diff options
author | George Hazan <ghazan@miranda.im> | 2021-05-02 20:10:02 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2021-05-02 20:10:02 +0300 |
commit | ef160df04b9e55727c5fbff9854a2e264d48df02 (patch) | |
tree | 460c94851f4ab01cd41dbb583704aa7327f05ffc /protocols/Facebook/src | |
parent | bbb01adcd4c89ca377bfec17c2b572ecce84498c (diff) |
Facebook: fix for reading messages
Diffstat (limited to 'protocols/Facebook/src')
-rw-r--r-- | protocols/Facebook/src/mqtt.h | 2 | ||||
-rw-r--r-- | protocols/Facebook/src/server.cpp | 25 |
2 files changed, 22 insertions, 5 deletions
diff --git a/protocols/Facebook/src/mqtt.h b/protocols/Facebook/src/mqtt.h index 824f54db85..80ab5a31ad 100644 --- a/protocols/Facebook/src/mqtt.h +++ b/protocols/Facebook/src/mqtt.h @@ -88,6 +88,8 @@ class FbThriftReader : public FbThrift uint8_t decodeType(int type); public: + __forceinline CMStringA rest() const { return CMStringA((char*)data() + offset, int(size() - offset)); } + bool isStop(); bool readBool(bool &bVal); bool readByte(uint8_t &val); diff --git a/protocols/Facebook/src/server.cpp b/protocols/Facebook/src/server.cpp index 2df81a34e3..eee0b7bddf 100644 --- a/protocols/Facebook/src/server.cpp +++ b/protocols/Facebook/src/server.cpp @@ -456,6 +456,7 @@ void FacebookProto::OnPublish(const char *topic, const uint8_t *p, size_t cbLen) void *pData = doUnzip(cbLen, p, dataSize); if (pData != nullptr) { debugLogA("UNZIP: %d bytes unzipped ok", dataSize); + Netlib_Dump(m_mqttConn, pData, dataSize, false, 0); rdr.reset(dataSize, pData); mir_free(pData); } @@ -474,7 +475,7 @@ void FacebookProto::OnPublish(const char *topic, const uint8_t *p, size_t cbLen) void FacebookProto::OnPublishPresence(FbThriftReader &rdr) { - char *str; + char *str = nullptr; rdr.readStr(str); mir_free(str); @@ -537,7 +538,7 @@ void FacebookProto::OnPublishPresence(FbThriftReader &rdr) void FacebookProto::OnPublishUtn(FbThriftReader &rdr) { - JSONNode root = JSONNode::parse((const char *)rdr.data()); + JSONNode root = JSONNode::parse(rdr.rest()); auto *pUser = FindUser(_wtoi64(root["sender_fbid"].as_mstring())); if (pUser != nullptr) { int length = (root["state"].as_int() == 0) ? PROTOTYPE_CONTACTTYPING_OFF : 60; @@ -564,10 +565,24 @@ static MsgHandlers[] = void FacebookProto::OnPublishMessage(FbThriftReader &rdr) { - CMStringA szJson((const char *)rdr.data(), (int)rdr.size()); - if (szJson[0] == 0) - szJson.Delete(0); + uint8_t stop; + if (rdr.isStop()) + rdr.readByte(stop); + else { + uint8_t type; + uint16_t id; + rdr.readField(type, id); + _ASSERT(type == FB_THRIFT_TYPE_STRING); + _ASSERT(id == 1 || id == 2); + + char *szShit = nullptr; + rdr.readStr(szShit); + mir_free(szShit); + + rdr.readByte(stop); + } + CMStringA szJson(rdr.rest()); debugLogA("MS: <%s>", szJson.c_str()); JSONNode root = JSONNode::parse(szJson); |