From 8b123abaabfafc7785cf08c68fefae5e0b528b15 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 15 Dec 2024 23:08:04 +0300 Subject: introducing Steam message descriptors & static message handlers --- protocols/Steam/src/main.cpp | 6 +++++- protocols/Steam/src/proto.h | 1 - protocols/Steam/src/steam_login.cpp | 17 ++++++++++------- protocols/Steam/src/steam_proto.h | 3 ++- protocols/Steam/src/steam_ws.cpp | 28 ++++++++++++++++------------ 5 files changed, 33 insertions(+), 22 deletions(-) (limited to 'protocols') diff --git a/protocols/Steam/src/main.cpp b/protocols/Steam/src/main.cpp index d39201d870..efb35cb945 100644 --- a/protocols/Steam/src/main.cpp +++ b/protocols/Steam/src/main.cpp @@ -34,7 +34,7 @@ extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = { MIID_PROTOC void CMPlugin::InitSteamServices() { - // message handlers + // message descriptors map messages[EMsg::Multi] = &cmsg_multi__descriptor; messages[EMsg::ClientHeartBeat] = &cmsg_client_heart_beat__descriptor; messages[EMsg::ClientHello] = &cmsg_client_hello__descriptor; @@ -137,6 +137,10 @@ void CMPlugin::InitSteamServices() // messages[EMsg::ClientDeauthorizeDevice] = &cmsg_Client_DeauthorizeDevice; // messages[EMsg::ClientUseLocalDeviceAuthorizations] = &cmsg_Client_UseLocalDeviceAuthorizations; + // message handlers + messageHandlers[EMsg::ClientLoggedOff] = ServiceResponseHandler(&CSteamProto::OnClientLogoff); + messageHandlers[EMsg::ClientLogOnResponse] = ServiceResponseHandler(&CSteamProto::OnClientLogon); + // services from steammessages_auth.steamclient.proto services["Authentication"] = &authentication__descriptor; services["AuthenticationSupport"] = &authentication_support__descriptor; diff --git a/protocols/Steam/src/proto.h b/protocols/Steam/src/proto.h index fdb120452d..c7f917a4e8 100644 --- a/protocols/Steam/src/proto.h +++ b/protocols/Steam/src/proto.h @@ -2142,5 +2142,4 @@ namespace proto PROTOBUF_PTR(MsgMulti, cmsg_multi__descriptor); PROTOBUF_PTR(MsgProtoBufHeader, cmsg_proto_buf_header__descriptor); - PROTOBUF_PTR(MsgClientLogonResponse, cmsg_client_logon_response__descriptor); }; diff --git a/protocols/Steam/src/steam_login.cpp b/protocols/Steam/src/steam_login.cpp index 13c6b9f371..30b773b7db 100644 --- a/protocols/Steam/src/steam_login.cpp +++ b/protocols/Steam/src/steam_login.cpp @@ -253,18 +253,15 @@ void CSteamProto::OnPollSession(const CAuthenticationPollAuthSessionStatusRespon WSSend(EMsg::ClientLogon, request); } -void CSteamProto::OnClientLogon(const uint8_t *buf, size_t cbLen) +void CSteamProto::OnClientLogon(const CMsgClientLogonResponse &reply, const CMsgProtoBufHeader &hdr) { - proto::MsgClientLogonResponse reply(buf, cbLen); - if (reply == nullptr || !reply->has_eresult || reply->eresult != (int)EResult::OK) { + if (hdr.failed()) { Logout(); return; } - debugLogA("client logged in\n%s", protobuf_c_text_to_string(*reply).c_str()); - - if (reply->has_heartbeat_seconds) - m_impl.m_heartBeat.Start(reply->heartbeat_seconds * 1000); + if (reply.has_heartbeat_seconds) + m_impl.m_heartBeat.Start(reply.heartbeat_seconds * 1000); // go to online now ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_CONNECTING, m_iStatus = m_iDesiredStatus); @@ -272,3 +269,9 @@ void CSteamProto::OnClientLogon(const uint8_t *buf, size_t cbLen) // load contact list SendRequest(new GetFriendListRequest(m_szAccessToken, m_iSteamId, "friend,ignoredfriend,requestrecipient"), &CSteamProto::OnGotFriendList); } + +void CSteamProto::OnClientLogoff(const CMsgClientLoggedOff &reply, const CMsgProtoBufHeader&) +{ + debugLogA("received logout request with error code %d", reply.has_eresult ? reply.eresult : 0); + Logout(); +} diff --git a/protocols/Steam/src/steam_proto.h b/protocols/Steam/src/steam_proto.h index 57f87b6b77..5453485a95 100644 --- a/protocols/Steam/src/steam_proto.h +++ b/protocols/Steam/src/steam_proto.h @@ -162,7 +162,8 @@ class CSteamProto : public PROTO static INT_PTR CALLBACK EnterEmailCode(void *param); void OnBeginSession(const CAuthenticationBeginAuthSessionViaCredentialsResponse &pResponse, const CMsgProtoBufHeader &hdr); - void OnClientLogon(const uint8_t *buf, size_t cbLen); + void OnClientLogon(const CMsgClientLogonResponse &pResponse, const CMsgProtoBufHeader &hdr); + void OnClientLogoff(const CMsgClientLoggedOff &pResponse, const CMsgProtoBufHeader &hdr); void OnGotRsaKey(const CAuthenticationGetPasswordRSAPublicKeyResponse &pResponse, const CMsgProtoBufHeader &hdr); void OnGotConfirmationCode(const CAuthenticationUpdateAuthSessionWithSteamGuardCodeResponse &pResponse, const CMsgProtoBufHeader &hdr); void OnPollSession(const CAuthenticationPollAuthSessionStatusResponse &pResponse, const CMsgProtoBufHeader &hdr); diff --git a/protocols/Steam/src/steam_ws.cpp b/protocols/Steam/src/steam_ws.cpp index f7a1112add..ceca7636a7 100644 --- a/protocols/Steam/src/steam_ws.cpp +++ b/protocols/Steam/src/steam_ws.cpp @@ -137,7 +137,7 @@ void CSteamProto::ProcessMessage(const uint8_t *buf, size_t cbLen) } if (!bIsProto) { - debugLogA("Got unknown packet, exiting"); + debugLogA("Got unknown packet of type %d, exiting", msgType); Netlib_Dump(HNETLIBCONN(m_ws->getConn()), buf, cbLen, false, 0); return; } @@ -156,22 +156,26 @@ void CSteamProto::ProcessMessage(const uint8_t *buf, size_t cbLen) // persistent callbacks switch (msgType) { - case EMsg::ClientLogOnResponse: - OnClientLogon(buf, cbLen); - break; - case EMsg::ServiceMethodResponse: ProcessServiceResponse(buf, cbLen, *hdr); break; - case EMsg::ClientLoggedOff: - debugLogA("received logout request"); - Logout(); - break; - default: - debugLogA("Received message of type %d", msgType); - Netlib_Dump(HNETLIBCONN(m_ws->getConn()), buf, cbLen, false, 0); + // find message descriptor first, if succeeded, try to find a message handler then + auto md = g_plugin.messages.find(msgType); + if (md == g_plugin.messages.end()) { + debugLogA("Received message of type %d", msgType); + Netlib_Dump(HNETLIBCONN(m_ws->getConn()), buf, cbLen, false, 0); + } + else if (auto *pMessage = protobuf_c_message_unpack(md->second, 0, cbLen, buf)) { + debugLogA("Received known message:\n%s", protobuf_c_text_to_string(*pMessage).c_str()); + + auto mh = g_plugin.messageHandlers.find(msgType); + if (mh != g_plugin.messageHandlers.end()) + (this->*(mh->second))(*pMessage, *hdr); + + protobuf_c_message_free_unpacked(pMessage, 0); + } } } -- cgit v1.2.3