summaryrefslogtreecommitdiff
path: root/protocols/WhatsApp/src
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2022-11-18 20:16:14 +0300
committerGeorge Hazan <ghazan@miranda.im>2022-11-18 20:16:14 +0300
commite11b467c11b01de711d5641b7aaa2f3bdb3fd398 (patch)
tree4cdcd2f3cc692041baae35333299e6d1d0972840 /protocols/WhatsApp/src
parentb3061e352adfb4620fe407e59bcbe91d766669b9 (diff)
WhatsApp: fix for the requests' queue processing
Diffstat (limited to 'protocols/WhatsApp/src')
-rw-r--r--protocols/WhatsApp/src/iq.cpp20
-rw-r--r--protocols/WhatsApp/src/proto.cpp7
-rw-r--r--protocols/WhatsApp/src/proto.h59
-rw-r--r--protocols/WhatsApp/src/utils.cpp4
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);