diff options
author | George Hazan <ghazan@miranda.im> | 2018-01-12 23:07:59 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2018-01-12 23:07:59 +0300 |
commit | 6bc16395b7033d7d6225f83928cbbec225ccbe01 (patch) | |
tree | c4ba4c1119485d0bac71dba4b80fe2f3dc2f13fe | |
parent | a57284db27d3bfb58b47e469159a121d1d94da8e (diff) |
why not parse the whole json and then iterate nodes?
-rw-r--r-- | protocols/FacebookRM/src/json.cpp | 36 |
1 files changed, 9 insertions, 27 deletions
diff --git a/protocols/FacebookRM/src/json.cpp b/protocols/FacebookRM/src/json.cpp index 98048df928..02775b85f3 100644 --- a/protocols/FacebookRM/src/json.cpp +++ b/protocols/FacebookRM/src/json.cpp @@ -21,7 +21,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "stdafx.h" -#include <regex> LRESULT CALLBACK PopupDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); @@ -1166,40 +1165,27 @@ int FacebookProto::ParseUnreadThreads(std::string *data, std::vector< std::strin int FacebookProto::ParseThreadMessages(std::string *data, std::vector< facebook_message >* messages, bool unreadOnly) { - /*size_t len = data->find("\r\n"); + // cuts out the rest + size_t len = data->find("\r\n"); if (len != data->npos) - data->erase(len);*/ + data->erase(len); + + JSONNode root = JSONNode::parse(data->c_str()); + if (!root) + return EXIT_FAILURE; // since it could loop over multiple queries not all can be valid // so return EXIT_FAILURE only if none is processed bool hasResult = false; - // pattern for one query - std::regex r("\\{\"o\\d\":\\{\"data\":\\{\"message_thread\":\\{.+\\}{4,5}"); // (\\{|$) - std::sregex_iterator i = std::sregex_iterator(data->begin(), data->end(), r); - std::sregex_iterator end; // loop over queries - for (; i != end; ++i) { - - std::smatch m = *i; - std::string match = m.str(); - - JSONNode root = JSONNode::parse(match.c_str()); - if (!root) - //return EXIT_FAILURE; - continue; - - // query number "o0", "o1", .. but they are not ordered - std::string oX = std::string("o") + std::string(1, match.at(3)); - - const JSONNode &thread = root[oX.c_str()]["data"]["message_thread"]; + for (auto &itr : root) { + const JSONNode &thread = itr["data"]["message_thread"]; if (!thread) - //return EXIT_FAILURE; continue; const JSONNode &nodes = thread["messages"]["nodes"]; if (!nodes) - //return EXIT_FAILURE; continue; // TODO! process commented sections and better pair json (this is just quick attempt, + I do not know what everything means yet) @@ -1213,7 +1199,6 @@ int FacebookProto::ParseThreadMessages(std::string *data, std::vector< facebook_ const JSONNode &thread_id_ = it["offline_threading_id"]; const JSONNode &mid_ = it["message_id"]; const JSONNode ×tamp_ = it["timestamp_precise"]; - // const JSONNode &filtered_ = it["is_filtered_content"]; const JSONNode &is_unread_ = it["unread"]; // Either there is "body" (for classic messages), or "log_message_type" and "log_message_body" (for log messages) @@ -1239,9 +1224,6 @@ int FacebookProto::ParseThreadMessages(std::string *data, std::vector< facebook_ // Process attachements and stickers ParseAttachments(message_text, it, other_user_fbid, true); - //if (filtered_.as_bool() && message_text.empty()) - // message_text = Translate("This message is no longer available, because it was marked as abusive or spam."); - message_text = utils::text::trim(utils::text::slashu_to_utf8(message_text), true); if (message_text.empty()) { debugLogA("ParseThreadMessages: ignoring message (%s) - empty message text", mid_.as_string().c_str()); |