| | |
| | | |
| | | int CHsmsPassive::loadReports(const char* pszFilepath) |
| | | { |
| | | m_strReportFilepath = pszFilepath; |
| | | m_bReportUtf8 = false; |
| | | m_bReportUtf8Bom = false; |
| | | // 兼容 UTF-8/BOM 与本地编码读取 |
| | | CFile file; |
| | | if (!file.Open(pszFilepath, CFile::modeRead | CFile::shareDenyNone)) { |
| | |
| | | // UTF-8 BOM |
| | | if (nLen >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) { |
| | | offset = 3; |
| | | m_bReportUtf8 = true; |
| | | m_bReportUtf8Bom = true; |
| | | } |
| | | |
| | | // UTF-16 LE BOM |
| | |
| | | MultiByteToWideChar(CP_UTF8, 0, buffer.data() + off, |
| | | static_cast<int>(buffer.size() - off), temp.data(), need); |
| | | content = temp.c_str(); |
| | | m_bReportUtf8 = true; |
| | | return true; |
| | | }; |
| | | |
| | |
| | | return false; |
| | | } |
| | | |
| | | int CHsmsPassive::deleteReport(int rptid) |
| | | { |
| | | if (!removeReport(rptid)) { |
| | | return -1; |
| | | } |
| | | return writeReportsToFile(m_strReportFilepath); |
| | | } |
| | | |
| | | void CHsmsPassive::clearAllReport() |
| | | { |
| | | for (auto item : m_reports) { |
| | |
| | | m_reports.clear(); |
| | | } |
| | | |
| | | int CHsmsPassive::writeReportsToFile(const std::string& filepath) |
| | | { |
| | | if (filepath.empty()) return -1; |
| | | |
| | | CFile file; |
| | | if (!file.Open(filepath.c_str(), CFile::modeCreate | CFile::modeWrite)) { |
| | | return -1; |
| | | } |
| | | |
| | | if (m_bReportUtf8 && m_bReportUtf8Bom) { |
| | | const BYTE bom[3] = { 0xEF, 0xBB, 0xBF }; |
| | | file.Write(bom, 3); |
| | | } |
| | | |
| | | // header |
| | | const std::string headerAnsi = "RPTID,(VID1,VID2,...)\r\n"; |
| | | if (m_bReportUtf8) { |
| | | CStringA header = AnsiToUtf8(headerAnsi); |
| | | file.Write(header.GetString(), header.GetLength()); |
| | | } |
| | | else { |
| | | file.Write(headerAnsi.data(), (UINT)headerAnsi.size()); |
| | | } |
| | | |
| | | for (auto rpt : m_reports) { |
| | | if (rpt == nullptr) continue; |
| | | std::string line; |
| | | line.reserve(64); |
| | | line += std::to_string(rpt->getReportId()); |
| | | line += ",("; |
| | | |
| | | const auto& vids = rpt->getVids(); |
| | | for (size_t i = 0; i < vids.size(); ++i) { |
| | | line += std::to_string(vids[i]); |
| | | if (i + 1 < vids.size()) { |
| | | line.push_back(','); |
| | | } |
| | | } |
| | | line += ")\r\n"; |
| | | |
| | | if (m_bReportUtf8) { |
| | | CStringA out = AnsiToUtf8(line); |
| | | file.Write(out.GetString(), out.GetLength()); |
| | | } |
| | | else { |
| | | file.Write(line.data(), (UINT)line.size()); |
| | | } |
| | | } |
| | | |
| | | file.Close(); |
| | | return 0; |
| | | } |
| | | |
| | | int CHsmsPassive::loadCollectionEvents(const char* pszFilepath) |
| | | { |
| | | CFile file; |