diff options
Diffstat (limited to 'protocols/Steam/src')
43 files changed, 950 insertions, 1410 deletions
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 <openssl/rsa.h>
 -#include <openssl/bio.h>
 -#include <openssl/bn.h>
 -#include <openssl/err.h>
 -#include <openssl/evp.h>
 -#include <openssl/rand.h>
 -#include <openssl/engine.h>
 -
 -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<NETLIBHTTPREQUEST> 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<NETLIBHTTPREQUEST> 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<NETLIBHTTPREQUEST> 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<NETLIBHTTPREQUEST> 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 <http://www.gnu.org/licenses/>.
 +*/
 +
 +#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<RequestQueueItem> 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 <windows.h> -#include <commctrl.h> -#include <malloc.h> -#include <time.h> - -#include <newpluginapi.h> -#include <m_database.h> -#include <m_langpack.h> -#include <m_message.h> -#include <m_netlib.h> -#include <m_options.h> -#include <m_popup.h> -#include <m_json.h> -#include <m_avatars.h> -#include <m_icolib.h> -#include <m_skin.h> -#include <m_clist.h> -#include <m_genmenu.h> -#include <m_string.h> -#include <m_freeimage.h> -#include <m_imgsrvc.h> -#include <m_protocols.h> -#include <m_protomod.h> -#include <m_protosvc.h> -#include <m_protoint.h> -#include <m_idle.h> -#include <m_xstatus.h> -#include <m_extraicons.h> -#include <m_gui.h> - -#include <map> -#include <vector> -#include <string> -#include <algorithm> - -#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 <windows.h>
 +#include <commctrl.h>
 +#include <malloc.h>
 +#include <time.h>
 +
 +#include <newpluginapi.h>
 +#include <m_database.h>
 +#include <m_langpack.h>
 +#include <m_message.h>
 +#include <m_netlib.h>
 +#include <m_options.h>
 +#include <m_popup.h>
 +#include <m_json.h>
 +#include <m_avatars.h>
 +#include <m_icolib.h>
 +#include <m_skin.h>
 +#include <m_clist.h>
 +#include <m_genmenu.h>
 +#include <m_string.h>
 +#include <m_freeimage.h>
 +#include <m_imgsrvc.h>
 +#include <m_protocols.h>
 +#include <m_protomod.h>
 +#include <m_protosvc.h>
 +#include <m_protoint.h>
 +#include <m_idle.h>
 +#include <m_xstatus.h>
 +#include <m_extraicons.h>
 +#include <m_gui.h>
 +
 +#include <map>
 +#include <vector>
 +#include <string>
 +#include <algorithm>
 +
 +#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<std::string, JSONNODE*>::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<CSteamProto>(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<CSteamProto>
  {
 @@ -152,27 +110,23 @@ protected:  	mir_cs contact_search_lock;
  	mir_cs requests_queue_lock;
  	mir_cs set_status_lock;
 -	LIST<QueueItem> requestsQueue;
  	// instances
  	static LIST<CSteamProto> 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 <stdver.h>
  | 
