From 0333d7006f7c1e415819c0521d01b58f80313fbe Mon Sep 17 00:00:00 2001 From: George Hazan <ghazan@miranda.im> Date: Tue, 12 Feb 2019 18:29:58 +0300 Subject: code cleaning --- plugins/UserInfoEx/src/commonheaders.cpp | 158 --------- plugins/UserInfoEx/src/ctrl_contact.cpp | 6 +- plugins/UserInfoEx/src/dlg_anniversarylist.cpp | 14 +- .../src/ex_import/classExImContactBase.cpp | 6 +- .../src/ex_import/classExImContactBase.h | 4 +- .../src/ex_import/classExImContactXML.cpp | 2 +- plugins/UserInfoEx/src/ex_import/svc_ExImXML.cpp | 317 ++++++++---------- plugins/UserInfoEx/src/init.cpp | 3 + plugins/UserInfoEx/src/stdafx.h | 6 - plugins/UserInfoEx/src/svc_refreshci.cpp | 365 ++++++++------------- 10 files changed, 292 insertions(+), 589 deletions(-) delete mode 100644 plugins/UserInfoEx/src/commonheaders.cpp (limited to 'plugins/UserInfoEx') diff --git a/plugins/UserInfoEx/src/commonheaders.cpp b/plugins/UserInfoEx/src/commonheaders.cpp deleted file mode 100644 index 21c680affe..0000000000 --- a/plugins/UserInfoEx/src/commonheaders.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/* -UserinfoEx plugin for Miranda IM - -Copyright: -© 2006-2010 DeathAxe, Yasnovidyashii, Merlin, K. Romanov, Kreol - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#include "stdafx.h" - -// global: - -MGLOBAL myGlobals; -pfnDwmIsCompositionEnabled dwmIsCompositionEnabled; - -/** - * Calculates an unique DWORD number from a string. - * It's the same as used in langpack. - * - * @param szStr - string to calculate the hash value for - * @return the unique id for the szStr - **/ - -#if __GNUC__ -#define NOINLINEASM -#endif - -DWORD hashSetting(LPCSTR szStr) -{ -#if defined _M_IX86 && !defined _NUMEGA_BC_FINALCHECK && !defined NOINLINEASM - __asm - { - xor edx,edx - xor eax,eax - mov esi,szStr - mov al,[esi] - dec esi - xor cl,cl - lph_top: //only 4 of 9 instructions in here don't use AL, so optimal pipe use is impossible - xor edx,eax - inc esi - and cl,31 - movzx eax,byte ptr [esi] - add cl,5 - test al,al - rol eax,cl //rol is u-pipe only, but pairable - //rol doesn't touch z-flag - jnz lph_top //5 clock tick loop. not bad. - - xor eax,edx - } -#else - DWORD hash = 0; - int i; - int shift = 0; - for (i = 0; szStr[i]; i++) - { - hash ^= szStr[i] << shift; - if (shift > 24) - { - hash ^= (szStr[i] >> (32 - shift)) & 0x7F; - } - shift = (shift + 5) & 0x1F; - } - return hash; -#endif -} - -// MurmurHash2 -#ifdef _DEBUG -#pragma optimize( "gt", on ) -#endif -unsigned int __fastcall hash_M2(const void * key, unsigned int len) -{ - // 'm' and 'r' are mixing constants generated offline. - // They're not really 'magic', they just happen to work well. - const unsigned int m = 0x5bd1e995; - const int r = 24; - - // Initialize the hash to a 'random' value - unsigned int h = len; - - // Mix 4 bytes at a time into the hash - const unsigned char * data = (const unsigned char *)key; - - while(len >= 4) - { - unsigned int k = *(unsigned int *)data; - - k *= m; - k ^= k >> r; - k *= m; - - h *= m; - h ^= k; - - data += 4; - len -= 4; - } - - // Handle the last few bytes of the input array - switch(len) - { - case 3: h ^= data[2] << 16; - case 2: h ^= data[1] << 8; - case 1: h ^= data[0]; - h *= m; - }; - - // Do a few final mixes of the hash to ensure the last few - // bytes are well-incorporated. - h ^= h >> 13; - h *= m; - h ^= h >> 15; - - return h; -} - -unsigned int hashSettingW_M2(const char * key) -{ - if (key == nullptr) return 0; - const unsigned int len = (unsigned int)mir_wstrlen((const wchar_t*)key); - char* buf = (char*)alloca(len + 1); - for (unsigned i = 0; i <= len ; ++i) - buf[i] = key[i << 1]; - return hash_M2(buf, len); -} - -unsigned int hashSetting_M2(const char * key) -{ - if (key == nullptr) return 0; - const unsigned int len = (unsigned int)mir_strlen((const char*)key); - return hash_M2(key, len); -} - -unsigned int hashSetting_M2(const wchar_t * key) -{ - if (key == nullptr) return 0; - const unsigned int len = (unsigned int)mir_wstrlen((const wchar_t*)key); - return hash_M2(key, len * sizeof(wchar_t)); -} - -#ifdef _DEBUG -#pragma optimize( "", on ) -#endif diff --git a/plugins/UserInfoEx/src/ctrl_contact.cpp b/plugins/UserInfoEx/src/ctrl_contact.cpp index c0ad33eb9c..d8084daaed 100644 --- a/plugins/UserInfoEx/src/ctrl_contact.cpp +++ b/plugins/UserInfoEx/src/ctrl_contact.cpp @@ -1290,7 +1290,7 @@ int CtrlContactAddItemFromDB( CBEXITEM cbi; cbi.pszVal = nullptr; - cbi.dwID = hashSetting(szSettingVal); + cbi.dwID = mir_hashstr(szSettingVal); cbi.wFlags = CBEXIF_CATREADONLY|DB::Setting::GetTStringCtrl(hContact, pszModule, pszModule, pszProto, szSettingVal, &dbv); if (dbv.type >= DBVT_WCHAR) { // no value read from database @@ -1355,7 +1355,7 @@ int CtrlContactAddMyItemsFromDB( i++) { // read value - cbi.dwID = hashSetting(pszSetting); + cbi.dwID = mir_hashstr(pszSetting); cbi.pszVal = dbv.pwszVal; dbv.type = DBVT_DELETED; dbv.pwszVal = nullptr; @@ -1421,7 +1421,7 @@ int CtrlContactWriteItemToDB( cbi.pszVal = szVal; cbi.ccVal = MAXDATASIZE - 4; cbi.iItem = 0; - cbi.dwID = hashSetting(pszSetting); + cbi.dwID = mir_hashstr(pszSetting); if (!CtrlContactWndProc(hCtrl, CBEXM_GETITEM, NULL, (LPARAM)&cbi)) return 1; if (!(cbi.wFlags & CTRLF_CHANGED)) return 0; if (!hContact && !(pszModule = pszProto)) return 1; diff --git a/plugins/UserInfoEx/src/dlg_anniversarylist.cpp b/plugins/UserInfoEx/src/dlg_anniversarylist.cpp index 69dc4dce35..0f8c68c09f 100644 --- a/plugins/UserInfoEx/src/dlg_anniversarylist.cpp +++ b/plugins/UserInfoEx/src/dlg_anniversarylist.cpp @@ -927,17 +927,11 @@ public: INT_PTR DlgAnniversaryListShow(WPARAM, LPARAM) { if (!gpDlg) { - try { - myGlobals.WantAeroAdaption = g_plugin.getByte(SET_PROPSHEET_AEROADAPTION, TRUE); - gpDlg = new CAnnivList(); - } - catch(...) { - delete gpDlg; - gpDlg = nullptr; - } + myGlobals.WantAeroAdaption = g_plugin.getByte(SET_PROPSHEET_AEROADAPTION, TRUE); + gpDlg = new CAnnivList(); } - else - gpDlg->BringToFront(); + else gpDlg->BringToFront(); + return 0; } diff --git a/plugins/UserInfoEx/src/ex_import/classExImContactBase.cpp b/plugins/UserInfoEx/src/ex_import/classExImContactBase.cpp index bd1829e228..717203bab7 100644 --- a/plugins/UserInfoEx/src/ex_import/classExImContactBase.cpp +++ b/plugins/UserInfoEx/src/ex_import/classExImContactBase.cpp @@ -334,13 +334,13 @@ BYTE CExImContactBase::compareUID(DBVARIANT *dbv) } break; case DBVT_ASCIIZ: - hash = hashSetting_M2(dbv->pszVal); + hash = mir_hashstr(dbv->pszVal); case DBVT_WCHAR: - if (!hash) hash = hashSettingW_M2((const char *)dbv->pwszVal); + if (!hash) hash = mir_hashstrW(dbv->pwszVal); case DBVT_UTF8: if (!hash) { LPWSTR tmp = mir_utf8decodeW(dbv->pszVal); - hash = hashSettingW_M2((const char *)tmp); + hash = mir_hashstrW(tmp); mir_free(tmp); } if (hash == _dbvUIDHash) diff --git a/plugins/UserInfoEx/src/ex_import/classExImContactBase.h b/plugins/UserInfoEx/src/ex_import/classExImContactBase.h index 4894d09bae..122b35c6ef 100644 --- a/plugins/UserInfoEx/src/ex_import/classExImContactBase.h +++ b/plugins/UserInfoEx/src/ex_import/classExImContactBase.h @@ -60,13 +60,13 @@ public: __inline void uida(LPCSTR val) { _dbvUID.type = (_dbvUID.pszVal = mir_utf8decodeA(val))? DBVT_ASCIIZ : DBVT_DELETED; - _dbvUIDHash = hashSetting_M2(_dbvUID.pszVal); + _dbvUIDHash = mir_hashstr(_dbvUID.pszVal); } __inline void uidu(LPCSTR val) { _dbvUID.type = (_dbvUID.pszVal = mir_strdup(val))? DBVT_UTF8 : DBVT_DELETED; LPWSTR temp = mir_utf8decodeW(val); - _dbvUIDHash = hashSettingW_M2((const char *)temp); + _dbvUIDHash = mir_hashstrW(temp); mir_free(temp); } diff --git a/plugins/UserInfoEx/src/ex_import/classExImContactXML.cpp b/plugins/UserInfoEx/src/ex_import/classExImContactXML.cpp index d30973d337..c1d0d624cd 100644 --- a/plugins/UserInfoEx/src/ex_import/classExImContactXML.cpp +++ b/plugins/UserInfoEx/src/ex_import/classExImContactXML.cpp @@ -83,7 +83,7 @@ BYTE CExImContactXML::IsContactInfo(LPCSTR pszKey) if (pszKey && *pszKey) { char buf[MAXSETTING]; // convert to hash and make bsearch as it is much faster then working with strings - const DWORD dwHash = hashSetting(_strlwr(mir_strncpy(buf, pszKey, _countof(buf)))); + const DWORD dwHash = mir_hashstr(_strlwr(mir_strncpy(buf, pszKey, _countof(buf)))); return bsearch(&dwHash, dwCiHash, _countof(dwCiHash), sizeof(dwCiHash[0]), (int (*)(const void*, const void*))SortProc) != nullptr; } return FALSE; diff --git a/plugins/UserInfoEx/src/ex_import/svc_ExImXML.cpp b/plugins/UserInfoEx/src/ex_import/svc_ExImXML.cpp index 390af4034f..196daf6230 100644 --- a/plugins/UserInfoEx/src/ex_import/svc_ExImXML.cpp +++ b/plugins/UserInfoEx/src/ex_import/svc_ExImXML.cpp @@ -79,43 +79,40 @@ INT_PTR CALLBACK DlgProc_DataHistory(HWND hDlg, UINT msg, WPARAM wParam, LPARAM * exporting stuff ***********************************************************************************************************/ -/** - * name: Export - * desc: globally accessible function which does the whole export stuff. - * params: hContact - handle to the contact who is to export - * pszFileName - full qualified path to the xml file which is destination for the export process - * return: 0 on success, 1 otherwise - **/ + /** + * name: Export + * desc: globally accessible function which does the whole export stuff. + * params: hContact - handle to the contact who is to export + * pszFileName - full qualified path to the xml file which is destination for the export process + * return: 0 on success, 1 otherwise + **/ int CFileXml::Export(lpExImParam ExImContact, LPCSTR pszFileName) { DB::CEnumList Modules; - DWORD result = (DWORD) DialogBox(g_plugin.getInst(), - MAKEINTRESOURCE(IDD_EXPORT_DATAHISTORY), - nullptr, DlgProc_DataHistory); - if (LOWORD(result) != IDOK) - { + DWORD result = (DWORD)DialogBox(g_plugin.getInst(), + MAKEINTRESOURCE(IDD_EXPORT_DATAHISTORY), + nullptr, DlgProc_DataHistory); + if (LOWORD(result) != IDOK) { return 0; } _wExport = HIWORD(result); // show dialog to enable user to select modules for export if (!(_wExport & EXPORT_DATA) || - !DlgExImModules_SelectModulesToExport(ExImContact, &Modules, nullptr)) - { + !DlgExImModules_SelectModulesToExport(ExImContact, &Modules, nullptr)) { FILE *xmlfile = fopen(pszFileName, "wt"); - if (!xmlfile) - { + if (!xmlfile) { MsgErr(nullptr, LPGENW("Can't create xml file!\n%S"), pszFileName); return 1; } - + SYSTEMTIME now; GetLocalTime(&now); // write xml header raw as it is without using the tinyxml api - fprintf(xmlfile, + fprintf(xmlfile, "%c%c%c<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" "<XMLCard ver=\"" XMLCARD_VERSION "\" ref=\"%04d-%02d-%02d %02d:%02d:%02d\">\n", 0xefU, 0xbbU, 0xbfU, now.wYear, now.wMonth, now.wDay, now.wHour, now.wMinute, now.wSecond @@ -126,7 +123,7 @@ int CFileXml::Export(lpExImParam ExImContact, LPCSTR pszFileName) CExImContactXML vContact(this); // write data - if ( ExImContact->Typ == EXIM_CONTACT) { + if (ExImContact->Typ == EXIM_CONTACT) { // export single contact _hContactToWorkOn = ExImContact->hContact; if (vContact.fromDB(ExImContact->hContact)) { @@ -136,57 +133,45 @@ int CFileXml::Export(lpExImParam ExImContact, LPCSTR pszFileName) else { // other export mode _hContactToWorkOn = INVALID_CONTACT_ID; -#ifdef _DEBUG - LARGE_INTEGER freq, t1, t2; - QueryPerformanceFrequency(&freq); - QueryPerformanceCounter(&t1); -#endif // export owner contact if (ExImContact->Typ == EXIM_ALL && vContact.fromDB(NULL)) { vContact.Export(xmlfile, &Modules); } // loop for all other contact - for (MCONTACT hContact = db_find_first(); hContact != NULL; hContact = db_find_next(hContact)) - { - switch (ExImContact->Typ) - { - case EXIM_ALL: - case EXIM_GROUP: - // dont export meta subcontacts by default - if (!db_mc_isSub(hContact)) { - if (vContact.fromDB(hContact)) { - vContact.Export(xmlfile, &Modules); - } + for (MCONTACT hContact = db_find_first(); hContact != NULL; hContact = db_find_next(hContact)) { + switch (ExImContact->Typ) { + case EXIM_ALL: + case EXIM_GROUP: + // dont export meta subcontacts by default + if (!db_mc_isSub(hContact)) { + if (vContact.fromDB(hContact)) { + vContact.Export(xmlfile, &Modules); } - break; - case EXIM_SUBGROUP: - // dont export meta subcontacts by default and - // export only contact with selectet group name - if (!db_mc_isSub(hContact) && - mir_wstrncmp(ExImContact->ptszName, DB::Setting::GetTString(hContact, "CList", "Group"), mir_wstrlen(ExImContact->ptszName))== 0) - { - if (vContact.fromDB(hContact)) { - vContact.Export(xmlfile, &Modules); - } + } + break; + case EXIM_SUBGROUP: + // dont export meta subcontacts by default and + // export only contact with selectet group name + if (!db_mc_isSub(hContact) && + mir_wstrncmp(ExImContact->ptszName, DB::Setting::GetTString(hContact, "CList", "Group"), mir_wstrlen(ExImContact->ptszName)) == 0) { + if (vContact.fromDB(hContact)) { + vContact.Export(xmlfile, &Modules); } - break; - case EXIM_ACCOUNT: - // export only contact with selectet account name - if (!mir_strncmp(ExImContact->pszName, Proto_GetBaseAccountName(hContact), mir_strlen(ExImContact->pszName))) { - if (vContact.fromDB(hContact)) { - vContact.Export(xmlfile, &Modules); - } + } + break; + case EXIM_ACCOUNT: + // export only contact with selectet account name + if (!mir_strncmp(ExImContact->pszName, Proto_GetBaseAccountName(hContact), mir_strlen(ExImContact->pszName))) { + if (vContact.fromDB(hContact)) { + vContact.Export(xmlfile, &Modules); } - break; + } + break; } } // *end for -#ifdef _DEBUG - QueryPerformanceCounter(&t2); - MsgErr(nullptr, LPGENW("Export took %f ms"), - (long double)(t2.QuadPart - t1.QuadPart) / freq.QuadPart * 1000.); -#endif - }// *end other export mode + } + // *end other export mode // nothing exported? if (cbHeader == ftell(xmlfile)) { @@ -207,15 +192,15 @@ int CFileXml::Export(lpExImParam ExImContact, LPCSTR pszFileName) CFileXml::CFileXml() { - _numContactsTodo = 0; - _numContactsDone = 0; - _numSettingsTodo = 0; - _numSettingsDone = 0; - _numEventsTodo = 0; - _numEventsDone = 0; - _numEventsDuplicated = 0; - _hContactToWorkOn = INVALID_CONTACT_ID; - _wExport = 0; + _numContactsTodo = 0; + _numContactsDone = 0; + _numSettingsTodo = 0; + _numSettingsDone = 0; + _numEventsTodo = 0; + _numEventsDone = 0; + _numEventsDuplicated = 0; + _hContactToWorkOn = INVALID_CONTACT_ID; + _wExport = 0; } /** @@ -258,33 +243,23 @@ int CFileXml::ImportContacts(TiXmlElement* xmlParent) if (_progress.UpdateContact(LPGENW("Contact: %s (%S)"), pszNick, xContact->Attribute("proto"))) { int result = vContact.LoadXmlElemnt(xContact); switch (result) { - case ERROR_OK: - // init contact class and import if matches the user desires - if (_hContactToWorkOn == INVALID_CONTACT_ID || vContact.handle() == _hContactToWorkOn) { - result = vContact.Import(_hContactToWorkOn != INVALID_CONTACT_ID); - switch (result) { - case ERROR_OK: - _numContactsDone++; - break; - case ERROR_ABORTED: - if (pszNick) mir_free(pszNick); - return ERROR_ABORTED; -#ifdef _DEBUG - default: - MsgErr(nullptr, LPGENW("Importing %s caused error %d"), pszNick, result); - break; -#endif - } + case ERROR_OK: + // init contact class and import if matches the user desires + if (_hContactToWorkOn == INVALID_CONTACT_ID || vContact.handle() == _hContactToWorkOn) { + result = vContact.Import(_hContactToWorkOn != INVALID_CONTACT_ID); + switch (result) { + case ERROR_OK: + _numContactsDone++; + break; + case ERROR_ABORTED: + if (pszNick) mir_free(pszNick); + return ERROR_ABORTED; } - break; - case ERROR_ABORTED: - if (pszNick) mir_free(pszNick); - return ERROR_ABORTED; -#ifdef _DEBUG - default: - MsgErr(nullptr, LPGENW("Loading contact %s from xml failed with error %d"), pszNick, result); - break; -#endif + } + break; + case ERROR_ABORTED: + if (pszNick) mir_free(pszNick); + return ERROR_ABORTED; } } if (pszNick) mir_free(pszNick); @@ -293,15 +268,11 @@ int CFileXml::ImportContacts(TiXmlElement* xmlParent) else if (_hContactToWorkOn == INVALID_CONTACT_ID && !mir_strcmpi(xContact->Value(), XKEY_OWNER) && (vContact = xContact)) { int result = vContact.Import(); switch (result) { - case ERROR_OK: - _numContactsDone++; - break; - case ERROR_ABORTED: - return ERROR_ABORTED; -#ifdef _DEBUG - default: - MsgErr(nullptr, LPGENW("Importing Owner caused error %d"), result); -#endif + case ERROR_OK: + _numContactsDone++; + break; + case ERROR_ABORTED: + return ERROR_ABORTED; } } } @@ -316,18 +287,13 @@ int CFileXml::ImportContacts(TiXmlElement* xmlParent) **/ DWORD CFileXml::CountContacts(TiXmlElement* xmlParent) { - try { - DWORD dwCount = 0; - // count contacts in file for progress bar - for (TiXmlNode *xContact = xmlParent->FirstChild(); xContact != nullptr; xContact = xContact->NextSibling()) - if (!mir_strcmpi(xContact->Value(), XKEY_CONTACT) || !mir_strcmpi(xContact->Value(), XKEY_OWNER)) - dwCount += CountContacts(xContact->ToElement()) + 1; + DWORD dwCount = 0; + // count contacts in file for progress bar + for (TiXmlNode *xContact = xmlParent->FirstChild(); xContact != nullptr; xContact = xContact->NextSibling()) + if (!mir_strcmpi(xContact->Value(), XKEY_CONTACT) || !mir_strcmpi(xContact->Value(), XKEY_OWNER)) + dwCount += CountContacts(xContact->ToElement()) + 1; - return dwCount; - } - catch(...) { - return 0; - } + return dwCount; } /** @@ -340,77 +306,72 @@ DWORD CFileXml::CountContacts(TiXmlElement* xmlParent) **/ int CFileXml::Import(MCONTACT hContact, LPCSTR pszFileName) { - try { - _hContactToWorkOn = hContact; - // load xml file - TiXmlDocument doc; - if (!doc.LoadFile(pszFileName)) { - MsgErr(nullptr, LPGENW("Parser is unable to load XMLCard \"%s\"\nError: %d\nDescription: %s"), - pszFileName, doc.ErrorID(), doc.Error()); - return 1; - } - // is xmlfile a XMLCard ? - TiXmlElement *xmlCard = doc.FirstChildElement("XMLCard"); - if (xmlCard == nullptr) { - MsgErr(nullptr, LPGENW("The selected file is no valid XMLCard")); - return 1; + _hContactToWorkOn = hContact; + // load xml file + TiXmlDocument doc; + if (!doc.LoadFile(pszFileName)) { + MsgErr(nullptr, LPGENW("Parser is unable to load XMLCard \"%s\"\nError: %d\nDescription: %s"), + pszFileName, doc.ErrorID(), doc.Error()); + return 1; + } + // is xmlfile a XMLCard ? + TiXmlElement *xmlCard = doc.FirstChildElement("XMLCard"); + if (xmlCard == nullptr) { + MsgErr(nullptr, LPGENW("The selected file is no valid XMLCard")); + return 1; + } + // check version + if (mir_strcmp(xmlCard->Attribute("ver"), XMLCARD_VERSION)) { + MsgErr(nullptr, LPGENW("The version of the XMLCard is not supported by UserInfoEx")); + return 1; + } + + // is owner contact to import ? + if (_hContactToWorkOn == NULL) { + int ret; + + // disable database safty mode to speed up the operation + db_set_safety_mode(0); + // import owner contact + ret = ImportOwner(xmlCard->FirstChildElement(XKEY_OWNER)); + // as soon as possible enable safty mode again! + db_set_safety_mode(1); + + if (!ret) { + MsgBox(nullptr, MB_ICONINFORMATION, + LPGENW("Complete"), + LPGENW("Import complete"), + LPGENW("Owner contact successfully imported.")); + return 0; } - // check version - if (mir_strcmp(xmlCard->Attribute("ver"), XMLCARD_VERSION)) { - MsgErr(nullptr, LPGENW("The version of the XMLCard is not supported by UserInfoEx")); + else { + MsgErr(nullptr, LPGENW("Selected XMLCard does not contain an owner contact!")); return 1; } - - // is owner contact to import ? - if (_hContactToWorkOn == NULL) { - int ret; - + } + else { + // count contacts in file for progress bar + _numContactsTodo = CountContacts(xmlCard); + if (_numContactsTodo > 0) { + _progress.SetContactCount(_numContactsTodo); // disable database safty mode to speed up the operation db_set_safety_mode(0); - // import owner contact - ret = ImportOwner(xmlCard->FirstChildElement(XKEY_OWNER)); + // import the contacts + ImportContacts(xmlCard); // as soon as possible enable safty mode again! db_set_safety_mode(1); - - if (!ret) { - MsgBox(nullptr, MB_ICONINFORMATION, - LPGENW("Complete"), - LPGENW("Import complete"), - LPGENW("Owner contact successfully imported.")); - return 0; - } else { - MsgErr(nullptr, LPGENW("Selected XMLCard does not contain an owner contact!")); - return 1; - } - } - else { - // count contacts in file for progress bar - _numContactsTodo = CountContacts(xmlCard); - if (_numContactsTodo > 0) { - _progress.SetContactCount(_numContactsTodo); - // disable database safty mode to speed up the operation - db_set_safety_mode(0); - // import the contacts - ImportContacts(xmlCard); - // as soon as possible enable safty mode again! - db_set_safety_mode(1); - } - // finally hide the progress dialog - _progress.Hide(); - - // show results - MsgBox(nullptr, MB_ICONINFORMATION, LPGENW("Import complete"), LPGENW("Some basic statistics"), - LPGENW("added contacts: %u / %u\nadded settings: %u / %u\nadded events %u / %u\nduplicated events: %u"), - _numContactsDone, _numContactsTodo, - _numSettingsDone, _numSettingsTodo, - _numEventsDone, _numEventsTodo, - _numEventsDuplicated); - } - return 0; - } - catch(...) { - MsgErr(nullptr, LPGENW("FATAL: An exception was thrown while importing contacts from xmlCard!")); - return 1; + // finally hide the progress dialog + _progress.Hide(); + + // show results + MsgBox(nullptr, MB_ICONINFORMATION, LPGENW("Import complete"), LPGENW("Some basic statistics"), + LPGENW("added contacts: %u / %u\nadded settings: %u / %u\nadded events %u / %u\nduplicated events: %u"), + _numContactsDone, _numContactsTodo, + _numSettingsDone, _numSettingsTodo, + _numEventsDone, _numEventsTodo, + _numEventsDuplicated); + } + return 0; } diff --git a/plugins/UserInfoEx/src/init.cpp b/plugins/UserInfoEx/src/init.cpp index c71c1c64e8..2259a892b0 100644 --- a/plugins/UserInfoEx/src/init.cpp +++ b/plugins/UserInfoEx/src/init.cpp @@ -24,6 +24,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. CMPlugin g_plugin; HMODULE hDwmApi; +MGLOBAL myGlobals; +pfnDwmIsCompositionEnabled dwmIsCompositionEnabled; + ///////////////////////////////////////////////////////////////////////////////////////// static PLUGININFOEX pluginInfoEx = diff --git a/plugins/UserInfoEx/src/stdafx.h b/plugins/UserInfoEx/src/stdafx.h index 095017dd57..c15c141fe9 100644 --- a/plugins/UserInfoEx/src/stdafx.h +++ b/plugins/UserInfoEx/src/stdafx.h @@ -104,10 +104,6 @@ using namespace std; #define GetUserData(p) GetWindowLongPtr((p), GWLP_USERDATA) #define SetUserData(p, l) SetWindowLongPtr((p), GWLP_USERDATA, (LONG_PTR) (l)) -unsigned int hashSetting_M2(const wchar_t * key); //new Murma2 hash -unsigned int hashSetting_M2(const char * key); //new Murma2 hash -unsigned int hashSettingW_M2(const char * key); //new Murma2 hash - #include "resource.h" #include "version.h" #include "../IconPacks/default/src/icons.h" @@ -209,8 +205,6 @@ extern struct CountryListEntry *countries; * UserInfoEx common used functions ***********************************************************************************************************/ -DWORD hashSetting(LPCSTR szStr); //old miranda hash - static FORCEINLINE BOOL IsProtoOnline(LPSTR pszProto) { return pszProto && pszProto[0] && Proto_GetStatus(pszProto) >= ID_STATUS_ONLINE; diff --git a/plugins/UserInfoEx/src/svc_refreshci.cpp b/plugins/UserInfoEx/src/svc_refreshci.cpp index 6f3d9473ea..6f07273138 100644 --- a/plugins/UserInfoEx/src/svc_refreshci.cpp +++ b/plugins/UserInfoEx/src/svc_refreshci.cpp @@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define HM_PROTOACK (WM_USER+100) -typedef INT_PTR (*PUpdCallback) (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, void *UserData); +typedef INT_PTR(*PUpdCallback) (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, void *UserData); /*********************************************************************************************************** * class CUpdProgress @@ -51,36 +51,30 @@ protected: * * @return This method returns 0. **/ - static INT_PTR CALLBACK DefWndProc(CUpdProgress *pProgress, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + static INT_PTR CALLBACK DefWndProc(CUpdProgress *pProgress, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - __try - { - if (PtrIsValid(pProgress)) - { - switch (uMsg) - { + __try { + if (PtrIsValid(pProgress)) { + switch (uMsg) { case UM_POPUPACTION: case WM_COMMAND: { - if (wParam == MAKEWORD(IDSKIP, BN_CLICKED)) - { + if (wParam == MAKEWORD(IDSKIP, BN_CLICKED)) { pProgress->Destroy(); } - else - if (wParam == MAKEWORD(IDCANCEL, BN_CLICKED)) - { - pProgress->_bIsCanceled = TRUE; - } + else + if (wParam == MAKEWORD(IDCANCEL, BN_CLICKED)) { + pProgress->_bIsCanceled = TRUE; + } } } - if (PtrIsValid(pProgress->_pFnCallBack)) - { + if (PtrIsValid(pProgress->_pFnCallBack)) { pProgress->_pFnCallBack(hWnd, uMsg, wParam, lParam, pProgress->_pData); } } } - __except(GetExceptionCode()==EXCEPTION_ACCESS_VIOLATION ? - EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) + __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? + EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { // code to handle exception puts("Exception Occurred"); } @@ -89,10 +83,10 @@ protected: public: - virtual HWND Create (LPCTSTR szTitle, PUpdCallback pFnCallBack) = 0; - virtual void Destroy (void) {}; - virtual void SetTitle (LPCTSTR szText) = 0; - virtual void SetText (LPCTSTR szText) = 0; + virtual HWND Create(LPCTSTR szTitle, PUpdCallback pFnCallBack) = 0; + virtual void Destroy(void) {}; + virtual void SetTitle(LPCTSTR szText) = 0; + virtual void SetText(LPCTSTR szText) = 0; BYTE IsVisible() const { @@ -113,15 +107,13 @@ public: **/ void SetTitleParam(LPCTSTR szText, ...) { - if (szText) - { + if (szText) { wchar_t buf[MAXDATASIZE]; va_list vl; - + va_start(vl, szText); - if (mir_vsnwprintf(buf, _countof(buf), szText, vl) != -1) - { - SetTitle(buf); + if (mir_vsnwprintf(buf, _countof(buf), szText, vl) != -1) { + SetTitle(buf); } va_end(vl); } @@ -130,7 +122,7 @@ public: /** * This method is used to set the popups or dialogs message text. * It takes text with parameters as sprintf does. If bbcodes are - * disabled this method automatically deletes them from the text. + * disabled this method automatically deletes them from the text. * * @param szText - the text to display. Can contain formats like * sprintf does. @@ -141,47 +133,39 @@ public: **/ void SetTextParam(LPCTSTR szText, ...) { - if (szText) - { + if (szText) { INT_PTR cch = mir_wstrlen(szText); - LPTSTR fmt = (LPTSTR) mir_alloc((cch + 1) * sizeof(wchar_t)); - - if (fmt) - { + LPTSTR fmt = (LPTSTR)mir_alloc((cch + 1) * sizeof(wchar_t)); + + if (fmt) { wchar_t buf[MAXDATASIZE]; va_list vl; mir_wstrcpy(fmt, szText); // delete bbcodes - if (!_bBBCode) - { + if (!_bBBCode) { LPTSTR s, e; - for (s = fmt, e = fmt + cch; s[0] != 0; s++) - { - if (s[0] == '[') - { + for (s = fmt, e = fmt + cch; s[0] != 0; s++) { + if (s[0] == '[') { // leading bbcode tag (e.g.: [b], [u], [i]) - if ((s[1] == 'b' || s[1] == 'u' || s[1] == 'i') && s[2] == ']') - { + if ((s[1] == 'b' || s[1] == 'u' || s[1] == 'i') && s[2] == ']') { memmove(s, s + 3, (e - s - 2) * sizeof(wchar_t)); e -= 3; } // ending bbcode tag (e.g.: [/b], [/u], [/i]) - else if (s[1] == '/' && (s[2] == 'b' || s[2] == 'u' || s[2] == 'i') && s[3] == ']') - { + else if (s[1] == '/' && (s[2] == 'b' || s[2] == 'u' || s[2] == 'i') && s[3] == ']') { memmove(s, s + 4, (e - s - 3) * sizeof(wchar_t)); e -= 4; } } } } - + va_start(vl, szText); - if (mir_vsnwprintf(buf, _countof(buf), fmt, vl) != -1) - { - SetText(buf); + if (mir_vsnwprintf(buf, _countof(buf), fmt, vl) != -1) { + SetText(buf); } va_end(vl); mir_free(fmt); @@ -231,7 +215,7 @@ class CDlgUpdProgress : public CUpdProgress * * **/ - static INT_PTR CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + static INT_PTR CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: @@ -242,11 +226,11 @@ class CDlgUpdProgress : public CUpdProgress { ICO_BTN_CANCEL, BM_SETIMAGE, IDCANCEL } }; IcoLib_SetCtrlIcons(hWnd, idIcon, g_plugin.getByte(SET_ICONS_BUTTONS, 1) ? 2 : 1); - - SendDlgItemMessage(hWnd, IDCANCEL, BUTTONTRANSLATE, NULL, NULL); - SendDlgItemMessage(hWnd, IDSKIP, BUTTONTRANSLATE, NULL, NULL); + + SendDlgItemMessage(hWnd, IDCANCEL, BUTTONTRANSLATE, NULL, NULL); + SendDlgItemMessage(hWnd, IDSKIP, BUTTONTRANSLATE, NULL, NULL); SetUserData(hWnd, lParam); - + TranslateDialogDefault(hWnd); } return TRUE; @@ -260,7 +244,7 @@ class CDlgUpdProgress : public CUpdProgress } return FALSE; } - return CUpdProgress::DefWndProc((CUpdProgress *) GetUserData(hWnd), hWnd, uMsg, wParam, lParam); + return CUpdProgress::DefWndProc((CUpdProgress *)GetUserData(hWnd), hWnd, uMsg, wParam, lParam); } public: @@ -281,13 +265,12 @@ public: virtual HWND Create(LPCTSTR szTitle, PUpdCallback pFnCallBack) { _pFnCallBack = pFnCallBack; - _hWnd = CreateDialogParam(g_plugin.getInst(), - MAKEINTRESOURCE(IDD_REFRESHDETAILS), - nullptr, - CDlgUpdProgress::WndProc, - (LPARAM) this); - if (_hWnd) - { + _hWnd = CreateDialogParam(g_plugin.getInst(), + MAKEINTRESOURCE(IDD_REFRESHDETAILS), + nullptr, + CDlgUpdProgress::WndProc, + (LPARAM)this); + if (_hWnd) { SetTitle(szTitle); ShowWindow(_hWnd, SW_SHOW); } @@ -300,8 +283,7 @@ public: **/ virtual void Destroy() { - if (_hWnd) - { + if (_hWnd) { SetUserData(_hWnd, NULL); EndDialog(_hWnd, IDOK); _hWnd = nullptr; @@ -343,16 +325,14 @@ class CPopupUpdProgress : public CUpdProgress **/ void UpdateText() { - if (_szText) - { + if (_szText) { INT_PTR cb = mir_wstrlen(_szText) + 8; - LPTSTR pb = (LPTSTR) mir_alloc(cb * sizeof(wchar_t)); + LPTSTR pb = (LPTSTR)mir_alloc(cb * sizeof(wchar_t)); - if (pb) - { + if (pb) { mir_wstrcpy(pb, _szText); - SendMessage(_hWnd, UM_CHANGEPOPUP, CPT_TITLET, (LPARAM) pb); + SendMessage(_hWnd, UM_CHANGEPOPUP, CPT_TITLET, (LPARAM)pb); } } } @@ -364,18 +344,17 @@ class CPopupUpdProgress : public CUpdProgress * if passed to the default windows procedure. * **/ - static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // Filter out messages, which must not be passed to default windows procedure or even // to the callback function! - switch (uMsg) - { + switch (uMsg) { case UM_INITPOPUP: case UM_CHANGEPOPUP: case UM_FREEPLUGINDATA: break; default: - CUpdProgress::DefWndProc((CUpdProgress *) PUGetPluginData(hWnd), hWnd, uMsg, wParam, lParam); + CUpdProgress::DefWndProc((CUpdProgress *)PUGetPluginData(hWnd), hWnd, uMsg, wParam, lParam); } return DefWindowProc(hWnd, uMsg, wParam, lParam); } @@ -426,11 +405,11 @@ public: // dummy text _szText = mir_wstrdup(szTitle); mir_wstrcpy(pd.lptzContactName, _szText); - + mir_wstrcpy(pd.lptzText, L" "); - + _pFnCallBack = pFnCallBack; - _hWnd = (HWND) CallService(MS_POPUP_ADDPOPUPT, (WPARAM) &pd, APF_RETURN_HWND|APF_NEWDATA); + _hWnd = (HWND)CallService(MS_POPUP_ADDPOPUPT, (WPARAM)&pd, APF_RETURN_HWND | APF_NEWDATA); return _hWnd; } @@ -440,8 +419,7 @@ public: **/ virtual void Destroy() { - if (_hWnd) - { + if (_hWnd) { PUDeletePopup(_hWnd); _hWnd = nullptr; } @@ -465,7 +443,7 @@ public: **/ virtual void SetText(LPCTSTR szText) { - SendMessage(_hWnd, UM_CHANGEPOPUP, CPT_TEXTT, (LPARAM) mir_wstrdup(szText)); + SendMessage(_hWnd, UM_CHANGEPOPUP, CPT_TEXTT, (LPARAM)mir_wstrdup(szText)); } }; @@ -497,25 +475,21 @@ class CContactUpdater : public CContactQueue * * @return This method returns 0. **/ - static int DlgProc(HWND, UINT uMsg, WPARAM wParam, LPARAM, CContactUpdater* u) + static int DlgProc(HWND, UINT uMsg, WPARAM wParam, LPARAM, CContactUpdater* u) { - switch (uMsg) - { + switch (uMsg) { - /** - * User has clicked on the skip or cancel button. - **/ + /** + * User has clicked on the skip or cancel button. + **/ case UM_POPUPACTION: - case WM_COMMAND: + case WM_COMMAND: { - if (PtrIsValid(u)) - { - switch (LOWORD(wParam)) - { + if (PtrIsValid(u)) { + switch (LOWORD(wParam)) { case IDCANCEL: { - if (HIWORD(wParam) == BN_CLICKED) - { + if (HIWORD(wParam) == BN_CLICKED) { u->Cancel(); } } @@ -534,7 +508,7 @@ class CContactUpdater : public CContactQueue * the time is shortend to 4s. * * @param wParam - not used - * @param ack - pointer to an ACKDATA structure containing all + * @param ack - pointer to an ACKDATA structure containing all * data for the acknoledgement. * * @return nothing @@ -547,7 +521,7 @@ class CContactUpdater : public CContactQueue _nContactAcks = (INT_PTR)ack->hProcess; _hContactAcks = (PBYTE)mir_calloc(sizeof(BYTE) * (INT_PTR)ack->hProcess); } - + if (ack->result == ACKRESULT_SUCCESS || ack->result == ACKRESULT_FAILED) _hContactAcks[ack->lParam] = 1; @@ -569,11 +543,10 @@ class CContactUpdater : public CContactQueue * * @return nothing **/ - virtual void OnEmpty() + virtual void OnEmpty() { // This was the last contact, so destroy the progress window. - if (_hProtoAckEvent) - { + if (_hProtoAckEvent) { UnhookEvent(_hProtoAckEvent); _hProtoAckEvent = nullptr; } @@ -584,8 +557,7 @@ class CContactUpdater : public CContactQueue _hContact = NULL; // close progress bar - if (_pProgress) - { + if (_pProgress) { _pProgress->Destroy(); delete _pProgress; @@ -606,66 +578,44 @@ class CContactUpdater : public CContactQueue * * @return nothing **/ + virtual void Callback(MCONTACT hContact, PVOID) { - LPSTR pszProto = Proto_GetBaseAccountName(hContact); + LPSTR pszProto = Proto_GetBaseAccountName(hContact); - if (pszProto && pszProto[0]) - { + if (pszProto && pszProto[0]) { MIR_FREE(_hContactAcks); _nContactAcks = 0; _hContact = hContact; if (!_hProtoAckEvent) - { - _hProtoAckEvent = (HANDLE) ThisHookEvent(ME_PROTO_ACK, (EVENTHOOK) &CContactUpdater::OnProtoAck); - } + _hProtoAckEvent = (HANDLE)ThisHookEvent(ME_PROTO_ACK, (EVENTHOOK)&CContactUpdater::OnProtoAck); if (_pProgress) - { - _pProgress->SetTextParam(TranslateT("[b]%s (%S)...[/b]\n%d Contacts remaining"), - Clist_GetContactDisplayName(_hContact), pszProto, Size()); - } + _pProgress->SetTextParam(TranslateT("[b]%s (%S)...[/b]\n%d Contacts remaining"), Clist_GetContactDisplayName(_hContact), pszProto, Size()); + if (IsProtoOnline(pszProto)) - { - int i; - for (i = 0; i < 3 && ProtoChainSend(hContact, PSS_GETINFO, 0, 0); i++) - { + for (int i = 0; i < 3 && ProtoChainSend(hContact, PSS_GETINFO, 0, 0); i++) Sleep(3000); - } - } } } public: - - /** - * This is the default constructor - * - **/ CContactUpdater() : CContactQueue() { - _hContactAcks = nullptr; - _nContactAcks = 0; - _hContact = NULL; - _pProgress = nullptr; - _hProtoAckEvent = nullptr; + _hContactAcks = nullptr; + _nContactAcks = 0; + _hContact = NULL; + _pProgress = nullptr; + _hProtoAckEvent = nullptr; } - /** - * - * - **/ ~CContactUpdater() { RemoveAll(); OnEmpty(); } - /** - * - * - **/ BOOL QueueAddRefreshContact(MCONTACT hContact, int iWait) { LPSTR pszProto = Proto_GetBaseAccountName(hContact); @@ -676,10 +626,6 @@ public: return 0; } - /** - * - * - **/ void RefreshAll() { int iWait = 100; @@ -688,18 +634,15 @@ public: if (QueueAddRefreshContact(hContact, iWait)) iWait += 5000; - if (Size() && !_pProgress) - { - if (ServiceExists(MS_POPUP_CHANGETEXTT) && g_plugin.getByte("PopupProgress", FALSE)) - { + if (Size() && !_pProgress) { + if (ServiceExists(MS_POPUP_CHANGETEXTT) && g_plugin.getByte("PopupProgress", FALSE)) { _pProgress = new CPopupUpdProgress(this); } - else - { + else { _pProgress = new CDlgUpdProgress(this); } - _pProgress->Create(TranslateT("Refresh contact details"), (PUpdCallback) CContactUpdater::DlgProc); + _pProgress->Create(TranslateT("Refresh contact details"), (PUpdCallback)CContactUpdater::DlgProc); _pProgress->SetText(TranslateT("Preparing...")); } @@ -708,10 +651,6 @@ public: Menu_ModifyItem(hMenuItemRefresh, LPGENW("Abort Refreshing Contact Details"), IcoLib_GetIcon(ICO_BTN_CANCEL)); } - /** - * - * - **/ void Cancel() { RemoveAll(); @@ -725,14 +664,15 @@ static CContactUpdater *ContactUpdater = nullptr; * common helper functions ***********************************************************************************************************/ -/** - * This function checks, whether at least one protocol is online! - * - * @param none - * - * @retval TRUE - At least one protocol is online. - * @retval FALSE - All protocols are offline. - **/ + /** + * This function checks, whether at least one protocol is online! + * + * @param none + * + * @retval TRUE - At least one protocol is online. + * @retval FALSE - All protocols are offline. + **/ + static BOOL IsMirandaOnline() { for (auto &pa : Accounts()) @@ -746,47 +686,35 @@ static BOOL IsMirandaOnline() * services ***********************************************************************************************************/ -/** - * This is the service function being called by MS_USERINFO_REFRESH. - * It adds each contact, whose protocol is online, to the queue of contacts to refresh. - * The queue is running a separate thread, which is responsible for requesting the contact information - * one after another with a certain time to wait in between. - * - * @param wParam - not used - * @param lParam - not used - * - * @return This service function always returns 0. - **/ + /** + * This is the service function being called by MS_USERINFO_REFRESH. + * It adds each contact, whose protocol is online, to the queue of contacts to refresh. + * The queue is running a separate thread, which is responsible for requesting the contact information + * one after another with a certain time to wait in between. + * + * @param wParam - not used + * @param lParam - not used + * + * @return This service function always returns 0. + **/ + static INT_PTR RefreshService(WPARAM, LPARAM) { - try - { - if (IsMirandaOnline()) - { - if (!ContactUpdater) - { - ContactUpdater = new CContactUpdater(); - } - - if (ContactUpdater->Size() == 0) - { - ContactUpdater->RefreshAll(); - } - else if (IDYES == MsgBox(nullptr, MB_YESNO|MB_ICON_QUESTION, LPGENW("Refresh contact details"), nullptr, - LPGENW("Do you want to cancel the current refresh procedure?"))) - { - ContactUpdater->Cancel(); - } - } - else - { - MsgErr(nullptr, LPGENW("Miranda must be online for refreshing contact information!")); - } + if (!IsMirandaOnline()) { + MsgErr(nullptr, LPGENW("Miranda must be online for refreshing contact information!")); + return 0; } - catch(...) - { - MsgErr(nullptr, LPGENW("The function caused an exception!")); + + if (!ContactUpdater) + ContactUpdater = new CContactUpdater(); + + if (ContactUpdater->Size() == 0) + ContactUpdater->RefreshAll(); + else if (IDYES == MsgBox(nullptr, MB_YESNO | MB_ICON_QUESTION, LPGENW("Refresh contact details"), nullptr, + LPGENW("Do you want to cancel the current refresh procedure?"))) { + ContactUpdater->Cancel(); } + return 0; } @@ -794,39 +722,22 @@ static INT_PTR RefreshService(WPARAM, LPARAM) * events ***********************************************************************************************************/ -/** - * - * - **/ static int OnContactAdded(WPARAM hContact, LPARAM) { - try - { - DWORD dwStmp = db_get_dw(hContact, USERINFO, SET_CONTACT_ADDEDTIME, 0); - if (!dwStmp) - { - MTime mt; - - mt.GetLocalTime(); - mt.DBWriteStamp(hContact, USERINFO, SET_CONTACT_ADDEDTIME); - - // create updater, if not yet exists - if (!ContactUpdater) - { - ContactUpdater = new CContactUpdater(); - } - - // add to the end of the queue - ContactUpdater->AddIfDontHave( - (ContactUpdater->Size() > 0) - ? max(ContactUpdater->Get(ContactUpdater->Size() - 1)->check_time + 15000, 4000) - : 4000, hContact); - } - } - catch(...) - { - MsgErr(nullptr, LPGENW("The function caused an exception!")); + DWORD dwStmp = db_get_dw(hContact, USERINFO, SET_CONTACT_ADDEDTIME, 0); + if (!dwStmp) { + MTime mt; + mt.GetLocalTime(); + mt.DBWriteStamp(hContact, USERINFO, SET_CONTACT_ADDEDTIME); + + // create updater, if not yet exists + if (!ContactUpdater) + ContactUpdater = new CContactUpdater(); + + // add to the end of the queue + ContactUpdater->AddIfDontHave((ContactUpdater->Size() > 0) ? max(ContactUpdater->Get(ContactUpdater->Size() - 1)->check_time + 15000, 4000) : 4000, hContact); } + return 0; } @@ -839,6 +750,7 @@ static int OnContactAdded(WPARAM hContact, LPARAM) * * @return This function always returns 0. **/ + static int OnPreShutdown(WPARAM, LPARAM) { if (ContactUpdater) { @@ -853,9 +765,6 @@ static int OnPreShutdown(WPARAM, LPARAM) * initialization ***********************************************************************************************************/ -/** - * This function initially loads the module upon startup. - **/ void SvcRefreshContactInfoLoadModule(void) { CreateServiceFunction(MS_USERINFO_REFRESH, RefreshService); -- cgit v1.2.3