diff options
| author | George Hazan <george.hazan@gmail.com> | 2025-04-22 16:51:47 +0300 |
|---|---|---|
| committer | George Hazan <george.hazan@gmail.com> | 2025-04-22 16:51:47 +0300 |
| commit | 5f5b401c63a2cec26188b5eef75814cd58e7bbfa (patch) | |
| tree | a16cdeccb79062e268f8aa962a81a92f4ab35d0b | |
| parent | ec44091523501a7f4007c21977e0638ca8e42434 (diff) | |
Teams: fix for trouter headers
| -rw-r--r-- | protocols/Teams/src/teams_endpoint.cpp | 7 | ||||
| -rw-r--r-- | protocols/Teams/src/teams_login.cpp | 5 | ||||
| -rw-r--r-- | protocols/Teams/src/teams_proto.h | 8 | ||||
| -rw-r--r-- | protocols/Teams/src/teams_trouter.cpp | 60 |
4 files changed, 48 insertions, 32 deletions
diff --git a/protocols/Teams/src/teams_endpoint.cpp b/protocols/Teams/src/teams_endpoint.cpp index c29bc64ff9..5687c81e5f 100644 --- a/protocols/Teams/src/teams_endpoint.cpp +++ b/protocols/Teams/src/teams_endpoint.cpp @@ -55,10 +55,6 @@ void CTeamsProto::OnEndpointCreated(MHttpResponse *response, AsyncHttpRequest*) } // Succeeded, decode the answer - int oldStatus = m_iStatus; - m_iStatus = m_iDesiredStatus; - ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, m_iStatus); - if (auto *hdr = response->FindHeader("Set-RegistrationToken")) { CMStringA szValue = hdr; int iStart = 0; @@ -81,8 +77,7 @@ void CTeamsProto::OnEndpointCreated(MHttpResponse *response, AsyncHttpRequest*) } } - SetServerStatus(m_iDesiredStatus); - StartTrouter(); + LoggedIn(); } void CTeamsProto::OnEndpointDeleted(MHttpResponse *, AsyncHttpRequest *) diff --git a/protocols/Teams/src/teams_login.cpp b/protocols/Teams/src/teams_login.cpp index 4dd815a0d1..2eaf0e2f60 100644 --- a/protocols/Teams/src/teams_login.cpp +++ b/protocols/Teams/src/teams_login.cpp @@ -40,7 +40,8 @@ void CTeamsProto::LoggedIn() m_iStatus = m_iDesiredStatus; ProtoBroadcastAck(0, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, m_iStatus); - SendCreateEndpoint(); + SetServerStatus(m_iStatus); + StartTrouter(); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -156,7 +157,7 @@ void CTeamsProto::OnReceiveSkypeToken(MHttpResponse *response, AsyncHttpRequest m_szSkypeToken = token["skypetoken"].as_mstring(); setWString(DBKEY_ID, token["skypeid"].as_mstring()); - LoggedIn(); + SendCreateEndpoint(); } void CTeamsProto::OnRefreshAccessToken(MHttpResponse *response, AsyncHttpRequest *) diff --git a/protocols/Teams/src/teams_proto.h b/protocols/Teams/src/teams_proto.h index d47e020a8e..60e2c29dde 100644 --- a/protocols/Teams/src/teams_proto.h +++ b/protocols/Teams/src/teams_proto.h @@ -356,18 +356,18 @@ private: void ProcessNewMessage(const JSONNode &node); void ProcessUserPresence(const JSONNode &node); void ProcessThreadUpdate(const JSONNode &node); - void ProcessServerMessage(const std::string &szName, const JSONNode &args); + void ProcessServerMessage(const std::string &szName, int packetId, const JSONNode &args); void ProcessEndpointPresence(const JSONNode &node); void ProcessConversationUpdate(const JSONNode &node); void __cdecl GatewayThread(void *); void GatewayThreadWorker(); - void TRouterSendJson(const char *szName, const JSONNode *node = 0); - void TRouterSendJson(const JSONNode &node); + void TRouterSendJson(const char *szName, const JSONNode *node = nullptr, int iReplyTo = -1); + void TRouterSendJson(const JSONNode &node, int iReplyTo = -1); void TRouterSendAuthentication(); - void TRouterSendActive(bool); + void TRouterSendActive(bool bActive, int iReplyTo); void TRouterRegister(); void TRouterRegister(const char *pszAppId, const char *pszKey, const char *pszPath); diff --git a/protocols/Teams/src/teams_trouter.cpp b/protocols/Teams/src/teams_trouter.cpp index d466b98ad3..b7a3b0ba94 100644 --- a/protocols/Teams/src/teams_trouter.cpp +++ b/protocols/Teams/src/teams_trouter.cpp @@ -123,25 +123,41 @@ void CTeamsProto::GatewayThreadWorker() ///////////////////////////////////////////////////////////////////////////////////////// // TRouter send -void CTeamsProto::TRouterSendJson(const JSONNode &node) +void CTeamsProto::TRouterSendJson(const JSONNode &node, int iReplyTo) { - std::string szJson = "5:::" + node.write(); - if (m_ws) { - m_ws->sendText(szJson.c_str()); + CMStringA szJson; + if (iReplyTo == -1) { + iCommandId++; + szJson.Format("5:%d+::", iCommandId); } + else szJson.Format("5:%d+::", iReplyTo); + szJson += node.write().c_str(); + + if (m_ws) + m_ws->sendText(szJson.c_str()); } -void CTeamsProto::TRouterSendJson(const char *szName, const JSONNode *node) +void CTeamsProto::TRouterSendJson(const char *szName, const JSONNode *node, int iReplyTo) { JSONNode payload, args(JSON_ARRAY); payload << CHAR_PARAM("name", szName); if (node) { - args.set_name("args"); - args << *node; - payload << args; + if (mir_strcmp(node->name(), "args")) { + args.set_name("args"); + args << *node; + payload << args; + } + else payload << *node; } - std::string szJson = payload.write(); + CMStringA szJson; + if (iReplyTo == -1) { + iCommandId++; + szJson.Format("5:%d+::", iCommandId); + } + else szJson.Format("5:%d+::", iReplyTo); + szJson += payload.write().c_str(); + if (m_ws) m_ws->sendText(szJson.c_str()); } @@ -164,7 +180,7 @@ void CTeamsProto::TRouterSendAuthentication() static char szSuffix[4] = { 'A', 'g', 'Q', 'w' }; -void CTeamsProto::TRouterSendActive(bool bActive) +void CTeamsProto::TRouterSendActive(bool bActive, int iReplyTo) { CMStringA cv; srand(time(0)); @@ -175,7 +191,7 @@ void CTeamsProto::TRouterSendActive(bool bActive) JSONNode payload; payload << CHAR_PARAM("state", bActive ? "active" : "inactive") << CHAR_PARAM("cv", cv); - TRouterSendJson("user.activity", &payload); + TRouterSendJson("user.activity", &payload, iReplyTo); } void CTeamsProto::TRouterRegister() @@ -220,11 +236,14 @@ void WebSocket<CTeamsProto>::process(const uint8_t *buf, size_t cbLen) p->TRouterProcess(payload); } -static const char* skip3colons(const char *str) +static const char* skip3colons(const char *str, int *packet_id = nullptr) { int nColons = 3; for (const char *p = str; *p; p++) { if (*p == ':') { + if (packet_id && nColons == 3) + *packet_id = atoi(p+1); + if (--nColons == 0) return p + 1; } @@ -236,8 +255,7 @@ void CTeamsProto::TRouterProcess(const char *str) { switch (*str) { case '1': - TRouterSendAuthentication(); - TRouterSendActive(true); + // TRouterSendAuthentication(); TRouterRegister(); break; @@ -266,9 +284,9 @@ void CTeamsProto::TRouterProcess(const char *str) break; case '5': - if (auto root = JSONNode::parse(skip3colons(str))) { + if (auto root = JSONNode::parse(skip3colons(str, &iCommandId))) { std::string szName(root["name"].as_string()); - ProcessServerMessage(szName, root["args"]); + ProcessServerMessage(szName, iCommandId, root["args"]); } break; } @@ -364,11 +382,13 @@ void CTeamsProto::ProcessUserPresence(const JSONNode &node) } } -void CTeamsProto::ProcessServerMessage(const std::string &szName, const JSONNode&) +void CTeamsProto::ProcessServerMessage(const std::string &szName, int packetId, const JSONNode &args) { - if (szName == "trouter.message_loss") { - TRouterRegister("TeamsCDLWebWorker", "TeamsCDLWebWorker_1.9", m_szTrouterSurl); - } + if (szName == "trouter.message_loss") + TRouterSendJson("trouter.processed_message_loss", &args, packetId); + + else if (szName == "trouter.connected") + TRouterSendActive(true, packetId); } void CTeamsProto::ProcessConversationUpdate(const JSONNode &) {} |
