diff options
author | George Hazan <ghazan@miranda.im> | 2021-04-30 17:52:29 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2021-04-30 17:52:29 +0300 |
commit | 9f00802dfbad293235fc44536069c64b236fdc50 (patch) | |
tree | d6d337bdc9334c5516e30f83d5edf9f742be2f35 | |
parent | 84f2722e07a23656bdc8d1a7f4040e86450fe91d (diff) |
fixes #2859 (Импорт: дублируются контакты ICQ и FaceBook)
-rw-r--r-- | include/m_protoint.h | 3 | ||||
-rw-r--r-- | libs/win32/mir_app.lib | bin | 220758 -> 221084 bytes | |||
-rw-r--r-- | libs/win64/mir_app.lib | bin | 216580 -> 216910 bytes | |||
-rw-r--r-- | plugins/Import/src/import.cpp | 12 | ||||
-rw-r--r-- | protocols/Facebook/src/proto.cpp | 14 | ||||
-rw-r--r-- | protocols/Facebook/src/proto.h | 8 | ||||
-rw-r--r-- | protocols/Facebook/src/server.cpp | 13 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/proto.cpp | 9 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/proto.h | 1 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/utils.cpp | 7 | ||||
-rw-r--r-- | src/mir_app/src/mir_app.def | 1 | ||||
-rw-r--r-- | src/mir_app/src/mir_app64.def | 1 | ||||
-rw-r--r-- | src/mir_app/src/proto_accs.cpp | 28 | ||||
-rw-r--r-- | src/mir_app/src/proto_chains.cpp | 3 | ||||
-rw-r--r-- | src/mir_app/src/proto_interface.cpp | 3 |
15 files changed, 70 insertions, 33 deletions
diff --git a/include/m_protoint.h b/include/m_protoint.h index 0aea12fa33..0f9444c448 100644 --- a/include/m_protoint.h +++ b/include/m_protoint.h @@ -247,6 +247,9 @@ public: // builds the account's protocol menu
virtual void OnBuildProtoMenu(void);
+ // called when an account's contact is added
+ virtual void OnContactAdded(MCONTACT);
+
// called when an account's contact is deleted
virtual void OnContactDeleted(MCONTACT);
diff --git a/libs/win32/mir_app.lib b/libs/win32/mir_app.lib Binary files differindex 8b97a73f1e..a879ad15e6 100644 --- a/libs/win32/mir_app.lib +++ b/libs/win32/mir_app.lib diff --git a/libs/win64/mir_app.lib b/libs/win64/mir_app.lib Binary files differindex 2a9408c8e0..d169e2d3fe 100644 --- a/libs/win64/mir_app.lib +++ b/libs/win64/mir_app.lib diff --git a/plugins/Import/src/import.cpp b/plugins/Import/src/import.cpp index f1e270eac7..ca3e78f33c 100644 --- a/plugins/Import/src/import.cpp +++ b/plugins/Import/src/import.cpp @@ -792,18 +792,18 @@ MCONTACT CImportBatch::ImportContact(MCONTACT hSrc) return 0;
}
- if (Proto_AddToContact(hDst, szDstModuleName) != 0) {
- db_delete_contact(hDst);
- AddMessage(LPGENW("Failed to add %S contact %s"), szDstModuleName, pszUniqueID);
- return INVALID_CONTACT_ID;
- }
-
if (dbv.type == 0)
srcDb->GetContactSetting(hSrc, cc->szProto, "ID", &dbv);
if (dbv.type != 0)
db_set(hDst, szDstModuleName, pszUniqueSetting, &dbv);
+ if (Proto_AddToContact(hDst, szDstModuleName) != 0) {
+ db_delete_contact(hDst);
+ AddMessage(LPGENW("Failed to add %S contact %s"), szDstModuleName, pszUniqueID);
+ return INVALID_CONTACT_ID;
+ }
+
CreateGroup(tszGroup, hDst);
if (tszNick && *tszNick) {
diff --git a/protocols/Facebook/src/proto.cpp b/protocols/Facebook/src/proto.cpp index 2873b2d8d3..3b9eb5101b 100644 --- a/protocols/Facebook/src/proto.cpp +++ b/protocols/Facebook/src/proto.cpp @@ -122,6 +122,18 @@ FacebookProto::~FacebookProto() { } +///////////////////////////////////////////////////////////////////////////////////////// +// protocol events + +void FacebookProto::OnContactAdded(MCONTACT hContact) +{ + __int64 userId = _atoi64(getMStringA(hContact, DBKEY_ID)); + if (userId && !FindUser(userId)) { + mir_cslock lck(m_csUsers); + m_users.insert(new FacebookUser(userId, hContact)); + } +} + void FacebookProto::OnModulesLoaded() { VARSW wszCache(L"%miranda_avatarcache%"); @@ -162,8 +174,8 @@ MCONTACT FacebookProto::AddToList(int, PROTOSEARCHRESULT *psr) return pUser->hContact; MCONTACT hContact = db_add_contact(); - Proto_AddToContact(hContact, m_szModuleName); setWString(hContact, DBKEY_ID, psr->id.w); + Proto_AddToContact(hContact, m_szModuleName); return hContact; } diff --git a/protocols/Facebook/src/proto.h b/protocols/Facebook/src/proto.h index a1beb850e3..e2dffa6513 100644 --- a/protocols/Facebook/src/proto.h +++ b/protocols/Facebook/src/proto.h @@ -466,11 +466,10 @@ class FacebookProto : public PROTO<FacebookProto> OBJLIST<COwnMessage> arOwnMessages; bool ExtractOwnMessage(__int64 msgId, COwnMessage &res); + mir_cs m_csUsers; OBJLIST<FacebookUser> m_users; - FacebookUser *FindUser(__int64 id) - { - return m_users.find((FacebookUser *)&id); - } + + FacebookUser* FindUser(__int64 id); FacebookUser *UserFromJson(const JSONNode &root, CMStringW &wszId, bool &bIsChat); @@ -521,6 +520,7 @@ public: //////////////////////////////////////////////////////////////////////////////////////// // PROTO_INTERFACE + void OnContactAdded(MCONTACT) override; void OnModulesLoaded() override; void OnShutdown() override; diff --git a/protocols/Facebook/src/server.cpp b/protocols/Facebook/src/server.cpp index 013993c741..2df81a34e3 100644 --- a/protocols/Facebook/src/server.cpp +++ b/protocols/Facebook/src/server.cpp @@ -89,15 +89,19 @@ void FacebookProto::OnLoggedOut() FacebookUser* FacebookProto::AddContact(const CMStringW &wszId, bool bTemp) { MCONTACT hContact = db_add_contact(); - Proto_AddToContact(hContact, m_szModuleName); setWString(hContact, DBKEY_ID, wszId); + Proto_AddToContact(hContact, m_szModuleName); Clist_SetGroup(hContact, m_wszDefaultGroup); if (bTemp) Contact_RemoveFromList(hContact); - auto *ret = new FacebookUser(_wtoi64(wszId), hContact); - m_users.insert(ret); - return ret; + return FindUser(_wtoi64(wszId)); +} + +FacebookUser* FacebookProto::FindUser(__int64 id) +{ + mir_cslock lck(m_csUsers); + return m_users.find((FacebookUser *)&id); } FacebookUser* FacebookProto::UserFromJson(const JSONNode &root, CMStringW &wszUserId, bool &bIsChat) @@ -267,6 +271,7 @@ FacebookUser* FacebookProto::RefreshThread(JSONNode &n) auto *pUser = FindUser(userId); if (pUser == nullptr) { + mir_cslock lck(m_csUsers); pUser = new FacebookUser(userId, si->hContact, true, true); m_users.insert(pUser); } diff --git a/protocols/ICQ-WIM/src/proto.cpp b/protocols/ICQ-WIM/src/proto.cpp index 87a33e0502..d7bf399154 100644 --- a/protocols/ICQ-WIM/src/proto.cpp +++ b/protocols/ICQ-WIM/src/proto.cpp @@ -142,6 +142,15 @@ void CIcqProto::OnShutdown() m_bTerminated = true; } +void CIcqProto::OnContactAdded(MCONTACT hContact) +{ + CMStringW wszId(getMStringW(hContact, DB_KEY_ID)); + if (!wszId.IsEmpty() && !FindContactByUIN(wszId)) { + mir_cslock l(m_csCache); + m_arCache.insert(new IcqCacheItem(wszId, hContact)); + } +} + void CIcqProto::OnContactDeleted(MCONTACT hContact) { CMStringW szId(GetUserId(hContact)); diff --git a/protocols/ICQ-WIM/src/proto.h b/protocols/ICQ-WIM/src/proto.h index ef83185830..163fc56b3a 100644 --- a/protocols/ICQ-WIM/src/proto.h +++ b/protocols/ICQ-WIM/src/proto.h @@ -441,6 +441,7 @@ class CIcqProto : public PROTO<CIcqProto> int UserIsTyping(MCONTACT hContact, int type) override; void OnBuildProtoMenu(void) override; + void OnContactAdded(MCONTACT) override; void OnContactDeleted(MCONTACT) override; void OnEventEdited(MCONTACT, MEVENT) override; void OnModulesLoaded() override; diff --git a/protocols/ICQ-WIM/src/utils.cpp b/protocols/ICQ-WIM/src/utils.cpp index e01b94c9b4..30e1dcc575 100644 --- a/protocols/ICQ-WIM/src/utils.cpp +++ b/protocols/ICQ-WIM/src/utils.cpp @@ -91,13 +91,8 @@ MCONTACT CIcqProto::CreateContact(const CMStringW &wszId, bool bTemporary) return pCache->m_hContact; MCONTACT hContact = db_add_contact(); - Proto_AddToContact(hContact, m_szModuleName); setWString(hContact, DB_KEY_ID, wszId); - pCache = new IcqCacheItem(wszId, hContact); - { - mir_cslock l(m_csCache); - m_arCache.insert(pCache); - } + Proto_AddToContact(hContact, m_szModuleName); RetrieveUserInfo(hContact); if (bTemporary) diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def index 053f1e6d95..c7b62601aa 100644 --- a/src/mir_app/src/mir_app.def +++ b/src/mir_app/src/mir_app.def @@ -779,3 +779,4 @@ _Netlib_GetTlsUnique@8 @831 NONAME Chat_Mute @868
_WebSocket_SendBinary@12 @869 NONAME
_WebSocket_SendText@8 @870 NONAME
+?OnContactAdded@PROTO_INTERFACE@@UAEXI@Z @871 NONAME
diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def index c33b8ede03..3885bb7d91 100644 --- a/src/mir_app/src/mir_app64.def +++ b/src/mir_app/src/mir_app64.def @@ -779,3 +779,4 @@ Netlib_GetTlsUnique @831 NONAME Chat_Mute @868
WebSocket_SendBinary @869 NONAME
WebSocket_SendText @870 NONAME
+?OnContactAdded@PROTO_INTERFACE@@UEAAXI@Z @871 NONAME
diff --git a/src/mir_app/src/proto_accs.cpp b/src/mir_app/src/proto_accs.cpp index 4e2be22d74..dfbd4a0f2f 100644 --- a/src/mir_app/src/proto_accs.cpp +++ b/src/mir_app/src/proto_accs.cpp @@ -248,22 +248,26 @@ bool ActivateAccount(PROTOACCOUNT *pa, bool bIsDynamic) if (ppd->fnInit == nullptr) return false; - PROTO_INTERFACE *ppi = ppd->fnInit(pa->szModuleName, pa->tszAccountName); - if (ppi == nullptr) - return false; + PROTO_INTERFACE *ppi = pa->ppro; + if (ppi == nullptr) { + ppi = ppd->fnInit(pa->szModuleName, pa->tszAccountName); + if (ppi == nullptr) + return false; + + pa->ppro = ppi; + + if (bIsDynamic) { + if (g_bModulesLoadedFired) + pa->ppro->OnModulesLoaded(); + if (!db_get_b(0, "CList", "MoveProtoMenus", true)) + pa->ppro->OnBuildProtoMenu(); + pa->bDynDisabled = false; + } + } - pa->ppro = ppi; if (ppi->m_hProtoIcon == nullptr) ppi->m_hProtoIcon = IcoLib_IsManaged(Skin_LoadProtoIcon(pa->szModuleName, ID_STATUS_ONLINE)); ppi->m_iDesiredStatus = ppi->m_iStatus = ID_STATUS_OFFLINE; - - if (bIsDynamic) { - if (g_bModulesLoadedFired) - pa->ppro->OnModulesLoaded(); - if (!db_get_b(0, "CList", "MoveProtoMenus", true)) - pa->ppro->OnBuildProtoMenu(); - pa->bDynDisabled = false; - } return true; } diff --git a/src/mir_app/src/proto_chains.cpp b/src/mir_app/src/proto_chains.cpp index a2ad4b65b5..c66d4e1230 100644 --- a/src/mir_app/src/proto_chains.cpp +++ b/src/mir_app/src/proto_chains.cpp @@ -176,6 +176,9 @@ MIR_APP_DLL(int) Proto_AddToContact(MCONTACT hContact, const char *szProto) PROTOACCOUNT *pa = Proto_GetAccount(szProto);
if (pa) {
db_set_s(hContact, "Protocol", "p", szProto);
+
+ if (pa->ppro)
+ pa->ppro->OnContactAdded(hContact);
return 0;
}
return 1;
diff --git a/src/mir_app/src/proto_interface.cpp b/src/mir_app/src/proto_interface.cpp index 43ec3b3112..52bf10eea2 100644 --- a/src/mir_app/src/proto_interface.cpp +++ b/src/mir_app/src/proto_interface.cpp @@ -63,6 +63,9 @@ HGENMENU PROTO_INTERFACE::GetMenuItem(ProtoMenuItemType aType) void PROTO_INTERFACE::OnBuildProtoMenu() {} +void PROTO_INTERFACE::OnContactAdded(MCONTACT) +{} + void PROTO_INTERFACE::OnContactDeleted(MCONTACT) {} |