summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Pösel <robyer@seznam.cz>2014-12-04 06:53:04 +0000
committerRobert Pösel <robyer@seznam.cz>2014-12-04 06:53:04 +0000
commitaaf41a3dbab17fc84a3fd448d6653beb280d3a7c (patch)
treee3817bff54de2856d98709bc4d7516f64a364913
parent55a693349d1d494bf3bf60af69cf8d6f8bc23c39 (diff)
Steam:
- Fix loading sent messages from other instances - Probably fixed related memleaks - Fixed *W to *T variables/methods in steam_pooling.cpp git-svn-id: http://svn.miranda-ng.org/main/trunk@11234 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
-rw-r--r--protocols/Steam/src/steam_pooling.cpp524
1 files changed, 265 insertions, 259 deletions
diff --git a/protocols/Steam/src/steam_pooling.cpp b/protocols/Steam/src/steam_pooling.cpp
index 164baa9b47..1bcc29bbb5 100644
--- a/protocols/Steam/src/steam_pooling.cpp
+++ b/protocols/Steam/src/steam_pooling.cpp
@@ -1,260 +1,266 @@
-#include "common.h"
-
-#define POLLING_ERRORS_LIMIT 3
-
-void CSteamProto::ParsePollData(JSONNODE *data)
-{
- JSONNODE *node, *item = NULL;
-
- std::string steamIds;
- for (size_t i = 0; i < json_size(data); i++)
- {
- item = json_at(data, i);
- if (item == NULL)
- break;
-
- node = json_get(item, "steamid_from");
- ptrA steamId(mir_u2a(json_as_string(node)));
-
- node = json_get(item, "utc_timestamp");
- time_t timestamp = atol(ptrA(mir_u2a(json_as_string(node))));
-
- node = json_get(item, "type");
- ptrW type(json_as_string(node));
- if (!lstrcmpi(type, L"saytext") || !lstrcmpi(type, L"emote") ||
- !lstrcmpi(type, L"my_saytext") || !lstrcmpi(type, L"my_emote"))
- {
- node = json_get(item, "text");
- const wchar_t *text = json_as_string(node);
-
- if (_tcsstr(type, L"my_") == NULL)
- {
- MCONTACT hContact = FindContact(steamId);
- if (hContact)
- {
- PROTORECVEVENT recv = { 0 };
- recv.flags = PREF_UTF;
- recv.timestamp = timestamp;
- recv.szMessage = mir_utf8encodeW(text);
-
- ProtoChainRecvMsg(hContact, &recv);
- }
- }
- else
- {
- MCONTACT hContact = FindContact(steamId);
- if (hContact)
- AddDBEvent(hContact, EVENTTYPE_MESSAGE, timestamp, DBEF_UTF | DBEF_SENT, lstrlen(text), (BYTE*)mir_utf8encodeW(text));
- }
- }
- /*else if (!lstrcmpi(type, L"typing"))
- {
- }*/
- else if (!lstrcmpi(type, L"personastate"))
- {
- node = json_get(item, "persona_state");
- int status = SteamToMirandaStatus(json_as_int(node));
-
- if (IsMe(steamId))
- {
- node = json_get(item, "persona_name");
- setWString("Nick", json_as_string(node));
-
- if (status == ID_STATUS_OFFLINE)
- continue;
-
- if (status != m_iStatus)
- {
- debugLog(_T("CSteamProto::ParsePollData: Change own status to %i"), status);
- int oldStatus = m_iStatus;
- m_iStatus = m_iDesiredStatus = status;
- ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, m_iStatus);
- }
-
- continue;
- }
-
- MCONTACT hContact = FindContact(steamId);
- if (hContact == NULL)
- hContact = AddContact(steamId);
-
- setWord(hContact, "Status", status);
-
- node = json_get(item, "persona_name");
- setWString(hContact, "Nick", json_as_string(node));
-
- // todo: find difference between state changing and info changing
- steamIds.append(steamId).append(",");
- }
- else if (!lstrcmpi(type, L"personarelationship"))
- {
- node = json_get(item, "persona_state");
- int state = json_as_int(node);
-
- switch (state)
- {
- case 0:
- {// removed
- MCONTACT hContact = FindContact(steamId);
- if (hContact)
- {
- setByte(hContact, "Auth", 1);
-
- wchar_t message[MAX_PATH];
- mir_sntprintf(
- message, MAX_PATH,
- TranslateT("%s has been removed from your contact list"),
- ptrW(mir_a2u(steamId)));
-
- ShowNotification(L"Steam", message);
- }
- }
- break;
-
- case 1:
- // ignored
- // todo
- {
- MCONTACT hContact = FindContact(steamId);
- if (hContact)
- {
- setByte(hContact, "Block", 1);
- }
- }
- break;
-
- case 2:
- { // auth request
- /*MCONTACT hContact = FindContact(steamId);
- if (!hContact)
- hContact = AddContact(steamId, true);*/
-
- //RaiseAuthRequestThread((void*)hContact);
-
- ptrA token(getStringA("TokenSecret"));
-
- PushRequest(
- new SteamWebApi::GetUserSummariesRequest(token, steamId),
- &CSteamProto::OnAuthRequested,
- mir_strdup(steamId));
- }
- break;
-
- case 3:
- // add to list
- // todo
- break;
-
- default: continue;
- }
- }
- /*else if (!lstrcmpi(type, L"leftconversation"))
- {
- }*/
- else
- {
- continue;
- }
- }
-
- if (!steamIds.empty())
- {
- steamIds.pop_back();
- ptrA token(getStringA("TokenSecret"));
-
- PushRequest(
- new SteamWebApi::GetUserSummariesRequest(token, steamIds.c_str()),
- &CSteamProto::OnGotUserSummaries);
- }
-}
-
-void CSteamProto::PollingThread(void*)
-{
- debugLog(_T("CSteamProto::PollingThread: entering"));
-
- ptrA token(getStringA("TokenSecret"));
- ptrA umqId(getStringA("UMQID"));
- UINT32 messageId = getDword("MessageID", 0);
-
- //SteamWebApi::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);
- debugLogA("CSteamProto::PollingThread: %s", request->szUrl);
- request->szUrl = (char*)request->url.c_str();
- request->nlc = m_pollingConnection;
- NETLIBHTTPREQUEST *response = (NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM)m_hNetlibUser, (LPARAM)request);
- delete request;
-
- if (response == NULL || response->resultCode != HTTP_STATUS_OK)
- {
- if (response != NULL)
- CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)response);
-
- errors++;
- continue;
- }
- else
- errors = 0;
-
- JSONROOT root(response->pData);
- JSONNODE *node = json_get(root, "error");
- ptrW error(json_as_string(node));
-
- if (!lstrcmpi(error, L"OK"))
- {
- node = json_get(root, "messagelast");
- messageId = json_as_int(node);
-
- node = json_get(root, "messages");
- JSONNODE *nroot = json_as_array(node);
-
- if (nroot != NULL)
- ParsePollData(nroot);
-
- m_pollingConnection = response->nlc;
- }
- else if (!lstrcmpi(error, L"Timeout"))
- {
- continue;
- }
- /*else if (!lstrcmpi(error, L"Not Logged On")) // 'else' below will handle this error, we don't need this particular check right now
- {
- if (!IsOnline())
- {
- // need to relogin
- debugLogA("CSteamProto::PollingThread: not logged on");
-
- SetStatus(ID_STATUS_OFFLINE);
- }
-
- breaked = true;
- }*/
- else
- {
- // something wrong
- debugLog(_T("CSteamProto::PollingThread: %s (%d)"), error, response->resultCode);
-
- // token has expired
- if (response->resultCode == HTTP_STATUS_UNAUTHORIZED)
- delSetting("TokenSecret");
-
- breaked = true;
- }
-
- CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)response);
- }
-
- setDword("MessageID", messageId);
-
- m_hPollingThread = NULL;
- debugLog(_T("CSteamProto::PollingThread: leaving"));
-
- if (!isTerminated)
- {
- debugLogA("CSteamProto::PollingThread: unexpected termination; switching protocol to offline");
- SetStatus(ID_STATUS_OFFLINE);
- }
+#include "common.h"
+
+#define POLLING_ERRORS_LIMIT 3
+
+void CSteamProto::ParsePollData(JSONNODE *data)
+{
+ JSONNODE *node, *item = NULL;
+
+ std::string steamIds;
+ for (size_t i = 0; i < json_size(data); i++)
+ {
+ item = json_at(data, i);
+ if (item == NULL)
+ break;
+
+ node = json_get(item, "steamid_from");
+ ptrA steamId(mir_t2a(json_as_string(node)));
+
+ node = json_get(item, "utc_timestamp");
+ time_t timestamp = atol(ptrA(mir_t2a(json_as_string(node))));
+
+ node = json_get(item, "type");
+ ptrT type(json_as_string(node));
+ if (!lstrcmpi(type, _T("saytext")) || !lstrcmpi(type, _T("emote")) ||
+ !lstrcmpi(type, _T("my_saytext")) || !lstrcmpi(type, _T("my_emote")))
+ {
+ node = json_get(item, "text");
+ const TCHAR *text = json_as_string(node);
+
+ if (_tcsstr(type, _T("my_")) == NULL)
+ {
+ MCONTACT hContact = FindContact(steamId);
+ if (hContact)
+ {
+ ptrA szMessage(mir_utf8encodeT(text));
+
+ PROTORECVEVENT recv = { 0 };
+ recv.flags = PREF_UTF;
+ recv.timestamp = timestamp;
+ recv.szMessage = szMessage;
+
+ ProtoChainRecvMsg(hContact, &recv);
+ }
+ }
+ else
+ {
+ MCONTACT hContact = FindContact(steamId);
+ if (hContact)
+ {
+ ptrA szMessage(mir_utf8encodeT(text));
+
+ AddDBEvent(hContact, EVENTTYPE_MESSAGE, timestamp, DBEF_UTF | DBEF_SENT, mir_strlen(szMessage) + 1, (PBYTE)(char*)szMessage);
+ }
+ }
+ }
+ /*else if (!lstrcmpi(type, _T("typing")))
+ {
+ }*/
+ else if (!lstrcmpi(type, _T("personastate")))
+ {
+ node = json_get(item, "persona_state");
+ int status = SteamToMirandaStatus(json_as_int(node));
+
+ if (IsMe(steamId))
+ {
+ node = json_get(item, "persona_name");
+ setTString("Nick", json_as_string(node));
+
+ if (status == ID_STATUS_OFFLINE)
+ continue;
+
+ if (status != m_iStatus)
+ {
+ debugLog(_T("CSteamProto::ParsePollData: Change own status to %i"), status);
+ int oldStatus = m_iStatus;
+ m_iStatus = m_iDesiredStatus = status;
+ ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, m_iStatus);
+ }
+
+ continue;
+ }
+
+ MCONTACT hContact = FindContact(steamId);
+ if (hContact == NULL)
+ hContact = AddContact(steamId);
+
+ setWord(hContact, "Status", status);
+
+ node = json_get(item, "persona_name");
+ setTString(hContact, "Nick", json_as_string(node));
+
+ // todo: find difference between state changing and info changing
+ steamIds.append(steamId).append(",");
+ }
+ else if (!lstrcmpi(type, _T("personarelationship")))
+ {
+ node = json_get(item, "persona_state");
+ int state = json_as_int(node);
+
+ switch (state)
+ {
+ case 0:
+ {// removed
+ MCONTACT hContact = FindContact(steamId);
+ if (hContact)
+ {
+ setByte(hContact, "Auth", 1);
+
+ TCHAR message[MAX_PATH];
+ mir_sntprintf(
+ message, MAX_PATH,
+ TranslateT("%s has been removed from your contact list"),
+ ptrT(mir_a2t(steamId)));
+
+ ShowNotification(_T("Steam"), message);
+ }
+ }
+ break;
+
+ case 1:
+ // ignored
+ // todo
+ {
+ MCONTACT hContact = FindContact(steamId);
+ if (hContact)
+ {
+ setByte(hContact, "Block", 1);
+ }
+ }
+ break;
+
+ case 2:
+ { // auth request
+ /*MCONTACT hContact = FindContact(steamId);
+ if (!hContact)
+ hContact = AddContact(steamId, true);*/
+
+ //RaiseAuthRequestThread((void*)hContact);
+
+ ptrA token(getStringA("TokenSecret"));
+
+ PushRequest(
+ new SteamWebApi::GetUserSummariesRequest(token, steamId),
+ &CSteamProto::OnAuthRequested,
+ mir_strdup(steamId));
+ }
+ break;
+
+ case 3:
+ // add to list
+ // todo
+ break;
+
+ default: continue;
+ }
+ }
+ /*else if (!lstrcmpi(type, _T("leftconversation")))
+ {
+ }*/
+ else
+ {
+ continue;
+ }
+ }
+
+ if (!steamIds.empty())
+ {
+ steamIds.pop_back();
+ ptrA token(getStringA("TokenSecret"));
+
+ PushRequest(
+ new SteamWebApi::GetUserSummariesRequest(token, steamIds.c_str()),
+ &CSteamProto::OnGotUserSummaries);
+ }
+}
+
+void CSteamProto::PollingThread(void*)
+{
+ debugLog(_T("CSteamProto::PollingThread: entering"));
+
+ ptrA token(getStringA("TokenSecret"));
+ ptrA umqId(getStringA("UMQID"));
+ UINT32 messageId = getDword("MessageID", 0);
+
+ //SteamWebApi::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);
+ debugLogA("CSteamProto::PollingThread: %s", request->szUrl);
+ request->szUrl = (char*)request->url.c_str();
+ request->nlc = m_pollingConnection;
+ NETLIBHTTPREQUEST *response = (NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM)m_hNetlibUser, (LPARAM)request);
+ delete request;
+
+ if (response == NULL || response->resultCode != HTTP_STATUS_OK)
+ {
+ if (response != NULL)
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)response);
+
+ errors++;
+ continue;
+ }
+ else
+ errors = 0;
+
+ JSONROOT root(response->pData);
+ JSONNODE *node = json_get(root, "error");
+ ptrT error(json_as_string(node));
+
+ if (!lstrcmpi(error, _T("OK")))
+ {
+ node = json_get(root, "messagelast");
+ messageId = json_as_int(node);
+
+ node = json_get(root, "messages");
+ JSONNODE *nroot = json_as_array(node);
+
+ if (nroot != NULL)
+ ParsePollData(nroot);
+
+ m_pollingConnection = response->nlc;
+ }
+ else if (!lstrcmpi(error, _T("Timeout")))
+ {
+ continue;
+ }
+ /*else if (!lstrcmpi(error, _T("Not Logged On"))) // 'else' below will handle this error, we don't need this particular check right now
+ {
+ if (!IsOnline())
+ {
+ // need to relogin
+ debugLog(_T("CSteamProto::PollingThread: not logged on"));
+
+ SetStatus(ID_STATUS_OFFLINE);
+ }
+
+ breaked = true;
+ }*/
+ else
+ {
+ // something wrong
+ debugLog(_T("CSteamProto::PollingThread: %s (%d)"), error, response->resultCode);
+
+ // token has expired
+ if (response->resultCode == HTTP_STATUS_UNAUTHORIZED)
+ delSetting("TokenSecret");
+
+ breaked = true;
+ }
+
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)response);
+ }
+
+ setDword("MessageID", messageId);
+
+ m_hPollingThread = NULL;
+ debugLog(_T("CSteamProto::PollingThread: leaving"));
+
+ if (!isTerminated)
+ {
+ debugLog(_T("CSteamProto::PollingThread: unexpected termination; switching protocol to offline"));
+ SetStatus(ID_STATUS_OFFLINE);
+ }
} \ No newline at end of file