diff options
author | George Hazan <ghazan@miranda.im> | 2023-01-25 18:34:51 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2023-01-25 18:34:51 +0300 |
commit | 9885bf54f788e831a80c76001340aa68d31d2aaa (patch) | |
tree | 420ab4aa5bf868d4193c965668ae68e5855093b7 | |
parent | c9d99d1525e2e9374ed0fa10837e82e76c3b9216 (diff) |
Group chats: ChatRoomID setting replaced with real protocol id
60 files changed, 313 insertions, 432 deletions
diff --git a/include/m_chat_int.h b/include/m_chat_int.h index 135be0f7f8..b7be21801a 100644 --- a/include/m_chat_int.h +++ b/include/m_chat_int.h @@ -307,7 +307,6 @@ struct CHAT_MANAGER BOOL (*SetOffline)(MCONTACT hContact, BOOL bHide);
BOOL (*SetAllOffline)(BOOL bHide, const char *pszModule);
- MCONTACT (*FindRoom)(const char *pszModule, const wchar_t *pszRoom);
char* (*Log_CreateRTF)(LOGSTREAMDATA *streamData);
char* (*Log_CreateRtfHeader)(void);
diff --git a/include/newpluginapi.h b/include/newpluginapi.h index a7e561461f..e836a93c9f 100644 --- a/include/newpluginapi.h +++ b/include/newpluginapi.h @@ -156,7 +156,7 @@ protected: // pass one of PROTOTYPE_* constants as type
void RegisterProtocol(int type, pfnInitProto = nullptr, pfnUninitProto = nullptr);
- void SetUniqueId(const char *pszUniqueId);
+ void SetUniqueId(const char *pszUniqueId, int type = 0);
public:
void debugLogA(LPCSTR szFormat, ...);
diff --git a/libs/win32/mir_app.lib b/libs/win32/mir_app.lib Binary files differindex 6b0fdbb352..dc36cf5c27 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 3a3071cebf..7726b7ca9b 100644 --- a/libs/win64/mir_app.lib +++ b/libs/win64/mir_app.lib diff --git a/plugins/Actman/iac_contact.pas b/plugins/Actman/iac_contact.pas index bf19f02020..a1bd4b1577 100644 --- a/plugins/Actman/iac_contact.pas +++ b/plugins/Actman/iac_contact.pas @@ -88,41 +88,31 @@ begin proto:=Proto_GetBaseAccountName(hContact);
if proto<>nil then
begin
- is_chat:=IsChat(hContact);
- if is_chat then
+ uid:=Proto_GetUniqueId(proto);
+ if DBReadSetting(hContact,proto,uid,@cws)=0 then
begin
- p:=DBReadUnicode(hContact,proto,'ChatRoomID');
- node.AddTextW('id',p);
- mFreeMem(p);
result:=1;
- end
- else
- begin
- uid:=Proto_GetUniqueId(proto);
- if DBReadSetting(hContact,proto,uid,@cws)=0 then
- begin
- result:=1;
- node.AddDWord('ctype',cws._type);
- case cws._type of
- DBVT_BYTE : node.AddDWord('id',cws.bVal);
- DBVT_WORD : node.AddDWord('id',cws.wVal);
- DBVT_DWORD : node.AddDWord('id',cws.dVal);
- DBVT_ASCIIZ: begin
- node.AddText('id',cws.szVal.A); // ansi to utf
- end;
- DBVT_UTF8 : begin
- node.AddText('id',cws.szVal.A);
- end;
- DBVT_WCHAR : node.AddTextW('id',cws.szVal.W);
- DBVT_BLOB : begin
- p1:=mir_base64_encode(cws.pbVal,cws.cpbVal);
- node.AddText('id',p1);
- mir_free(p1);
- end;
+ node.AddDWord('ctype',cws._type);
+ case cws._type of
+ DBVT_BYTE : node.AddDWord('id',cws.bVal);
+ DBVT_WORD : node.AddDWord('id',cws.wVal);
+ DBVT_DWORD : node.AddDWord('id',cws.dVal);
+ DBVT_ASCIIZ: begin
+ node.AddText('id',cws.szVal.A); // ansi to utf
+ end;
+ DBVT_UTF8 : begin
+ node.AddText('id',cws.szVal.A);
+ end;
+ DBVT_WCHAR : node.AddTextW('id',cws.szVal.W);
+ DBVT_BLOB : begin
+ p1:=mir_base64_encode(cws.pbVal,cws.cpbVal);
+ node.AddText('id',p1);
+ mir_free(p1);
end;
end;
- db_free(@cws);
end;
+ db_free(@cws);
+
if result<>0 then
begin
node.AddText('protocol',proto);
diff --git a/plugins/Clist_nicer/src/extBackg.cpp b/plugins/Clist_nicer/src/extBackg.cpp index 5655d67a07..b16188fcdb 100644 --- a/plugins/Clist_nicer/src/extBackg.cpp +++ b/plugins/Clist_nicer/src/extBackg.cpp @@ -1315,7 +1315,7 @@ void LoadPerContactSkins(wchar_t *tszFileName) continue;
const char *uid = Proto_GetUniqueId(szProto);
- if ((INT_PTR)uid != CALLSERVICE_NOTFOUND && uid != nullptr) {
+ if (uid != nullptr) {
DBVARIANT dbv = { 0 };
if (db_get(hContact, szProto, uid, &dbv))
break;
diff --git a/plugins/Import/src/import.cpp b/plugins/Import/src/import.cpp index 17aeaa073a..3fd7b23161 100644 --- a/plugins/Import/src/import.cpp +++ b/plugins/Import/src/import.cpp @@ -95,20 +95,6 @@ MCONTACT CImportBatch::HContactFromID(const char *pszProtoName, const char *pszS return INVALID_CONTACT_ID;
}
-MCONTACT CImportBatch::HContactFromChatID(const char *pszProtoName, const wchar_t *pszChatID)
-{
- for (MCONTACT hContact = dstDb->FindFirstContact(pszProtoName); hContact; hContact = dstDb->FindNextContact(hContact, pszProtoName)) {
- if (!Contact::IsGroupChat(hContact, pszProtoName))
- continue;
-
- ptrW wszChatId(db_get_wsa(hContact, pszProtoName, "ChatRoomID"));
- if (!mir_wstrcmp(pszChatID, wszChatId))
- return hContact;
- }
-
- return INVALID_CONTACT_ID;
-}
-
MCONTACT CImportBatch::HContactFromNumericID(const char *pszProtoName, const char *pszSetting, uint32_t dwID)
{
for (MCONTACT hContact = dstDb->FindFirstContact(pszProtoName); hContact; hContact = dstDb->FindNextContact(hContact, pszProtoName))
@@ -725,18 +711,11 @@ MCONTACT CImportBatch::ImportContact(MCONTACT hSrc) return 0;
}
- // group chat?
- const char *pszUniqueSetting;
- bool bIsChat = myGetD(hSrc, cc->szProto, "ChatRoom", 0) != 0;
- if (bIsChat)
- pszUniqueSetting = "ChatRoomID";
- else {
- // Skip protocols with no unique id setting (some non IM protocols return 0)
- pszUniqueSetting = Proto_GetUniqueId(szDstModuleName);
- if (!pszUniqueSetting) {
- AddMessage(LPGENW("Skipping non-IM contact (%S)"), cc->szProto);
- return 0;
- }
+ // Skip protocols with no unique id setting (some non IM protocols return 0)
+ const char *pszUniqueSetting = Proto_GetUniqueId(szDstModuleName);
+ if (!pszUniqueSetting) {
+ AddMessage(LPGENW("Skipping non-IM contact (%S)"), cc->szProto);
+ return 0;
}
wchar_t *pszUniqueID = L"<Unknown>";
@@ -754,18 +733,12 @@ MCONTACT CImportBatch::ImportContact(MCONTACT hSrc) case DBVT_ASCIIZ:
case DBVT_UTF8:
pszUniqueID = NEWWSTR_ALLOCA(_A2T(dbv.pszVal));
- if (bIsChat)
- hDst = HContactFromChatID(szDstModuleName, pszUniqueID);
- else
- hDst = HContactFromID(szDstModuleName, pszUniqueSetting, pszUniqueID);
+ hDst = HContactFromID(szDstModuleName, pszUniqueSetting, pszUniqueID);
break;
case DBVT_WCHAR:
pszUniqueID = NEWWSTR_ALLOCA(dbv.pwszVal);
- if (bIsChat)
- hDst = HContactFromChatID(szDstModuleName, pszUniqueID);
- else
- hDst = HContactFromID(szDstModuleName, pszUniqueSetting, pszUniqueID);
+ hDst = HContactFromID(szDstModuleName, pszUniqueSetting, pszUniqueID);
break;
default:
@@ -814,7 +787,7 @@ MCONTACT CImportBatch::ImportContact(MCONTACT hSrc) srcDb->FreeVariant(&dbv);
- if (bIsChat)
+ if (myGetD(hSrc, cc->szProto, "ChatRoom", 0) != 0)
db_set_b(hDst, szDstModuleName, "ChatRoom", 1);
m_contacts.insert(new ContactMap(hSrc, hDst));
@@ -879,7 +852,7 @@ void CImportBatch::ImportHistory(MCONTACT hContact, PROTOACCOUNT **protocol, int else hDst = NULL;
bool bSkipAll = false;
- uint32_t cbAlloc = 4096;
+ int cbAlloc = 4096;
uint8_t *eventBuf = (uint8_t*)mir_alloc(cbAlloc);
// Get the start of the event chain
diff --git a/plugins/Import/src/stdafx.h b/plugins/Import/src/stdafx.h index b60d8402a5..3df8c0917a 100644 --- a/plugins/Import/src/stdafx.h +++ b/plugins/Import/src/stdafx.h @@ -285,7 +285,6 @@ class CImportBatch : public MZeroedObject PROTOACCOUNT* FindMyAccount(const char *szProto, const char *szBaseProto, const wchar_t *ptszName, bool bStrict);
MCONTACT HContactFromID(const char *pszProtoName, const char *pszSetting, wchar_t *pwszID);
- MCONTACT HContactFromChatID(const char *pszProtoName, const wchar_t *pszChatID);
MCONTACT HContactFromNumericID(const char *pszProtoName, const char *pszSetting, uint32_t dwID);
public:
diff --git a/plugins/MirLua/src/Modules/m_message.cpp b/plugins/MirLua/src/Modules/m_message.cpp index 289f82c935..a00ec285e1 100644 --- a/plugins/MirLua/src/Modules/m_message.cpp +++ b/plugins/MirLua/src/Modules/m_message.cpp @@ -28,7 +28,7 @@ static int message_Send(lua_State *L) const char *szProto = Proto_GetBaseAccountName(hContact); if (Contact::IsGroupChat(hContact, szProto)) { - ptrW wszChatRoom(db_get_wsa(hContact, szProto, "ChatRoomID")); + ptrW wszChatRoom(Contact::GetInfo(CNF_UNIQUEID, hContact, szProto)); ptrW wszMessage(mir_utf8decodeW(message)); res = Chat_SendUserMessage(szProto, wszChatRoom, wszMessage); lua_pushinteger(L, res); diff --git a/plugins/UserInfoEx/src/ex_import/classExImContactBase.cpp b/plugins/UserInfoEx/src/ex_import/classExImContactBase.cpp index 301d87c4f3..5393ae538b 100644 --- a/plugins/UserInfoEx/src/ex_import/classExImContactBase.cpp +++ b/plugins/UserInfoEx/src/ex_import/classExImContactBase.cpp @@ -78,7 +78,6 @@ uint8_t CExImContactBase::fromDB(MCONTACT hContact) uint8_t ret = FALSE; uint8_t isChatRoom = FALSE; LPSTR pszProto; - LPCSTR uidSetting; DBVARIANT dbv; _hContact = hContact; @@ -106,29 +105,16 @@ uint8_t CExImContactBase::fromDB(MCONTACT hContact) db_free(&dbv); } - // unique id (for ChatRoom) - if (isChatRoom = Contact::IsGroupChat(_hContact, pszProto)) { - uidSetting = "ChatRoomID"; + LPCSTR uidSetting = Proto_GetUniqueId(pszProto); + if (uidSetting != nullptr) { // valid _pszUIDKey = mir_strdup(uidSetting); if (!DB::Setting::GetAsIs(_hContact, pszProto, uidSetting, &_dbvUID)) { ret = TRUE; } } - // unique id (normal) + // fails because the protocol is no longer installed else { - uidSetting = Proto_GetUniqueId(pszProto); - // valid - if (uidSetting != nullptr && (INT_PTR)uidSetting != CALLSERVICE_NOTFOUND) { - _pszUIDKey = mir_strdup(uidSetting); - if (!DB::Setting::GetAsIs(_hContact, pszProto, uidSetting, &_dbvUID)) { - ret = TRUE; - } - } - // fails because the protocol is no longer installed - else { - // assert(ret == TRUE); - ret = TRUE; - } + ret = TRUE; } // nickname diff --git a/plugins/UserInfoEx/src/ex_import/svc_ExImVCF.cpp b/plugins/UserInfoEx/src/ex_import/svc_ExImVCF.cpp index 1dc8fc82d4..14887c485d 100644 --- a/plugins/UserInfoEx/src/ex_import/svc_ExImVCF.cpp +++ b/plugins/UserInfoEx/src/ex_import/svc_ExImVCF.cpp @@ -1111,7 +1111,7 @@ uint8_t CVCardFileVCF::Export(uint8_t bExportUtf) // contacts protocol, uin setting, uin value
//
LPCSTR uid = Proto_GetUniqueId(_pszBaseProto);
- if ((INT_PTR)uid != CALLSERVICE_NOTFOUND && uid) {
+ if (uid) {
CHAR szUID[MAXUID];
if (!db_get_static(_hContact, _pszBaseProto, uid, szUID, sizeof(szUID)))
fprintf(_pFile, "IM;%s;%s:%s\n", _pszBaseProto, uid, szUID);
diff --git a/plugins/Utils.pas/mircontacts.pas b/plugins/Utils.pas/mircontacts.pas index 9a34525d24..583292702d 100644 --- a/plugins/Utils.pas/mircontacts.pas +++ b/plugins/Utils.pas/mircontacts.pas @@ -138,40 +138,28 @@ begin hContact:=db_find_first();
while hContact<>0 do
begin
- if is_chat then
+ if DBReadSetting(hContact,Proto,uid,@ldbv)=0 then
begin
- if IsChat(hContact) then
+ if dbv._type=ldbv._type then
begin
- pw:=DBReadUnicode(hContact,Proto,'ChatRoomID');
- if StrCmpW(pw,dbv.szVal.W)=0 then result:=hContact;
- mFreeMem(pw);
- end
- end
- else
- begin
- if DBReadSetting(hContact,Proto,uid,@ldbv)=0 then
- begin
- if dbv._type=ldbv._type then
- begin
- case dbv._type of
-// DBVT_DELETED: ;
- DBVT_BYTE : if dbv.bVal=ldbv.bVal then result:=hContact;
- DBVT_WORD : if dbv.wVal=ldbv.wVal then result:=hContact;
- DBVT_DWORD : if dbv.dVal=ldbv.dVal then result:=hContact;
- DBVT_UTF8,
- DBVT_ASCIIZ : if StrCmp (dbv.szVal.A,ldbv.szVal.A)=0 then result:=hContact;
- DBVT_WCHAR : if StrCmpW(dbv.szVal.W,ldbv.szVal.W)=0 then result:=hContact;
- DBVT_BLOB : begin
- if dbv.cpbVal = ldbv.cpbVal then
- begin
- if CompareMem(dbv.pbVal,ldbv.pbVal,dbv.cpbVal) then
- result:=hContact;
- end;
+ case dbv._type of
+// DBVT_DELETED: ;
+ DBVT_BYTE : if dbv.bVal=ldbv.bVal then result:=hContact;
+ DBVT_WORD : if dbv.wVal=ldbv.wVal then result:=hContact;
+ DBVT_DWORD : if dbv.dVal=ldbv.dVal then result:=hContact;
+ DBVT_UTF8,
+ DBVT_ASCIIZ : if StrCmp (dbv.szVal.A,ldbv.szVal.A)=0 then result:=hContact;
+ DBVT_WCHAR : if StrCmpW(dbv.szVal.W,ldbv.szVal.W)=0 then result:=hContact;
+ DBVT_BLOB : begin
+ if dbv.cpbVal = ldbv.cpbVal then
+ begin
+ if CompareMem(dbv.pbVal,ldbv.pbVal,dbv.cpbVal) then
+ result:=hContact;
end;
end;
end;
- db_free(@ldbv);
end;
+ db_free(@ldbv);
end;
// added 2011.04.20
if result<>0 then break;
@@ -217,25 +205,14 @@ begin if Proto<>nil then
begin
p:=StrCopyE(section,setting);
- is_chat:=IsChat(hContact);
- if is_chat then
- begin
- pw:=DBReadUnicode(hContact,Proto,'ChatRoomID');
- StrCopy(p,opt_cuid); DBWriteUnicode(0,group,section,pw);
- mFreeMem(pw);
- result:=1;
- end
- else
+ uid:=Proto_GetUniqueId(Proto);
+ if uid<>nil then
begin
- uid:=Proto_GetUniqueId(Proto);
- if uid<>nil then
+ if DBReadSetting(hContact,Proto,uid,@cws)=0 then
begin
- if DBReadSetting(hContact,Proto,uid,@cws)=0 then
- begin
- StrCopy(p,opt_cuid); DBWriteSetting(0,group,section,@cws);
- db_free(@cws);
- result:=1;
- end;
+ StrCopy(p,opt_cuid); DBWriteSetting(0,group,section,@cws);
+ db_free(@cws);
+ result:=1;
end;
end;
if result<>0 then
@@ -373,37 +350,28 @@ begin begin
if acc=nil then
acc:=Proto_GetBaseAccountName(hContact);
- if IsChat(hContact) then
- begin
- p:=DBReadUnicode(hContact,acc,'ChatRoomID');
- StrReplaceW(buf,'%uid%',p);
- mFreeMem(p);
- end
- else
+ uid:=Proto_GetUniqueId(acc);
+ if uid<>nil then
begin
- uid:=Proto_GetUniqueId(acc);
- if uid<>nil then
+ if DBReadSetting(hContact,acc,uid,@ldbv)=0 then
begin
- if DBReadSetting(hContact,acc,uid,@ldbv)=0 then
- begin
- case ldbv._type of
- DBVT_DELETED: p:='[deleted]';
- DBVT_BYTE : p:=IntToStr(buf1,ldbv.bVal);
- DBVT_WORD : p:=IntToStr(buf1,ldbv.wVal);
- DBVT_DWORD : p:=IntToStr(buf1,ldbv.dVal);
- DBVT_UTF8 : UTF8ToWide(ldbv.szVal.A,p);
- DBVT_ASCIIZ : AnsiToWide(ldbv.szVal.A,p,Langpack_GetDefaultCodePage);
- DBVT_WCHAR : p:=ldbv.szVal.W;
- DBVT_BLOB : p:='blob';
- end;
- StrReplaceW(buf,'%uid%',p);
- if ldbv._type in [DBVT_UTF8,DBVT_ASCIIZ] then
- mFreeMem(p);
- db_free(@ldbv);
+ case ldbv._type of
+ DBVT_DELETED: p:='[deleted]';
+ DBVT_BYTE : p:=IntToStr(buf1,ldbv.bVal);
+ DBVT_WORD : p:=IntToStr(buf1,ldbv.wVal);
+ DBVT_DWORD : p:=IntToStr(buf1,ldbv.dVal);
+ DBVT_UTF8 : UTF8ToWide(ldbv.szVal.A,p);
+ DBVT_ASCIIZ : AnsiToWide(ldbv.szVal.A,p,Langpack_GetDefaultCodePage);
+ DBVT_WCHAR : p:=ldbv.szVal.W;
+ DBVT_BLOB : p:='blob';
end;
+ StrReplaceW(buf,'%uid%',p);
+ if ldbv._type in [DBVT_UTF8,DBVT_ASCIIZ] then
+ mFreeMem(p);
+ db_free(@ldbv);
end;
- StrReplaceW(buf,'%uid%',nil);
end;
+ StrReplaceW(buf,'%uid%',nil);
end;
SendMessage(list,CB_SETITEMDATA,
diff --git a/plugins/Variables/src/contact.cpp b/plugins/Variables/src/contact.cpp index bb6194aad9..5904a2cd23 100644 --- a/plugins/Variables/src/contact.cpp +++ b/plugins/Variables/src/contact.cpp @@ -153,15 +153,6 @@ wchar_t* getContactInfoT(uint8_t type, MCONTACT hContact) if ((res = Clist_GetGroup(hContact)) != nullptr)
return res;
break;
-
- case CNF_UNIQUEID:
- // UID for ChatRoom
- if (Contact::IsGroupChat(hContact, szProto))
- if ((res = db_get_wsa(hContact, szProto, "ChatRoomID")) != nullptr)
- return res;
-
- // UID for other contact
- break;
}
return Contact::GetInfo(type, hContact);
diff --git a/protocols/CloudFile/src/utils.cpp b/protocols/CloudFile/src/utils.cpp index 5de7ebdee9..69a5c74a60 100644 --- a/protocols/CloudFile/src/utils.cpp +++ b/protocols/CloudFile/src/utils.cpp @@ -67,7 +67,7 @@ void SendToContact(MCONTACT hContact, const wchar_t *data) { const char *szProto = Proto_GetBaseAccountName(hContact); if (Contact::IsGroupChat(hContact, szProto)) { - ptrW tszChatRoom(db_get_wsa(hContact, szProto, "ChatRoomID")); + ptrW tszChatRoom(Contact::GetInfo(CNF_UNIQUEID, hContact, szProto)); Chat_SendUserMessage(szProto, tszChatRoom, data); return; } diff --git a/protocols/Facebook/src/server.cpp b/protocols/Facebook/src/server.cpp index 39ba67f83d..e3d1f31736 100644 --- a/protocols/Facebook/src/server.cpp +++ b/protocols/Facebook/src/server.cpp @@ -279,7 +279,6 @@ FacebookUser* FacebookProto::RefreshThread(JSONNode &n) if (si == nullptr)
return nullptr;
- setWString(si->hContact, DBKEY_ID, chatId);
Chat_AddGroup(si, TranslateT("Participant"));
for (auto &u : n["all_participants"]["nodes"]) {
diff --git a/protocols/Gadu-Gadu/src/core.cpp b/protocols/Gadu-Gadu/src/core.cpp index f1daddfbd4..6a0698e1cf 100644 --- a/protocols/Gadu-Gadu/src/core.cpp +++ b/protocols/Gadu-Gadu/src/core.cpp @@ -1210,14 +1210,14 @@ void GaduProto::broadcastnewstatus(int newStatus) void GaduProto::OnContactDeleted(MCONTACT hContact)
{
- uin_t uin = (uin_t)getDword(hContact, GG_KEY_UIN, 0);
+ uin_t uin = (uin_t)getDword(hContact, GG_KEY_UIN);
// Terminate conference if contact is deleted
- ptrW wszRoomId(getWStringA(hContact, "ChatRoomID"));
- if (isChatRoom(hContact) && wszRoomId != NULL && gc_enabled)
+ if (isChatRoom(hContact) && uin && gc_enabled)
{
+ CMStringW wszRoomId(FORMAT, L"%d", uin);
GGGC *chat = gc_lookup(wszRoomId);
- debugLogA("contactdeleted(): Terminating chat %x, id %s from contact list...", chat, wszRoomId.get());
+ debugLogA("contactdeleted(): Terminating chat %x, id %s from contact list...", chat, wszRoomId.c_str());
if (chat)
{
// Destroy chat entry
@@ -1279,20 +1279,20 @@ int GaduProto::dbsettingchanged(WPARAM hContact, LPARAM lParam) return 0;
// Groupchat window contact is being renamed
- DBVARIANT dbv;
- if (isChatRoom(hContact) && !getWString(hContact, "ChatRoomID", &dbv))
+ if (isChatRoom(hContact))
{
+ CMStringW wszId(FORMAT, L"%d", getDword(hContact, GG_KEY_UIN));
+
// Most important... check redundancy (fucking cascading)
static int cascade = 0;
- if (!cascade && dbv.pwszVal)
+ if (!cascade)
{
- debugLogA("dbsettingchanged(): Conference %s was renamed.", dbv.pszVal);
+ debugLogA("dbsettingchanged(): Conference %s was renamed.", wszId.c_str());
// Mark cascading
/* FIXME */ cascade = 1;
- Chat_ChangeSessionName(m_szModuleName, dbv.pwszVal, ptszVal);
+ Chat_ChangeSessionName(m_szModuleName, wszId, ptszVal);
/* FIXME */ cascade = 0;
}
- db_free(&dbv);
}
else {
// Change contact name on all chats
diff --git a/protocols/Gadu-Gadu/src/gg.cpp b/protocols/Gadu-Gadu/src/gg.cpp index 34b7e1b8fa..fd0aea0f03 100644 --- a/protocols/Gadu-Gadu/src/gg.cpp +++ b/protocols/Gadu-Gadu/src/gg.cpp @@ -48,7 +48,7 @@ CMPlugin::CMPlugin() : ACCPROTOPLUGIN<GaduProto>(GGDEF_PROTO, pluginInfoEx)
{
crc_gentable();
- SetUniqueId(GG_KEY_UIN);
+ SetUniqueId(GG_KEY_UIN, DBVT_DWORD);
}
//////////////////////////////////////////////////////////
diff --git a/protocols/Gadu-Gadu/src/groupchat.cpp b/protocols/Gadu-Gadu/src/groupchat.cpp index 6eac366e71..81deec7393 100644 --- a/protocols/Gadu-Gadu/src/groupchat.cpp +++ b/protocols/Gadu-Gadu/src/groupchat.cpp @@ -114,7 +114,7 @@ int GaduProto::gc_event(WPARAM, LPARAM lParam) // Check if we got our protocol, and fields are set
if (!gch || !gch->si->ptszID || !gch->si->pszModule
|| mir_strcmpi(gch->si->pszModule, m_szModuleName)
- || !(uin = getDword(GG_KEY_UIN, 0))
+ || !(uin = getDword(gch->si->hContact, GG_KEY_UIN))
|| !(chat = gc_lookup(gch->si->ptszID)))
return 0;
@@ -126,16 +126,7 @@ int GaduProto::gc_event(WPARAM, LPARAM lParam) list_remove(&chats, chat, 1);
// Remove contact from contact list (duh!) should be done by chat.dll !!
- for (MCONTACT hContact = db_find_first(); hContact; ) {
- MCONTACT hNext = db_find_next(hContact);
- DBVARIANT dbv;
- if (!getWString(hContact, "ChatRoomID", &dbv)) {
- if (dbv.pwszVal && !mir_wstrcmp(gch->si->ptszID, dbv.pwszVal))
- db_delete_contact(hContact);
- db_free(&dbv);
- }
- hContact = hNext;
- }
+ db_delete_contact(gch->si->hContact);
return 1;
}
diff --git a/protocols/ICQ-WIM/src/server.cpp b/protocols/ICQ-WIM/src/server.cpp index ce3dad53bb..e7468d952a 100644 --- a/protocols/ICQ-WIM/src/server.cpp +++ b/protocols/ICQ-WIM/src/server.cpp @@ -491,7 +491,7 @@ void CIcqProto::ParseMessage(MCONTACT hContact, __int64 &lastMsgId, const JSONNo CheckOwnMessage(reqId, szMsgId, true);
CMStringW wszSender(it["chat"]["sender"].as_mstring());
- CMStringW wszChatId(getMStringW(hContact, "ChatRoomID"));
+ CMStringW wszChatId(GetUserId(hContact));
if (bIsFileTransfer) {
wszText = pFileInfo->szUrl;
diff --git a/protocols/ICQ-WIM/src/utils.cpp b/protocols/ICQ-WIM/src/utils.cpp index 9a2e0b35ef..6bfc868e96 100644 --- a/protocols/ICQ-WIM/src/utils.cpp +++ b/protocols/ICQ-WIM/src/utils.cpp @@ -265,9 +265,6 @@ INT_PTR __cdecl CIcqProto::SetAvatar(WPARAM, LPARAM lParam) CMStringW CIcqProto::GetUserId(MCONTACT hContact)
{
- if (isChatRoom(hContact))
- return getMStringW(hContact, "ChatRoomID");
-
return getMStringW(hContact, DB_KEY_ID);
}
diff --git a/protocols/IRCG/src/ircproto.cpp b/protocols/IRCG/src/ircproto.cpp index e64a3b420e..95b233d8dc 100644 --- a/protocols/IRCG/src/ircproto.cpp +++ b/protocols/IRCG/src/ircproto.cpp @@ -195,7 +195,7 @@ void CIrcProto::OnModulesLoaded() ptrA szNetwork(getStringA("Network"));
if (szNetwork) {
- CMStringA szSetting(FORMAT, "PERFORM:%s", szNetwork);
+ CMStringA szSetting(FORMAT, "PERFORM:%s", szNetwork.get());
szSetting.MakeUpper();
CMStringW wszValue(getMStringW(szSetting));
@@ -206,18 +206,6 @@ void CIrcProto::OnModulesLoaded() delSetting("Network");
}
- if (getByte("CompatibilityLevel") < 1) {
- for (auto &cc : AccContacts()) {
- CMStringW chatId(getMStringW(cc, "ChatRoomID"));
- int idx = chatId.Find(L" - ");
- if (idx != -1) {
- chatId.Truncate(idx);
- setWString(cc, "ChatRoomID", chatId);
- }
- }
- setByte("CompatibilityLevel", 1);
- }
-
InitIgnore();
HookProtoEvent(ME_USERINFO_INITIALISE, &CIrcProto::OnInitUserInfo);
diff --git a/protocols/JabberG/src/jabber_api.cpp b/protocols/JabberG/src/jabber_api.cpp index 738e1bb439..775102599e 100644 --- a/protocols/JabberG/src/jabber_api.cpp +++ b/protocols/JabberG/src/jabber_api.cpp @@ -57,7 +57,7 @@ MCONTACT CJabberProto::ContactFromJID(const char *jid) char* CJabberProto::ContactToJID(MCONTACT hContact)
{
- return getUStringA(hContact, isChatRoom(hContact) ? "ChatRoomID" : "jid");
+ return getUStringA(hContact, "jid");
}
char* CJabberProto::GetBestResourceName(const char *jid)
diff --git a/protocols/JabberG/src/jabber_groupchat.cpp b/protocols/JabberG/src/jabber_groupchat.cpp index f4f3e6c008..719144a127 100644 --- a/protocols/JabberG/src/jabber_groupchat.cpp +++ b/protocols/JabberG/src/jabber_groupchat.cpp @@ -186,7 +186,7 @@ INT_PTR __cdecl CJabberProto::OnMenuHandleJoinGroupchat(WPARAM, LPARAM) INT_PTR __cdecl CJabberProto::OnJoinChat(WPARAM hContact, LPARAM)
{
- ptrA jid(getUStringA(hContact, "ChatRoomID"));
+ ptrA jid(ContactToJID(hContact));
if (jid == nullptr)
return 0;
@@ -210,7 +210,7 @@ INT_PTR __cdecl CJabberProto::OnJoinChat(WPARAM hContact, LPARAM) INT_PTR __cdecl CJabberProto::OnLeaveChat(WPARAM hContact, LPARAM)
{
- ptrA jid(getUStringA(hContact, "ChatRoomID"));
+ ptrA jid(ContactToJID(hContact));
if (jid != nullptr) {
if (getWord(hContact, "Status", 0) != ID_STATUS_OFFLINE) {
JABBER_LIST_ITEM *item = ListGetItemPtr(LIST_CHATROOM, jid);
diff --git a/protocols/JabberG/src/jabber_iqid.cpp b/protocols/JabberG/src/jabber_iqid.cpp index 041a2052bf..85e2397829 100644 --- a/protocols/JabberG/src/jabber_iqid.cpp +++ b/protocols/JabberG/src/jabber_iqid.cpp @@ -423,7 +423,7 @@ void CJabberProto::OnIqResultSession(const TiXmlElement*, CJabberIqInfo *pInfo) void CJabberProto::GroupchatJoinByHContact(MCONTACT hContact, bool autojoin)
{
- ptrA roomjid(getUStringA(hContact, "ChatRoomID"));
+ ptrA roomjid(ContactToJID(hContact));
if (roomjid == nullptr)
return;
diff --git a/protocols/JabberG/src/jabber_list.cpp b/protocols/JabberG/src/jabber_list.cpp index 73abe09e2b..da6cfb955d 100644 --- a/protocols/JabberG/src/jabber_list.cpp +++ b/protocols/JabberG/src/jabber_list.cpp @@ -89,16 +89,9 @@ void JABBER_RESOURCE_STATUS::Release() void CJabberProto::ListInit(void)
{
for (auto &hContact : AccContacts()) {
- if (isChatRoom(hContact)) {
- ptrA jid(getUStringA(hContact, "ChatRoomID"));
- if (jid != nullptr)
- ListAdd(LIST_CHATROOM, jid, hContact);
- }
- else {
- ptrA jid(getUStringA(hContact, "jid"));
- if (jid != nullptr)
- ListAdd(LIST_ROSTER, jid, hContact);
- }
+ ptrA jid(ContactToJID(hContact));
+ if (jid != nullptr)
+ ListAdd(isChatRoom(hContact) ? LIST_CHATROOM : LIST_ROSTER, jid, hContact);
}
}
diff --git a/protocols/JabberG/src/jabber_menu.cpp b/protocols/JabberG/src/jabber_menu.cpp index 0d510f6859..715909e915 100644 --- a/protocols/JabberG/src/jabber_menu.cpp +++ b/protocols/JabberG/src/jabber_menu.cpp @@ -282,7 +282,7 @@ int CJabberProto::OnPrebuildContactMenu(WPARAM hContact, LPARAM) Menu_ShowItem(GetMenuItem(PROTO_MENU_LOAD_HISTORY), true);
if (bIsChatRoom) {
- ptrA roomid(getUStringA(hContact, "ChatRoomID"));
+ ptrA roomid(ContactToJID(hContact));
if (ListGetItemPtr(LIST_BOOKMARK, roomid) == nullptr)
if (m_ThreadInfo && m_ThreadInfo->jabberServerCaps & JABBER_CAPS_PRIVATE_STORAGE)
Menu_ShowItem(g_hMenuAddBookmark, true);
@@ -425,7 +425,7 @@ INT_PTR __cdecl CJabberProto::OnMenuBookmarkAdd(WPARAM hContact, LPARAM) if (!hContact)
return 0; // we do not add ourself to the roster. (buggy situation - should not happen)
- ptrA roomID(getUStringA(hContact, "ChatRoomID"));
+ ptrA roomID(ContactToJID(hContact));
if (roomID == nullptr)
return 0;
@@ -922,7 +922,7 @@ INT_PTR __cdecl CJabberProto::OnMenuHandleDirectPresence(WPARAM hContact, LPARAM CMStringA jid;
ptrA szJid(getUStringA(hContact, "jid"));
if (szJid == nullptr) {
- ptrA roomid(getUStringA(hContact, "ChatRoomID"));
+ ptrA roomid(ContactToJID(hContact));
if (roomid == nullptr)
return 0;
diff --git a/protocols/JabberG/src/jabber_util.cpp b/protocols/JabberG/src/jabber_util.cpp index a3e1c856f6..2782aef450 100644 --- a/protocols/JabberG/src/jabber_util.cpp +++ b/protocols/JabberG/src/jabber_util.cpp @@ -570,8 +570,7 @@ char* CJabberProto::GetClientJID(MCONTACT hContact, char *dest, size_t destLen) if (hContact == 0)
return nullptr;
- ptrA jid(getUStringA(hContact, isChatRoom(hContact) ? "ChatRoomID" : "jid"));
- return GetClientJID(jid, dest, destLen);
+ return GetClientJID(ptrA(ContactToJID(hContact)), dest, destLen);
}
char* CJabberProto::GetClientJID(const char *jid, char *dest, size_t destLen)
diff --git a/protocols/MinecraftDynmap/src/chat.cpp b/protocols/MinecraftDynmap/src/chat.cpp index c0c1f80542..b5bd327d24 100644 --- a/protocols/MinecraftDynmap/src/chat.cpp +++ b/protocols/MinecraftDynmap/src/chat.cpp @@ -162,19 +162,6 @@ void MinecraftDynmapProto::ClearChat() // TODO: Could this be done better?
MCONTACT MinecraftDynmapProto::GetChatHandle()
{
- /*if (chatHandle_ != NULL)
- return chatHandle_;
-
- for (auto &hContact : AccContacts()) {
- if (db_get_b(hContact, m_szModuleName, "ChatRoom", 0) > 0) {
- ptrA id = db_get_sa(hContact, m_szModuleName, "ChatRoomId");
- if (id != NULL && !strcmp(id, m_szModuleName))
- return hContact;
- }
- }
-
- return NULL;*/
-
GC_INFO gci = {0};
gci.Flags = GCF_HCONTACT;
gci.pszModule = m_szModuleName;
diff --git a/protocols/Sametime/sametime.vcxproj.filters b/protocols/Sametime/sametime.vcxproj.filters index 4d89fb680e..96d0377694 100644 --- a/protocols/Sametime/sametime.vcxproj.filters +++ b/protocols/Sametime/sametime.vcxproj.filters @@ -8,92 +8,92 @@ <ClCompile Include="src\files.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\channel.c"> + <ClCompile Include="src\messaging.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\cipher.c"> + <ClCompile Include="src\options.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\common.c"> + <ClCompile Include="src\places.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\error.c"> + <ClCompile Include="src\sametime.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\message.c"> + <ClCompile Include="src\sametime_proto.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\mpi\mpi.c"> + <ClCompile Include="src\sametime_session.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\mw_debug.c"> + <ClCompile Include="src\session_announce_win.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\mw_util.c"> + <ClCompile Include="src\stdafx.cxx"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\service.c"> + <ClCompile Include="src\userlist.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\session.c"> + <ClCompile Include="src\utils.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\srvc_aware.c"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\channel.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\srvc_conf.c"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\cipher.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\srvc_dir.c"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\common.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\srvc_ft.c"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\error.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\srvc_im.c"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\message.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\srvc_place.c"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\mpi\mpi.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\srvc_resolve.c"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\mw_debug.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\srvc_store.c"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\mw_util.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\meanwhile\src\st_list.c"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\service.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\messaging.cpp"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\session.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\options.cpp"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\srvc_aware.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\places.cpp"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\srvc_conf.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\sametime.cpp"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\srvc_dir.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\sametime_proto.cpp"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\srvc_ft.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\sametime_session.cpp"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\srvc_im.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\session_announce_win.cpp"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\srvc_resolve.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\stdafx.cxx"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\srvc_place.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\userlist.cpp"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\srvc_store.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> - <ClCompile Include="src\utils.cpp"> - <Filter>Source Files</Filter> + <ClCompile Include="src\meanwhile\src\st_list.c"> + <Filter>Source Files\meanwhile</Filter> </ClCompile> </ItemGroup> <ItemGroup> @@ -121,4 +121,9 @@ <Filter>Resource Files</Filter> </ResourceCompile> </ItemGroup> + <ItemGroup> + <Filter Include="Source Files\meanwhile"> + <UniqueIdentifier>{425f78cf-1344-45bb-89f5-cfe3510ea8ac}</UniqueIdentifier> + </Filter> + </ItemGroup> </Project>
\ No newline at end of file diff --git a/protocols/Sametime/src/conference.cpp b/protocols/Sametime/src/conference.cpp index 27c490c388..6d1783958d 100644 --- a/protocols/Sametime/src/conference.cpp +++ b/protocols/Sametime/src/conference.cpp @@ -323,7 +323,7 @@ int CSametimeProto::ChatDeleted(MCONTACT hContact) { debugLogW(L"CSametimeProto::ChatDeleted() hContact=[%x]", hContact);
DBVARIANT dbv;
- if (!db_get_s(hContact, m_szModuleName, "ChatRoomID", &dbv)) {
+ if (!getUString(hContact, "stid", &dbv)) {
TerminateConference(dbv.pszVal);
db_free(&dbv);
}
@@ -384,7 +384,7 @@ int CSametimeProto::PrebuildContactMenu(WPARAM wParam, LPARAM) // if user is already in our meeting,
bool not_present = true;
DBVARIANT dbv;
- if (my_conference && !db_get_utf(hContact, m_szModuleName, "stid", &dbv)) {
+ if (my_conference && !getUString(hContact, "stid", &dbv)) {
char* user_id = dbv.pszVal;
GList *members, *mem;
diff --git a/protocols/Sametime/src/options.cpp b/protocols/Sametime/src/options.cpp index e96404360a..d34b6b5505 100644 --- a/protocols/Sametime/src/options.cpp +++ b/protocols/Sametime/src/options.cpp @@ -350,15 +350,15 @@ void CSametimeProto::LoadOptions() {
DBVARIANT dbv;
- if (!db_get_utf(0, m_szModuleName, "ServerName", &dbv)) {
+ if (!getUString(0, "ServerName", &dbv)) {
strncpy(options.server_name, dbv.pszVal, LSTRINGLEN);
db_free(&dbv);
}
- if (!db_get_utf(0, m_szModuleName, "stid", &dbv)) {
+ if (!getUString(0, "stid", &dbv)) {
strncpy(options.id, dbv.pszVal, LSTRINGLEN);
db_free(&dbv);
}
- if (!db_get_utf(0, m_szModuleName, "Password", &dbv)) {
+ if (!getUString(0, "Password", &dbv)) {
strncpy(options.pword, dbv.pszVal, LSTRINGLEN);
db_free(&dbv);
}
@@ -398,20 +398,19 @@ void CSametimeProto::LoadOptions() void CSametimeProto::SaveOptions()
{
- db_set_utf(0, m_szModuleName, "ServerName", options.server_name);
-
- db_set_utf(0, m_szModuleName, "stid", options.id);
- //db_set_s(0, m_szModuleName, "Nick", options.id);
- db_set_utf(0, m_szModuleName, "Password", options.pword);
-
- db_set_dw(0, m_szModuleName, "ServerPort", options.port);
- db_set_b(0, m_szModuleName, "GetServerContacts", options.get_server_contacts ? 1 : 0);
- db_set_dw(0, m_szModuleName, "ClientID", options.client_id);
- db_set_dw(0, m_szModuleName, "ClientVersionMajor", options.client_versionMajor);
- db_set_dw(0, m_szModuleName, "ClientVersionMinor", options.client_versionMinor);
- db_set_b(0, m_szModuleName, "ErrorDisplay", options.err_method);
-
- db_set_b(0, m_szModuleName, "AutoAddContacts", options.add_contacts ? 1 : 0);
- db_set_b(0, m_szModuleName, "EncryptSession", options.encrypt_session ? 1 : 0);
- db_set_b(0, m_szModuleName, "IdleAsAway", options.idle_as_away ? 1 : 0);
+ setUString("ServerName", options.server_name);
+
+ setUString("stid", options.id);
+ setUString("Password", options.pword);
+
+ setDword("ServerPort", options.port);
+ setByte("GetServerContacts", options.get_server_contacts ? 1 : 0);
+ setDword("ClientID", options.client_id);
+ setDword("ClientVersionMajor", options.client_versionMajor);
+ setDword("ClientVersionMinor", options.client_versionMinor);
+
+ setByte("ErrorDisplay", options.err_method);
+ setByte("AutoAddContacts", options.add_contacts ? 1 : 0);
+ setByte("EncryptSession", options.encrypt_session ? 1 : 0);
+ setByte("IdleAsAway", options.idle_as_away ? 1 : 0);
}
diff --git a/protocols/Sametime/src/session_announce_win.cpp b/protocols/Sametime/src/session_announce_win.cpp index 11ff040c7f..ab4d7bb495 100644 --- a/protocols/Sametime/src/session_announce_win.cpp +++ b/protocols/Sametime/src/session_announce_win.cpp @@ -102,7 +102,7 @@ INT_PTR CALLBACK SessionAnnounceDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wPara lvI.mask = LVIF_PARAM;
ListView_GetItem(GetDlgItem(hwndDlg, IDC_LST_ANTO), &lvI);
- if (!db_get_utf((MCONTACT)lvI.lParam, proto->m_szModuleName, "stid", &dbv)) {
+ if (!proto->getUString((MCONTACT)lvI.lParam, "stid", &dbv)) {
safArg->recipients = g_list_prepend(safArg->recipients, _strdup(dbv.pszVal));
mir_strcpy(p, dbv.pszVal);
safArg->recipients = g_list_prepend(safArg->recipients, _strdup(id));
diff --git a/protocols/Sametime/src/userlist.cpp b/protocols/Sametime/src/userlist.cpp index 1bc5102fff..cc64094d40 100644 --- a/protocols/Sametime/src/userlist.cpp +++ b/protocols/Sametime/src/userlist.cpp @@ -5,7 +5,7 @@ MCONTACT CSametimeProto::FindContactByUserId(const char* id) {
DBVARIANT dbv;
for (auto &hContact : AccContacts()) {
- if (!db_get_utf(hContact, m_szModuleName, "stid", &dbv)) {
+ if (!getUString(hContact, "stid", &dbv)) {
if (dbv.pszVal && mir_strcmp(id, dbv.pszVal) == 0) {
db_free(&dbv);
return hContact;
@@ -21,7 +21,7 @@ bool CSametimeProto::GetAwareIdFromContact(MCONTACT hContact, mwAwareIdBlock* id char *proto = Proto_GetBaseAccountName(hContact);
DBVARIANT dbv;
if (proto && !mir_strcmp(m_szModuleName, proto)) {
- if (!db_get_utf(hContact, m_szModuleName, "stid", &dbv)) {
+ if (!getUString(hContact, "stid", &dbv)) {
if (dbv.pszVal) {
id_block->type = mwAware_USER;
id_block->user = _strdup(dbv.pszVal);
@@ -73,21 +73,21 @@ MCONTACT CSametimeProto::AddContact(mwSametimeUser* user, bool temporary) Contact::Hide(hContact, false);
}
-
// add to miranda
- if (new_contact) db_set_utf(hContact, m_szModuleName, "stid", id);
+ if (new_contact)
+ setUString(hContact, "stid", id);
if (name && mir_strlen(name))
- db_set_utf(hContact, m_szModuleName, "Name", name);
+ setUString(hContact, "Name", name);
- if (nick && mir_strlen(nick)) {
- db_set_utf(hContact, m_szModuleName, "Nick", nick);
+ if (mir_strlen(nick)) {
+ setUString(hContact, "Nick", nick);
}
- else if (name && mir_strlen(name)) {
- db_set_utf(hContact, m_szModuleName, "Nick", name);
+ else if (mir_strlen(name)) {
+ setUString(hContact, "Nick", name);
}
else {
- db_set_utf(hContact, m_szModuleName, "Nick", id);
+ setUString(hContact, "Nick", id);
}
db_set_b(hContact, m_szModuleName, "type", (uint8_t)type);
@@ -196,7 +196,7 @@ void CSametimeProto::ExportContactsToList(mwSametimeList* user_list) mwIdBlock uid;
for (auto &hContact : AccContacts()) {
- if (!db_get_utf(hContact, m_szModuleName, "stid", &dbv)) {
+ if (!getUString(hContact, "stid", &dbv)) {
if (dbv.pszVal) {
if (GetAwareIdFromContact(hContact, &id_block)) {
if (!db_get_utf(hContact, "CList", "Group", &dbv2)) {
@@ -250,7 +250,7 @@ void CSametimeProto::ExportContactsToList(mwSametimeList* user_list) free(group_name);
free(group_alias);
- if (!db_get_utf(hContact, m_szModuleName, "Name", &dbv2)) {
+ if (!getUString(hContact, "Name", &dbv2)) {
user_shortName = _strdup(dbv2.pszVal);
db_free(&dbv2);
}
@@ -451,7 +451,7 @@ void mwAwareList_on_aware(mwAwareList* list, mwAwareSnapshot* aware) DBVARIANT dbv;
// update self - necessary for some servers
- if (aware->online && !db_get_utf(0, proto->m_szModuleName, "stid", &dbv) && mir_strcmp(aware->id.user, dbv.pszVal) == 0) {
+ if (aware->online && !proto->getUString("stid", &dbv) && mir_strcmp(aware->id.user, dbv.pszVal) == 0) {
int new_status = ID_STATUS_OFFLINE;
switch (aware->status.status) {
@@ -587,7 +587,7 @@ void CSametimeProto::UserListCreate() for (auto &hContact : AccContacts()) {
if (!Contact::IsGroupChat(hContact, m_szModuleName) /*&& proto && !mir_strcmp( PROTO, proto)*/) {
- if (!db_get_utf(hContact, m_szModuleName, "stid", &dbv)) {
+ if (!getUString(hContact, "stid", &dbv)) {
if (dbv.pszVal) {
if (GetAwareIdFromContact(hContact, &id_block)) {
// add user to aware list
@@ -603,7 +603,7 @@ void CSametimeProto::UserListCreate() }
// add self - might be necessary for some servers
- if (!db_get_utf(0, m_szModuleName, "stid", &dbv)) {
+ if (!getUString("stid", &dbv)) {
id_block.type = mwAware_USER;
id_block.user = dbv.pszVal;
id_block.community = nullptr;
@@ -710,8 +710,8 @@ void mwResolve_handler_details_callback(mwServiceResolve* srvc, guint32, guint32 if (hContact) {
char* name = ((mwResolveMatch*)mri->data)->name;
if (name && mir_strlen(name)) {
- db_set_utf(hContact, proto->m_szModuleName, "Name", name);
- db_set_utf(hContact, proto->m_szModuleName, "Nick", name);
+ proto->setUString(hContact, "Name", name);
+ proto->setUString(hContact, "Nick", name);
db_set_utf(hContact, "CList", "MyHandle", name);
}
}
diff --git a/protocols/SkypeWeb/src/skype_chatrooms.cpp b/protocols/SkypeWeb/src/skype_chatrooms.cpp index 4f27b13c5c..8fcaa6fc31 100644 --- a/protocols/SkypeWeb/src/skype_chatrooms.cpp +++ b/protocols/SkypeWeb/src/skype_chatrooms.cpp @@ -214,7 +214,7 @@ int CSkypeProto::OnGroupChatEventHook(WPARAM, LPARAM lParam) INT_PTR CSkypeProto::OnJoinChatRoom(WPARAM hContact, LPARAM)
{
if (hContact) {
- ptrW idT(getWStringA(hContact, "ChatRoomID"));
+ ptrW idT(getWStringA(hContact, SKYPE_SETTINGS_ID));
ptrW nameT(getWStringA(hContact, "Nick"));
StartChatRoom(idT, nameT != NULL ? nameT : idT);
}
@@ -227,7 +227,7 @@ INT_PTR CSkypeProto::OnLeaveChatRoom(WPARAM hContact, LPARAM) return 1;
if (hContact && IDYES == MessageBox(nullptr, TranslateT("This chat is going to be destroyed forever with all its contents. This action cannot be undone. Are you sure?"), TranslateT("Warning"), MB_YESNO | MB_ICONQUESTION)) {
- ptrW idT(getWStringA(hContact, "ChatRoomID"));
+ ptrW idT(getWStringA(hContact, SKYPE_SETTINGS_ID));
Chat_Control(m_szModuleName, idT, SESSION_OFFLINE);
Chat_Terminate(m_szModuleName, idT);
diff --git a/protocols/SkypeWeb/src/skype_contacts.cpp b/protocols/SkypeWeb/src/skype_contacts.cpp index 75827daaf6..4de99c709b 100644 --- a/protocols/SkypeWeb/src/skype_contacts.cpp +++ b/protocols/SkypeWeb/src/skype_contacts.cpp @@ -34,7 +34,7 @@ void CSkypeProto::SetContactStatus(MCONTACT hContact, uint16_t status) void CSkypeProto::SetChatStatus(MCONTACT hContact, int iStatus)
{
- ptrW tszChatID(getWStringA(hContact, "ChatRoomID"));
+ ptrW tszChatID(getWStringA(hContact, SKYPE_SETTINGS_ID));
if (tszChatID != NULL)
Chat_Control(m_szModuleName, tszChatID, (iStatus == ID_STATUS_OFFLINE) ? SESSION_OFFLINE : SESSION_ONLINE);
}
@@ -239,7 +239,7 @@ void CSkypeProto::OnContactDeleted(MCONTACT hContact) {
if (IsOnline() && hContact) {
if (isChatRoom(hContact))
- PushRequest(new DestroyChatroomRequest(getMStringA(hContact, "ChatRoomID")));
+ PushRequest(new DestroyChatroomRequest(getMStringA(hContact, SKYPE_SETTINGS_ID)));
else
PushRequest(new DeleteContactRequest(getId(hContact)));
}
diff --git a/protocols/Telegram/src/proto.cpp b/protocols/Telegram/src/proto.cpp index ba9565f09f..fa9313c0be 100644 --- a/protocols/Telegram/src/proto.cpp +++ b/protocols/Telegram/src/proto.cpp @@ -83,7 +83,7 @@ void CTelegramProto::OnModulesLoaded() } bool isGroupChat = isChatRoom(cc); - szId = getMStringA(cc, isGroupChat ? "ChatRoomID" : DBKEY_ID); + szId = getMStringA(cc, DBKEY_ID); if (!szId.IsEmpty()) { auto *pUser = new TG_USER(_atoi64(szId.c_str()), cc, isGroupChat); pUser->szAvatarHash = getMStringA(cc, DBKEY_AVATAR_HASH); diff --git a/protocols/Telegram/src/utils.cpp b/protocols/Telegram/src/utils.cpp index 4a122f70c1..bcf222ecab 100644 --- a/protocols/Telegram/src/utils.cpp +++ b/protocols/Telegram/src/utils.cpp @@ -47,17 +47,14 @@ TG_USER* CTelegramProto::AddUser(uint64_t id, bool bIsChat) char szId[100];
_i64toa(id, szId, 10);
+ setString(hContact, DBKEY_ID, szId);
if (bIsChat) {
Clist_SetGroup(hContact, TranslateT("Chat rooms"));
setByte(hContact, "ChatRoom", 1);
- setString(hContact, "ChatRoomID", szId);
- }
- else {
- setString(hContact, DBKEY_ID, szId);
- if (mir_wstrlen(m_wszDefaultGroup))
- Clist_SetGroup(hContact, m_wszDefaultGroup);
}
+ else if (mir_wstrlen(m_wszDefaultGroup))
+ Clist_SetGroup(hContact, m_wszDefaultGroup);
pUser = new TG_USER(id, hContact, bIsChat);
m_arUsers.insert(pUser);
diff --git a/protocols/VKontakte/src/main.cpp b/protocols/VKontakte/src/main.cpp index ee2ccc09c2..6241d8763f 100644 --- a/protocols/VKontakte/src/main.cpp +++ b/protocols/VKontakte/src/main.cpp @@ -40,7 +40,7 @@ PLUGININFOEX pluginInfoEx = CMPlugin::CMPlugin() :
ACCPROTOPLUGIN<CVkProto>("VKontakte", pluginInfoEx)
{
- SetUniqueId("ID");
+ SetUniqueId("ID", DBVT_DWORD);
}
/////////////////////////////////////////////////////////////////////////////////////////
diff --git a/protocols/VKontakte/src/misc.cpp b/protocols/VKontakte/src/misc.cpp index c60dbb36ad..18c4b0e5be 100644 --- a/protocols/VKontakte/src/misc.cpp +++ b/protocols/VKontakte/src/misc.cpp @@ -117,6 +117,20 @@ char* ExpUrlEncode(const char *szUrl, bool strict) /////////////////////////////////////////////////////////////////////////////////////////
+void CVkProto::CheckUpdate()
+{
+ if (getByte("Compatibility") < 1) {
+ for (auto &cc : AccContacts()) {
+ LONG userId = getDword(cc, "vk_chat_id", VK_INVALID_USER);
+ if (userId != VK_INVALID_USER) {
+ setDword(cc, "ID", userId);
+ delSetting(cc, "vk_chat_id");
+ }
+ }
+ setByte("Compatibility", 1);
+ }
+}
+
void CVkProto::ClearAccessToken()
{
debugLogA("CVkProto::ClearAccessToken");
@@ -183,7 +197,7 @@ MCONTACT CVkProto::FindChat(LONG dwUserid) return 0;
for (auto &hContact : AccContacts()) {
- LONG dbUserid = getDword(hContact, "vk_chat_id", VK_INVALID_USER);
+ LONG dbUserid = getDword(hContact, "ID", VK_INVALID_USER);
if (dbUserid == VK_INVALID_USER)
continue;
diff --git a/protocols/VKontakte/src/vk_chats.cpp b/protocols/VKontakte/src/vk_chats.cpp index 1771b5d474..3a7e2cdfe6 100644 --- a/protocols/VKontakte/src/vk_chats.cpp +++ b/protocols/VKontakte/src/vk_chats.cpp @@ -84,7 +84,7 @@ CVkChatInfo* CVkProto::AppendConversationChat(int iChatId, const JSONNode& jnIte for (int i = _countof(sttStatuses) - 1; i >= 0; i--)
Chat_AddGroup(si, TranslateW(sttStatuses[i]));
- setDword(si->hContact, "vk_chat_id", iChatId);
+ setDword(si->hContact, "ID", iChatId);
CMStringW wszHomepage(FORMAT, L"https://vk.com/im?sel=c%d", iChatId);
setWString(si->hContact, "Homepage", wszHomepage);
@@ -445,6 +445,17 @@ void CVkProto::AppendChatMessage(CVkChatInfo *cc, LONG uid, int msgTime, LPCWSTR /////////////////////////////////////////////////////////////////////////////////////////
+CVkChatInfo* CVkProto::GetChatByContact(MCONTACT hContact)
+{
+ LONG dbUserid = getDword(hContact, "ID", VK_INVALID_USER);
+ if (dbUserid == VK_INVALID_USER)
+ return nullptr;
+
+ wchar_t wszChatID[40];
+ _itow(dbUserid, wszChatID, 10);
+ return GetChatById(wszChatID);
+}
+
CVkChatInfo* CVkProto::GetChatById(LPCWSTR pwszId)
{
for (auto &it : m_chats)
@@ -458,13 +469,9 @@ CVkChatInfo* CVkProto::GetChatById(LPCWSTR pwszId) void CVkProto::SetChatStatus(MCONTACT hContact, int iStatus)
{
- ptrW wszChatID(getWStringA(hContact, "ChatRoomID"));
- if (wszChatID == nullptr)
- return;
-
- CVkChatInfo *cc = GetChatById(wszChatID);
+ CVkChatInfo *cc = GetChatByContact(hContact);
if (cc != nullptr)
- Chat_Control(m_szModuleName, wszChatID, (iStatus == ID_STATUS_OFFLINE) ? SESSION_OFFLINE : SESSION_ONLINE);
+ Chat_Control(m_szModuleName, cc->m_wszId, (iStatus == ID_STATUS_OFFLINE) ? SESSION_OFFLINE : SESSION_ONLINE);
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -601,7 +608,7 @@ INT_PTR __cdecl CVkProto::OnJoinChat(WPARAM hContact, LPARAM) if (!IsOnline() || getBool(hContact, "kicked") || !getBool(hContact, "off"))
return 1;
- int chat_id = getDword(hContact, "vk_chat_id", VK_INVALID_USER);
+ int chat_id = getDword(hContact, "ID", VK_INVALID_USER);
if (chat_id == VK_INVALID_USER)
return 1;
@@ -619,11 +626,7 @@ INT_PTR __cdecl CVkProto::OnLeaveChat(WPARAM hContact, LPARAM) if (!IsOnline())
return 1;
- ptrW wszChatID(getWStringA(hContact, "ChatRoomID"));
- if (wszChatID == nullptr)
- return 1;
-
- CVkChatInfo *cc = GetChatById(wszChatID);
+ CVkChatInfo *cc = GetChatByContact(hContact);
if (cc == nullptr)
return 1;
@@ -705,7 +708,7 @@ INT_PTR __cdecl CVkProto::SvcDestroyKickChat(WPARAM hContact, LPARAM) if (!getBool(hContact, "off"))
return 1;
- int chat_id = getDword(hContact, "vk_chat_id", VK_INVALID_USER);
+ int chat_id = getDword(hContact, "ID", VK_INVALID_USER);
if (chat_id == VK_INVALID_USER)
return 1;
diff --git a/protocols/VKontakte/src/vk_files.cpp b/protocols/VKontakte/src/vk_files.cpp index a7306c1568..7ac1b9657e 100644 --- a/protocols/VKontakte/src/vk_files.cpp +++ b/protocols/VKontakte/src/vk_files.cpp @@ -363,14 +363,7 @@ void CVkProto::OnReciveUploadFile(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pR AsyncHttpRequest *pMsgReq;
if (isChatRoom(fup->hContact)) {
-
- ptrW wszChatID(getWStringA(fup->hContact, "ChatRoomID"));
- if (!wszChatID) {
- SendFileFiled(fup, VKERR_INVALID_USER);
- return;
- }
-
- CVkChatInfo *cc = GetChatById(wszChatID);
+ CVkChatInfo *cc = GetChatByContact(fup->hContact);
if (cc == nullptr) {
SendFileFiled(fup, VKERR_INVALID_USER);
return;
diff --git a/protocols/VKontakte/src/vk_messages.cpp b/protocols/VKontakte/src/vk_messages.cpp index e6f31c2256..7bec7a13fd 100644 --- a/protocols/VKontakte/src/vk_messages.cpp +++ b/protocols/VKontakte/src/vk_messages.cpp @@ -26,8 +26,8 @@ int CVkProto::SendMsg(MCONTACT hContact, int, const char *szMsg) return 0;
bool bIsChat = isChatRoom(hContact);
- LONG iUserID = getDword(hContact, bIsChat ? "vk_chat_id" : "ID", VK_INVALID_USER);
+ LONG iUserID = getDword(hContact, "ID", VK_INVALID_USER);
if (iUserID == VK_INVALID_USER || iUserID == VK_FEED_USER) {
ProtoBroadcastAsync(hContact, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, 0);
return 0;
diff --git a/protocols/VKontakte/src/vk_proto.cpp b/protocols/VKontakte/src/vk_proto.cpp index f16be722f7..b712b83eb2 100644 --- a/protocols/VKontakte/src/vk_proto.cpp +++ b/protocols/VKontakte/src/vk_proto.cpp @@ -46,6 +46,7 @@ CVkProto::CVkProto(const char *szModuleName, const wchar_t *pwszUserName) : m_tWorkThreadTimer = m_tPoolThreadTimer = time(0);
InitQueue();
+ CheckUpdate();
CreateProtoService(PS_CREATEACCMGRUI, &CVkProto::SvcCreateAccMgrUI);
CreateProtoService(PS_GETAVATARINFO, &CVkProto::SvcGetAvatarInfo);
diff --git a/protocols/VKontakte/src/vk_proto.h b/protocols/VKontakte/src/vk_proto.h index fd680580a6..43936e8c5b 100644 --- a/protocols/VKontakte/src/vk_proto.h +++ b/protocols/VKontakte/src/vk_proto.h @@ -357,6 +357,7 @@ private: int IsHystoryMessageExist(MCONTACT hContact);
void SetSrmmReadStatus(MCONTACT hContact);
void MarkDialogAsRead(MCONTACT hContact);
+ void CheckUpdate();
char* GetStickerId(const char *Msg, int& stickerid);
CMStringA GetAttachmentsFromMessage(const char * Msg);
CMStringW SpanVKNotificationType(CMStringW& wszType, VKObjType& vkFeedback, VKObjType& vkParent);
@@ -413,6 +414,7 @@ private: LPTSTR ChangeChatTopic(CVkChatInfo*);
void SetChatStatus(MCONTACT hContact, int iStatus);
CVkChatInfo* GetChatById(LPCWSTR pwszId);
+ CVkChatInfo* GetChatByContact(MCONTACT hContact);
INT_PTR __cdecl SvcCreateChat(WPARAM, LPARAM);
void __cdecl GetAwayMsgThread(void* p);
};
diff --git a/protocols/WhatsApp/src/avatars.cpp b/protocols/WhatsApp/src/avatars.cpp index fd4bbfde1f..7be5b1d412 100644 --- a/protocols/WhatsApp/src/avatars.cpp +++ b/protocols/WhatsApp/src/avatars.cpp @@ -46,7 +46,7 @@ INT_PTR WhatsAppProto::GetAvatarInfo(WPARAM wParam, LPARAM lParam) {
PROTO_AVATAR_INFORMATION *pai = (PROTO_AVATAR_INFORMATION*)lParam;
- ptrA jid(getStringA(pai->hContact, isChatRoom(pai->hContact) ? "ChatRoomID" : DBKEY_ID));
+ ptrA jid(getStringA(pai->hContact, DBKEY_ID));
if (jid == NULL)
return GAIR_NOAVATAR;
@@ -94,7 +94,7 @@ CMStringW WhatsAppProto::GetAvatarFileName(MCONTACT hContact) CMStringA jid;
if (hContact != NULL) {
- ptrA szId(getStringA(hContact, isChatRoom(hContact) ? "ChatRoomID" : DBKEY_ID));
+ ptrA szId(getStringA(hContact, DBKEY_ID));
if (szId == NULL)
return L"";
diff --git a/protocols/WhatsApp/src/proto.cpp b/protocols/WhatsApp/src/proto.cpp index 40ab1336b8..1c2e0a7142 100644 --- a/protocols/WhatsApp/src/proto.cpp +++ b/protocols/WhatsApp/src/proto.cpp @@ -153,10 +153,9 @@ void WhatsAppProto::OnModulesLoaded() m_arUsers.insert(new WAUser(0, m_szJid, false));
for (auto &cc : AccContacts()) {
- bool bIsChat = isChatRoom(cc);
- CMStringA szId(getMStringA(cc, bIsChat ? "ChatRoomID" : DBKEY_ID));
+ CMStringA szId(getMStringA(cc, DBKEY_ID));
if (!szId.IsEmpty())
- m_arUsers.insert(new WAUser(cc, szId, bIsChat));
+ m_arUsers.insert(new WAUser(cc, szId, isChatRoom(cc)));
}
}
diff --git a/protocols/WhatsApp/src/utils.cpp b/protocols/WhatsApp/src/utils.cpp index 1e2d39f553..a1d234e405 100644 --- a/protocols/WhatsApp/src/utils.cpp +++ b/protocols/WhatsApp/src/utils.cpp @@ -113,19 +113,16 @@ WAUser* WhatsAppProto::AddUser(const char *szId, bool bTemporary) MCONTACT hContact = db_add_contact();
Proto_AddToContact(hContact, m_szModuleName);
+ setString(hContact, DBKEY_ID, szId);
pUser = new WAUser(hContact, mir_strdup(szId));
pUser->bIsGroupChat = WAJid(szId).isGroup();
if (pUser->bIsGroupChat) {
setByte(hContact, "ChatRoom", 1);
- setString(hContact, "ChatRoomID", szId);
- }
- else {
- setString(hContact, DBKEY_ID, szId);
- if (m_wszDefaultGroup)
- Clist_SetGroup(hContact, m_wszDefaultGroup);
}
+ else if (m_wszDefaultGroup)
+ Clist_SetGroup(hContact, m_wszDefaultGroup);
if (bTemporary)
Contact::RemoveFromList(hContact);
diff --git a/src/core/stdfile/src/file.cpp b/src/core/stdfile/src/file.cpp index 234f84404f..254cbbebd7 100644 --- a/src/core/stdfile/src/file.cpp +++ b/src/core/stdfile/src/file.cpp @@ -32,16 +32,6 @@ int PFTS_CompareWithTchar(PROTOFILETRANSFERSTATUS* ft, const wchar_t* s, wchar_t static HGENMENU hSRFileMenuItem;
-wchar_t* GetContactID(MCONTACT hContact)
-{
- char *szProto = Proto_GetBaseAccountName(hContact);
- if (Contact::IsGroupChat(hContact, szProto))
- if (wchar_t *theValue = db_get_wsa(hContact, szProto, "ChatRoomID"))
- return theValue;
-
- return Contact::GetInfo(CNF_UNIQUEID, hContact, szProto);
-}
-
static INT_PTR SendFileCommand(WPARAM hContact, LPARAM)
{
FileSendData fsd;
diff --git a/src/core/stdfile/src/file.h b/src/core/stdfile/src/file.h index 2bdddb04e5..60e38c907f 100644 --- a/src/core/stdfile/src/file.h +++ b/src/core/stdfile/src/file.h @@ -120,6 +120,4 @@ HWND FtMgr_Show(bool bForceActivate, bool bFromMenu); void FtMgr_Destroy();
void FtMgr_AddTransfer(FileDlgData *dat);
-wchar_t *GetContactID(MCONTACT hContact);
-
extern HANDLE hDlgSucceeded, hDlgCanceled;
diff --git a/src/core/stdfile/src/filerecvdlg.cpp b/src/core/stdfile/src/filerecvdlg.cpp index 7a364e210e..b784e09c24 100644 --- a/src/core/stdfile/src/filerecvdlg.cpp +++ b/src/core/stdfile/src/filerecvdlg.cpp @@ -138,7 +138,7 @@ void GetContactReceivedFilesDir(MCONTACT hContact, wchar_t *szDir, int cchDir, B rvaVarsToReplace[0].key.w = L"nick";
rvaVarsToReplace[0].value.w = mir_wstrdup(Clist_GetContactDisplayName(hContact));
rvaVarsToReplace[1].key.w = L"userid";
- rvaVarsToReplace[1].value.w = GetContactID(hContact);
+ rvaVarsToReplace[1].value.w = Contact::GetInfo(CNF_UNIQUEID, hContact);
rvaVarsToReplace[2].key.w = L"proto";
rvaVarsToReplace[2].value.w = mir_a2u(Proto_GetBaseAccountName(hContact));
rvaVarsToReplace[3].key.w = nullptr;
diff --git a/src/mir_app/src/CMPluginBase.cpp b/src/mir_app/src/CMPluginBase.cpp index 92c444e46c..910b1bbd44 100644 --- a/src/mir_app/src/CMPluginBase.cpp +++ b/src/mir_app/src/CMPluginBase.cpp @@ -332,12 +332,14 @@ void CMPluginBase::RegisterProtocol(int type, pfnInitProto fnInit, pfnUninitProt }
}
-void CMPluginBase::SetUniqueId(const char *pszUniqueId)
+void CMPluginBase::SetUniqueId(const char *pszUniqueId, int type)
{
if (pszUniqueId == nullptr)
return;
MBaseProto *pd = g_arProtos.find((MBaseProto*)&m_szModuleName);
- if (pd != nullptr)
+ if (pd != nullptr) {
pd->szUniqueId = mir_strdup(pszUniqueId);
+ pd->iUniqueIdType = (type == 0) ? DBVT_WCHAR : type;
+ }
}
diff --git a/src/mir_app/src/chat.h b/src/mir_app/src/chat.h index cab71e9849..00d2f183fe 100644 --- a/src/mir_app/src/chat.h +++ b/src/mir_app/src/chat.h @@ -90,7 +90,6 @@ void UM_SortUser(SESSION_INFO *si); // clist.c
MCONTACT AddRoom(const char *pszModule, const wchar_t *pszRoom, const wchar_t *pszDisplayName, int iType);
-MCONTACT FindRoom(const char *pszModule, const wchar_t *pszRoom);
BOOL SetAllOffline(BOOL bHide, const char *pszModule);
BOOL SetOffline(MCONTACT hContact, BOOL bHide);
diff --git a/src/mir_app/src/chat_clist.cpp b/src/mir_app/src/chat_clist.cpp index 7358635617..85b56632c7 100644 --- a/src/mir_app/src/chat_clist.cpp +++ b/src/mir_app/src/chat_clist.cpp @@ -22,6 +22,20 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "chat.h"
+static MCONTACT FindRoom(const char *pszModule, const wchar_t *pszRoom)
+{
+ for (auto &hContact : Contacts(pszModule)) {
+ if (!Contact::IsGroupChat(hContact, pszModule))
+ continue;
+
+ ptrW roomid(Contact::GetInfo(CNF_UNIQUEID, hContact, pszModule));
+ if (roomid != nullptr && !mir_wstrcmpi(roomid, pszRoom))
+ return hContact;
+ }
+
+ return 0;
+}
+
MCONTACT AddRoom(const char *pszModule, const wchar_t *pszRoom, const wchar_t *pszDisplayName, int iType)
{
ptrW pwszGroup(Chat_GetGroup());
@@ -34,7 +48,7 @@ MCONTACT AddRoom(const char *pszModule, const wchar_t *pszRoom, const wchar_t *p }
}
- MCONTACT hContact = g_chatApi.FindRoom(pszModule, pszRoom);
+ MCONTACT hContact = FindRoom(pszModule, pszRoom);
if (hContact) {
// contact exists, let's assign the standard group name if it's missing
if (mir_wstrlen(pwszGroup)) {
@@ -55,8 +69,16 @@ MCONTACT AddRoom(const char *pszModule, const wchar_t *pszRoom, const wchar_t *p Proto_AddToContact(hContact, pszModule);
Clist_SetGroup(hContact, pwszGroup);
+ if (auto *pa = Proto_GetAccount(pszModule)) {
+ if (MBaseProto *pd = g_arProtos.find((MBaseProto *)&pa->szProtoName)) {
+ if (pd->iUniqueIdType == DBVT_DWORD)
+ db_set_w(hContact, pszModule, pd->szUniqueId, _wtoi(pszRoom));
+ else
+ db_set_ws(hContact, pszModule, pd->szUniqueId, pszRoom);
+ }
+ }
+
db_set_ws(hContact, pszModule, "Nick", pszDisplayName);
- db_set_ws(hContact, pszModule, "ChatRoomID", pszRoom);
db_set_b(hContact, pszModule, "ChatRoom", (uint8_t)iType);
db_set_w(hContact, pszModule, "Status", ID_STATUS_OFFLINE);
return hContact;
@@ -101,7 +123,7 @@ int RoomDoubleclicked(WPARAM hContact, LPARAM) if (!Contact::IsGroupChat(hContact, szProto))
return 0;
- ptrW roomid(db_get_wsa(hContact, szProto, "ChatRoomID"));
+ ptrW roomid(Contact::GetInfo(CNF_UNIQUEID, hContact, szProto));
if (roomid == nullptr)
return 0;
@@ -115,17 +137,3 @@ int RoomDoubleclicked(WPARAM hContact, LPARAM) }
return 1;
}
-
-MCONTACT FindRoom(const char *pszModule, const wchar_t *pszRoom)
-{
- for (auto &hContact : Contacts(pszModule)) {
- if (!Contact::IsGroupChat(hContact, pszModule))
- continue;
-
- ptrW roomid(db_get_wsa(hContact, pszModule, "ChatRoomID"));
- if (roomid != nullptr && !mir_wstrcmpi(roomid, pszRoom))
- return hContact;
- }
-
- return 0;
-}
diff --git a/src/mir_app/src/chat_manager.cpp b/src/mir_app/src/chat_manager.cpp index 7019e3a2a7..9818d1da9b 100644 --- a/src/mir_app/src/chat_manager.cpp +++ b/src/mir_app/src/chat_manager.cpp @@ -935,7 +935,6 @@ static void ResetApi() g_chatApi.SetOffline = ::SetOffline;
g_chatApi.SetAllOffline = ::SetAllOffline;
- g_chatApi.FindRoom = ::FindRoom;
g_chatApi.DoRtfToTags = ::DoRtfToTags;
g_chatApi.Log_CreateRTF = ::Log_CreateRTF;
@@ -958,6 +957,32 @@ static void ResetApi() /////////////////////////////////////////////////////////////////////////////////////////
+static void CheckUpdate()
+{
+ if (db_get_b(0, "Compatibility", "GroupChats") < 1) {
+ for (auto &cc : Contacts()) {
+ if (auto *pa = Proto_GetContactAccount(cc)) {
+ if (!db_get_b(cc, pa->szModuleName, "ChatRoom"))
+ continue;
+
+ ptrW wszId(db_get_wsa(cc, pa->szModuleName, "ChatRoomID"));
+ if (wszId == nullptr)
+ continue;
+
+ if (MBaseProto *pd = g_arProtos.find((MBaseProto *)&pa->szProtoName)) {
+ if (pd->iUniqueIdType == DBVT_DWORD)
+ db_set_dw(cc, pa->szModuleName, pd->szUniqueId, _wtoi(wszId));
+ else
+ db_set_ws(cc, pa->szModuleName, pd->szUniqueId, wszId);
+
+ db_unset(cc, pa->szModuleName, "ChatRoomID");
+ }
+ }
+ }
+ db_set_b(0, "Compatibility", "GroupChats", 1);
+ }
+}
+
MIR_APP_DLL(CHAT_MANAGER*) Chat_CustomizeApi(const CHAT_MANAGER_INITDATA *pInit)
{
if (pInit == nullptr)
@@ -1011,6 +1036,7 @@ MIR_APP_DLL(CHAT_MANAGER*) Chat_CustomizeApi(const CHAT_MANAGER_INITDATA *pInit) LoadChatIcons();
RegisterFonts();
OptionsInit();
+ CheckUpdate();
return &g_chatApi;
}
diff --git a/src/mir_app/src/contacts.cpp b/src/mir_app/src/contacts.cpp index 8cec2a273a..376735f87e 100644 --- a/src/mir_app/src/contacts.cpp +++ b/src/mir_app/src/contacts.cpp @@ -82,7 +82,6 @@ MIR_APP_DLL(wchar_t*) Contact::GetInfo(int type, MCONTACT hContact, const char * if (szProto == nullptr)
return nullptr;
- const char *uid;
wchar_t *res;
DBVARIANT dbv;
switch (type) {
@@ -164,8 +163,7 @@ MIR_APP_DLL(wchar_t*) Contact::GetInfo(int type, MCONTACT hContact, const char * return mir_wstrdup(buf);
}
- uid = Proto_GetUniqueId(szProto);
- if (uid)
+ if (auto *uid = Proto_GetUniqueId(szProto))
return ProcessDatabaseValueDefault(hContact, szProto, uid);
break;
@@ -173,8 +171,7 @@ MIR_APP_DLL(wchar_t*) Contact::GetInfo(int type, MCONTACT hContact, const char * if (res = ProcessDatabaseValueDefault(hContact, szProto, "display_uid"))
return res;
- uid = Proto_GetUniqueId(szProto);
- if (uid)
+ if (auto *uid = Proto_GetUniqueId(szProto))
return ProcessDatabaseValueDefault(hContact, szProto, uid);
break;
@@ -209,8 +206,7 @@ MIR_APP_DLL(wchar_t*) Contact::GetInfo(int type, MCONTACT hContact, const char * case 5: // Unique id
// protocol must define a PFLAG_UNIQUEIDSETTING
- uid = Proto_GetUniqueId(szProto);
- if ((INT_PTR)uid != CALLSERVICE_NOTFOUND && uid) {
+ if (auto *uid = Proto_GetUniqueId(szProto)) {
if (!db_get_ws(hContact, szProto, uid, &dbv)) {
if (dbv.type == DBVT_BYTE || dbv.type == DBVT_WORD || dbv.type == DBVT_DWORD) {
long value = (dbv.type == DBVT_BYTE) ? dbv.bVal : (dbv.type == DBVT_WORD ? dbv.wVal : dbv.dVal);
diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def index 694de1eb1f..cc94a44a7c 100644 --- a/src/mir_app/src/mir_app.def +++ b/src/mir_app/src/mir_app.def @@ -456,7 +456,7 @@ Proto_SetUniqueId @549 ?IsEnabled@PROTOACCOUNT@@QBE_NXZ @552 NONAME
?IsLocked@PROTOACCOUNT@@QBE_NXZ @553 NONAME
?IsVisible@PROTOACCOUNT@@QBE_NXZ @554 NONAME
-?SetUniqueId@CMPluginBase@@IAEXPBD@Z @555 NONAME
+?SetUniqueId@CMPluginBase@@IAEXPBDH@Z @555 NONAME
Clist_GetProtocolVisibility @556
?Accounts@@YGAAU?$LIST@UPROTOACCOUNT@@@@XZ @557 NONAME
Clist_InitAutoRebuild @558
diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def index e8bfae2ac4..23413c088a 100644 --- a/src/mir_app/src/mir_app64.def +++ b/src/mir_app/src/mir_app64.def @@ -456,7 +456,7 @@ Proto_SetUniqueId @549 ?IsEnabled@PROTOACCOUNT@@QEBA_NXZ @552 NONAME
?IsLocked@PROTOACCOUNT@@QEBA_NXZ @553 NONAME
?IsVisible@PROTOACCOUNT@@QEBA_NXZ @554 NONAME
-?SetUniqueId@CMPluginBase@@IEAAXPEBD@Z @555 NONAME
+?SetUniqueId@CMPluginBase@@IEAAXPEBDH@Z @555 NONAME
Clist_GetProtocolVisibility @556
?Accounts@@YAAEAU?$LIST@UPROTOACCOUNT@@@@XZ @557 NONAME
Clist_InitAutoRebuild @558
diff --git a/src/mir_app/src/miranda.h b/src/mir_app/src/miranda.h index b0508c18f3..b2f0605959 100644 --- a/src/mir_app/src/miranda.h +++ b/src/mir_app/src/miranda.h @@ -154,6 +154,7 @@ struct MBaseProto : public PROTOCOLDESCRIPTOR, public MZeroedObject HINSTANCE hInst;
char *szUniqueId; // name of the unique setting that identifies a contact
+ int iUniqueIdType; // DBVT_*
};
extern OBJLIST<MBaseProto> g_arProtos;
diff --git a/src/mir_app/src/path.cpp b/src/mir_app/src/path.cpp index 49e5cd7487..9f66a2991d 100644 --- a/src/mir_app/src/path.cpp +++ b/src/mir_app/src/path.cpp @@ -32,15 +32,6 @@ extern wchar_t g_profileDir[MAX_PATH], g_shortProfileName[MAX_PATH]; static HANDLE hAvatarFolder;
static wchar_t tszAvatarRoot[MAX_PATH];
-wchar_t* GetContactID(MCONTACT hContact)
-{
- char *szProto = Proto_GetBaseAccountName(hContact);
- if (Contact::IsGroupChat(hContact, szProto))
- return db_get_wsa(hContact, szProto, "ChatRoomID");
-
- return Contact::GetInfo(CNF_UNIQUEID, hContact, szProto);
-}
-
/////////////////////////////////////////////////////////////////////////////////////////
// Variables parser
@@ -63,7 +54,7 @@ static __forceinline char *GetContactNickX(const char*, MCONTACT hContact) static __forceinline char* GetContactIDX(const char*, MCONTACT hContact)
{
- wchar_t *id = GetContactID(hContact);
+ wchar_t *id = Contact::GetInfo(CNF_UNIQUEID, hContact);
char* res = mir_u2a(id);
mir_free(id);
return res;
@@ -151,7 +142,7 @@ static __forceinline wchar_t* GetContactNickX(const wchar_t*, MCONTACT hContact) static __forceinline wchar_t* GetContactIDX(const wchar_t*, MCONTACT hContact)
{
- return GetContactID(hContact);
+ return Contact::GetInfo(CNF_UNIQUEID, hContact);
}
static __forceinline wchar_t* GetEnvironmentVariableX(const wchar_t *variable)
diff --git a/src/mir_app/src/proto_utils.cpp b/src/mir_app/src/proto_utils.cpp index 281d76719e..85ef574e3c 100644 --- a/src/mir_app/src/proto_utils.cpp +++ b/src/mir_app/src/proto_utils.cpp @@ -110,7 +110,7 @@ void PROTO_INTERFACE::setAllContactStatuses(int iStatus, bool bSkipChats) for (auto &hContact : AccContacts()) {
if (isChatRoom(hContact)) {
if (!bSkipChats && iStatus == ID_STATUS_OFFLINE) {
- ptrW wszRoom(getWStringA(hContact, "ChatRoomID"));
+ ptrW wszRoom(Contact::GetInfo(CNF_UNIQUEID, hContact));
if (wszRoom != nullptr)
Chat_Control(m_szModuleName, wszRoom, SESSION_OFFLINE);
}
|