summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2021-04-30 17:52:29 +0300
committerGeorge Hazan <ghazan@miranda.im>2021-04-30 17:52:29 +0300
commit9f00802dfbad293235fc44536069c64b236fdc50 (patch)
treed6d337bdc9334c5516e30f83d5edf9f742be2f35
parent84f2722e07a23656bdc8d1a7f4040e86450fe91d (diff)
fixes #2859 (Импорт: дублируются контакты ICQ и FaceBook)
-rw-r--r--include/m_protoint.h3
-rw-r--r--libs/win32/mir_app.libbin220758 -> 221084 bytes
-rw-r--r--libs/win64/mir_app.libbin216580 -> 216910 bytes
-rw-r--r--plugins/Import/src/import.cpp12
-rw-r--r--protocols/Facebook/src/proto.cpp14
-rw-r--r--protocols/Facebook/src/proto.h8
-rw-r--r--protocols/Facebook/src/server.cpp13
-rw-r--r--protocols/ICQ-WIM/src/proto.cpp9
-rw-r--r--protocols/ICQ-WIM/src/proto.h1
-rw-r--r--protocols/ICQ-WIM/src/utils.cpp7
-rw-r--r--src/mir_app/src/mir_app.def1
-rw-r--r--src/mir_app/src/mir_app64.def1
-rw-r--r--src/mir_app/src/proto_accs.cpp28
-rw-r--r--src/mir_app/src/proto_chains.cpp3
-rw-r--r--src/mir_app/src/proto_interface.cpp3
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
index 8b97a73f1e..a879ad15e6 100644
--- a/libs/win32/mir_app.lib
+++ b/libs/win32/mir_app.lib
Binary files differ
diff --git a/libs/win64/mir_app.lib b/libs/win64/mir_app.lib
index 2a9408c8e0..d169e2d3fe 100644
--- a/libs/win64/mir_app.lib
+++ b/libs/win64/mir_app.lib
Binary files differ
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)
{}