diff options
author | George Hazan <ghazan@miranda.im> | 2022-11-18 20:16:14 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2022-11-18 20:16:14 +0300 |
commit | e11b467c11b01de711d5641b7aaa2f3bdb3fd398 (patch) | |
tree | 4cdcd2f3cc692041baae35333299e6d1d0972840 /protocols/WhatsApp/src | |
parent | b3061e352adfb4620fe407e59bcbe91d766669b9 (diff) |
WhatsApp: fix for the requests' queue processing
Diffstat (limited to 'protocols/WhatsApp/src')
-rw-r--r-- | protocols/WhatsApp/src/iq.cpp | 20 | ||||
-rw-r--r-- | protocols/WhatsApp/src/proto.cpp | 7 | ||||
-rw-r--r-- | protocols/WhatsApp/src/proto.h | 59 | ||||
-rw-r--r-- | protocols/WhatsApp/src/utils.cpp | 4 |
4 files changed, 63 insertions, 27 deletions
diff --git a/protocols/WhatsApp/src/iq.cpp b/protocols/WhatsApp/src/iq.cpp index 6700b4e04a..c3f4ba2a38 100644 --- a/protocols/WhatsApp/src/iq.cpp +++ b/protocols/WhatsApp/src/iq.cpp @@ -97,7 +97,7 @@ void WhatsAppProto::OnIqGetKeys(const WANode &node, void *pUserInfo) m_signalStore.injectSession(it); // don't forget to send delayed message when all keys are retrieved - if (pUserInfo != INVALID_HANDLE_VALUE) + if (pUserInfo) SendTask((WASendTask *)pUserInfo); } @@ -122,7 +122,7 @@ void WhatsAppProto::OnIqGetUsync(const WANode &node) pKey->addChild("user")->addAttr("jid", it->toString()); } if (pKey->getChildren().getCount() > 0) - WSSendNode(iq, &WhatsAppProto::OnIqGetKeys, INVALID_HANDLE_VALUE); + WSSendNode(iq, &WhatsAppProto::OnIqGetKeys, nullptr); } } @@ -252,13 +252,15 @@ void WhatsAppProto::OnIqPairSuccess(const WANode &node) void WhatsAppProto::OnIqResult(const WANode &node) { - if (auto *pszId = node.getAttr("id")) - for (auto &it : m_arPacketQueue) - if (it->szPacketId == pszId) - if (it->pUserInfo) - (this->*it->pHandlerFull)(node, it->pUserInfo); - else - (this->*it->pHandler)(node); + if (auto *pszId = node.getAttr("id")) { + for (auto &it : m_arPacketQueue) { + if (it->szPacketId == pszId) { + it->Execute(this, node); + m_arPacketQueue.remove(it); + break; + } + } + } } ///////////////////////////////////////////////////////////////////////////////////////// diff --git a/protocols/WhatsApp/src/proto.cpp b/protocols/WhatsApp/src/proto.cpp index fe036b40b5..ac6562450c 100644 --- a/protocols/WhatsApp/src/proto.cpp +++ b/protocols/WhatsApp/src/proto.cpp @@ -32,6 +32,11 @@ static int CompareCollections(const WACollection *p1, const WACollection *p2) return strcmp(p1->szName, p2->szName); } +static int CompareRequests(const WARequestBase *p1, const WARequestBase *p2) +{ + return strcmp(p1->szPacketId, p2->szPacketId); +} + WhatsAppProto::WhatsAppProto(const char *proto_name, const wchar_t *username) : PROTO<WhatsAppProto>(proto_name, username), m_impl(*this), @@ -42,7 +47,7 @@ WhatsAppProto::WhatsAppProto(const char *proto_name, const wchar_t *username) : m_arDevices(1), m_arOwnMsgs(1, CompareOwnMsgs), m_arPersistent(1), - m_arPacketQueue(10), + m_arPacketQueue(10, CompareRequests), m_arCollections(10, CompareCollections), m_wszNick(this, "Nick"), diff --git a/protocols/WhatsApp/src/proto.h b/protocols/WhatsApp/src/proto.h index 290aa6c392..a699c91481 100644 --- a/protocols/WhatsApp/src/proto.h +++ b/protocols/WhatsApp/src/proto.h @@ -41,28 +41,57 @@ struct WAMediaKeys uint8_t macKey[64]; }; -struct WARequest +///////////////////////////////////////////////////////////////////////////////////////// +// own requests + +struct WARequestBase { - WARequest(const CMStringA &_1, WA_PKT_HANDLER _2) : - szPacketId(_1), - pHandler(_2), - pUserInfo(nullptr) + WARequestBase(const CMStringA &_1) : + szPacketId(_1) {} + virtual ~WARequestBase() {} - WARequest(const CMStringA &_1, WA_PKT_HANDLER_FULL _2, void *_3) : - szPacketId(_1), - pHandlerFull(_2), - pUserInfo(_3) + CMStringA szPacketId; + + virtual void Execute(WhatsAppProto *ppro, const WANode &node) = 0; +}; + +class WARequestSimple : public WARequestBase +{ + WA_PKT_HANDLER pHandler; + +public: + WARequestSimple(const CMStringA &_1, WA_PKT_HANDLER _2) : + WARequestBase(_1), + pHandler(_2) {} - CMStringA szPacketId; - union { - WA_PKT_HANDLER pHandler; - WA_PKT_HANDLER_FULL pHandlerFull; - }; + void Execute(WhatsAppProto *ppro, const WANode &node) override + { + (ppro->*pHandler)(node); + } +}; + +class WARequestParam : public WARequestBase +{ + WA_PKT_HANDLER_FULL pHandler; void *pUserInfo; + +public: + WARequestParam(const CMStringA &_1, WA_PKT_HANDLER_FULL _2, void *_3) : + WARequestBase(_1), + pHandler(_2), + pUserInfo(_3) + {} + + void Execute(WhatsAppProto *ppro, const WANode &node) override + { + (ppro->*pHandler)(node, pUserInfo); + } }; +///////////////////////////////////////////////////////////////////////////////////////// + struct WAPersistentHandler { WAPersistentHandler(const char *_1, const char *_2, const char *_3, const char *_4, WA_PKT_HANDLER _5) : @@ -310,7 +339,7 @@ class WhatsAppProto : public PROTO<WhatsAppProto> HNETLIBCONN m_hServerConn; mir_cs m_csPacketQueue; - OBJLIST<WARequest> m_arPacketQueue; + OBJLIST<WARequestBase> m_arPacketQueue; LIST<WAPersistentHandler> m_arPersistent; WA_PKT_HANDLER FindPersistentHandler(const WANode &node); diff --git a/protocols/WhatsApp/src/utils.cpp b/protocols/WhatsApp/src/utils.cpp index 2993af9579..b2fce4db09 100644 --- a/protocols/WhatsApp/src/utils.cpp +++ b/protocols/WhatsApp/src/utils.cpp @@ -212,7 +212,7 @@ int WhatsAppProto::WSSendNode(WANode &node, WA_PKT_HANDLER pHandler) node.addAttr("id", id); { mir_cslock lck(m_csPacketQueue); - m_arPacketQueue.insert(new WARequest(id, pHandler)); + m_arPacketQueue.insert(new WARequestSimple(id, pHandler)); } return WSSendNode(node); @@ -227,7 +227,7 @@ int WhatsAppProto::WSSendNode(WANode &node, WA_PKT_HANDLER_FULL pHandler, void * node.addAttr("id", id); { mir_cslock lck(m_csPacketQueue); - m_arPacketQueue.insert(new WARequest(id, pHandler, pUserInfo)); + m_arPacketQueue.insert(new WARequestParam(id, pHandler, pUserInfo)); } return WSSendNode(node); |