summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocols/Icq10/src/groupchats.cpp2
-rw-r--r--protocols/Icq10/src/http.h1
-rw-r--r--protocols/Icq10/src/proto.cpp12
-rw-r--r--protocols/Icq10/src/proto.h15
-rw-r--r--protocols/Icq10/src/server.cpp65
5 files changed, 55 insertions, 40 deletions
diff --git a/protocols/Icq10/src/groupchats.cpp b/protocols/Icq10/src/groupchats.cpp
index 0951df4d0f..5d4253bc15 100644
--- a/protocols/Icq10/src/groupchats.cpp
+++ b/protocols/Icq10/src/groupchats.cpp
@@ -145,7 +145,7 @@ public:
if (m_clc.GetCheck(hItem)) {
if (!szMembers.IsEmpty())
szMembers.AppendChar(',');
- szMembers.AppendFormat("%d", m_proto->getDword(hContact, DB_KEY_UIN));
+ szMembers.Append(m_proto->GetUserId(hContact));
}
}
}
diff --git a/protocols/Icq10/src/http.h b/protocols/Icq10/src/http.h
index 58dbba4060..bdcac34f50 100644
--- a/protocols/Icq10/src/http.h
+++ b/protocols/Icq10/src/http.h
@@ -9,6 +9,7 @@ enum IcqConnection
struct AsyncHttpRequest : public MTHttpRequest<CIcqProto>
{
IcqConnection m_conn;
+ MCONTACT hContact;
char m_reqId[50];
AsyncHttpRequest(IcqConnection, int type, const char *szUrl, MTHttpRequestHandler pFunc = nullptr);
diff --git a/protocols/Icq10/src/proto.cpp b/protocols/Icq10/src/proto.cpp
index 4b0aa787f0..a5c99219aa 100644
--- a/protocols/Icq10/src/proto.cpp
+++ b/protocols/Icq10/src/proto.cpp
@@ -38,6 +38,7 @@ CIcqProto::CIcqProto(const char* aProtoName, const wchar_t* aUserName) :
m_arHttpQueue(10),
m_arOwnIds(1),
m_arCache(20, NumericKeySortT),
+ m_arGroups(10, NumericKeySortT),
arMarkReadQueue(10, NumericKeySortT),
m_evRequestsQueue(CreateEvent(nullptr, FALSE, FALSE, nullptr)),
m_dwUin(this, DB_KEY_UIN, 0),
@@ -117,12 +118,9 @@ void CIcqProto::MarkReadTimerProc(HWND hwnd, UINT, UINT_PTR id, DWORD)
while (ppro->arMarkReadQueue.getCount()) {
IcqCacheItem *pUser = ppro->arMarkReadQueue[0];
- char buf[100];
- itoa(ppro->getDword(pUser->m_hContact, DB_KEY_UIN), buf, 10);
-
auto *pReq = new AsyncHttpRequest(CONN_RAPI, REQUEST_POST, ICQ_ROBUST_SERVER);
JSONNode request, params; params.set_name("params");
- params << CHAR_PARAM("sn", buf) << INT64_PARAM("lastRead", ppro->getId(pUser->m_hContact, DB_KEY_LASTMSGID));
+ params << CHAR_PARAM("sn", ppro->GetUserId(pUser->m_hContact)) << INT64_PARAM("lastRead", ppro->getId(pUser->m_hContact, DB_KEY_LASTMSGID));
request << CHAR_PARAM("method", "setDlgStateWim") << CHAR_PARAM("reqId", pReq->m_reqId)
<< CHAR_PARAM("authToken", ppro->m_szRToken) << INT_PARAM("clientId", ppro->m_iRClientId) << params;
pReq->m_szParam = ptrW(json_write(&request));
@@ -186,9 +184,9 @@ int CIcqProto::AuthRequest(MCONTACT hContact, const wchar_t* szMessage)
{
auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_POST, ICQ_API_SERVER "/buddylist/addBuddy", &CIcqProto::OnAddBuddy);
pReq << CHAR_PARAM("f", "json") << CHAR_PARAM("aimsid", m_aimsid) << CHAR_PARAM("r", pReq->m_reqId) << WCHAR_PARAM("authorizationMsg", szMessage)
- << INT_PARAM("buddy", getDword(hContact, DB_KEY_UIN)) << CHAR_PARAM("group", "General") << INT_PARAM("preAuthorized", 1);
+ << CHAR_PARAM("buddy", GetUserId(hContact)) << CHAR_PARAM("group", "General") << INT_PARAM("preAuthorized", 1);
pReq->flags |= NLHRF_NODUMPSEND;
- pReq->pUserInfo = (void*)hContact;
+ pReq->hContact = hContact;
Push(pReq);
return 0;
}
@@ -408,7 +406,7 @@ int CIcqProto::UserIsTyping(MCONTACT hContact, int type)
auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, ICQ_API_SERVER "/im/setTyping");
pReq->flags |= NLHRF_NODUMPSEND;
pReq << CHAR_PARAM("f", "json") << CHAR_PARAM("aimsid", m_aimsid) << CHAR_PARAM("f", "json")
- << INT_PARAM("t", getDword(hContact, DB_KEY_UIN)) << CHAR_PARAM("r", pReq->m_reqId)
+ << CHAR_PARAM("t", GetUserId(hContact)) << CHAR_PARAM("r", pReq->m_reqId)
<< CHAR_PARAM("typingStatus", (type == PROTOTYPE_SELFTYPING_ON) ? "typing" : "typed");
Push(pReq);
return 0;
diff --git a/protocols/Icq10/src/proto.h b/protocols/Icq10/src/proto.h
index 70f0c9855f..dbb7e24bf9 100644
--- a/protocols/Icq10/src/proto.h
+++ b/protocols/Icq10/src/proto.h
@@ -42,6 +42,20 @@ enum ChatMenuItems
IDM_INVITE = 10, IDM_LEAVE
};
+struct IcqGroup
+{
+ IcqGroup(int icqId, const CMStringW &wszName) :
+ m_iIcqId(icqId),
+ m_wszName(wszName)
+ {
+ m_iMirId = ::Clist_GroupExists(wszName);
+ }
+
+ MGROUP m_iMirId;
+ int m_iIcqId;
+ CMStringW m_wszName;
+};
+
struct IcqCacheItem
{
IcqCacheItem(DWORD _uin, MCONTACT _contact) :
@@ -171,6 +185,7 @@ class CIcqProto : public PROTO<CIcqProto>
mir_cs m_csCache;
OBJLIST<IcqCacheItem> m_arCache;
+ OBJLIST<IcqGroup> m_arGroups;
void InitContactCache(void);
IcqCacheItem* FindContactByUIN(DWORD);
diff --git a/protocols/Icq10/src/server.cpp b/protocols/Icq10/src/server.cpp
index 6033b73b14..3c9a12215c 100644
--- a/protocols/Icq10/src/server.cpp
+++ b/protocols/Icq10/src/server.cpp
@@ -30,9 +30,9 @@ void CIcqProto::CheckAvatarChange(MCONTACT hContact, const JSONNode &ev)
setWString(hContact, "IconId", wszIconId);
CMStringA szUrl(ev["buddyIcon"].as_mstring());
- auto *p = new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, szUrl, &CIcqProto::OnReceiveAvatar);
- p->pUserInfo = (void*)hContact;
- Push(p);
+ auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, szUrl, &CIcqProto::OnReceiveAvatar);
+ pReq->hContact = hContact;
+ Push(pReq);
}
}
@@ -307,8 +307,8 @@ void CIcqProto::RetrieveUserInfo(MCONTACT hContact)
{
auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, ICQ_API_SERVER "/presence/get", &CIcqProto::OnGetUserInfo);
pReq->flags |= NLHRF_NODUMPSEND;
- pReq->pUserInfo = (void*)hContact;
- pReq << CHAR_PARAM("f", "json") << CHAR_PARAM("aimsid", m_aimsid) << INT_PARAM("mdir", 1) << INT_PARAM("t", getDword(hContact, DB_KEY_UIN));
+ pReq->hContact = hContact;
+ pReq << CHAR_PARAM("f", "json") << CHAR_PARAM("aimsid", m_aimsid) << INT_PARAM("mdir", 1) << CHAR_PARAM("t", GetUserId(hContact));
Push(pReq);
}
@@ -323,14 +323,11 @@ void CIcqProto::RetrieveUserHistory(MCONTACT hContact, __int64 startMsgId, __int
return;
auto *pReq = new AsyncHttpRequest(CONN_RAPI, REQUEST_POST, ICQ_ROBUST_SERVER, &CIcqProto::OnGetUserHistory);
- //pReq->flags |= NLHRF_NODUMPSEND;
- pReq->pUserInfo = (void*)hContact;
-
- char buf[100];
- itoa(getDword(hContact, DB_KEY_UIN), buf, 10);
+ pReq->flags |= NLHRF_NODUMPSEND;
+ pReq->hContact = hContact;
JSONNode request, params; params.set_name("params");
- params << CHAR_PARAM("sn", buf) << INT64_PARAM("fromMsgId", startMsgId);
+ params << CHAR_PARAM("sn", GetUserId(hContact)) << INT64_PARAM("fromMsgId", startMsgId);
if (endMsgId != -1)
params << INT64_PARAM("tillMsgId", endMsgId);
params << INT_PARAM("count", 1000) << CHAR_PARAM("aimSid", m_aimsid) << CHAR_PARAM("patchVersion", "1") << CHAR_PARAM("language", "ru-ru");
@@ -422,12 +419,10 @@ void CIcqProto::StartSession()
void CIcqProto::OnAddBuddy(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq)
{
- MCONTACT hContact = (MCONTACT)pReq->pUserInfo;
-
JsonReply root(pReply);
if (root.error() == 200) {
- RetrieveUserInfo(getDword(hContact, DB_KEY_UIN));
- db_unset(hContact, "CList", "NotOnList");
+ RetrieveUserInfo(pReq->hContact);
+ db_unset(pReq->hContact, "CList", "NotOnList");
}
}
@@ -487,36 +482,32 @@ void CIcqProto::OnCheckPassword(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest*)
void CIcqProto::OnGetUserHistory(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq)
{
- MCONTACT hContact = (MCONTACT)pReq->pUserInfo;
-
RobustReply root(pReply);
if (root.error() != 20000)
return;
- __int64 lastMsgId = getId(hContact, DB_KEY_LASTMSGID);
+ __int64 lastMsgId = getId(pReq->hContact, DB_KEY_LASTMSGID);
const JSONNode &results = root.results();
for (auto &it : results["messages"])
- ParseMessage(hContact, lastMsgId, it);
+ ParseMessage(pReq->hContact, lastMsgId, it);
- setId(hContact, DB_KEY_LASTMSGID, lastMsgId);
+ setId(pReq->hContact, DB_KEY_LASTMSGID, lastMsgId);
}
void CIcqProto::OnGetUserInfo(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq)
{
- MCONTACT hContact = (MCONTACT)pReq->pUserInfo;
-
JsonReply root(pReply);
if (root.error() != 200) {
- ProtoBroadcastAck(hContact, ACKTYPE_GETINFO, ACKRESULT_FAILED, nullptr);
+ ProtoBroadcastAck(pReq->hContact, ACKTYPE_GETINFO, ACKRESULT_FAILED, nullptr);
return;
}
const JSONNode &data = root.data();
for (auto &it : data["users"])
- ParseBuddyInfo(it, hContact);
+ ParseBuddyInfo(it, pReq->hContact);
- ProtoBroadcastAck(hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, nullptr);
+ ProtoBroadcastAck(pReq->hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, nullptr);
}
void CIcqProto::OnStartSession(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest*)
@@ -554,20 +545,19 @@ void CIcqProto::OnStartSession(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest*)
void CIcqProto::OnReceiveAvatar(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq)
{
- MCONTACT hContact = (MCONTACT)pReq->pUserInfo;
PROTO_AVATAR_INFORMATION ai = {};
- ai.hContact = hContact;
+ ai.hContact = pReq->hContact;
if (pReply->resultCode != 200 || pReply->pData == nullptr) {
LBL_Error:
- ProtoBroadcastAck(hContact, ACKTYPE_AVATAR, ACKRESULT_FAILED, HANDLE(&ai), 0);
+ ProtoBroadcastAck(pReq->hContact, ACKTYPE_AVATAR, ACKRESULT_FAILED, HANDLE(&ai), 0);
return;
}
const wchar_t *pwszExtension;
ai.format = ProtoGetBufferFormat(pReply->pData, &pwszExtension);
- setByte(hContact, "AvatarType", ai.format);
- GetAvatarFileName(hContact, ai.filename, _countof(ai.filename));
+ setByte(pReq->hContact, "AvatarType", ai.format);
+ GetAvatarFileName(pReq->hContact, ai.filename, _countof(ai.filename));
FILE *out = _wfopen(ai.filename, L"wb");
if (out == nullptr)
@@ -576,8 +566,8 @@ LBL_Error:
fwrite(pReply->pData, pReply->dataLength, 1, out);
fclose(out);
- if (hContact != 0) {
- ProtoBroadcastAck(hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS, HANDLE(&ai), 0);
+ if (pReq->hContact != 0) {
+ ProtoBroadcastAck(pReq->hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS, HANDLE(&ai), 0);
debugLogW(L"Broadcast new avatar: %s", ai.filename);
}
else CallService(MS_AV_REPORTMYAVATARCHANGED, (WPARAM)m_szModuleName, 0);
@@ -641,9 +631,20 @@ void CIcqProto::OnSendMessage(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq)
void CIcqProto::ProcessBuddyList(const JSONNode &ev)
{
for (auto &it : ev["groups"]) {
+ int id = it["id"].as_int();
CMStringW szGroup = it["name"].as_mstring();
bool bCreated = false;
+ bool bFound = false;
+ for (auto &grp : m_arGroups)
+ if (grp->m_iIcqId == id) {
+ bFound = true;
+ break;
+ }
+
+ if (!bFound)
+ m_arGroups.insert(new IcqGroup(id, szGroup));
+
for (auto &buddy : it["buddies"]) {
MCONTACT hContact = ParseBuddyInfo(buddy);
if (hContact == INVALID_CONTACT_ID)