diff options
author | George Hazan <ghazan@miranda.im> | 2019-08-08 12:43:31 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2019-08-08 12:43:31 +0300 |
commit | 713456101f23626fef2766d86a57fb84a032c30a (patch) | |
tree | 9d55b518f06c0dd5f7e765830eb99f4a7aff1d97 /protocols | |
parent | 85341d5502ce3db9f60c0f9231e7f66a57f46546 (diff) |
ICQ-WIM: fixes problems with old server-side groups, created by Miranda IM
Diffstat (limited to 'protocols')
-rw-r--r-- | protocols/ICQ-WIM/src/poll.cpp | 43 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/proto.cpp | 17 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/proto.h | 24 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/stdafx.h | 1 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/utils.cpp | 9 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/version.h | 2 |
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> |