| | |
| | | |
| | | int CHsmsPassive::loadCollectionEvents(const char* pszFilepath) |
| | | { |
| | | CStdioFile file; |
| | | if (!file.Open(pszFilepath, CFile::modeRead)) { |
| | | CFile file; |
| | | if (!file.Open(pszFilepath, CFile::modeRead | CFile::shareDenyNone)) { |
| | | return -1; |
| | | } |
| | | |
| | | std::regex pattern("^\\d+,[^,]*,[^,]*,\\(\\d+(,\\d+)*\\).*"); // 匹配以数字+逗号开头的字符串 |
| | | const ULONGLONG nLen = file.GetLength(); |
| | | if (nLen == 0) { |
| | | return -1; |
| | | } |
| | | |
| | | std::string buffer; |
| | | buffer.resize(static_cast<size_t>(nLen)); |
| | | file.Read(buffer.data(), static_cast<UINT>(nLen)); |
| | | file.Close(); |
| | | |
| | | const unsigned char* bytes = reinterpret_cast<const unsigned char*>(buffer.data()); |
| | | size_t offset = 0; |
| | | CStringW content; |
| | | |
| | | // UTF-8 BOM |
| | | if (nLen >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) { |
| | | offset = 3; |
| | | } |
| | | |
| | | // UTF-16 LE BOM |
| | | if (nLen >= 2 && bytes[0] == 0xFF && bytes[1] == 0xFE) { |
| | | const wchar_t* wdata = reinterpret_cast<const wchar_t*>(buffer.data() + 2); |
| | | const size_t wlen = (nLen - 2) / sizeof(wchar_t); |
| | | content.SetString(wdata, static_cast<int>(wlen)); |
| | | } |
| | | // UTF-16 BE BOM |
| | | else if (nLen >= 2 && bytes[0] == 0xFE && bytes[1] == 0xFF) { |
| | | const size_t wlen = (nLen - 2) / sizeof(wchar_t); |
| | | std::wstring temp; |
| | | temp.reserve(wlen); |
| | | for (size_t i = 0; i < wlen; ++i) { |
| | | wchar_t ch = static_cast<wchar_t>(bytes[2 + i * 2] << 8 | bytes[2 + i * 2 + 1]); |
| | | temp.push_back(ch); |
| | | } |
| | | content = temp.c_str(); |
| | | } |
| | | else { |
| | | auto tryUtf8 = [&](size_t off) -> bool { |
| | | int need = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, buffer.data() + off, |
| | | static_cast<int>(buffer.size() - off), nullptr, 0); |
| | | if (need <= 0) return false; |
| | | std::wstring temp; |
| | | temp.resize(need); |
| | | MultiByteToWideChar(CP_UTF8, 0, buffer.data() + off, |
| | | static_cast<int>(buffer.size() - off), temp.data(), need); |
| | | content = temp.c_str(); |
| | | return true; |
| | | }; |
| | | |
| | | if (!tryUtf8(offset)) { |
| | | int need = MultiByteToWideChar(CP_ACP, 0, buffer.data(), static_cast<int>(buffer.size()), nullptr, 0); |
| | | if (need > 0) { |
| | | std::wstring temp; |
| | | temp.resize(need); |
| | | MultiByteToWideChar(CP_ACP, 0, buffer.data(), static_cast<int>(buffer.size()), temp.data(), need); |
| | | content = temp.c_str(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (content.IsEmpty()) { |
| | | return -1; |
| | | } |
| | | |
| | | std::wregex pattern(L"^\\d+,[^,]*,[^,]*,\\(\\d+(,\\d+)*\\).*"); // 匹配以数字+逗号开头的字符串 |
| | | std::vector<SERVO::CCollectionEvent*> events; |
| | | int index, last; |
| | | CString strLine, strRPTIDs; |
| | | CString strId, strName, strDescription; |
| | | while (file.ReadString(strLine)) { |
| | | if (!std::regex_match((LPTSTR)(LPCTSTR)strLine, pattern)) { |
| | | CStringW strLine, strRPTIDs; |
| | | CStringW strId, strName, strDescription; |
| | | std::wstringstream ss(content.GetString()); |
| | | auto narrowFromW = [](const CStringW& s) -> std::string { |
| | | int need = WideCharToMultiByte(CP_ACP, 0, s, -1, nullptr, 0, nullptr, nullptr); |
| | | if (need <= 0) return {}; |
| | | std::string out(static_cast<size_t>(need - 1), '\0'); |
| | | WideCharToMultiByte(CP_ACP, 0, s, -1, out.data(), need, nullptr, nullptr); |
| | | return out; |
| | | }; |
| | | std::wstring line; |
| | | while (std::getline(ss, line, L'\n')) { |
| | | strLine = line.c_str(); |
| | | strLine.Trim(); |
| | | if (strLine.IsEmpty()) continue; |
| | | if (!std::regex_match(static_cast<LPCWSTR>(strLine), pattern)) { |
| | | continue; |
| | | } |
| | | |
| | | last = 0; |
| | | index = strLine.Find(",", last); |
| | | index = strLine.Find(L",", last); |
| | | if (index < 0) continue; |
| | | strId = strLine.Left(index); |
| | | last = index + 1; |
| | | |
| | | index = strLine.Find(",", last); |
| | | index = strLine.Find(L",", last); |
| | | if (index < 0) continue; |
| | | strName = strLine.Mid(last, index - last); |
| | | last = index + 1; |
| | | |
| | | index = strLine.Find(",", last); |
| | | index = strLine.Find(L",", last); |
| | | if (index < 0) continue; |
| | | strDescription = strLine.Mid(last, index - last); |
| | | strRPTIDs = strLine.Right(strLine.GetLength() - index - 1); |
| | | strRPTIDs.Delete(0); |
| | | strRPTIDs.Delete(strRPTIDs.GetLength() - 1); |
| | | auto prtids = parseVidList(strRPTIDs); |
| | | CString strRPTIDsA(narrowFromW(strRPTIDs).c_str()); |
| | | auto prtids = parseVidList(strRPTIDsA); |
| | | |
| | | std::string sName = narrowFromW(strName); |
| | | std::string sDesc = narrowFromW(strDescription); |
| | | |
| | | SERVO::CCollectionEvent* pEvent = new SERVO::CCollectionEvent( |
| | | atoi(strId), (LPTSTR)(LPCTSTR)strName, (LPTSTR)(LPCTSTR)strDescription, prtids); |
| | | _wtoi(strId), sName.c_str(), sDesc.c_str(), prtids); |
| | | for (auto rptid : prtids) { |
| | | SERVO::CReport* pReport = getReport(rptid); |
| | | if (pReport != nullptr) { |
| | |
| | | m_collectionEvents.push_back(item); |
| | | } |
| | | } |
| | | |
| | | |
| | | file.Close(); |
| | | return 0; |
| | | } |
| | | |