summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2019-08-08 12:43:31 +0300
committerGeorge Hazan <ghazan@miranda.im>2019-08-08 12:43:31 +0300
commit713456101f23626fef2766d86a57fb84a032c30a (patch)
tree9d55b518f06c0dd5f7e765830eb99f4a7aff1d97
parent85341d5502ce3db9f60c0f9231e7f66a57f46546 (diff)
ICQ-WIM: fixes problems with old server-side groups, created by Miranda IM
-rw-r--r--protocols/ICQ-WIM/src/poll.cpp43
-rw-r--r--protocols/ICQ-WIM/src/proto.cpp17
-rw-r--r--protocols/ICQ-WIM/src/proto.h24
-rw-r--r--protocols/ICQ-WIM/src/stdafx.h1
-rw-r--r--protocols/ICQ-WIM/src/utils.cpp9
-rw-r--r--protocols/ICQ-WIM/src/version.h2
6 files changed, 61 insertions, 35 deletions
diff --git a/protocols/ICQ-WIM/src/poll.cpp b/protocols/ICQ-WIM/src/poll.cpp
index 1d2a43b8dc..b58eaa111c 100644
--- a/protocols/ICQ-WIM/src/poll.cpp
+++ b/protocols/ICQ-WIM/src/poll.cpp
@@ -23,11 +23,27 @@
void CIcqProto::ProcessBuddyList(const JSONNode &ev)
{
+ m_arGroups.destroy();
+
+ LIST<IcqGroup> tmpGroups(10);
bool bEnableMenu = false;
for (auto &it : ev["groups"]) {
- CMStringW szGroup = it["name"].as_mstring();
- parseGroup(szGroup);
+ auto *pGroup = new IcqGroup(it["id"].as_int(), it["name"].as_mstring());
+ debugLogA("new group: id=%d, level=%d, name=%S", pGroup->id, pGroup->level, pGroup->wszName.c_str());
+ if (pGroup->level != 0) {
+ for (auto &p : tmpGroups.rev_iter()) {
+ if (p->level == pGroup->level-1) {
+ pGroup->wszName.Delete(pGroup->level);
+ pGroup->wszName = p->wszName + L"\\" + pGroup->wszName;
+ debugLogA("Group name fixed as %S", pGroup->wszName.c_str());
+ break;
+ }
+ }
+ }
+ tmpGroups.insert(pGroup);
+ m_arGroups.insert(pGroup);
+
bool bCreated = false;
for (auto &buddy : it["buddies"]) {
@@ -35,19 +51,17 @@ void CIcqProto::ProcessBuddyList(const JSONNode &ev)
if (hContact == INVALID_CONTACT_ID)
continue;
- setWString(hContact, "IcqGroup", szGroup);
-
ptrW mirGroup(Clist_GetGroup(hContact));
- if (mir_wstrcmp(mirGroup, szGroup))
+ if (mir_wstrcmp(mirGroup, pGroup->wszName))
bEnableMenu = true;
if (mirGroup) {
if (!bCreated) {
- Clist_GroupCreate(0, szGroup);
+ Clist_GroupCreate(0, pGroup->wszName);
bCreated = true;
}
- Clist_SetGroup(hContact, szGroup);
+ Clist_SetGroup(hContact, pGroup->wszName);
}
}
}
@@ -70,8 +84,13 @@ void CIcqProto::ProcessDiff(const JSONNode &ev)
continue;
for (auto &it : block["data"]) {
- CMStringW szGroup = it["name"].as_mstring();
- parseGroup(szGroup);
+ int grpId = it["id"].as_int();
+ auto *pGroup = m_arGroups.find((IcqGroup *)&grpId);
+ if (pGroup == nullptr) {
+ debugLogA("Group %d isn't found", grpId);
+ continue;
+ }
+
bool bCreated = false;
for (auto &buddy : it["buddies"]) {
@@ -79,16 +98,16 @@ void CIcqProto::ProcessDiff(const JSONNode &ev)
if (hContact == INVALID_CONTACT_ID)
continue;
- setWString(hContact, "IcqGroup", szGroup);
+ setWString(hContact, "IcqGroup", pGroup->wszName);
ptrW wszGroup(Clist_GetGroup(hContact));
if (!wszGroup) {
if (!bCreated) {
- Clist_GroupCreate(0, szGroup);
+ Clist_GroupCreate(0, pGroup->wszName);
bCreated = true;
}
- Clist_SetGroup(hContact, szGroup);
+ Clist_SetGroup(hContact, pGroup->wszName);
}
}
}
diff --git a/protocols/ICQ-WIM/src/proto.cpp b/protocols/ICQ-WIM/src/proto.cpp
index 15c4c6d4f1..abfab56f45 100644
--- a/protocols/ICQ-WIM/src/proto.cpp
+++ b/protocols/ICQ-WIM/src/proto.cpp
@@ -43,7 +43,8 @@ CIcqProto::CIcqProto(const char *aProtoName, const wchar_t *aUserName) :
m_arHttpQueue(10),
m_arOwnIds(1, PtrKeySortT),
m_arCache(20, &CompareCache),
- arMarkReadQueue(10, NumericKeySortT),
+ m_arGroups(10, NumericKeySortT),
+ m_arMarkReadQueue(10, NumericKeySortT),
m_evRequestsQueue(CreateEvent(nullptr, FALSE, FALSE, nullptr)),
m_szOwnId(this, DB_KEY_ID),
m_iStatus1(this, "Status1", ID_STATUS_AWAY),
@@ -199,9 +200,9 @@ void CIcqProto::MarkReadTimerProc(HWND hwnd, UINT, UINT_PTR id, DWORD)
{
CIcqProto *ppro = (CIcqProto*)id;
- mir_cslock lck(ppro->csMarkReadQueue);
- while (ppro->arMarkReadQueue.getCount()) {
- IcqCacheItem *pUser = ppro->arMarkReadQueue[0];
+ mir_cslock lck(ppro->m_csMarkReadQueue);
+ while (ppro->m_arMarkReadQueue.getCount()) {
+ IcqCacheItem *pUser = ppro->m_arMarkReadQueue[0];
auto *pReq = new AsyncHttpRequest(CONN_RAPI, REQUEST_POST, ICQ_ROBUST_SERVER);
JSONNode request, params; params.set_name("params");
@@ -210,7 +211,7 @@ void CIcqProto::MarkReadTimerProc(HWND hwnd, UINT, UINT_PTR id, DWORD)
pReq->m_szParam = ptrW(json_write(&request));
ppro->Push(pReq);
- ppro->arMarkReadQueue.remove(0);
+ ppro->m_arMarkReadQueue.remove(0);
}
KillTimer(hwnd, id);
}
@@ -231,9 +232,9 @@ int CIcqProto::OnDbEventRead(WPARAM, LPARAM hDbEvent)
IcqCacheItem *pCache = FindContactByUIN(GetUserId(hContact));
if (pCache) {
- mir_cslock lck(csMarkReadQueue);
- if (arMarkReadQueue.indexOf(pCache) == -1)
- arMarkReadQueue.insert(pCache);
+ mir_cslock lck(m_csMarkReadQueue);
+ if (m_arMarkReadQueue.indexOf(pCache) == -1)
+ m_arMarkReadQueue.insert(pCache);
}
}
return 0;
diff --git a/protocols/ICQ-WIM/src/proto.h b/protocols/ICQ-WIM/src/proto.h
index 6056382e89..c9f40a2da8 100644
--- a/protocols/ICQ-WIM/src/proto.h
+++ b/protocols/ICQ-WIM/src/proto.h
@@ -68,7 +68,21 @@ enum ChatMenuItems
IDM_INVITE = 10, IDM_LEAVE
};
-struct IcqCacheItem
+struct IcqGroup
+{
+ IcqGroup(int _p1, const CMStringW &_p2) :
+ id(_p1),
+ wszName(_p2)
+ {
+ level = wszName.SpanIncluding(L"<").GetLength();
+ }
+
+ int id;
+ int level;
+ CMStringW wszName;
+};
+
+struct IcqCacheItem : public MZeroedObject
{
IcqCacheItem(const CMStringW &wszId, MCONTACT _contact) :
m_aimid(wszId),
@@ -77,7 +91,7 @@ struct IcqCacheItem
CMStringW m_aimid;
MCONTACT m_hContact;
- bool m_bInList = false;
+ bool m_bInList;
int m_iApparentMode;
time_t m_timer1, m_timer2;
};
@@ -189,8 +203,8 @@ class CIcqProto : public PROTO<CIcqProto>
void OnLoggedIn(void);
void OnLoggedOut(void);
- mir_cs csMarkReadQueue;
- LIST<IcqCacheItem> arMarkReadQueue;
+ mir_cs m_csMarkReadQueue;
+ LIST<IcqCacheItem> m_arMarkReadQueue;
static void CALLBACK MarkReadTimerProc(HWND hwnd, UINT, UINT_PTR id, DWORD);
AsyncHttpRequest* UserInfoRequest(MCONTACT);
@@ -244,6 +258,8 @@ class CIcqProto : public PROTO<CIcqProto>
mir_cs m_csOwnIds;
OBJLIST<IcqOwnMessage> m_arOwnIds;
+ OBJLIST<IcqGroup> m_arGroups;
+
CIcqDlgBase *m_pdlgEditIgnore;
int m_unreadEmails = -1;
diff --git a/protocols/ICQ-WIM/src/stdafx.h b/protocols/ICQ-WIM/src/stdafx.h
index a02de67fdf..b216ec459a 100644
--- a/protocols/ICQ-WIM/src/stdafx.h
+++ b/protocols/ICQ-WIM/src/stdafx.h
@@ -100,7 +100,6 @@
bool IsChat(const CMStringW &aimid);
int StatusFromString(const CMStringW&);
-void parseGroup(CMStringW &wszGroup);
char* time2text(time_t time);
extern HWND g_hwndHeartbeat;
diff --git a/protocols/ICQ-WIM/src/utils.cpp b/protocols/ICQ-WIM/src/utils.cpp
index 55465a77b3..d59d423f6f 100644
--- a/protocols/ICQ-WIM/src/utils.cpp
+++ b/protocols/ICQ-WIM/src/utils.cpp
@@ -311,15 +311,6 @@ void CIcqProto::setId(MCONTACT hContact, const char *szSetting, __int64 iValue)
/////////////////////////////////////////////////////////////////////////////////////////
-void parseGroup(CMStringW &wszGroup)
-{
- wszGroup.Replace(L">", L"\\");
- if (wszGroup[0] == '\\')
- wszGroup.Delete(0, 1);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
char* time2text(time_t time)
{
if (time == 0)
diff --git a/protocols/ICQ-WIM/src/version.h b/protocols/ICQ-WIM/src/version.h
index a5f369d606..9e813e32ec 100644
--- a/protocols/ICQ-WIM/src/version.h
+++ b/protocols/ICQ-WIM/src/version.h
@@ -1,7 +1,7 @@
#define __MAJOR_VERSION 0
#define __MINOR_VERSION 95
#define __RELEASE_NUM 11
-#define __BUILD_NUM 5
+#define __BUILD_NUM 6
#include <stdver.h>