diff --git a/WechatExporter/core/WechatParser.cpp b/WechatExporter/core/WechatParser.cpp index 5d58012..c55477d 100644 --- a/WechatExporter/core/WechatParser.cpp +++ b/WechatExporter/core/WechatParser.cpp @@ -1172,62 +1172,6 @@ SessionParser::SessionParser(MessageParser& msgParser, int options) : m_options( { } -int SessionParser::parse(const Session& session, std::function&)> handler) -{ - int count = 0; - sqlite3 *db = NULL; - int rc = openSqlite3ReadOnly(session.getDbFile(), &db); - if (rc != SQLITE_OK) - { - sqlite3_close(db); - return false; - } - - std::string sql = "SELECT CreateTime,Message,Des,Type,MesLocalID FROM Chat_" + session.getHash() + " ORDER BY CreateTime"; - if ((m_options & SPO_DESC) == SPO_DESC) - { - sql += " DESC"; - } - - sqlite3_stmt* stmt = NULL; - rc = sqlite3_prepare_v2(db, sql.c_str(), (int)(sql.size()), &stmt, NULL); - if (rc != SQLITE_OK) - { - sqlite3_close(db); - return false; - } - - std::vector tvs; - WXMSG msg; - - while (sqlite3_step(stmt) == SQLITE_ROW) - { - tvs.clear(); - - msg.createTime = sqlite3_column_int(stmt, 0); - const unsigned char* pMessage = sqlite3_column_text(stmt, 1); - - msg.content = pMessage != NULL ? reinterpret_cast(pMessage) : ""; - msg.des = sqlite3_column_int(stmt, 2); - msg.type = sqlite3_column_int(stmt, 3); - msg.msgId = std::to_string(sqlite3_column_int(stmt, 4)); - if (m_msgParser.parse(msg, session, tvs)) - { - count++; - if (handler(tvs)) - { - // cancelled - break; - } - } - } - - sqlite3_finalize(stmt); - sqlite3_close(db); - - return count; -} - SessionParser::MessageEnumerator* SessionParser::buildMsgEnumerator(const Session& session) { return new MessageEnumerator(session, m_options); diff --git a/WechatExporter/core/WechatParser.h b/WechatExporter/core/WechatParser.h index 836bbe3..32b3d91 100644 --- a/WechatExporter/core/WechatParser.h +++ b/WechatExporter/core/WechatParser.h @@ -305,6 +305,23 @@ private: class SessionParser { +public: + class MessageEnumerator + { + protected: + MessageEnumerator(const Session& session, int options); + + friend SessionParser; + public: + bool isInvalid() const; + bool nextMessage(WXMSG& msg); + + ~MessageEnumerator(); + private: + + void* m_context; + }; + private: int m_options; @@ -313,11 +330,7 @@ private: public: SessionParser(MessageParser& msgParser, int options); - int parse(const Session& session, std::function&)> handler); - -private: - - + MessageEnumerator* buildMsgEnumerator(const Session& session); };