From ab75f8e4a3968c956425844415237a4fa6fcee63 Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Tue, 26 May 2015 19:15:20 +0000 Subject: Steam: merge new api git-svn-id: http://svn.miranda-ng.org/main/trunk@13850 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Steam/src/Junk/steam_thread.cpp | 171 -------------------------- protocols/Steam/src/Steam/authorization.h | 59 --------- protocols/Steam/src/Steam/avatar.h | 18 --- protocols/Steam/src/Steam/captcha.h | 18 --- protocols/Steam/src/Steam/crypto.h | 123 ------------------- protocols/Steam/src/Steam/friend.h | 18 --- protocols/Steam/src/Steam/friend_list.h | 88 -------------- protocols/Steam/src/Steam/login.h | 33 ----- protocols/Steam/src/Steam/message.h | 126 ------------------- protocols/Steam/src/Steam/pending.h | 67 ----------- protocols/Steam/src/Steam/poll.h | 30 ----- protocols/Steam/src/Steam/rsa_key.h | 19 --- protocols/Steam/src/Steam/search.h | 20 ---- protocols/Steam/src/Steam/session.h | 26 ---- protocols/Steam/src/Steam/steam.h | 185 ---------------------------- protocols/Steam/src/api/authorization.h | 59 +++++++++ protocols/Steam/src/api/avatar.h | 14 +++ protocols/Steam/src/api/captcha.h | 14 +++ protocols/Steam/src/api/friend.h | 15 +++ protocols/Steam/src/api/friend_list.h | 88 ++++++++++++++ protocols/Steam/src/api/login.h | 32 +++++ protocols/Steam/src/api/message.h | 22 ++++ protocols/Steam/src/api/pending.h | 67 +++++++++++ protocols/Steam/src/api/poll.h | 28 +++++ protocols/Steam/src/api/rsa_key.h | 16 +++ protocols/Steam/src/api/search.h | 17 +++ protocols/Steam/src/api/session.h | 24 ++++ protocols/Steam/src/http_request.h | 96 +++++++++++++++ protocols/Steam/src/request_queue.cpp | 121 +++++++++++++++++++ protocols/Steam/src/request_queue.h | 59 +++++++++ protocols/Steam/src/stdafx.h | 130 +++++++++++--------- protocols/Steam/src/steam_account.cpp | 27 ++--- protocols/Steam/src/steam_avatars.cpp | 5 +- protocols/Steam/src/steam_contacts.cpp | 24 ++-- protocols/Steam/src/steam_events.cpp | 4 +- protocols/Steam/src/steam_menus.cpp | 6 +- protocols/Steam/src/steam_messages.cpp | 13 +- protocols/Steam/src/steam_pooling.cpp | 10 +- protocols/Steam/src/steam_proto.cpp | 113 +++++++++-------- protocols/Steam/src/steam_proto.h | 85 ++++--------- protocols/Steam/src/steam_queue.cpp | 193 ------------------------------ protocols/Steam/src/steam_request.cpp | 73 +++++++++++ protocols/Steam/src/version.h | 4 +- 43 files changed, 950 insertions(+), 1410 deletions(-) delete mode 100644 protocols/Steam/src/Junk/steam_thread.cpp delete mode 100644 protocols/Steam/src/Steam/authorization.h delete mode 100644 protocols/Steam/src/Steam/avatar.h delete mode 100644 protocols/Steam/src/Steam/captcha.h delete mode 100644 protocols/Steam/src/Steam/crypto.h delete mode 100644 protocols/Steam/src/Steam/friend.h delete mode 100644 protocols/Steam/src/Steam/friend_list.h delete mode 100644 protocols/Steam/src/Steam/login.h delete mode 100644 protocols/Steam/src/Steam/message.h delete mode 100644 protocols/Steam/src/Steam/pending.h delete mode 100644 protocols/Steam/src/Steam/poll.h delete mode 100644 protocols/Steam/src/Steam/rsa_key.h delete mode 100644 protocols/Steam/src/Steam/search.h delete mode 100644 protocols/Steam/src/Steam/session.h delete mode 100644 protocols/Steam/src/Steam/steam.h create mode 100644 protocols/Steam/src/api/authorization.h create mode 100644 protocols/Steam/src/api/avatar.h create mode 100644 protocols/Steam/src/api/captcha.h create mode 100644 protocols/Steam/src/api/friend.h create mode 100644 protocols/Steam/src/api/friend_list.h create mode 100644 protocols/Steam/src/api/login.h create mode 100644 protocols/Steam/src/api/message.h create mode 100644 protocols/Steam/src/api/pending.h create mode 100644 protocols/Steam/src/api/poll.h create mode 100644 protocols/Steam/src/api/rsa_key.h create mode 100644 protocols/Steam/src/api/search.h create mode 100644 protocols/Steam/src/api/session.h create mode 100644 protocols/Steam/src/http_request.h create mode 100644 protocols/Steam/src/request_queue.cpp create mode 100644 protocols/Steam/src/request_queue.h delete mode 100644 protocols/Steam/src/steam_queue.cpp create mode 100644 protocols/Steam/src/steam_request.cpp (limited to 'protocols/Steam/src') diff --git a/protocols/Steam/src/Junk/steam_thread.cpp b/protocols/Steam/src/Junk/steam_thread.cpp deleted file mode 100644 index f07541c6d3..0000000000 --- a/protocols/Steam/src/Junk/steam_thread.cpp +++ /dev/null @@ -1,171 +0,0 @@ -#include "stdafx.h" - -void CSteamProto::PollServer(const char *token, const char *umqId, UINT32 messageId, SteamWebApi::PollApi::PollResult *pollResult) -{ - debugLogA("CSteamProto::PollServer: call SteamWebApi::PollApi::Poll"); - SteamWebApi::PollApi::Poll(m_hNetlibUser, token, umqId, messageId, pollResult); - - if (!pollResult->IsSuccess()) - return; - - CMStringA updatedIds; - for (size_t i = 0; i < pollResult->GetItemCount(); i++) - { - const SteamWebApi::PollApi::PoolItem *item = pollResult->GetAt(i); - switch (item->GetType()) - { - case SteamWebApi::PollApi::POOL_TYPE_TYPING: - break; - - case SteamWebApi::PollApi::POOL_TYPE_MESSAGE: - { - SteamWebApi::PollApi::Message *message = (SteamWebApi::PollApi::Message*)item; - - MCONTACT hContact = FindContact(message->GetSteamId()); - if (hContact) - { - const wchar_t *text = message->GetText(); - - PROTORECVEVENT recv = { 0 }; - recv.flags = PREF_UTF; - recv.timestamp = message->GetTimestamp(); - recv.szMessage = mir_utf8encodeW(text); - - ProtoChainRecvMsg(hContact, &recv); - } - } - break; - - case SteamWebApi::PollApi::POOL_TYPE_MYMESSAGE: - { - SteamWebApi::PollApi::Message *message = (SteamWebApi::PollApi::Message*)item; - - MCONTACT hContact = FindContact(message->GetSteamId()); - if (hContact) - { - const wchar_t *text = message->GetText(); - - AddDBEvent(hContact, EVENTTYPE_MESSAGE, time(NULL), DBEF_UTF | DBEF_SENT, mir_tstrlen(text), (BYTE*)mir_utf8encodeW(text)); - } - } - break; - - case SteamWebApi::PollApi::POOL_TYPE_STATE: - { - SteamWebApi::PollApi::State *state = (SteamWebApi::PollApi::State*)item; - - WORD status = CSteamProto::SteamToMirandaStatus(state->GetStatus()); - const char *steamId = state->GetSteamId(); - const wchar_t *nickname = state->GetNickname(); - - if (IsMe(steamId)) - { - if (status == ID_STATUS_OFFLINE) - continue; - - if (status != m_iStatus) - { - debugLogA("Change own status to %i", status); - WORD oldStatus = m_iStatus; - m_iStatus = m_iDesiredStatus = status; - ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, m_iStatus); - } - } - /*else - { - MCONTACT hContact = FindContact(steamId); - if (hContact) - SetContactStatus(hContact, status); - }*/ - - if (updatedIds.IsEmpty()) - updatedIds.Append(steamId); - else - updatedIds.AppendFormat(",%s", steamId); - } - break; - - case SteamWebApi::PollApi::POOL_TYPE_CONTACT_ADD: - { - SteamWebApi::PollApi::Relationship *crs = (SteamWebApi::PollApi::Relationship*)item; - - const char *steamId = crs->GetSteamId(); - if (updatedIds.IsEmpty()) - updatedIds.Append(steamId); - else - updatedIds.AppendFormat(",%s", steamId); - } - break; - - case SteamWebApi::PollApi::POOL_TYPE_CONTACT_REMOVE: - { - SteamWebApi::PollApi::Relationship *crs = (SteamWebApi::PollApi::Relationship*)item; - - const char *steamId = crs->GetSteamId(); - MCONTACT hContact = FindContact(steamId); - if (hContact) - CallService(MS_DB_CONTACT_DELETE, hContact, 0); - } - break; - - case SteamWebApi::PollApi::POOL_TYPE_CONTACT_REQUEST: - { - SteamWebApi::PollApi::Relationship *crs = (SteamWebApi::PollApi::Relationship*)item; - - const char *steamId = crs->GetSteamId(); - - MCONTACT hContact = FindContact(steamId); - if (!hContact) - hContact = AddContact(steamId, true); - - RaiseAuthRequestThread((void*)hContact); - } - break; - } - } - - if (!updatedIds.IsEmpty()) - UpdateContactsThread(mir_strdup(updatedIds)); -} - -void CSteamProto::PollingThread(void*) -{ - debugLogA("CSteamProto::PollingThread: entering"); - - ptrA token(getStringA("TokenSecret")); - ptrA umqId(getStringA("UMQID")); - UINT32 messageId = getDword("MessageID", 0); - - SteamWebApi::PollApi::PollResult pollResult; - while (!m_bTerminated) - { - PollServer(token, umqId, messageId, &pollResult); - - if (pollResult.IsNeedRelogin()) - { - debugLogA("CSteamProto::PollingThread: need to relogin"); - SetStatus(ID_STATUS_OFFLINE); - } - - if (!pollResult.IsSuccess()) - { - debugLogA("CSteamProto::PollServer: call SteamWebApi::PollApi::Poll"); - SetStatus(ID_STATUS_OFFLINE); - - // token has expired - if (pollResult.GetStatus() == HTTP_STATUS_UNAUTHORIZED) - { - delSetting("TokenSecret"); - //delSetting("Cookie"); - } - - break; - } - - messageId = pollResult.GetMessageId(); - setDword("MessageID", messageId); - } - - m_hPollingThread = NULL; - debugLogA("CSteamProto::PollingThread: leaving"); -} \ No newline at end of file diff --git a/protocols/Steam/src/Steam/authorization.h b/protocols/Steam/src/Steam/authorization.h deleted file mode 100644 index 57401f91c5..0000000000 --- a/protocols/Steam/src/Steam/authorization.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef _STEAM_AUTHORIZATION_H_ -#define _STEAM_AUTHORIZATION_H_ - -namespace SteamWebApi -{ - class AuthorizationRequest : public HttpsPostRequest - { - public: - AuthorizationRequest(const char *username, const char *password, const char *timestamp) : - HttpsPostRequest(STEAM_WEB_URL "/mobilelogin/dologin") - { - flags = NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMP; - - char data[1024]; - mir_snprintf(data, SIZEOF(data), - "username=%s&password=%s&oauth_client_id=3638BFB1&oauth_scope=read_profile write_profile read_client write_client&captchagid=-1&rsatimestamp=%s", - ptrA(mir_urlEncode(username)), - ptrA(mir_urlEncode(password)), - timestamp); - - SetData(data, mir_strlen(data)); - } - - AuthorizationRequest(const char *username, const char *password, const char *timestamp, const char *guardCode) : - HttpsPostRequest(STEAM_WEB_URL "/mobilelogin/dologin") - { - flags = NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMP; - - char data[1024]; - mir_snprintf(data, SIZEOF(data), - "username=%s&password=%s&emailauth=%s&loginfriendlyname=MirandaNG&oauth_client_id=3638BFB1&oauth_scope=read_profile write_profile read_client write_client&captchagid=-1&rsatimestamp=%s", - ptrA(mir_urlEncode(username)), - ptrA(mir_urlEncode(password)), - guardCode, - timestamp); - - SetData(data, mir_strlen(data)); - } - - AuthorizationRequest(const char *username, const char *password, const char *timestamp, const char *captchaId, const char *captchaText) : - HttpsPostRequest(STEAM_WEB_URL "/mobilelogin/dologin") - { - flags = NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMP; - - char data[1024]; - mir_snprintf(data, SIZEOF(data), - "username=%s&password=%s&emailauth=&captchagid=%s&captcha_text=%s&oauth_client_id=3638BFB1&oauth_scope=read_profile write_profile read_client write_client&rsatimestamp=%s", - ptrA(mir_urlEncode(username)), - ptrA(mir_urlEncode(password)), - captchaId, - ptrA(mir_urlEncode(captchaText)), - timestamp); - - SetData(data, mir_strlen(data)); - } - }; -} - -#endif //_STEAM_AUTHORIZATION_H_ \ No newline at end of file diff --git a/protocols/Steam/src/Steam/avatar.h b/protocols/Steam/src/Steam/avatar.h deleted file mode 100644 index e306b7dfb8..0000000000 --- a/protocols/Steam/src/Steam/avatar.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _STEAM_AVATAR_H_ -#define _STEAM_AVATAR_H_ - -namespace SteamWebApi -{ - class GetAvatarRequest : public HttpGetRequest - { - public: - GetAvatarRequest(const char *url) : - HttpGetRequest(url) - { - flags = NLHRF_HTTP11 | NLHRF_NODUMP; - } - }; -} - - -#endif //_STEAM_AVATAR_H_ \ No newline at end of file diff --git a/protocols/Steam/src/Steam/captcha.h b/protocols/Steam/src/Steam/captcha.h deleted file mode 100644 index 6ad01048ca..0000000000 --- a/protocols/Steam/src/Steam/captcha.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _STEAM_CAPTCHA_H_ -#define _STEAM_CAPTCHA_H_ - -namespace SteamWebApi -{ - class GetCaptchaRequest : public HttpGetRequest - { - public: - GetCaptchaRequest(const char *captchaId) : - HttpGetRequest(STEAM_WEB_URL "/public/captcha.php?gid=%s", captchaId) - { - flags = NLHRF_HTTP11 | NLHRF_NODUMP; - } - }; -} - - -#endif //_STEAM_CAPTCHA_H_ \ No newline at end of file diff --git a/protocols/Steam/src/Steam/crypto.h b/protocols/Steam/src/Steam/crypto.h deleted file mode 100644 index 729dc2a591..0000000000 --- a/protocols/Steam/src/Steam/crypto.h +++ /dev/null @@ -1,123 +0,0 @@ -#ifndef _STEAM_CRYPTO_H_ -#define _STEAM_CRYPTO_H_ - -#include -#include -#include -#include -#include -#include -#include - -namespace SteamWebApi -{ - class CryptoApi : public BaseApi - { - public: - - class RsaKey : public Result - { - friend CryptoApi; - - private: - std::string modulus; - std::string exponent; - time_t timestamp; - - public: - RsaKey() : timestamp(0) { } - - const char * GetModulus() const - { - return modulus.c_str(); - } - - const char * GetExponent() const - { - return exponent.c_str(); - } - - time_t GetTimestamp() const - { - return timestamp; - } - - int GetEncryptedSize() const - { - BIGNUM *n = BN_new(); - if (!BN_hex2bn(&n, modulus.c_str())) - return NULL; - - BIGNUM *e = BN_new(); - if (!BN_hex2bn(&e, exponent.c_str())) - return NULL; - - RSA *rsa = RSA_new(); - rsa->n = n; - rsa->e = e; - - int size = RSA_size(rsa); - - RSA_free(rsa); - - return size; - } - - int Encrypt(BYTE *data, int dataSize, BYTE *encrypted) const - { - BIGNUM *n = BN_new(); - if (!BN_hex2bn(&n, modulus.c_str())) - return NULL; - - BIGNUM *e = BN_new(); - if (!BN_hex2bn(&e, exponent.c_str())) - return NULL; - - RSA *rsa = RSA_new(); - rsa->n = n; - rsa->e = e; - - if (RSA_public_encrypt(dataSize, data, encrypted, rsa, RSA_PKCS1_PADDING) < 0) - { - RSA_free(rsa); - return 1; - } - - RSA_free(rsa); - return 0; - } - }; - - static void GetRsaKey(HANDLE hConnection, const char *username, RsaKey *rsaKey) - { - rsaKey->success = false; - - HttpRequest request(hConnection, REQUEST_GET, STEAM_COMMUNITY_URL "/mobilelogin/getrsakey"); - request.AddParameter("username", username); - - mir_ptr response(request.Send()); - if (!response || response->resultCode != HTTP_STATUS_OK) - return; - - JSONROOT root(response->pData); - if (!root) return; - - JSONNODE *node = json_get(root, "success"); - if (!json_as_bool(node)) return; - - node = json_get(root, "publickey_mod"); - rsaKey->modulus = ptrA(mir_u2a(json_as_string(node))); - - node = json_get(root, "publickey_exp"); - rsaKey->exponent = ptrA(mir_u2a(json_as_string(node))); - - node = json_get(root, "timestamp"); - rsaKey->timestamp = _atoi64(ptrA(mir_u2a(json_as_string(node)))); - - rsaKey->success = true; - } - }; -} - - -#endif //_STEAM_CRYPTO_H_ \ No newline at end of file diff --git a/protocols/Steam/src/Steam/friend.h b/protocols/Steam/src/Steam/friend.h deleted file mode 100644 index 14c5250c97..0000000000 --- a/protocols/Steam/src/Steam/friend.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _STEAM_FRIEND_H_ -#define _STEAM_FRIEND_H_ - -namespace SteamWebApi -{ - class GetUserSummariesRequest : public HttpsGetRequest - { - public: - GetUserSummariesRequest(const char *token, const char *steamIds) : - HttpsGetRequest(STEAM_API_URL "/ISteamUserOAuth/GetUserSummaries/v0001") - { - AddParameter("access_token", token); - AddParameter("steamids", steamIds); - } - }; -} - -#endif //_STEAM_FRIEND_H_ \ No newline at end of file diff --git a/protocols/Steam/src/Steam/friend_list.h b/protocols/Steam/src/Steam/friend_list.h deleted file mode 100644 index cfa383c533..0000000000 --- a/protocols/Steam/src/Steam/friend_list.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef _STEAM_FRIEND_LIST_H_ -#define _STEAM_FRIEND_LIST_H_ - -namespace SteamWebApi -{ - class GetFriendListRequest : public HttpsGetRequest - { - public: - GetFriendListRequest(const char *token, const char *steamId, const char *relationship = "friend,ignoredfriend,requestrecipient") : - HttpsGetRequest(STEAM_API_URL "/ISteamUserOAuth/GetFriendList/v0001") - { - AddParameter("access_token", token); - AddParameter("steamid", steamId); - AddParameter("relationship", relationship); - } - }; - - class AddFriendRequest : public HttpsPostRequest - { - public: - AddFriendRequest(const char *token, const char *sessionId, const char *steamId, const char *who) : - HttpsPostRequest(STEAM_WEB_URL "/actions/AddFriendAjax") - { - char login[MAX_PATH]; - mir_snprintf(login, SIZEOF(login), "%s||oauth:%s", steamId, token); - - char cookie[MAX_PATH]; - mir_snprintf(cookie, SIZEOF(cookie), "steamLogin=%s;sessionid=%s;forceMobile=1", login, sessionId); - - char data[128]; - mir_snprintf(data, SIZEOF(data), - "sessionID=%s&steamid=%s", - sessionId, - who); - - SetData(data, mir_strlen(data)); - AddHeader("Cookie", cookie); - } - }; - - class BlockFriendRequest : public HttpsPostRequest - { - public: - BlockFriendRequest(const char *token, const char *sessionId, const char *steamId, const char *who) : - HttpsPostRequest(STEAM_WEB_URL "/actions/BlockUserAjax") - { - char login[MAX_PATH]; - mir_snprintf(login, SIZEOF(login), "%s||oauth:%s", steamId, token); - - char cookie[MAX_PATH]; - mir_snprintf(cookie, SIZEOF(cookie), "steamLogin=%s;sessionid=%s;forceMobile=1", login, sessionId); - - char data[128]; - mir_snprintf(data, SIZEOF(data), - "sessionID=%s&action=ignore&steamid=%s", - sessionId, - who); - - SetData(data, mir_strlen(data)); - AddHeader("Cookie", cookie); - } - }; - - class RemoveFriendRequest : public HttpsPostRequest - { - public: - RemoveFriendRequest(const char *token, const char *sessionId, const char *steamId, const char *who) : - HttpsPostRequest(STEAM_WEB_URL "/actions/RemoveFriendAjax") - { - char login[MAX_PATH]; - mir_snprintf(login, SIZEOF(login), "%s||oauth:%s", steamId, token); - - char cookie[MAX_PATH]; - mir_snprintf(cookie, SIZEOF(cookie), "steamLogin=%s;sessionid=%s;forceMobile=1", login, sessionId); - - char data[128]; - mir_snprintf(data, SIZEOF(data), - "sessionID=%s&steamid=%s", - sessionId, - who); - - SetData(data, mir_strlen(data)); - AddHeader("Cookie", cookie); - } - }; -} - -#endif //_STEAM_FRIEND_LIST_H_ \ No newline at end of file diff --git a/protocols/Steam/src/Steam/login.h b/protocols/Steam/src/Steam/login.h deleted file mode 100644 index e2b9b41a81..0000000000 --- a/protocols/Steam/src/Steam/login.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef _STEAM_LOGIN_H_ -#define _STEAM_LOGIN_H_ - -namespace SteamWebApi -{ - class LogonRequest : public HttpsPostRequest - { - public: - LogonRequest(const char *token) : - HttpsPostRequest(STEAM_API_URL "/ISteamWebUserPresenceOAuth/Logon/v0001") - { - char data[256]; - mir_snprintf(data, SIZEOF(data), "access_token=%s&ui_mode=web", token); - - SetData(data, mir_strlen(data)); - } - }; - - class LogoffRequest : public HttpsPostRequest - { - public: - LogoffRequest(const char *token, const char *umqId) : - HttpsPostRequest(STEAM_API_URL "/ISteamWebUserPresenceOAuth/Logoff/v0001") - { - char data[256]; - mir_snprintf(data, SIZEOF(data), "access_token=%s&umqid=%s", token, umqId); - - SetData(data, mir_strlen(data)); - } - }; -} - -#endif //_STEAM_LOGIN_H_ \ No newline at end of file diff --git a/protocols/Steam/src/Steam/message.h b/protocols/Steam/src/Steam/message.h deleted file mode 100644 index bf0cb78b3d..0000000000 --- a/protocols/Steam/src/Steam/message.h +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef _STEAM_MESSAGE_H_ -#define _STEAM_MESSAGE_H_ - -namespace SteamWebApi -{ - //class MessageApi : public BaseApi - //{ - //public: - // class SendResult : public Result - // { - // friend MessageApi; - - // private: - // DWORD timestamp; - - // public: - // SendResult() : timestamp(0) { } - - // const DWORD GetTimestamp() const { return timestamp; } - // }; - - // static void SendStatus(HANDLE hConnection, const char *token, const char *umqId, int state, SendResult *sendResult) - // { - // sendResult->success = false; - - // char data[256]; - // mir_snprintf(data, SIZEOF(data), - // "access_token=%s&umqid=%s&type=personastate&persona_state=%i", - // token, - // umqId, - // state); - - // SecureHttpPostRequest request(hConnection, STEAM_API_URL "/ISteamWebUserPresenceOAuth/Message/v0001"); - // request.SetData(data, mir_strlen(data)); - - // mir_ptr response(request.Send()); - // if (!response) - // return; - - // if ((sendResult->status = (HTTP_STATUS)response->resultCode) != HTTP_STATUS_OK) - // return; - - // sendResult->success = true; - // } - - // static void SendMessage(HANDLE hConnection, const char *token, const char *umqId, const char *steamId, const char *text, SendResult *sendResult) - // { - // sendResult->success = false; - - // char data[1024]; - // mir_snprintf(data, SIZEOF(data), - // "access_token=%s&umqid=%s&steamid_dst=%s&type=saytext&text=%s", - // token, - // umqId, - // steamId, - // ptrA(mir_urlEncode(text))); - - // SecureHttpPostRequest request(hConnection, STEAM_API_URL "/ISteamWebUserPresenceOAuth/Message/v0001"); - // request.SetData(data, mir_strlen(data)); - - // mir_ptr response(request.Send()); - // if (!response) - // return; - - // if ((sendResult->status = (HTTP_STATUS)response->resultCode) != HTTP_STATUS_OK) - // return; - - // JSONROOT root(response->pData); - - // JSONNODE *node = json_get(root, "error"); - // ptrT error(json_as_string(node)); - - // if (mir_tstrcmp(error, _T("OK"))) - // return; - - // node = json_get(root, "utc_timestamp"); - // sendResult->timestamp = atol(ptrA(mir_u2a(ptrT(json_as_string(node))))); - - // sendResult->success = true; - // } - - // static void SendTyping(HANDLE hConnection, const char *token, const char *umqId, const char *steamId, SendResult *sendResult) - // { - // sendResult->success = false; - - // char data[256]; - // mir_snprintf(data, SIZEOF(data), - // "access_token=%s&umqid=%s&steamid_dst=%s&type=typing", - // token, - // umqId, - // steamId); - - // SecureHttpPostRequest request(hConnection, STEAM_API_URL "/ISteamWebUserPresenceOAuth/Message/v0001"); - // request.SetData(data, mir_strlen(data)); - - // mir_ptr response(request.Send()); - // if (!response) - // return; - - // if ((sendResult->status = (HTTP_STATUS)response->resultCode) != HTTP_STATUS_OK) - // return; - - // sendResult->success = true; - // } - //}; - - class SendMessageRequest : public HttpsPostRequest - { - public: - SendMessageRequest(const char *token, const char *umqId, const char *steamId, const char *text) : - HttpsPostRequest(STEAM_API_URL "/ISteamWebUserPresenceOAuth/Message/v0001") - { - CMStringA data; - data.AppendFormat("access_token=%s&umqid=%s&steamid_dst=%s&type=saytext&text=%s", - token, - umqId, - steamId, - ptrA(mir_urlEncode(text))); - - SetData(data, data.GetLength()); - } - }; -} - - -#endif //_STEAM_MESSAGE_H_ \ No newline at end of file diff --git a/protocols/Steam/src/Steam/pending.h b/protocols/Steam/src/Steam/pending.h deleted file mode 100644 index 65a72d25d4..0000000000 --- a/protocols/Steam/src/Steam/pending.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef _STEAM_PENDING_H_ -#define _STEAM_PENDING_H_ - -namespace SteamWebApi -{ - class ApprovePendingRequest : public HttpsPostRequest - { - public: - ApprovePendingRequest(const char *token, const char *sessionId, const char *steamId, const char *who) : - HttpsPostRequest(STEAM_WEB_URL "/profiles/%s/home_process", steamId) - { - char login[MAX_PATH]; - mir_snprintf(login, SIZEOF(login), "%s||oauth:%s", steamId, token); - - char cookie[MAX_PATH]; - mir_snprintf(cookie, SIZEOF(cookie), "steamLogin=%s;sessionid=%s;forceMobile=1", login, sessionId); - - char data[MAX_PATH]; - mir_snprintf(data, SIZEOF(data), "sessionID=%s&id=%s&perform=accept&action=approvePending&itype=friend&json=1&xml=0", sessionId, who); - - SetData(data, mir_strlen(data)); - AddHeader("Cookie", cookie); - } - }; - - class IgnorePendingRequest : public HttpsPostRequest - { - public: - IgnorePendingRequest(const char *token, const char *sessionId, const char *steamId, const char *who) : - HttpsPostRequest(STEAM_WEB_URL "/profiles/%s/home_process", steamId) - { - char login[MAX_PATH]; - mir_snprintf(login, SIZEOF(login), "%s||oauth:%s", steamId, token); - - char cookie[MAX_PATH]; - mir_snprintf(cookie, SIZEOF(cookie), "steamLogin=%s;sessionid=%s;forceMobile=1", login, sessionId); - - char data[MAX_PATH]; - mir_snprintf(data, SIZEOF(data), "sessionID=%s&id=%s&perform=ignore&action=approvePending&itype=friend&json=1&xml=0", sessionId, who); - - SetData(data, mir_strlen(data)); - AddHeader("Cookie", cookie); - } - }; - - class BlockPendingRequest : public HttpsPostRequest - { - public: - BlockPendingRequest(const char *token, const char *sessionId, const char *steamId, const char *who) : - HttpsPostRequest(STEAM_WEB_URL "/profiles/%s/home_process", steamId) - { - char login[MAX_PATH]; - mir_snprintf(login, SIZEOF(login), "%s||oauth:%s", steamId, token); - - char cookie[MAX_PATH]; - mir_snprintf(cookie, SIZEOF(cookie), "steamLogin=%s;sessionid=%s;forceMobile=1", login, sessionId); - - char data[MAX_PATH]; - mir_snprintf(data, SIZEOF(data), "sessionID=%s&id=%s&perform=block&action=approvePending&itype=friend&json=1&xml=0", sessionId, who); - - SetData(data, mir_strlen(data)); - AddHeader("Cookie", cookie); - } - }; -} - -#endif //_STEAM_PENDING_H_ \ No newline at end of file diff --git a/protocols/Steam/src/Steam/poll.h b/protocols/Steam/src/Steam/poll.h deleted file mode 100644 index 33ffe6dce5..0000000000 --- a/protocols/Steam/src/Steam/poll.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _STEAM_POLL_H_ -#define _STEAM_POLL_H_ - -namespace SteamWebApi -{ - class PollRequest : public HttpsPostRequest - { - public: - PollRequest(const char *token, const char *umqId, UINT32 messageId, int idleSeconds) : - HttpsPostRequest(STEAM_API_URL "/ISteamWebUserPresenceOAuth/Poll/v0001") - { - timeout = (STEAM_API_TIMEOUT + 5) * 1000; - flags |= NLHRF_PERSISTENT; - - CMStringA data; - data.AppendFormat("access_token=%s&umqid=%s&message=%u&secidletime=%d§imeout=%d", - token, - umqId, - messageId, - idleSeconds, - STEAM_API_TIMEOUT); - - SetData(data, data.GetLength()); - - AddHeader("Connection", "keep-alive"); - } - }; -} - -#endif //_STEAM_POLL_H_ \ No newline at end of file diff --git a/protocols/Steam/src/Steam/rsa_key.h b/protocols/Steam/src/Steam/rsa_key.h deleted file mode 100644 index be7d7ac79c..0000000000 --- a/protocols/Steam/src/Steam/rsa_key.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _STEAM_RSA_KEY_H_ -#define _STEAM_RSA_KEY_H_ - -namespace SteamWebApi -{ - class RsaKeyRequest : public HttpsGetRequest - { - public: - RsaKeyRequest(const char *username) : - HttpsGetRequest(STEAM_WEB_URL "/mobilelogin/getrsakey") - { - flags = NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMP; - - AddParameter("username", (char*)username); - } - }; -} - -#endif //_STEAM_RSA_KEY_H_ \ No newline at end of file diff --git a/protocols/Steam/src/Steam/search.h b/protocols/Steam/src/Steam/search.h deleted file mode 100644 index 4cdd4179e0..0000000000 --- a/protocols/Steam/src/Steam/search.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _STEAM_SEARCH_H_ -#define _STEAM_SEARCH_H_ - -namespace SteamWebApi -{ - class SearchRequest : public HttpsGetRequest - { - public: - SearchRequest(const char *token, const char *text) : - HttpsGetRequest(STEAM_API_URL "/ISteamUserOAuth/Search/v0001") - { - AddParameter("access_token", token); - AddParameter("keywords", ptrA(mir_urlEncode(text))); - // todo: may need to load all results (15 first at now) - AddParameter("offset=0&count=15&targets=users&fields=all"); - } - }; -} - -#endif //_STEAM_SEARCH_H_ \ No newline at end of file diff --git a/protocols/Steam/src/Steam/session.h b/protocols/Steam/src/Steam/session.h deleted file mode 100644 index 20a5d7db53..0000000000 --- a/protocols/Steam/src/Steam/session.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _STEAM_SESSION_H_ -#define _STEAM_SESSION_H_ - -namespace SteamWebApi -{ - class GetSessionRequest : public HttpsPostRequest - { - public: - GetSessionRequest(const char *token, const char *steamId, const char *cookie) : - HttpsPostRequest(STEAM_WEB_URL "/mobileloginsucceeded") - { - flags = NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMP; - - char data[512]; - mir_snprintf(data, SIZEOF(data), - "oauth_token=%s&steamid=%s&webcookie=%s", - token, - steamId, - cookie); - - SetData(data, mir_strlen(data)); - } - }; -} - -#endif //_STEAM_SESSION_H_ \ No newline at end of file diff --git a/protocols/Steam/src/Steam/steam.h b/protocols/Steam/src/Steam/steam.h deleted file mode 100644 index a2a373a3d3..0000000000 --- a/protocols/Steam/src/Steam/steam.h +++ /dev/null @@ -1,185 +0,0 @@ -#ifndef _STEAM_H_ -#define _STEAM_H_ - -namespace SteamWebApi -{ - #define STEAM_API_URL "https://api.steampowered.com" - #define STEAM_WEB_URL "https://steamcommunity.com" - - class HttpRequest : public NETLIBHTTPREQUEST, public MZeroedObject - { - private: - CMStringA url; - - protected: - HttpRequest() - { - cbSize = sizeof(NETLIBHTTPREQUEST); - - AddHeader("user-agent", "Steam 1.2.0 / iPhone"); - } - - HttpRequest(int type, LPCSTR urlFormat, va_list args) - { - this->HttpRequest::HttpRequest(); - - requestType = type; - //timeout = 0; - flags = NLHRF_HTTP11 | NLHRF_NODUMPSEND | NLHRF_DUMPASTEXT; - - url.AppendFormatV(urlFormat, args); - szUrl = url.GetBuffer(); - } - - void AddHeader(LPCSTR szName, LPCSTR szValue) - { - headers = (NETLIBHTTPHEADER*)mir_realloc(headers, sizeof(NETLIBHTTPHEADER)*(headersCount + 1)); - headers[headersCount].szName = mir_strdup(szName); - headers[headersCount].szValue = mir_strdup(szValue); - headersCount++; - } - - void AddParameter(const char *fmt, ...) - { - va_list args; - va_start(args, fmt); - if (url.Find('?') == -1) - url += '?'; - else - url += '&'; - url.AppendFormatV(fmt, args); - va_end(args); - - szUrl = url.GetBuffer(); - } - - void AddParameter(LPCSTR name, LPCSTR value) - { - AddParameter("%s=%s", name, value); - } - - void SetData(const char *data, size_t size) - { - if (pData != NULL) - mir_free(pData); - - dataLength = (int)size; - pData = (char*)mir_alloc(size + 1); - memcpy(pData, data, size); - pData[size] = 0; - } - - public: - HttpRequest(int type, LPCSTR urlFormat, ...) - { - va_list args; - va_start(args, urlFormat); - this->HttpRequest::HttpRequest(type, urlFormat, args); - va_end(args); - } - - ~HttpRequest() - { - for (int i = 0; i < headersCount; i++) - { - mir_free(headers[i].szName); - mir_free(headers[i].szValue); - } - mir_free(headers); - mir_free(pData); - } - - NETLIBHTTPREQUEST * Send(HANDLE hConnection) - { - char message[1024]; - mir_snprintf(message, SIZEOF(message), "Send request to %s", szUrl); - CallService(MS_NETLIB_LOG, (WPARAM)hConnection, (LPARAM)&message); - - return (NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM)hConnection, (LPARAM)this); - } - }; - - class HttpGetRequest : public HttpRequest - { - public: - HttpGetRequest(LPCSTR urlFormat, ...) : HttpRequest() - { - va_list args; - va_start(args, urlFormat); - this->HttpRequest::HttpRequest(REQUEST_GET, urlFormat, args); - va_end(args); - } - }; - - class HttpPostRequest : public HttpRequest - { - public: - HttpPostRequest(LPCSTR urlFormat, ...) : HttpRequest() - { - va_list args; - va_start(args, urlFormat); - this->HttpRequest::HttpRequest(REQUEST_POST, urlFormat, args); - va_end(args); - - AddHeader("Content-Type", "application/x-www-form-urlencoded"); - } - }; - - class HttpsRequest : public HttpRequest - { - protected: - HttpsRequest() : HttpRequest() { } - - public: - HttpsRequest(int type, LPCSTR urlFormat, ...) : HttpRequest() - { - va_list args; - va_start(args, urlFormat); - this->HttpRequest::HttpRequest(type, urlFormat, args); - va_end(args); - - flags = NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMPSEND | NLHRF_DUMPASTEXT; - } - }; - - class HttpsGetRequest : public HttpsRequest - { - public: - HttpsGetRequest(LPCSTR urlFormat, ...) : HttpsRequest() - { - va_list args; - va_start(args, urlFormat); - this->HttpRequest::HttpRequest(REQUEST_GET, urlFormat, args); - va_end(args); - } - }; - - class HttpsPostRequest : public HttpsRequest - { - public: - HttpsPostRequest(LPCSTR urlFormat, ...) : HttpsRequest() - { - va_list args; - va_start(args, urlFormat); - this->HttpRequest::HttpRequest(REQUEST_POST, urlFormat, args); - va_end(args); - - AddHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); - } - }; -} - -#include "Steam\rsa_key.h" -#include "Steam\authorization.h" -#include "Steam\login.h" -#include "Steam\session.h" -#include "Steam\friend_list.h" -#include "Steam\pending.h" -#include "Steam\friend.h" -#include "Steam\poll.h" -#include "Steam\message.h" -#include "Steam\search.h" -#include "Steam\avatar.h" -#include "Steam\captcha.h" - -#endif //_STEAM_H_ \ No newline at end of file diff --git a/protocols/Steam/src/api/authorization.h b/protocols/Steam/src/api/authorization.h new file mode 100644 index 0000000000..e7b2ee8c39 --- /dev/null +++ b/protocols/Steam/src/api/authorization.h @@ -0,0 +1,59 @@ +#ifndef _STEAM_REQUEST_AUTHORIZATION_H_ +#define _STEAM_REQUEST_AUTHORIZATION_H_ + +class AuthorizationRequest : public HttpRequest +{ +public: + AuthorizationRequest(const char *username, const char *password, const char *timestamp) : + HttpRequest(REQUEST_POST, STEAM_WEB_URL "/mobilelogin/dologin") + { + flags = NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMP; + + char data[1024]; + mir_snprintf(data, SIZEOF(data), + "username=%s&password=%s&oauth_client_id=3638BFB1&oauth_scope=read_profile write_profile read_client write_client&captchagid=-1&rsatimestamp=%s", + ptrA(mir_urlEncode(username)), + ptrA(mir_urlEncode(password)), + timestamp); + + SetData(data, strlen(data)); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } + + AuthorizationRequest(const char *username, const char *password, const char *timestamp, const char *guardCode) : + HttpRequest(REQUEST_POST, STEAM_WEB_URL "/mobilelogin/dologin") + { + flags = NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMP; + + char data[1024]; + mir_snprintf(data, SIZEOF(data), + "username=%s&password=%s&emailauth=%s&loginfriendlyname=MirandaNG&oauth_client_id=3638BFB1&oauth_scope=read_profile write_profile read_client write_client&captchagid=-1&rsatimestamp=%s", + ptrA(mir_urlEncode(username)), + ptrA(mir_urlEncode(password)), + guardCode, + timestamp); + + SetData(data, strlen(data)); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } + + AuthorizationRequest(const char *username, const char *password, const char *timestamp, const char *captchaId, const char *captchaText) : + HttpRequest(REQUEST_POST, STEAM_WEB_URL "/mobilelogin/dologin") + { + flags = NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMP; + + char data[1024]; + mir_snprintf(data, SIZEOF(data), + "username=%s&password=%s&emailauth=&captchagid=%s&captcha_text=%s&oauth_client_id=3638BFB1&oauth_scope=read_profile write_profile read_client write_client&rsatimestamp=%s", + ptrA(mir_urlEncode(username)), + ptrA(mir_urlEncode(password)), + captchaId, + ptrA(mir_urlEncode(captchaText)), + timestamp); + + SetData(data, strlen(data)); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } +}; + +#endif //_STEAM_REQUEST_AUTHORIZATION_H_ diff --git a/protocols/Steam/src/api/avatar.h b/protocols/Steam/src/api/avatar.h new file mode 100644 index 0000000000..ef4fcdfcf5 --- /dev/null +++ b/protocols/Steam/src/api/avatar.h @@ -0,0 +1,14 @@ +#ifndef _STEAM_REQUEST_AVATAR_H_ +#define _STEAM_REQUEST_AVATAR_H_ + +class GetAvatarRequest : public HttpRequest +{ +public: + GetAvatarRequest(const char *url) : + HttpRequest(REQUEST_GET, url) + { + flags = NLHRF_HTTP11 | NLHRF_NODUMP; + } +}; + +#endif //_STEAM_REQUEST_AVATAR_H_ diff --git a/protocols/Steam/src/api/captcha.h b/protocols/Steam/src/api/captcha.h new file mode 100644 index 0000000000..b61dca89d6 --- /dev/null +++ b/protocols/Steam/src/api/captcha.h @@ -0,0 +1,14 @@ +#ifndef _STEAM_REQUEST_CAPTCHA_H_ +#define _STEAM_REQUEST_CAPTCHA_H_ + +class GetCaptchaRequest : public HttpRequest +{ +public: + GetCaptchaRequest(const char *captchaId) : + HttpRequest(REQUEST_GET, FORMAT, STEAM_WEB_URL "/public/captcha.php?gid=%s", captchaId) + { + flags = NLHRF_HTTP11 | NLHRF_NODUMP; + } +}; + +#endif //_STEAM_REQUEST_CAPTCHA_H_ diff --git a/protocols/Steam/src/api/friend.h b/protocols/Steam/src/api/friend.h new file mode 100644 index 0000000000..d0fd70fa22 --- /dev/null +++ b/protocols/Steam/src/api/friend.h @@ -0,0 +1,15 @@ +#ifndef _STEAM_REQUEST_FRIEND_H_ +#define _STEAM_REQUEST_FRIEND_H_ + +class GetUserSummariesRequest : public HttpRequest +{ +public: + GetUserSummariesRequest(const char *token, const char *steamIds) : + HttpRequest(REQUEST_GET, STEAM_API_URL "/ISteamUserOAuth/GetUserSummaries/v0001") + { + AddParameter("access_token", token); + AddParameter("steamids", steamIds); + } +}; + +#endif //_STEAM_REQUEST_FRIEND_H_ diff --git a/protocols/Steam/src/api/friend_list.h b/protocols/Steam/src/api/friend_list.h new file mode 100644 index 0000000000..4c1d6f8ef2 --- /dev/null +++ b/protocols/Steam/src/api/friend_list.h @@ -0,0 +1,88 @@ +#ifndef _STEAM_REQUEST_FRIEND_LIST_H_ +#define _STEAM_REQUEST_FRIEND_LIST_H_ + +class GetFriendListRequest : public HttpRequest +{ +public: + GetFriendListRequest(const char *token, const char *steamId, const char *relationship = "friend,ignoredfriend,requestrecipient") : + HttpRequest(REQUEST_GET, STEAM_API_URL "/ISteamUserOAuth/GetFriendList/v0001") + { + AddParameter("access_token", token); + AddParameter("steamid", steamId); + AddParameter("relationship", relationship); + } +}; + +class AddFriendRequest : public HttpRequest +{ +public: + AddFriendRequest(const char *token, const char *sessionId, const char *steamId, const char *who) : + HttpRequest(REQUEST_POST, STEAM_WEB_URL "/actions/AddFriendAjax") + { + char login[MAX_PATH]; + mir_snprintf(login, SIZEOF(login), "%s||oauth:%s", steamId, token); + + char cookie[MAX_PATH]; + mir_snprintf(cookie, SIZEOF(cookie), "steamLogin=%s;sessionid=%s;forceMobile=1", login, sessionId); + + char data[128]; + mir_snprintf(data, SIZEOF(data), + "sessionID=%s&steamid=%s", + sessionId, + who); + + SetData(data, strlen(data)); + AddHeader("Cookie", cookie); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } +}; + +class BlockFriendRequest : public HttpRequest +{ +public: + BlockFriendRequest(const char *token, const char *sessionId, const char *steamId, const char *who) : + HttpRequest(REQUEST_POST, STEAM_WEB_URL "/actions/BlockUserAjax") + { + char login[MAX_PATH]; + mir_snprintf(login, SIZEOF(login), "%s||oauth:%s", steamId, token); + + char cookie[MAX_PATH]; + mir_snprintf(cookie, SIZEOF(cookie), "steamLogin=%s;sessionid=%s;forceMobile=1", login, sessionId); + + char data[128]; + mir_snprintf(data, SIZEOF(data), + "sessionID=%s&action=ignore&steamid=%s", + sessionId, + who); + + SetData(data, strlen(data)); + AddHeader("Cookie", cookie); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } +}; + +class RemoveFriendRequest : public HttpRequest +{ +public: + RemoveFriendRequest(const char *token, const char *sessionId, const char *steamId, const char *who) : + HttpRequest(REQUEST_POST, STEAM_WEB_URL "/actions/RemoveFriendAjax") + { + char login[MAX_PATH]; + mir_snprintf(login, SIZEOF(login), "%s||oauth:%s", steamId, token); + + char cookie[MAX_PATH]; + mir_snprintf(cookie, SIZEOF(cookie), "steamLogin=%s;sessionid=%s;forceMobile=1", login, sessionId); + + char data[128]; + mir_snprintf(data, SIZEOF(data), + "sessionID=%s&steamid=%s", + sessionId, + who); + + SetData(data, strlen(data)); + AddHeader("Cookie", cookie); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } +}; + +#endif //_STEAM_REQUEST_FRIEND_LIST_H_ diff --git a/protocols/Steam/src/api/login.h b/protocols/Steam/src/api/login.h new file mode 100644 index 0000000000..64b41f07cb --- /dev/null +++ b/protocols/Steam/src/api/login.h @@ -0,0 +1,32 @@ +#ifndef _STEAM_REQUEST_LOGIN_H_ +#define _STEAM_REQUEST_LOGIN_H_ + +class LogonRequest : public HttpRequest +{ +public: + LogonRequest(const char *token) : + HttpRequest(REQUEST_POST, STEAM_API_URL "/ISteamWebUserPresenceOAuth/Logon/v0001") + { + char data[256]; + mir_snprintf(data, SIZEOF(data), "access_token=%s&ui_mode=web", token); + + SetData(data, strlen(data)); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } +}; + +class LogoffRequest : public HttpRequest +{ +public: + LogoffRequest(const char *token, const char *umqId) : + HttpRequest(REQUEST_POST, STEAM_API_URL "/ISteamWebUserPresenceOAuth/Logoff/v0001") + { + char data[256]; + mir_snprintf(data, SIZEOF(data), "access_token=%s&umqid=%s", token, umqId); + + SetData(data, strlen(data)); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } +}; + +#endif //_STEAM_REQUEST_LOGIN_H_ diff --git a/protocols/Steam/src/api/message.h b/protocols/Steam/src/api/message.h new file mode 100644 index 0000000000..cb3a1f0590 --- /dev/null +++ b/protocols/Steam/src/api/message.h @@ -0,0 +1,22 @@ +#ifndef _STEAM_REQUEST_MESSAGE_H_ +#define _STEAM_REQUEST_MESSAGE_H_ + +class SendMessageRequest : public HttpRequest +{ +public: + SendMessageRequest(const char *token, const char *umqId, const char *steamId, const char *text) : + HttpRequest(REQUEST_POST, STEAM_API_URL "/ISteamWebUserPresenceOAuth/Message/v0001") + { + CMStringA data; + data.AppendFormat("access_token=%s&umqid=%s&steamid_dst=%s&type=saytext&text=%s", + token, + umqId, + steamId, + ptrA(mir_urlEncode(text))); + + SetData(data, data.GetLength()); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } +}; + +#endif //_STEAM_REQUEST_MESSAGE_H_ diff --git a/protocols/Steam/src/api/pending.h b/protocols/Steam/src/api/pending.h new file mode 100644 index 0000000000..f9965d341f --- /dev/null +++ b/protocols/Steam/src/api/pending.h @@ -0,0 +1,67 @@ +#ifndef _STEAM_REQUEST_PENDING_H_ +#define _STEAM_REQUEST_PENDING_H_ + +class ApprovePendingRequest : public HttpRequest +{ +public: + ApprovePendingRequest(const char *token, const char *sessionId, const char *steamId, const char *who) : + HttpRequest(REQUEST_POST, FORMAT, STEAM_WEB_URL "/profiles/%s/home_process", steamId) + { + char login[MAX_PATH]; + mir_snprintf(login, SIZEOF(login), "%s||oauth:%s", steamId, token); + + char cookie[MAX_PATH]; + mir_snprintf(cookie, SIZEOF(cookie), "steamLogin=%s;sessionid=%s;forceMobile=1", login, sessionId); + + char data[MAX_PATH]; + mir_snprintf(data, SIZEOF(data), "sessionID=%s&id=%s&perform=accept&action=approvePending&itype=friend&json=1&xml=0", sessionId, who); + + SetData(data, strlen(data)); + AddHeader("Cookie", cookie); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } +}; + +class IgnorePendingRequest : public HttpRequest +{ +public: + IgnorePendingRequest(const char *token, const char *sessionId, const char *steamId, const char *who) : + HttpRequest(REQUEST_POST, FORMAT, STEAM_WEB_URL "/profiles/%s/home_process", steamId) + { + char login[MAX_PATH]; + mir_snprintf(login, SIZEOF(login), "%s||oauth:%s", steamId, token); + + char cookie[MAX_PATH]; + mir_snprintf(cookie, SIZEOF(cookie), "steamLogin=%s;sessionid=%s;forceMobile=1", login, sessionId); + + char data[MAX_PATH]; + mir_snprintf(data, SIZEOF(data), "sessionID=%s&id=%s&perform=ignore&action=approvePending&itype=friend&json=1&xml=0", sessionId, who); + + SetData(data, strlen(data)); + AddHeader("Cookie", cookie); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } +}; + +class BlockPendingRequest : public HttpRequest +{ +public: + BlockPendingRequest(const char *token, const char *sessionId, const char *steamId, const char *who) : + HttpRequest(REQUEST_POST, FORMAT, STEAM_WEB_URL "/profiles/%s/home_process", steamId) + { + char login[MAX_PATH]; + mir_snprintf(login, SIZEOF(login), "%s||oauth:%s", steamId, token); + + char cookie[MAX_PATH]; + mir_snprintf(cookie, SIZEOF(cookie), "steamLogin=%s;sessionid=%s;forceMobile=1", login, sessionId); + + char data[MAX_PATH]; + mir_snprintf(data, SIZEOF(data), "sessionID=%s&id=%s&perform=block&action=approvePending&itype=friend&json=1&xml=0", sessionId, who); + + SetData(data, strlen(data)); + AddHeader("Cookie", cookie); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } +}; + +#endif //_STEAM_REQUEST_PENDING_H_ diff --git a/protocols/Steam/src/api/poll.h b/protocols/Steam/src/api/poll.h new file mode 100644 index 0000000000..fec71c98e4 --- /dev/null +++ b/protocols/Steam/src/api/poll.h @@ -0,0 +1,28 @@ +#ifndef _STEAM_REQUEST_POLL_H_ +#define _STEAM_REQUEST_POLL_H_ + +class PollRequest : public HttpRequest +{ +public: + PollRequest(const char *token, const char *umqId, UINT32 messageId, int idleSeconds) : + HttpRequest(REQUEST_POST, STEAM_API_URL "/ISteamWebUserPresenceOAuth/Poll/v0001") + { + timeout = (STEAM_API_TIMEOUT + 5) * 1000; + flags |= NLHRF_PERSISTENT; + + CMStringA data; + data.AppendFormat("access_token=%s&umqid=%s&message=%u&secidletime=%d§imeout=%d", + token, + umqId, + messageId, + idleSeconds, + STEAM_API_TIMEOUT); + + SetData(data, data.GetLength()); + + AddHeader("Connection", "keep-alive"); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } +}; + +#endif //_STEAM_REQUEST_POLL_H_ diff --git a/protocols/Steam/src/api/rsa_key.h b/protocols/Steam/src/api/rsa_key.h new file mode 100644 index 0000000000..6b938a48ef --- /dev/null +++ b/protocols/Steam/src/api/rsa_key.h @@ -0,0 +1,16 @@ +#ifndef _STEAM_REQUEST_RSA_KEY_H_ +#define _STEAM_REQUEST_RSA_KEY_H_ + +class RsaKeyRequest : public HttpRequest +{ +public: + RsaKeyRequest(const char *username) : + HttpRequest(REQUEST_GET, STEAM_WEB_URL "/mobilelogin/getrsakey") + { + flags = NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMP; + + AddParameter("username", (char*)username); + } +}; + +#endif //_STEAM_REQUEST_RSA_KEY_H_ diff --git a/protocols/Steam/src/api/search.h b/protocols/Steam/src/api/search.h new file mode 100644 index 0000000000..ed1b0420eb --- /dev/null +++ b/protocols/Steam/src/api/search.h @@ -0,0 +1,17 @@ +#ifndef _STEAM_REQUEST_SEARCH_H_ +#define _STEAM_REQUEST_SEARCH_H_ + +class SearchRequest : public HttpRequest +{ +public: + SearchRequest(const char *token, const char *text) : + HttpRequest(REQUEST_GET, STEAM_API_URL "/ISteamUserOAuth/Search/v0001") + { + AddParameter("access_token", token); + AddParameter("keywords", ptrA(mir_urlEncode(text))); + // todo: may need to load all results (15 first at now) + AddParameter("offset=0&count=15&targets=users&fields=all"); + } +}; + +#endif //_STEAM_REQUEST_SEARCH_H_ diff --git a/protocols/Steam/src/api/session.h b/protocols/Steam/src/api/session.h new file mode 100644 index 0000000000..3e13a2e418 --- /dev/null +++ b/protocols/Steam/src/api/session.h @@ -0,0 +1,24 @@ +#ifndef _STEAM_REQUEST_SESSION_H_ +#define _STEAM_REQUEST_SESSION_H_ + +class GetSessionRequest : public HttpRequest +{ +public: + GetSessionRequest(const char *token, const char *steamId, const char *cookie) : + HttpRequest(REQUEST_POST, STEAM_WEB_URL "/mobileloginsucceeded") + { + flags = NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMP; + + char data[512]; + mir_snprintf(data, SIZEOF(data), + "oauth_token=%s&steamid=%s&webcookie=%s", + token, + steamId, + cookie); + + SetData(data, strlen(data)); + AddHeader("Content-Type", "application/x-www-form-urlencoded"); + } +}; + +#endif //_STEAM_REQUEST_SESSION_H_ diff --git a/protocols/Steam/src/http_request.h b/protocols/Steam/src/http_request.h new file mode 100644 index 0000000000..aa14d9037d --- /dev/null +++ b/protocols/Steam/src/http_request.h @@ -0,0 +1,96 @@ +#ifndef _HTTP_REQUEST_H_ +#define _HTTP_REQUEST_H_ + +class HttpRequest : public NETLIBHTTPREQUEST, public MZeroedObject +{ +private: + CMStringA m_url; + +protected: + enum HttpRequestUrlFormat { FORMAT }; + + void Init(int type) + { + cbSize = sizeof(NETLIBHTTPREQUEST); + requestType = type; + flags = NLHRF_HTTP11 | NLHRF_SSL | NLHRF_NODUMPSEND | NLHRF_DUMPASTEXT; + AddHeader("user-agent", "Steam 1.2.0 / iPhone"); + } + + void AddHeader(LPCSTR szName, LPCSTR szValue) + { + headers = (NETLIBHTTPHEADER*)mir_realloc(headers, sizeof(NETLIBHTTPHEADER)*(headersCount + 1)); + headers[headersCount].szName = mir_strdup(szName); + headers[headersCount].szValue = mir_strdup(szValue); + headersCount++; + } + + void AddParameter(const char *fmt, ...) + { + va_list args; + va_start(args, fmt); + m_url += m_url.Find('?') == -1 ? '?' : '&'; + m_url.AppendFormatV(fmt, args); + va_end(args); + } + + void AddParameter(LPCSTR name, LPCSTR value) + { + AddParameter("%s=%s", name, value); + } + + void SetData(const char *data, size_t size) + { + if (pData != NULL) + mir_free(pData); + + dataLength = (int)size; + pData = (char*)mir_alloc(size + 1); + memcpy(pData, data, size); + pData[size] = 0; + } + +public: + HttpRequest(int type, LPCSTR url) + { + Init(type); + + m_url = url; + } + + HttpRequest(int type, HttpRequestUrlFormat, LPCSTR urlFormat, ...) + { + Init(type); + + va_list formatArgs; + va_start(formatArgs, urlFormat); + m_url.AppendFormatV(urlFormat, formatArgs); + va_end(formatArgs); + } + + ~HttpRequest() + { + for (int i = 0; i < headersCount; i++) + { + mir_free(headers[i].szName); + mir_free(headers[i].szValue); + } + mir_free(headers); + + if (pData != NULL) + mir_free(pData); + } + + NETLIBHTTPREQUEST* Send(HANDLE hConnection) + { + szUrl = m_url.GetBuffer(); + + char message[1024]; + mir_snprintf(message, SIZEOF(message), "Send request to %s", szUrl); + CallService(MS_NETLIB_LOG, (WPARAM)hConnection, (LPARAM)&message); + + return (NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM)hConnection, (LPARAM)this); + } +}; + +#endif //_HTTP_REQUEST_H_ \ No newline at end of file diff --git a/protocols/Steam/src/request_queue.cpp b/protocols/Steam/src/request_queue.cpp new file mode 100644 index 0000000000..4e343a5118 --- /dev/null +++ b/protocols/Steam/src/request_queue.cpp @@ -0,0 +1,121 @@ +/* +Copyright (c) 2015 Miranda NG project (http://miranda-ng.org) + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation version 2 +of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "stdafx.h" + +RequestQueue::RequestQueue(HANDLE hConnection) : + hConnection(hConnection), requests(1) +{ + isTerminated = true; + hRequestQueueThread = NULL; + hRequestQueueEvent = CreateEvent(NULL, FALSE, FALSE, NULL); +} + +RequestQueue::~RequestQueue() +{ + requests.destroy(); + CloseHandle(hRequestQueueEvent); +} + +void RequestQueue::Start() +{ + if (!isTerminated) + return; + + isTerminated = false; + if (hRequestQueueThread == NULL) + hRequestQueueThread = mir_forkthread((pThreadFunc)&RequestQueue::WorkerThread, this); +} + +void RequestQueue::Stop() +{ + if (isTerminated) + return; + + isTerminated = true; + SetEvent(hRequestQueueEvent); +} + +void RequestQueue::Push(HttpRequest *request, HttpResponseCallback response, void *arg, HttpFinallyCallback last) +{ + if (isTerminated) + return; + + RequestQueueItem *item = new RequestQueueItem(request, response, arg, last); + { + mir_cslock lock(requestQueueLock); + + requests.insert(item); + } + SetEvent(hRequestQueueEvent); +} + +void RequestQueue::Send(HttpRequest *request, HttpResponseCallback response, void *arg, HttpFinallyCallback last) +{ + RequestQueueItem *item = new RequestQueueItem(request, response, arg, last); + mir_forkthreadowner((pThreadFuncOwner)&RequestQueue::AsyncSendThread, this, item, 0); +} + +void RequestQueue::Execute(RequestQueueItem *item) +{ + NETLIBHTTPREQUEST *response = item->request->Send(hConnection); + if (item->responseCallback != NULL) + item->responseCallback(response, item->arg); + CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)response); + if (item->finallyCallback != NULL) + item->finallyCallback(item->arg); + requests.remove(item); + delete item; +} + +unsigned int RequestQueue::AsyncSendThread(void *owner, void *arg) +{ + RequestQueue *that = (RequestQueue*)owner; + RequestQueueItem *item = (RequestQueueItem*)arg; + + that->Execute(item); + + return 0; +} + +unsigned int RequestQueue::WorkerThread(void *arg) +{ + RequestQueue *queue = (RequestQueue*)arg; + + while (!queue->isTerminated) + { + WaitForSingleObject(queue->hRequestQueueEvent, INFINITE); + while (true) + { + RequestQueueItem *item = NULL; + { + mir_cslock lock(queue->requestQueueLock); + + if (queue->requests.getCount() == 0) + break; + + item = queue->requests[0]; + queue->requests.remove(0); + } + if (item != NULL) + queue->Execute(item); + } + } + + queue->hRequestQueueThread = NULL; + return 0; +} \ No newline at end of file diff --git a/protocols/Steam/src/request_queue.h b/protocols/Steam/src/request_queue.h new file mode 100644 index 0000000000..3a213be0bf --- /dev/null +++ b/protocols/Steam/src/request_queue.h @@ -0,0 +1,59 @@ +#ifndef _REQUEST_QUEUE_H_ +#define _REQUEST_QUEUE_H_ + +typedef void(*HttpResponseCallback)(const NETLIBHTTPREQUEST *response, void *arg); +typedef void(*HttpFinallyCallback)(void *arg); + +struct RequestQueueItem +{ + void *arg; + HttpRequest *request; + HttpResponseCallback responseCallback; + HttpFinallyCallback finallyCallback; + + RequestQueueItem(HttpRequest *request, void *arg, HttpFinallyCallback finallyCallback) : + request(request), responseCallback(NULL), arg(arg), finallyCallback(finallyCallback) + { + } + + RequestQueueItem(HttpRequest *request, HttpResponseCallback response, void *arg, HttpFinallyCallback finallyCallback) : + request(request), responseCallback(response), arg(arg), finallyCallback(finallyCallback) + { + } + + ~RequestQueueItem() + { + delete request; + request = NULL; + responseCallback = NULL; + finallyCallback = NULL; + } +}; + +class RequestQueue +{ +private: + bool isTerminated; + HANDLE hConnection; + mir_cs requestQueueLock; + LIST requests; + HANDLE hRequestQueueEvent, hRequestQueueThread; + + void Execute(RequestQueueItem *item); + + static unsigned int __cdecl AsyncSendThread(void*, void*); + static unsigned int __cdecl WorkerThread(void*); + +public: + RequestQueue(HANDLE hConnection); + ~RequestQueue(); + + void Start(); + void Stop(); + + void Push(HttpRequest *request, HttpResponseCallback response = NULL, void *arg = NULL, HttpFinallyCallback last = NULL); + void Send(HttpRequest *request, HttpResponseCallback response = NULL, void *arg = NULL, HttpFinallyCallback last = NULL); + +}; + +#endif //_REQUEST_QUEUE_H_ \ No newline at end of file diff --git a/protocols/Steam/src/stdafx.h b/protocols/Steam/src/stdafx.h index d39881dbd2..489c994784 100644 --- a/protocols/Steam/src/stdafx.h +++ b/protocols/Steam/src/stdafx.h @@ -1,58 +1,74 @@ -#ifndef _COMMON_H_ -#define _COMMON_H_ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "resource.h" -#include "version.h" - -#define MODULE "Steam" - -#define STEAM_API_TIMEOUT 30 -#define STEAM_API_IDLEOUT_AWAY 600 -#define STEAM_API_IDLEOUT_SNOOZE 8000 - -class CSteamProto; -extern HINSTANCE g_hInstance; - -extern HANDLE hExtraXStatus; - -#include "Steam\steam.h" - -#include "steam_dialogs.h" -#include "steam_proto.h" - +#ifndef _COMMON_H_ +#define _COMMON_H_ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "resource.h" +#include "version.h" + +#define MODULE "Steam" + +#define STEAM_API_TIMEOUT 30 +#define STEAM_API_IDLEOUT_AWAY 600 +#define STEAM_API_IDLEOUT_SNOOZE 8000 + +class CSteamProto; +extern HINSTANCE g_hInstance; + +extern HANDLE hExtraXStatus; + +#define STEAM_API_URL "https://api.steampowered.com" +#define STEAM_WEB_URL "https://steamcommunity.com" + +#include "steam_dialogs.h" +#include "http_request.h" +#include "request_queue.h" +#include "api\authorization.h" +#include "api\authorization.h" +#include "api\avatar.h" +#include "api\captcha.h" +#include "api\friend.h" +#include "api\friend_list.h" +#include "api\login.h" +#include "api\message.h" +#include "api\pending.h" +#include "api\poll.h" +#include "api\rsa_key.h" +#include "api\search.h" +#include "api\session.h" +#include "steam_proto.h" + #endif //_COMMON_H_ \ No newline at end of file diff --git a/protocols/Steam/src/steam_account.cpp b/protocols/Steam/src/steam_account.cpp index 942095d150..bbf144fc61 100644 --- a/protocols/Steam/src/steam_account.cpp +++ b/protocols/Steam/src/steam_account.cpp @@ -14,7 +14,7 @@ bool CSteamProto::IsMe(const char *steamId) return false; } -void CSteamProto::OnGotRsaKey(const NETLIBHTTPREQUEST *response, void *) +void CSteamProto::OnGotRsaKey(const NETLIBHTTPREQUEST *response) { if (response == NULL) return; @@ -69,13 +69,14 @@ void CSteamProto::OnGotRsaKey(const NETLIBHTTPREQUEST *response, void *) ptrA username(mir_utf8encodeW(getWStringA("Username"))); PushRequest( - new SteamWebApi::AuthorizationRequest(username, base64RsaEncryptedPassword, timestamp), + new AuthorizationRequest(username, base64RsaEncryptedPassword, timestamp), &CSteamProto::OnAuthorization); } -void CSteamProto::OnAuthorization(const NETLIBHTTPREQUEST *response, void *) +void CSteamProto::OnAuthorization(const NETLIBHTTPREQUEST *response) { - if (response == NULL) { + if (response == NULL) + { SetStatus(ID_STATUS_OFFLINE); return; } @@ -109,16 +110,14 @@ void CSteamProto::OnAuthorization(const NETLIBHTTPREQUEST *response, void *) CSteamGuardDialog guardDialog(this, emailDomain); if (!guardDialog.DoModal()) - { return; - } ptrA username(mir_utf8encodeW(getWStringA("Username"))); ptrA password(getStringA("EncryptedPassword")); ptrA timestamp(getStringA("RsaTimestamp")); PushRequest( - new SteamWebApi::AuthorizationRequest(username, password, timestamp, guardDialog.GetGuardCode()), + new AuthorizationRequest(username, password, timestamp, guardDialog.GetGuardCode()), &CSteamProto::OnAuthorization); return; } @@ -129,7 +128,7 @@ void CSteamProto::OnAuthorization(const NETLIBHTTPREQUEST *response, void *) node = json_get(root, "captcha_gid"); ptrA captchaId(mir_u2a(ptrT(json_as_string(node)))); - SteamWebApi::GetCaptchaRequest *request = new SteamWebApi::GetCaptchaRequest(captchaId); + GetCaptchaRequest *request = new GetCaptchaRequest(captchaId); NETLIBHTTPREQUEST *response = request->Send(m_hNetlibUser); delete request; @@ -146,7 +145,7 @@ void CSteamProto::OnAuthorization(const NETLIBHTTPREQUEST *response, void *) ptrA timestamp(getStringA("RsaTimestamp")); PushRequest( - new SteamWebApi::AuthorizationRequest(username, password, timestamp, captchaId, captchaDialog.GetCaptchaText()), + new AuthorizationRequest(username, password, timestamp, captchaId, captchaDialog.GetCaptchaText()), &CSteamProto::OnAuthorization); return; } @@ -185,15 +184,15 @@ void CSteamProto::OnAuthorization(const NETLIBHTTPREQUEST *response, void *) delSetting("EncryptedPassword"); PushRequest( - new SteamWebApi::GetSessionRequest(token, steamId, cookie), + new GetSessionRequest(token, steamId, cookie), &CSteamProto::OnGotSession); PushRequest( - new SteamWebApi::LogonRequest(token), + new LogonRequest(token), &CSteamProto::OnLoggedOn); } -void CSteamProto::OnGotSession(const NETLIBHTTPREQUEST *response, void *) +void CSteamProto::OnGotSession(const NETLIBHTTPREQUEST *response) { if(response == NULL) return; @@ -224,7 +223,7 @@ void CSteamProto::HandleTokenExpired() SetStatus(ID_STATUS_OFFLINE); } -void CSteamProto::OnLoggedOn(const NETLIBHTTPREQUEST *response, void *) +void CSteamProto::OnLoggedOn(const NETLIBHTTPREQUEST *response) { if (response == NULL) { @@ -255,7 +254,7 @@ void CSteamProto::OnLoggedOn(const NETLIBHTTPREQUEST *response, void *) ptrA steamId(getStringA("SteamID")); PushRequest( - new SteamWebApi::GetFriendListRequest(token, steamId), + new GetFriendListRequest(token, steamId), &CSteamProto::OnGotFriendList); // start polling thread diff --git a/protocols/Steam/src/steam_avatars.cpp b/protocols/Steam/src/steam_avatars.cpp index ec2694b878..053a526134 100644 --- a/protocols/Steam/src/steam_avatars.cpp +++ b/protocols/Steam/src/steam_avatars.cpp @@ -79,10 +79,9 @@ INT_PTR CSteamProto::GetAvatarInfo(WPARAM wParam, LPARAM lParam) if (needLoad) { PushRequest( - new SteamWebApi::GetAvatarRequest(avatarUrl), + new GetAvatarRequest(avatarUrl), &CSteamProto::OnGotAvatar, - (void*)pai->hContact, - ARG_NO_FREE); + (void*)pai->hContact); return GAIR_WAITFOR; } diff --git a/protocols/Steam/src/steam_contacts.cpp b/protocols/Steam/src/steam_contacts.cpp index c15a839e85..655c0814f2 100644 --- a/protocols/Steam/src/steam_contacts.cpp +++ b/protocols/Steam/src/steam_contacts.cpp @@ -354,7 +354,7 @@ void CSteamProto::ProcessContact(std::map::iterator *it, } } -void CSteamProto::OnGotFriendList(const NETLIBHTTPREQUEST *response, void *) +void CSteamProto::OnGotFriendList(const NETLIBHTTPREQUEST *response) { if (response == NULL) return; @@ -434,12 +434,12 @@ void CSteamProto::OnGotFriendList(const NETLIBHTTPREQUEST *response, void *) ptrA token(getStringA("TokenSecret")); PushRequest( - new SteamWebApi::GetUserSummariesRequest(token, steamIds.c_str()), + new GetUserSummariesRequest(token, steamIds.c_str()), &CSteamProto::OnGotUserSummaries); } } -void CSteamProto::OnGotBlockList(const NETLIBHTTPREQUEST *response, void *) +void CSteamProto::OnGotBlockList(const NETLIBHTTPREQUEST *response) { if (response == NULL) return; @@ -483,7 +483,7 @@ void CSteamProto::OnGotBlockList(const NETLIBHTTPREQUEST *response, void *) } } -void CSteamProto::OnGotUserSummaries(const NETLIBHTTPREQUEST *response, void *) +void CSteamProto::OnGotUserSummaries(const NETLIBHTTPREQUEST *response) { if (response == NULL) return; @@ -759,9 +759,9 @@ void CSteamProto::OnSearchByNameStarted(const NETLIBHTTPREQUEST *, void *) // // ptrA token(getStringA("TokenSecret")); // -// SteamWebApi::SearchApi::SearchResult searchResult; -// debugLogA("CSteamProto::SearchByNameThread: call SteamWebApi::SearchApi::Search"); -// SteamWebApi::SearchApi::Search(m_hNetlibUser, token, keywords, &searchResult); +// SearchApi::SearchResult searchResult; +// debugLogA("CSteamProto::SearchByNameThread: call SearchApi::Search"); +// SearchApi::Search(m_hNetlibUser, token, keywords, &searchResult); // // if (!searchResult.IsSuccess()) // { @@ -772,16 +772,16 @@ void CSteamProto::OnSearchByNameStarted(const NETLIBHTTPREQUEST *, void *) // CMStringA steamIds; // for (int i = 0; i < searchResult.GetItemCount(); i++) // { -// const SteamWebApi::SearchApi::SearchItem *item = searchResult.GetAt(i); +// const SearchApi::SearchItem *item = searchResult.GetAt(i); // if (steamIds.IsEmpty()) // steamIds.Append(item->GetSteamId()); // else // steamIds.AppendFormat(",%s", item->GetSteamId()); // } // -// SteamWebApi::FriendApi::Summaries summarues; -// debugLogA("CSteamProto::SearchByNameThread: call SteamWebApi::FriendApi::LoadSummaries"); -// SteamWebApi::FriendApi::LoadSummaries(m_hNetlibUser, token, steamIds, &summarues); +// FriendApi::Summaries summarues; +// debugLogA("CSteamProto::SearchByNameThread: call FriendApi::LoadSummaries"); +// FriendApi::LoadSummaries(m_hNetlibUser, token, steamIds, &summarues); // // if (!summarues.IsSuccess()) // { @@ -791,7 +791,7 @@ void CSteamProto::OnSearchByNameStarted(const NETLIBHTTPREQUEST *, void *) // // for (size_t i = 0; i < summarues.GetItemCount(); i++) // { -// const SteamWebApi::FriendApi::Summary *contact = summarues.GetAt(i); +// const FriendApi::Summary *contact = summarues.GetAt(i); // // STEAM_SEARCH_RESULT ssr = { 0 }; // ssr.hdr.cbSize = sizeof(STEAM_SEARCH_RESULT); diff --git a/protocols/Steam/src/steam_events.cpp b/protocols/Steam/src/steam_events.cpp index 434eaed925..cbaf2302ae 100644 --- a/protocols/Steam/src/steam_events.cpp +++ b/protocols/Steam/src/steam_events.cpp @@ -14,6 +14,8 @@ int CSteamProto::OnModulesLoaded(WPARAM, LPARAM) nlu.szSettingsModule = m_szModuleName; m_hNetlibUser = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nlu); + requestQueue = new RequestQueue(m_hNetlibUser); + HookEvent(ME_CLIST_PREBUILDCONTACTMENU, &CSteamProto::PrebuildContactMenu); return 0; @@ -21,7 +23,7 @@ int CSteamProto::OnModulesLoaded(WPARAM, LPARAM) int CSteamProto::OnPreShutdown(WPARAM, LPARAM) { - //SetStatus(ID_STATUS_OFFLINE); + delete requestQueue; Netlib_CloseHandle(this->m_hNetlibUser); this->m_hNetlibUser = NULL; diff --git a/protocols/Steam/src/steam_menus.cpp b/protocols/Steam/src/steam_menus.cpp index b18e6862aa..08a5ca7c03 100644 --- a/protocols/Steam/src/steam_menus.cpp +++ b/protocols/Steam/src/steam_menus.cpp @@ -33,10 +33,10 @@ int CSteamProto::BlockCommand(WPARAM hContact, LPARAM) char *who = getStringA(hContact, "SteamID"); PushRequest( - new SteamWebApi::BlockFriendRequest(token, sessionId, steamId, who), + new BlockFriendRequest(token, sessionId, steamId, who), &CSteamProto::OnFriendBlocked, who, - ARG_MIR_FREE); + MirFreeArg); return 0; } @@ -57,7 +57,7 @@ INT_PTR CSteamProto::OpenBlockListCommand(WPARAM, LPARAM) ptrA steamId(getStringA("SteamID")); PushRequest( - new SteamWebApi::GetFriendListRequest(token, steamId, "ignoredfriend"), + new GetFriendListRequest(token, steamId, "ignoredfriend"), &CSteamProto::OnGotBlockList); return 0; diff --git a/protocols/Steam/src/steam_messages.cpp b/protocols/Steam/src/steam_messages.cpp index 3258613261..5a55919a07 100644 --- a/protocols/Steam/src/steam_messages.cpp +++ b/protocols/Steam/src/steam_messages.cpp @@ -8,9 +8,9 @@ // ptrA umqId(getStringA("UMQID")); // ptrA steamId(getStringA(hContact, "SteamID")); // -// SteamWebApi::MessageApi::SendResult sendResult; -// debugLogA("CSteamProto::SendTypingThread: call SteamWebApi::PollApi::SteamWebApi::MessageApi::SendMessage"); -// SteamWebApi::MessageApi::SendTyping(m_hNetlibUser, token, umqId, steamId, &sendResult); +// MessageApi::SendResult sendResult; +// debugLogA("CSteamProto::SendTypingThread: call PollApi::MessageApi::SendMessage"); +// MessageApi::SendTyping(m_hNetlibUser, token, umqId, steamId, &sendResult); //} void CSteamProto::OnMessageSent(const NETLIBHTTPREQUEST *response, void *arg) @@ -46,4 +46,11 @@ void CSteamProto::OnMessageSent(const NETLIBHTTPREQUEST *response, void *arg) status, param->hMessage, (LPARAM) errorA); +} + +void CSteamProto::MessageParamFree(void *arg) +{ + SendMessageParam *param = (SendMessageParam*)arg; + mir_free(param->message); + mir_free(param); } \ No newline at end of file diff --git a/protocols/Steam/src/steam_pooling.cpp b/protocols/Steam/src/steam_pooling.cpp index 4ea31428e8..89768c1a81 100644 --- a/protocols/Steam/src/steam_pooling.cpp +++ b/protocols/Steam/src/steam_pooling.cpp @@ -127,10 +127,10 @@ void CSteamProto::ParsePollData(JSONNODE *data) ptrA token(getStringA("TokenSecret")); PushRequest( - new SteamWebApi::GetUserSummariesRequest(token, steamId), + new GetUserSummariesRequest(token, steamId), &CSteamProto::OnAuthRequested, mir_strdup(steamId), - ARG_MIR_FREE); + MirFreeArg); } break; @@ -157,7 +157,7 @@ void CSteamProto::ParsePollData(JSONNODE *data) ptrA token(getStringA("TokenSecret")); PushRequest( - new SteamWebApi::GetUserSummariesRequest(token, steamIds.c_str()), + new GetUserSummariesRequest(token, steamIds.c_str()), &CSteamProto::OnGotUserSummaries); } } @@ -170,12 +170,12 @@ void CSteamProto::PollingThread(void*) ptrA umqId(getStringA("UMQID")); UINT32 messageId = getDword("MessageID", 0); - //SteamWebApi::PollApi::PollResult pollResult; + //PollApi::PollResult pollResult; int errors = 0; bool breaked = false; while (!isTerminated && !breaked && errors < POLLING_ERRORS_LIMIT) { - SteamWebApi::PollRequest *request = new SteamWebApi::PollRequest(token, umqId, messageId, IdleSeconds()); + PollRequest *request = new PollRequest(token, umqId, messageId, IdleSeconds()); //request->nlc = m_pollingConnection; NETLIBHTTPREQUEST *response = request->Send(m_hNetlibUser); delete request; diff --git a/protocols/Steam/src/steam_proto.cpp b/protocols/Steam/src/steam_proto.cpp index 2844492aa6..af5a3e677f 100644 --- a/protocols/Steam/src/steam_proto.cpp +++ b/protocols/Steam/src/steam_proto.cpp @@ -3,13 +3,10 @@ CSteamProto::CSteamProto(const char* protoName, const TCHAR* userName) : PROTO(protoName, userName), hAuthProcess(1), - hMessageProcess(1), - requestsQueue(1) + hMessageProcess(1) { CreateProtoService(PS_CREATEACCMGRUI, &CSteamProto::OnAccountManagerInit); - InitQueue(); - m_idleTS = 0; isTerminated = false; m_hQueueThread = NULL; @@ -68,10 +65,9 @@ CSteamProto::CSteamProto(const char* protoName, const TCHAR* userName) : CSteamProto::~CSteamProto() { - UninitQueue(); } -MCONTACT __cdecl CSteamProto::AddToList(int, PROTOSEARCHRESULT* psr) +MCONTACT CSteamProto::AddToList(int, PROTOSEARCHRESULT* psr) { MCONTACT hContact = NULL; ptrA steamId(mir_u2a(psr->id)); @@ -85,7 +81,7 @@ MCONTACT __cdecl CSteamProto::AddToList(int, PROTOSEARCHRESULT* psr) ptrA token(getStringA("TokenSecret")); PushRequest( - new SteamWebApi::GetUserSummariesRequest(token, steamId), + new GetUserSummariesRequest(token, steamId), &CSteamProto::OnGotUserSummaries); } } @@ -99,7 +95,7 @@ MCONTACT __cdecl CSteamProto::AddToList(int, PROTOSEARCHRESULT* psr) return hContact; } -int __cdecl CSteamProto::Authorize(MEVENT hDbEvent) +int CSteamProto::Authorize(MEVENT hDbEvent) { if (IsOnline() && hDbEvent) { @@ -115,10 +111,9 @@ int __cdecl CSteamProto::Authorize(MEVENT hDbEvent) char *who = getStringA(hContact, "SteamID"); PushRequest( - new SteamWebApi::ApprovePendingRequest(token, sessionId, steamId, who), + new ApprovePendingRequest(token, sessionId, steamId, who), &CSteamProto::OnPendingApproved, - who, - ARG_MIR_FREE); + who, MirFreeArg); return 0; } @@ -126,7 +121,7 @@ int __cdecl CSteamProto::Authorize(MEVENT hDbEvent) return 1; } -int __cdecl CSteamProto::AuthDeny(MEVENT hDbEvent, const TCHAR*) +int CSteamProto::AuthDeny(MEVENT hDbEvent, const TCHAR*) { if (IsOnline() && hDbEvent) { @@ -142,10 +137,9 @@ int __cdecl CSteamProto::AuthDeny(MEVENT hDbEvent, const TCHAR*) char *who = getStringA(hContact, "SteamID"); PushRequest( - new SteamWebApi::IgnorePendingRequest(token, sessionId, steamId, who), + new IgnorePendingRequest(token, sessionId, steamId, who), &CSteamProto::OnPendingIgnoreded, - who, - ARG_MIR_FREE); + who, MirFreeArg); return 0; } @@ -153,7 +147,7 @@ int __cdecl CSteamProto::AuthDeny(MEVENT hDbEvent, const TCHAR*) return 1; } -int __cdecl CSteamProto::AuthRequest(MCONTACT hContact, const TCHAR*) +int CSteamProto::AuthRequest(MCONTACT hContact, const TCHAR*) { if (IsOnline() && hContact) { @@ -182,10 +176,9 @@ int __cdecl CSteamProto::AuthRequest(MCONTACT hContact, const TCHAR*) */ PushRequest( - new SteamWebApi::AddFriendRequest(token, sessionId, steamId, who), + new AddFriendRequest(token, sessionId, steamId, who), &CSteamProto::OnFriendAdded, - param, - ARG_MIR_FREE); + param); return hAuth; } @@ -193,7 +186,7 @@ int __cdecl CSteamProto::AuthRequest(MCONTACT hContact, const TCHAR*) return 1; } -DWORD_PTR __cdecl CSteamProto:: GetCaps(int type, MCONTACT) +DWORD_PTR CSteamProto:: GetCaps(int type, MCONTACT) { switch(type) { @@ -216,7 +209,7 @@ DWORD_PTR __cdecl CSteamProto:: GetCaps(int type, MCONTACT) } } -HANDLE __cdecl CSteamProto::SearchBasic(const TCHAR* id) +HANDLE CSteamProto::SearchBasic(const TCHAR* id) { if (!this->IsOnline()) return 0; @@ -227,51 +220,43 @@ HANDLE __cdecl CSteamProto::SearchBasic(const TCHAR* id) ptrA steamId(mir_t2a(id)); PushRequest( - new SteamWebApi::GetUserSummariesRequest(token, steamId), + new GetUserSummariesRequest(token, steamId), &CSteamProto::OnSearchByIdEnded, mir_tstrdup(id), - ARG_MIR_FREE); + MirFreeArg); return (HANDLE)STEAM_SEARCH_BYID; } -int __cdecl CSteamProto::RecvMsg(MCONTACT hContact, PROTORECVEVENT* pre) +int CSteamProto::RecvMsg(MCONTACT hContact, PROTORECVEVENT* pre) { return (INT_PTR)AddDBEvent(hContact, EVENTTYPE_MESSAGE, pre->timestamp, DBEF_UTF, mir_strlen(pre->szMessage), (BYTE*)pre->szMessage); } -int __cdecl CSteamProto::SendMsg(MCONTACT hContact, int, const char *msg) +int CSteamProto::SendMsg(MCONTACT hContact, int flags, const char *message) { + if (!IsOnline()) + { + ProtoBroadcastAck(hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, NULL, (LPARAM)Translate("You cannot send messages when you are offline.")); + return 0; + } + UINT hMessage = InterlockedIncrement(&hMessageProcess); SendMessageParam *param = (SendMessageParam*)mir_calloc(sizeof(SendMessageParam)); param->hContact = hContact; param->hMessage = (HANDLE)hMessage; - param->msg = msg; - ForkThread(&CSteamProto::SendMsgThread, (void*)param); - return hMessage; -} - -void __cdecl CSteamProto::SendMsgThread(void *arg) -{ - SendMessageParam *param = (SendMessageParam*)arg; - - if (!IsOnline()) - { - ProtoBroadcastAck(param->hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, param->hMessage, (LPARAM)Translate("You cannot send messages when you are offline.")); - mir_free(param); - return; - } + param->message = mir_strdup(message); ptrA token(getStringA("TokenSecret")); ptrA umqid(getStringA("UMQID")); - ptrA steamId(getStringA(param->hContact, "SteamID")); - + ptrA steamId(getStringA(hContact, "SteamID")); PushRequest( - new SteamWebApi::SendMessageRequest(token, umqid, steamId, param->msg), + new SendMessageRequest(token, umqid, steamId, message), &CSteamProto::OnMessageSent, - param, - ARG_MIR_FREE); + param, MessageParamFree); + + return hMessage; } int CSteamProto::SetStatus(int new_status) @@ -311,7 +296,11 @@ int CSteamProto::SetStatus(int new_status) m_iStatus = m_iDesiredStatus = ID_STATUS_OFFLINE; ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)old_status, m_iStatus); - StopQueue(); + ptrA token(getStringA("TokenSecret")); + ptrA umqid(getStringA("UMQID")); + SendRequest(new LogoffRequest(token, umqid)); + + requestQueue->Stop(); if (!Miranda_Terminated()) SetAllContactsStatus(ID_STATUS_OFFLINE); @@ -321,7 +310,29 @@ int CSteamProto::SetStatus(int new_status) m_iStatus = ID_STATUS_CONNECTING; ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)old_status, m_iStatus); - StartQueue(); + requestQueue->Start(); + + ptrA token(getStringA("TokenSecret")); + if (mir_strlen(token) > 0) + { + PushRequest( + new LogonRequest(token), + &CSteamProto::OnLoggedOn); + } + else + { + ptrA username(mir_urlEncode(ptrA(mir_utf8encodeT(getTStringA("Username"))))); + if (username == NULL || username[0] == '\0') + { + m_iStatus = m_iDesiredStatus = ID_STATUS_OFFLINE; + ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_CONNECTING, m_iStatus); + return 0; + } + + PushRequest( + new RsaKeyRequest(username), + &CSteamProto::OnGotRsaKey); + } } else { @@ -334,7 +345,8 @@ int CSteamProto::SetStatus(int new_status) int __cdecl CSteamProto::OnEvent(PROTOEVENTTYPE eventType, WPARAM wParam, LPARAM lParam) { - switch (eventType) { + switch (eventType) + { case EV_PROTO_ONLOAD: return this->OnModulesLoaded(wParam, lParam); @@ -359,10 +371,9 @@ int __cdecl CSteamProto::OnEvent(PROTOEVENTTYPE eventType, WPARAM wParam, LPARAM return 0; PushRequest( - new SteamWebApi::RemoveFriendRequest(token, sessionId, steamId, who), + new RemoveFriendRequest(token, sessionId, steamId, who), &CSteamProto::OnFriendRemoved, - (void*)hContact, - ARG_NO_FREE); + (void*)hContact); } return 0; diff --git a/protocols/Steam/src/steam_proto.h b/protocols/Steam/src/steam_proto.h index 157fb71a8b..1f607ffd77 100644 --- a/protocols/Steam/src/steam_proto.h +++ b/protocols/Steam/src/steam_proto.h @@ -21,7 +21,7 @@ struct SendMessageParam { MCONTACT hContact; HANDLE hMessage; - const char *msg; + char *message; }; struct STEAM_SEARCH_RESULT @@ -56,50 +56,8 @@ enum HTTP_STATUS HTTP_STATUS_INSUFICIENTE_STORAGE = 507 }; -enum ARG_FREE_TYPE -{ - ARG_NO_FREE, - ARG_MIR_FREE -}; - -typedef void (CSteamProto::*RESPONSE)(const NETLIBHTTPREQUEST *response, void *arg); - -struct QueueItem -{ - SteamWebApi::HttpRequest *request; - void *arg; - ARG_FREE_TYPE arg_free_type; - RESPONSE responseCallback; - //RESPONSE responseFailedCallback; - - QueueItem(SteamWebApi::HttpRequest *request) : - request(request), arg(NULL), responseCallback(NULL)/*, responseFailedCallback(NULL)*/ { } - - QueueItem(SteamWebApi::HttpRequest *request, RESPONSE response) : - request(request), arg(NULL), responseCallback(response)/*, responseFailedCallback(NULL)*/ { } - - //QueueItem(SteamWebApi::HttpRequest *request, RESPONSE response, RESPONSE responseFailedCallback) : - // request(request), arg(NULL), responseCallback(response), responseFailedCallback(responseFailedCallback) { } - - ~QueueItem() { - // Free request - delete request; - - // Free argument - switch (arg_free_type) - { - case ARG_NO_FREE: - break; - case ARG_MIR_FREE: - mir_free(arg); - default: - break; - } - - responseCallback = NULL; - //responseFailedCallback = NULL; - } -}; +typedef void(CSteamProto::*SteamResponseCallback)(const NETLIBHTTPREQUEST *response); +typedef void(CSteamProto::*SteamResponseWithArgCallback)(const NETLIBHTTPREQUEST *response, void *arg); class CSteamProto : public PROTO { @@ -152,27 +110,23 @@ protected: mir_cs contact_search_lock; mir_cs requests_queue_lock; mir_cs set_status_lock; - LIST requestsQueue; // instances static LIST InstanceList; static int CompareProtos(const CSteamProto *p1, const CSteamProto *p2); - // queue - void InitQueue(); - void UninitQueue(); - - void StartQueue(); - void StopQueue(); + // requests + RequestQueue *requestQueue; - void PushRequest(SteamWebApi::HttpRequest *request); - void PushRequest(SteamWebApi::HttpRequest *request, RESPONSE response); - void PushRequest(SteamWebApi::HttpRequest *request, RESPONSE response, void *arg, ARG_FREE_TYPE arg_free_type); + void PushRequest(HttpRequest *request); + void PushRequest(HttpRequest *request, SteamResponseCallback response); + void PushRequest(HttpRequest *request, SteamResponseWithArgCallback response, void *arg, HttpFinallyCallback last = NULL); - void ExecuteRequest(QueueItem *requestItem); + void SendRequest(HttpRequest *request); + void SendRequest(HttpRequest *request, SteamResponseCallback response); + void SendRequest(HttpRequest *request, SteamResponseWithArgCallback response, void *arg, HttpFinallyCallback last = NULL); - void __cdecl SendMsgThread(void*); - void __cdecl QueueThread(void*); + static void MirFreeArg(void *arg) { mir_free(arg); } // pooling thread void ParsePollData(JSONNODE *data); @@ -182,12 +136,12 @@ protected: bool IsOnline(); bool IsMe(const char *steamId); - void OnGotRsaKey(const NETLIBHTTPREQUEST *response, void *arg); + void OnGotRsaKey(const NETLIBHTTPREQUEST *response); - void OnAuthorization(const NETLIBHTTPREQUEST *response, void *arg); - void OnGotSession(const NETLIBHTTPREQUEST *response, void *arg); + void OnAuthorization(const NETLIBHTTPREQUEST *response); + void OnGotSession(const NETLIBHTTPREQUEST *response); - void OnLoggedOn(const NETLIBHTTPREQUEST *response, void *arg); + void OnLoggedOn(const NETLIBHTTPREQUEST *response); void HandleTokenExpired(); @@ -207,9 +161,9 @@ protected: MCONTACT FindContact(const char *steamId); MCONTACT AddContact(const char *steamId, bool isTemporary = false); - void OnGotFriendList(const NETLIBHTTPREQUEST *response, void *arg); - void OnGotBlockList(const NETLIBHTTPREQUEST *response, void *arg); - void OnGotUserSummaries(const NETLIBHTTPREQUEST *response, void *arg); + void OnGotFriendList(const NETLIBHTTPREQUEST *response); + void OnGotBlockList(const NETLIBHTTPREQUEST *response); + void OnGotUserSummaries(const NETLIBHTTPREQUEST *response); void OnGotAvatar(const NETLIBHTTPREQUEST *response, void *arg); void OnFriendAdded(const NETLIBHTTPREQUEST *response, void *arg); @@ -228,6 +182,7 @@ protected: // messages void OnMessageSent(const NETLIBHTTPREQUEST *response, void *arg); + static void MessageParamFree(void *arg); // menus HGENMENU m_hMenuRoot; diff --git a/protocols/Steam/src/steam_queue.cpp b/protocols/Steam/src/steam_queue.cpp deleted file mode 100644 index c838b91294..0000000000 --- a/protocols/Steam/src/steam_queue.cpp +++ /dev/null @@ -1,193 +0,0 @@ -#include "stdafx.h" - -void CSteamProto::InitQueue() -{ - debugLogA("%s: entering", __FUNCTION__); - - m_evRequestsQueue = CreateEvent(NULL, FALSE, FALSE, NULL); - - debugLogA("%s: leaving", __FUNCTION__); -} - -void CSteamProto::UninitQueue() -{ - debugLogA("%s: entering", __FUNCTION__); - - requestsQueue.destroy(); - CloseHandle(m_evRequestsQueue); - - debugLogA("%s: leaving", __FUNCTION__); -} - -void CSteamProto::StartQueue() -{ - debugLogA("%s: entering", __FUNCTION__); - - isTerminated = false; - - if (m_hQueueThread == NULL) - { - ptrA token(getStringA("TokenSecret")); - if (token && token[0] != '\0') - { - PushRequest( - new SteamWebApi::LogonRequest(token), - &CSteamProto::OnLoggedOn); - } - else - { - ptrA username(mir_urlEncode(T2Utf(getTStringA("Username")))); - if (username == NULL || username[0] == '\0') - return; - - PushRequest( - new SteamWebApi::RsaKeyRequest(username), - &CSteamProto::OnGotRsaKey); - } - - m_hQueueThread = ForkThreadEx(&CSteamProto::QueueThread, 0, NULL); - } - - debugLogA("%s: leaving", __FUNCTION__); -} - -void CSteamProto::StopQueue() -{ - debugLogA("%s: entering", __FUNCTION__); - - isTerminated = true; - - { - mir_cslock lock(requests_queue_lock); - - debugLogA("%s: requestsQueue contains %d items", __FUNCTION__, requestsQueue.getCount()); - - while (requestsQueue.getCount() > 0) - { - QueueItem *item = requestsQueue[0]; - requestsQueue.remove(0); - - // QueueItem's destructor properly free request and arg - delete item; - - debugLogA("%s: removed item from requestsQueue, %d items remaining", __FUNCTION__, requestsQueue.getCount()); - } - } - - // logoff - ptrA token(getStringA("TokenSecret")); - ptrA umqid(getStringA("UMQID")); - - SteamWebApi::HttpRequest *request = new SteamWebApi::LogoffRequest(token, umqid); - NETLIBHTTPREQUEST *response = request->Send(m_hNetlibUser); - if (response != NULL) - { - CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)response); - } - delete request; - - m_hQueueThread = NULL; - - debugLogA("%s: leaving", __FUNCTION__); -} - -void CSteamProto::PushRequest(SteamWebApi::HttpRequest *request) -{ - PushRequest(request, NULL, NULL, ARG_NO_FREE); -} - -void CSteamProto::PushRequest(SteamWebApi::HttpRequest *request, RESPONSE response) -{ - PushRequest(request, response, NULL, ARG_NO_FREE); -} - -void CSteamProto::PushRequest(SteamWebApi::HttpRequest *request, RESPONSE response, void *arg, ARG_FREE_TYPE arg_free_type) -{ - debugLogA("%s: entering", __FUNCTION__); - - // Always prepare QueueItem so we can use it's destructor to free request and arg - QueueItem *item = new QueueItem(request, response); - item->arg = arg; - item->arg_free_type = arg_free_type; - - if (isTerminated) - { - debugLogA("%s: leaving (isTerminated)", __FUNCTION__); - - // QueueItem's destructor properly free request and arg - delete item; - return; - } - - { - mir_cslock lock(requests_queue_lock); - requestsQueue.insert(item); - } - - SetEvent(m_evRequestsQueue); - - debugLogA("%s: leaving", __FUNCTION__); -} - -void CSteamProto::ExecuteRequest(QueueItem *item) -{ - debugLogA("%s: entering", __FUNCTION__); - - if (isTerminated) - { - debugLogA("%s: leaving (isTerminated)", __FUNCTION__); - - // QueueItem's destructor properly free request and arg - delete item; - return; - } - - NETLIBHTTPREQUEST *response = item->request->Send(m_hNetlibUser); - - if (item->responseCallback != NULL) - (this->*(item->responseCallback))(response, item->arg); - - // todo: add succeed and failed handlers if need - if (response != NULL/* && response->resultCode != 200*/) - { - CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)response); - } - /*else if (requestItem->responseFailedCallback != NULL) - { - (this->*(requestItem->responseFailedCallback))(response); - }*/ - - delete item; - - debugLogA("%s: leaving", __FUNCTION__); -} - -void CSteamProto::QueueThread(void*) -{ - debugLogA("%s: entering", __FUNCTION__); - - while (!isTerminated) - { - WaitForSingleObject(m_evRequestsQueue, 1000); - - while (true) - { - QueueItem *item = NULL; - - { - mir_cslock lock(requests_queue_lock); - - if (requestsQueue.getCount() == 0) - break; - - item = requestsQueue[0]; - requestsQueue.remove(0); - } - - if (item != NULL) - ExecuteRequest(item); - } - } - - debugLogA("%s: leaving", __FUNCTION__); -} \ No newline at end of file diff --git a/protocols/Steam/src/steam_request.cpp b/protocols/Steam/src/steam_request.cpp new file mode 100644 index 0000000000..05a7b235b1 --- /dev/null +++ b/protocols/Steam/src/steam_request.cpp @@ -0,0 +1,73 @@ +#include "stdafx.h" + +class SteamResponseDelegate +{ +private: + CSteamProto *proto; + SteamResponseCallback responseCallback; + SteamResponseWithArgCallback responseWithArgCallback; + HttpFinallyCallback httpFinallyCallback; + + void *arg; + bool hasArg; + +public: + SteamResponseDelegate(CSteamProto *proto, SteamResponseCallback responseCallback) + : proto(proto), responseCallback(responseCallback), responseWithArgCallback(NULL), arg(NULL), httpFinallyCallback(NULL), hasArg(false) {} + + SteamResponseDelegate(CSteamProto *proto, SteamResponseWithArgCallback responseCallback, void *arg, HttpFinallyCallback httpFinallyCallback) + : proto(proto), responseCallback(NULL), responseWithArgCallback(responseCallback), arg(arg), httpFinallyCallback(httpFinallyCallback), hasArg(true) { } + + void Invoke(const NETLIBHTTPREQUEST *response) + { + if (hasArg) + { + (proto->*(responseWithArgCallback))(response, arg); + if (httpFinallyCallback != NULL) + httpFinallyCallback(arg); + } + else + (proto->*(responseCallback))(response); + } +}; + +static void SteamHttpResponse(const NETLIBHTTPREQUEST *response, void *arg) +{ + SteamResponseDelegate *delegate = (SteamResponseDelegate*)arg; + delegate->Invoke(response); + delete delegate; +} + +void CSteamProto::PushRequest(HttpRequest *request) +{ + requestQueue->Push(request); +} + +void CSteamProto::PushRequest(HttpRequest *request, SteamResponseCallback response) +{ + SteamResponseDelegate *delegate = new SteamResponseDelegate(this, response); + requestQueue->Push(request, SteamHttpResponse, delegate); +} + +void CSteamProto::PushRequest(HttpRequest *request, SteamResponseWithArgCallback response, void *arg, HttpFinallyCallback last) +{ + SteamResponseDelegate *delegate = new SteamResponseDelegate(this, response, arg, last); + requestQueue->Push(request, SteamHttpResponse, delegate); +} + +void CSteamProto::SendRequest(HttpRequest *request) +{ + requestQueue->Send(request, NULL, NULL); +} + +void CSteamProto::SendRequest(HttpRequest *request, SteamResponseCallback response) +{ + SteamResponseDelegate *delegate = new SteamResponseDelegate(this, response); + requestQueue->Send(request, SteamHttpResponse, delegate); +} + +void CSteamProto::SendRequest(HttpRequest *request, SteamResponseWithArgCallback response, void *arg, HttpFinallyCallback last) +{ + SteamResponseDelegate *delegate = new SteamResponseDelegate(this, response, arg, last); + requestQueue->Send(request, SteamHttpResponse, delegate); +} diff --git a/protocols/Steam/src/version.h b/protocols/Steam/src/version.h index 8dff6cd310..5d504039c5 100644 --- a/protocols/Steam/src/version.h +++ b/protocols/Steam/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 0 #define __MINOR_VERSION 11 -#define __RELEASE_NUM 3 -#define __BUILD_NUM 3 +#define __RELEASE_NUM 4 +#define __BUILD_NUM 0 #include -- cgit v1.2.3