From 1d9fd398b75a5a6eca9d40db2e2abb60c96ebc7d Mon Sep 17 00:00:00 2001 From: George Hazan <george.hazan@gmail.com> Date: Fri, 17 May 2013 19:23:37 +0000 Subject: some more fixes for MS_DB_CONTACT_DELETE & loops git-svn-id: http://svn.miranda-ng.org/main/trunk@4710 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/NewsAggregator/Src/Options.cpp | 30 ++++++++--------- plugins/StopSpamPlus/src/services.cpp | 16 ++++----- plugins/TabSRMM/src/msgdialog.cpp | 7 ++-- protocols/AimOscar/src/server.cpp | 3 +- protocols/FacebookRM/src/contacts.cpp | 4 +-- protocols/Gadu-Gadu/src/groupchat.cpp | 4 ++- protocols/JabberG/src/jabber_iqid.cpp | 39 ++++++---------------- protocols/Tlen/src/jabber_iqid.cpp | 60 +++++++++++----------------------- protocols/Twitter/src/contacts.cpp | 4 +-- protocols/Twitter/src/proto.cpp | 5 ++- protocols/Xfire/src/main.cpp | 4 +-- src/core/stdchat/src/manager.cpp | 2 -- src/modules/clist/clistmod.cpp | 11 ++++--- 13 files changed, 73 insertions(+), 116 deletions(-) diff --git a/plugins/NewsAggregator/Src/Options.cpp b/plugins/NewsAggregator/Src/Options.cpp index 697d5d8bc7..6a18c492bc 100644 --- a/plugins/NewsAggregator/Src/Options.cpp +++ b/plugins/NewsAggregator/Src/Options.cpp @@ -491,23 +491,21 @@ INT_PTR CALLBACK UpdateNotifyOptsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPA ListView_GetItemText(hwndList, sel, 1, url, MAX_PATH); for (HANDLE hContact = db_find_first(MODULE); hContact; hContact = db_find_next(hContact, MODULE)) { - DBVARIANT dbNick = {0}; - if (db_get_ts(hContact, MODULE, "Nick", &dbNick)) + ptrT dbNick( db_get_tsa(hContact, MODULE, "Nick")); + if (dbNick == NULL) break; - else if (lstrcmp(dbNick.ptszVal, nick) == 0) { - db_free(&dbNick); - DBVARIANT dbURL = {0}; - if (db_get_ts(hContact, MODULE, "URL", &dbURL)) - break; - else if (lstrcmp(dbURL.ptszVal, url) == 0) { - db_free(&dbURL); - CallService(MS_DB_CONTACT_DELETE, (WPARAM)hContact, 0); - ListView_DeleteItem(hwndList, sel); - break; - } - db_free(&dbURL); - } - db_free(&dbNick); + if ( lstrcmp(dbNick, nick)) + continue; + + ptrT dbURL( db_get_tsa(hContact, MODULE, "URL")); + if (dbURL == NULL) + break; + if ( lstrcmp(dbURL, url)) + continue; + + CallService(MS_DB_CONTACT_DELETE, (WPARAM)hContact, 0); + ListView_DeleteItem(hwndList, sel); + break; } } return FALSE; diff --git a/plugins/StopSpamPlus/src/services.cpp b/plugins/StopSpamPlus/src/services.cpp index 43470f8de7..c6ea59fe31 100644 --- a/plugins/StopSpamPlus/src/services.cpp +++ b/plugins/StopSpamPlus/src/services.cpp @@ -22,19 +22,17 @@ INT_PTR IsContactPassed(WPARAM wParam, LPARAM /*lParam*/) INT_PTR RemoveTempContacts(WPARAM wParam,LPARAM lParam) { - for (HANDLE hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) { - DBVARIANT dbv = { 0 }; - if ( db_get_ts( hContact, "CList", "Group", &dbv )) - dbv.ptszVal = NULL; + for (HANDLE hContact = db_find_first(); hContact; ) { + HANDLE hNext = db_find_next(hContact); + ptrT szGroup( db_get_tsa( hContact, "CList", "Group")); - if ( db_get_b(hContact, "CList", "NotOnList", 0) || db_get_b(hContact, "CList", "Hidden", 0 ) || (dbv.ptszVal != NULL && (_tcsstr(dbv.ptszVal, _T("Not In List")) || _tcsstr(dbv.ptszVal, TranslateT("Not In List"))))) { + if ( db_get_b(hContact, "CList", "NotOnList", 0) || db_get_b(hContact, "CList", "Hidden", 0 ) || (szGroup != NULL && (_tcsstr(szGroup, _T("Not In List")) || _tcsstr(szGroup, TranslateT("Not In List"))))) { char *szProto = GetContactProto(hContact); - if ( szProto != NULL ) { + if (szProto != NULL) { // Check if protocol uses server side lists DWORD caps = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0); if ( caps & PF1_SERVERCLIST ) { - int status; - status = CallProtoService(szProto, PS_GETSTATUS, 0, 0); + int status = CallProtoService(szProto, PS_GETSTATUS, 0, 0); if (status == ID_STATUS_OFFLINE || (status >= ID_STATUS_CONNECTING && status < ID_STATUS_CONNECTING + MAX_CONNECT_RETRIES)) // Set a flag so we remember to delete the contact when the protocol goes online the next time db_set_b( hContact, "CList", "Delete", 1 ); @@ -44,7 +42,7 @@ INT_PTR RemoveTempContacts(WPARAM wParam,LPARAM lParam) } } - db_free( &dbv ); + hContact = hNext; } int hGroup = 1; diff --git a/plugins/TabSRMM/src/msgdialog.cpp b/plugins/TabSRMM/src/msgdialog.cpp index d8f8d03799..3e109d2a20 100644 --- a/plugins/TabSRMM/src/msgdialog.cpp +++ b/plugins/TabSRMM/src/msgdialog.cpp @@ -3763,11 +3763,10 @@ quote_from_last: if (m_pContainer->dwFlags & CNT_SIDEBAR) m_pContainer->SideBar->removeSession(dat); dat->cache->setWindowData(); - if (dat->cache->isValid() && !dat->fIsReattach && dat->hContact && M->GetByte("deletetemp", 0)) { - if (M->GetByte(dat->hContact, "CList", "NotOnList", 0)) { + if (dat->cache->isValid() && !dat->fIsReattach && dat->hContact && M->GetByte("deletetemp", 0)) + if (M->GetByte(dat->hContact, "CList", "NotOnList", 0)) CallService(MS_DB_CONTACT_DELETE, (WPARAM)dat->hContact, 0); - } - } + delete dat->Panel; free(dat); } diff --git a/protocols/AimOscar/src/server.cpp b/protocols/AimOscar/src/server.cpp index 883905bd86..67af63c1f2 100644 --- a/protocols/AimOscar/src/server.cpp +++ b/protocols/AimOscar/src/server.cpp @@ -994,8 +994,7 @@ void CAimProto::delete_ssi_list(SNAC &snac, int &offset) HANDLE hContact = contact_from_sn(name); - switch (type) - { + switch (type) { case 0x0000: //buddy record for(i=1;;++i) { diff --git a/protocols/FacebookRM/src/contacts.cpp b/protocols/FacebookRM/src/contacts.cpp index d1eaad91cd..b332c48d8d 100644 --- a/protocols/FacebookRM/src/contacts.cpp +++ b/protocols/FacebookRM/src/contacts.cpp @@ -121,9 +121,9 @@ HANDLE FacebookProto::AddToContactList(facebook_user* fbu, BYTE type, bool dont_ CallService(MS_IGNORE_IGNORE, (WPARAM)hContact, (LPARAM)IGNOREEVENT_USERONLINE); return hContact; - } else { - CallService(MS_DB_CONTACT_DELETE,(WPARAM)hContact,0); } + + CallService(MS_DB_CONTACT_DELETE,(WPARAM)hContact,0); } return 0; diff --git a/protocols/Gadu-Gadu/src/groupchat.cpp b/protocols/Gadu-Gadu/src/groupchat.cpp index 1fd94d1fd1..b619ae97ac 100644 --- a/protocols/Gadu-Gadu/src/groupchat.cpp +++ b/protocols/Gadu-Gadu/src/groupchat.cpp @@ -143,13 +143,15 @@ int GGPROTO::gc_event(WPARAM wParam, LPARAM lParam) list_remove(&chats, chat, 1); // Remove contact from contact list (duh!) should be done by chat.dll !! - for (HANDLE hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) { + for (HANDLE hContact = db_find_first(); hContact; ) { + HANDLE hNext = db_find_next(hContact); DBVARIANT dbv; if (!db_get_s(hContact, m_szModuleName, "ChatRoomID", &dbv, DBVT_TCHAR)) { if (dbv.ptszVal && !_tcscmp(gch->pDest->ptszID, dbv.ptszVal)) CallService(MS_DB_CONTACT_DELETE, (WPARAM)hContact, 0); db_free(&dbv); } + hContact = hNext; } return 1; } diff --git a/protocols/JabberG/src/jabber_iqid.cpp b/protocols/JabberG/src/jabber_iqid.cpp index 3dbfd2d69d..104470416d 100644 --- a/protocols/JabberG/src/jabber_iqid.cpp +++ b/protocols/JabberG/src/jabber_iqid.cpp @@ -492,10 +492,8 @@ void CJabberProto::OnIqResultGetRoster(HXML iqNode, CJabberIqInfo* pInfo) db_unset(hContact, "CList", "Hidden"); chatRooms.insert(hContact); - } else - { - UpdateSubscriptionInfo(hContact, item); } + else UpdateSubscriptionInfo(hContact, item); if ( !m_options.IgnoreRosterGroups) { if (item->group != NULL) { @@ -533,32 +531,15 @@ void CJabberProto::OnIqResultGetRoster(HXML iqNode, CJabberIqInfo* pInfo) // Delete orphaned contacts (if roster sync is enabled) if (m_options.RosterSync == TRUE) { - int listSize = 0, listAllocSize = 0; - HANDLE* list = NULL; - for (HANDLE hContact = db_find_first(m_szModuleName); hContact; hContact = db_find_next(hContact, m_szModuleName)) { - DBVARIANT dbv; - if ( !JGetStringT(hContact, "jid", &dbv)) { - if ( !ListExist(LIST_ROSTER, dbv.ptszVal)) { - Log("Syncing roster: preparing to delete %S (hContact=0x%x)", dbv.ptszVal, hContact); - if (listSize >= listAllocSize) { - listAllocSize = listSize + 100; - if ((list=(HANDLE *) mir_realloc(list, listAllocSize * sizeof(HANDLE))) == NULL) { - listSize = 0; - break; - } } - - list[listSize++] = hContact; - } - db_free(&dbv); + for (HANDLE hContact = db_find_first(m_szModuleName); hContact; ) { + HANDLE hNext = db_find_next(hContact, m_szModuleName); + ptrT jid( db_get_tsa(hContact, m_szModuleName, "jid")); + if (jid != NULL && !ListExist(LIST_ROSTER, jid)) { + Log("Syncing roster: preparing to delete %S (hContact=0x%x)", jid, hContact); + CallService(MS_DB_CONTACT_DELETE, (WPARAM)hContact, 0); } + hContact = hNext; } - - for (i=0; i < listSize; i++) { - Log("Syncing roster: deleting 0x%x", list[i]); - CallService(MS_DB_CONTACT_DELETE, (WPARAM)list[i], 0); - } - if (list != NULL) - mir_free(list); } EnableMenuItems(TRUE); @@ -567,10 +548,10 @@ void CJabberProto::OnIqResultGetRoster(HXML iqNode, CJabberIqInfo* pInfo) m_bModeMsgStatusChangePending = FALSE; SetServerStatus(m_iDesiredStatus); - if (m_options.AutoJoinConferences) { + if (m_options.AutoJoinConferences) for (i=0; i < chatRooms.getCount(); i++) GroupchatJoinByHContact((HANDLE)chatRooms[i], true); - } + chatRooms.destroy(); //UI_SAFE_NOTIFY(m_pDlgJabberJoinGroupchat, WM_JABBER_CHECK_ONLINE); diff --git a/protocols/Tlen/src/jabber_iqid.cpp b/protocols/Tlen/src/jabber_iqid.cpp index f0a35837c2..4e39b0fe06 100644 --- a/protocols/Tlen/src/jabber_iqid.cpp +++ b/protocols/Tlen/src/jabber_iqid.cpp @@ -159,11 +159,11 @@ void JabberIqResultRoster(TlenProtocol *proto, XmlNode *iqNode) else sub = SUB_NONE; //if (str != NULL && (!strcmp(str, "to") || !strcmp(str, "both"))) { if ((jid=JabberXmlGetAttrValue(itemNode, "jid")) != NULL) { - if ((name=JabberXmlGetAttrValue(itemNode, "name")) != NULL) { + if ((name=JabberXmlGetAttrValue(itemNode, "name")) != NULL) nick = JabberTextDecode(name); - } else { + else nick = JabberLocalNickFromJID(jid); - } + if (nick != NULL) { HANDLE hContact; item = JabberListAdd(proto, LIST_ROSTER, jid); @@ -186,8 +186,7 @@ void JabberIqResultRoster(TlenProtocol *proto, XmlNode *iqNode) db_set_s(hContact, "CList", "Group", item->group); db_free(&dbv); } - else - db_set_s(hContact, "CList", "Group", item->group); + else db_set_s(hContact, "CList", "Group", item->group); } else { item->group = NULL; @@ -204,54 +203,33 @@ void JabberIqResultRoster(TlenProtocol *proto, XmlNode *iqNode) } } } + // Delete orphaned contacts (if roster sync is enabled) if (db_get_b(NULL, proto->m_szModuleName, "RosterSync", FALSE) == TRUE) { - HANDLE *list; - int listSize, listAllocSize; - - listSize = listAllocSize = 0; - list = NULL; - - for (HANDLE hContact = db_find_first(proto->m_szModuleName); hContact; hContact = db_find_next(hContact, proto->m_szModuleName)) { - if ( db_get(hContact, proto->m_szModuleName, "jid", &dbv)) - continue; - - if (!JabberListExist(proto, LIST_ROSTER, dbv.pszVal)) { - JabberLog(proto, "Syncing roster: preparing to delete %s (hContact=0x%x)", dbv.pszVal, hContact); - if (listSize >= listAllocSize) { - listAllocSize = listSize + 100; - if ((list=(HANDLE *) mir_realloc(list, listAllocSize)) == NULL) { - listSize = 0; - break; - } + for (HANDLE hContact = db_find_first(proto->m_szModuleName); hContact; ) { + HANDLE hNext = hContact = db_find_next(hContact, proto->m_szModuleName); + ptrA jid( db_get_sa(hContact, proto->m_szModuleName, "jid")); + if (jid != NULL) { + if (!JabberListExist(proto, LIST_ROSTER, jid)) { + JabberLog(proto, "Syncing roster: deleting 0x%x", hContact); + CallService(MS_DB_CONTACT_DELETE, (WPARAM)hContact, 0); } - list[listSize++] = hContact; } - db_free(&dbv); - } - - for (i=0; i<listSize; i++) { - JabberLog(proto, "Syncing roster: deleting 0x%x", list[i]); - CallService(MS_DB_CONTACT_DELETE, (WPARAM) list[i], 0); + hContact = hNext; } - if (list != NULL) - mir_free(list); - } - /////////////////////////////////////// - { - CLISTMENUITEM mi = { sizeof(mi) }; - mi.flags = CMIM_FLAGS; - Menu_ModifyItem(proto->hMenuMUC, &mi); - if (proto->hMenuChats != NULL) - Menu_ModifyItem(proto->hMenuChats, &mi); } + CLISTMENUITEM mi = { sizeof(mi) }; + mi.flags = CMIM_FLAGS; + Menu_ModifyItem(proto->hMenuMUC, &mi); + if (proto->hMenuChats != NULL) + Menu_ModifyItem(proto->hMenuChats, &mi); + proto->isOnline = TRUE; JabberLog(proto, "Status changed via THREADSTART"); oldStatus = proto->m_iStatus; JabberSendPresence(proto, proto->m_iDesiredStatus); ProtoBroadcastAck(proto->m_szModuleName, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE) oldStatus, proto->m_iStatus); - ////////////////////////////////// } } } diff --git a/protocols/Twitter/src/contacts.cpp b/protocols/Twitter/src/contacts.cpp index 3d4d7f9d58..f5568c9a9a 100644 --- a/protocols/Twitter/src/contacts.cpp +++ b/protocols/Twitter/src/contacts.cpp @@ -272,11 +272,9 @@ HANDLE TwitterProto::AddToClientList(const char *name,const char *status) db_free(&dbv); } - return hContact; } - else - CallService(MS_DB_CONTACT_DELETE,(WPARAM)hContact,0); + CallService(MS_DB_CONTACT_DELETE,(WPARAM)hContact,0); } return 0; diff --git a/protocols/Twitter/src/proto.cpp b/protocols/Twitter/src/proto.cpp index 5a1aa801f6..deeb0f88c7 100644 --- a/protocols/Twitter/src/proto.cpp +++ b/protocols/Twitter/src/proto.cpp @@ -503,9 +503,12 @@ void TwitterProto::UpdateSettings() if(in_chat_) OnLeaveChat(0,0); - for(HANDLE hContact = db_find_first(m_szModuleName); hContact; hContact = db_find_next(hContact, m_szModuleName)) + for(HANDLE hContact = db_find_first(m_szModuleName); hContact; ) { + HANDLE hNext = db_find_next(hContact, m_szModuleName); if(db_get_b(hContact,m_szModuleName,"ChatRoom",0)) CallService(MS_DB_CONTACT_DELETE,reinterpret_cast<WPARAM>(hContact),0); + hContact = hNext; + } } } diff --git a/protocols/Xfire/src/main.cpp b/protocols/Xfire/src/main.cpp index c01716807b..a0b336ffd6 100644 --- a/protocols/Xfire/src/main.cpp +++ b/protocols/Xfire/src/main.cpp @@ -1867,7 +1867,7 @@ void CList_MakeAllOffline() } //alle gefundenen handles ls�chen - for(uint i=0;i<fhandles.size();i++) + for(uint i=0; i < fhandles.size(); i++) CallService( MS_DB_CONTACT_DELETE, (WPARAM) fhandles.at(i), 0); } @@ -3499,7 +3499,7 @@ INT_PTR BlockFriend(WPARAM wParam,LPARAM lParam) { } } } - CallService( MS_DB_CONTACT_DELETE, (WPARAM) wParam, 1 ); + CallService(MS_DB_CONTACT_DELETE, (WPARAM) wParam, 1); db_free(&dbv); } return 0; diff --git a/src/core/stdchat/src/manager.cpp b/src/core/stdchat/src/manager.cpp index 5dead6fe83..ac718a9452 100644 --- a/src/core/stdchat/src/manager.cpp +++ b/src/core/stdchat/src/manager.cpp @@ -134,8 +134,6 @@ int SM_RemoveSession(const TCHAR* pszID, const char* pszModule, BOOL removeConta if (pTemp->hContact && db_get_b( pTemp->hContact, pTemp->pszModule, "ChatRoom", 0 ) != 0) { CList_SetOffline(pTemp->hContact, pTemp->iType == GCW_CHATROOM?TRUE:FALSE); -/* if (pTemp->iType != GCW_SERVER) - db_set_b(pTemp->hContact, "CList", "Hidden", 1);*/ db_set_s(pTemp->hContact, pTemp->pszModule, "Topic", ""); db_set_s(pTemp->hContact, pTemp->pszModule, "StatusBar", ""); db_unset(pTemp->hContact, "CList", "StatusMsg"); diff --git a/src/modules/clist/clistmod.cpp b/src/modules/clist/clistmod.cpp index 9ab769b65a..e25dcad0d3 100644 --- a/src/modules/clist/clistmod.cpp +++ b/src/modules/clist/clistmod.cpp @@ -143,10 +143,14 @@ static int ProtocolAck(WPARAM, LPARAM lParam) if ((int)ack->hProcess < ID_STATUS_ONLINE && ack->lParam >= ID_STATUS_ONLINE) { DWORD caps = (DWORD)CallProtoServiceInt(NULL,ack->szModule, PS_GETCAPS, PFLAGNUM_1, 0); - if (caps & PF1_SERVERCLIST) - for (HANDLE hContact = db_find_first(ack->szModule); hContact; hContact = db_find_next(hContact, ack->szModule)) + if (caps & PF1_SERVERCLIST) { + for (HANDLE hContact = db_find_first(ack->szModule); hContact; ) { + HANDLE hNext = db_find_next(hContact, ack->szModule); if (db_get_b(hContact, "CList", "Delete", 0)) CallService(MS_DB_CONTACT_DELETE, (WPARAM)hContact, 0); + hContact = hNext; + } + } } cli.pfnTrayIconUpdateBase(ack->szModule); @@ -544,8 +548,7 @@ void UnloadContactListModule() return; //remove transitory contacts - HANDLE hContact = db_find_first(); - while (hContact != NULL) { + for (HANDLE hContact = db_find_first(); hContact != NULL; ) { HANDLE hNext = db_find_next(hContact); if (db_get_b(hContact, "CList", "NotOnList", 0)) CallService(MS_DB_CONTACT_DELETE, (WPARAM) hContact, 0); -- cgit v1.2.3