summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2025-04-22 16:51:47 +0300
committerGeorge Hazan <george.hazan@gmail.com>2025-04-22 16:51:47 +0300
commit5f5b401c63a2cec26188b5eef75814cd58e7bbfa (patch)
treea16cdeccb79062e268f8aa962a81a92f4ab35d0b
parentec44091523501a7f4007c21977e0638ca8e42434 (diff)
Teams: fix for trouter headers
-rw-r--r--protocols/Teams/src/teams_endpoint.cpp7
-rw-r--r--protocols/Teams/src/teams_login.cpp5
-rw-r--r--protocols/Teams/src/teams_proto.h8
-rw-r--r--protocols/Teams/src/teams_trouter.cpp60
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 &) {}