From 467eb738e716c92abc1232c3f81c77c4c9098415 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 19 Dec 2013 19:30:14 +0000 Subject: total dejunkification of Contacts+: - Unicode; - own utf8 engine removed; - version bump git-svn-id: http://svn.miranda-ng.org/main/trunk@7288 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/ContactsPlus/contacts_10.vcxproj | 8 +- plugins/ContactsPlus/contacts_11.vcxproj | 8 +- plugins/ContactsPlus/contacts_12.vcxproj | 8 +- plugins/ContactsPlus/src/Version.h | 4 +- plugins/ContactsPlus/src/main.cpp | 144 +++-- plugins/ContactsPlus/src/receive.cpp | 273 ++++----- plugins/ContactsPlus/src/receive.h | 40 +- plugins/ContactsPlus/src/send.cpp | 919 +++++++++++++++---------------- plugins/ContactsPlus/src/send.h | 11 +- plugins/ContactsPlus/src/utils.cpp | 674 +++-------------------- plugins/ContactsPlus/src/utils.h | 37 +- 11 files changed, 771 insertions(+), 1355 deletions(-) (limited to 'plugins/ContactsPlus') diff --git a/plugins/ContactsPlus/contacts_10.vcxproj b/plugins/ContactsPlus/contacts_10.vcxproj index fbd45ff691..8c25dc7604 100644 --- a/plugins/ContactsPlus/contacts_10.vcxproj +++ b/plugins/ContactsPlus/contacts_10.vcxproj @@ -25,20 +25,20 @@ DynamicLibrary - MultiByte + Unicode DynamicLibrary - MultiByte + Unicode DynamicLibrary - MultiByte + Unicode true DynamicLibrary - MultiByte + Unicode true diff --git a/plugins/ContactsPlus/contacts_11.vcxproj b/plugins/ContactsPlus/contacts_11.vcxproj index 50929699d8..a795dc115d 100644 --- a/plugins/ContactsPlus/contacts_11.vcxproj +++ b/plugins/ContactsPlus/contacts_11.vcxproj @@ -25,23 +25,23 @@ DynamicLibrary - MultiByte + Unicode v110_xp DynamicLibrary - MultiByte + Unicode v110_xp DynamicLibrary - MultiByte + Unicode true v110_xp DynamicLibrary - MultiByte + Unicode true v110_xp diff --git a/plugins/ContactsPlus/contacts_12.vcxproj b/plugins/ContactsPlus/contacts_12.vcxproj index c9d4371c6b..765874d4f2 100644 --- a/plugins/ContactsPlus/contacts_12.vcxproj +++ b/plugins/ContactsPlus/contacts_12.vcxproj @@ -25,23 +25,23 @@ DynamicLibrary - MultiByte + Unicode v120_xp DynamicLibrary - MultiByte + Unicode v120_xp DynamicLibrary - MultiByte + Unicode true v120_xp DynamicLibrary - MultiByte + Unicode true v120_xp diff --git a/plugins/ContactsPlus/src/Version.h b/plugins/ContactsPlus/src/Version.h index f76c68b170..9c1160df62 100644 --- a/plugins/ContactsPlus/src/Version.h +++ b/plugins/ContactsPlus/src/Version.h @@ -1,6 +1,6 @@ #define __MAJOR_VERSION 1 -#define __MINOR_VERSION 5 -#define __RELEASE_NUM 2 +#define __MINOR_VERSION 6 +#define __RELEASE_NUM 0 #define __BUILD_NUM 0 #define __FILEVERSION_STRING __MAJOR_VERSION,__MINOR_VERSION,__RELEASE_NUM,__BUILD_NUM diff --git a/plugins/ContactsPlus/src/main.cpp b/plugins/ContactsPlus/src/main.cpp index 615b126000..4590e10d12 100644 --- a/plugins/ContactsPlus/src/main.cpp +++ b/plugins/ContactsPlus/src/main.cpp @@ -48,49 +48,46 @@ PLUGININFOEX pluginInfo = { __AUTHORWEB, UNICODE_AWARE, // {0324785E-74CE-4600-B781-851773B3EFC5} - {0x0324785E, 0x74CE, 0x4600, {0xB7, 0x81, 0x85, 0x17, 0x73, 0xB3, 0xEF, 0xC5}} + { 0x0324785E, 0x74CE, 0x4600, { 0xB7, 0x81, 0x85, 0x17, 0x73, 0xB3, 0xEF, 0xC5 } } }; BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { - hInst = hinstDLL; - return TRUE; + hInst = hinstDLL; + return TRUE; } static int HookDBEventAdded(WPARAM wParam, LPARAM lParam) { - HANDLE hContact = (HANDLE)wParam; - HANDLE hDbEvent = (HANDLE)lParam; - //process the event - DBEVENTINFO dbe = { sizeof(dbe) }; - db_event_get(hDbEvent, &dbe); - //check if we should process the event - if (dbe.flags & (DBEF_SENT|DBEF_READ) || dbe.eventType != EVENTTYPE_CONTACTS) return 0; - //get event contents - dbe.cbBlob = db_event_getBlobSize(hDbEvent); - if (dbe.cbBlob != -1) - dbe.pBlob = (PBYTE)_alloca(dbe.cbBlob); - db_event_get(hDbEvent, &dbe); - //play received sound - SkinPlaySound("RecvContacts"); - { //add event to the contact list - CLISTEVENT cle = {0}; - TCHAR caToolTip[128]; - - cle.cbSize = sizeof(cle); - cle.hContact = hContact; - cle.hDbEvent = hDbEvent; - cle.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_CONTACTS)); - cle.pszService = MS_CONTACTS_RECEIVE; - - WCHAR tmp[MAX_PATH]; - mir_sntprintf(caToolTip, SIZEOF(caToolTip), "%s %s", SRCTranslateT("Contacts received from", tmp), (TCHAR*)GetContactDisplayNameT(hContact)); - - cle.ptszTooltip = caToolTip; - cle.flags |= CLEF_UNICODE; - CallService(MS_CLIST_ADDEVENT, 0, (LPARAM)&cle); - } - return 0; //continue processing by other hooks + HANDLE hContact = (HANDLE)wParam; + HANDLE hDbEvent = (HANDLE)lParam; + //process the event + DBEVENTINFO dbe = { sizeof(dbe) }; + db_event_get(hDbEvent, &dbe); + //check if we should process the event + if (dbe.flags & (DBEF_SENT | DBEF_READ) || dbe.eventType != EVENTTYPE_CONTACTS) return 0; + //get event contents + dbe.cbBlob = db_event_getBlobSize(hDbEvent); + if (dbe.cbBlob != -1) + dbe.pBlob = (PBYTE)_alloca(dbe.cbBlob); + db_event_get(hDbEvent, &dbe); + //play received sound + SkinPlaySound("RecvContacts"); + { + //add event to the contact list + TCHAR caToolTip[128]; + mir_sntprintf(caToolTip, SIZEOF(caToolTip), _T("%s %s"), TranslateT("Contacts received from"), pcli->pfnGetContactDisplayName(hContact, 0)); + + CLISTEVENT cle = { sizeof(cle) }; + cle.hContact = hContact; + cle.hDbEvent = hDbEvent; + cle.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_CONTACTS)); + cle.pszService = MS_CONTACTS_RECEIVE; + cle.ptszTooltip = caToolTip; + cle.flags |= CLEF_UNICODE; + CallService(MS_CLIST_ADDEVENT, 0, (LPARAM)&cle); + } + return 0; //continue processing by other hooks } static void ProcessUnreadEvents(void) @@ -100,7 +97,7 @@ static void ProcessUnreadEvents(void) while (hDbEvent) { DBEVENTINFO dbei = { sizeof(dbei) }; db_event_get(hDbEvent, &dbei); - if (!(dbei.flags & (DBEF_SENT|DBEF_READ)) && dbei.eventType == EVENTTYPE_CONTACTS) { + if (!(dbei.flags & (DBEF_SENT | DBEF_READ)) && dbei.eventType == EVENTTYPE_CONTACTS) { //process the event HookDBEventAdded((WPARAM)hContact, (LPARAM)hDbEvent); } @@ -138,17 +135,14 @@ static int HookPreBuildContactMenu(WPARAM wParam, LPARAM lParam) static int HookModulesLoaded(WPARAM wParam, LPARAM lParam) { - char* modules[2] = {0}; - WCHAR tmp[MAX_PATH]; + char* modules[2] = { 0 }; modules[0] = MODULENAME; - CallService("DBEditorpp/RegisterModule",(WPARAM)modules,(LPARAM)1); + CallService("DBEditorpp/RegisterModule", (WPARAM)modules, (LPARAM)1); CLISTMENUITEM mi = { sizeof(mi) }; - mi.ptszName = SRCTranslateT("Contacts", tmp); + mi.pszName = LPGEN("Contacts"); mi.position = -2000009990; //position in menu - mi.flags = CMIF_KEEPUNTRANSLATED; - mi.flags |= CMIF_UNICODE; mi.pszService = MS_CONTACTS_SEND; mi.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_CONTACTS)); hContactMenuItem = Menu_AddContactMenuItem(&mi); @@ -164,56 +158,49 @@ static int HookModulesLoaded(WPARAM wParam, LPARAM lParam) static int HookContactSettingChanged(WPARAM wParam, LPARAM lParam) { - DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING*)lParam; - char *szProto =GetContactProto((HANDLE)wParam); + DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING*)lParam; + char *szProto = GetContactProto((HANDLE)wParam); - if (strcmpnull(cws->szModule,"CList") && strcmpnull(cws->szModule, szProto)) return 0; + if (strcmpnull(cws->szModule, "CList") && strcmpnull(cws->szModule, szProto)) return 0; - WindowList_Broadcast(ghSendWindowList,DM_UPDATETITLE,0,0); - WindowList_Broadcast(ghRecvWindowList,DM_UPDATETITLE,0,0); - - return 0; + WindowList_Broadcast(ghSendWindowList, DM_UPDATETITLE, 0, 0); + WindowList_Broadcast(ghRecvWindowList, DM_UPDATETITLE, 0, 0); + return 0; } static int HookContactDeleted(WPARAM wParam, LPARAM lParam) { // if our contact gets deleted close his window - HWND h = WindowList_Find(ghSendWindowList,(HANDLE)wParam); - - if (h) - { - SendMessageT(h,WM_CLOSE,0,0); - } - - while (h = WindowList_Find(ghRecvWindowList, (HANDLE)wParam)) - { // since we hack the window list - more windows for one contact, we need to close them all - SendMessageT(h, WM_CLOSE,0,0); - } - return 0; + HWND h = WindowList_Find(ghSendWindowList, (HANDLE)wParam); + + if (h) + { + SendMessage(h, WM_CLOSE, 0, 0); + } + + while (h = WindowList_Find(ghRecvWindowList, (HANDLE)wParam)) + { // since we hack the window list - more windows for one contact, we need to close them all + SendMessage(h, WM_CLOSE, 0, 0); + } + return 0; } static INT_PTR ServiceSendCommand(WPARAM wParam, LPARAM lParam) { - HWND hWnd; - //find window for hContact - hWnd = WindowList_Find(ghSendWindowList, (HANDLE)wParam); - - if (!hWnd) - CreateDialogParamT(hInst, MAKEINTRESOURCE(IDD_SEND), NULL, SendDlgProc, (LPARAM)(HANDLE)wParam); - else - { - SetForegroundWindow(hWnd); - SetFocus(hWnd); - } - return 0; + //find window for hContact + HWND hWnd = WindowList_Find(ghSendWindowList, (HANDLE)wParam); + if (!hWnd) + CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_SEND), NULL, SendDlgProc, wParam); + else { + SetForegroundWindow(hWnd); + SetFocus(hWnd); + } + return 0; } static INT_PTR ServiceReceiveCommand(WPARAM wParam, LPARAM lParam) { - CLISTEVENT* pcle = (CLISTEVENT*)lParam; - - CreateDialogParamT(hInst, MAKEINTRESOURCE(IDD_RECEIVE), NULL, RecvDlgProc, (LPARAM)pcle); - - return 0; + CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_RECEIVE), NULL, RecvDlgProc, lParam); + return 0; } extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) @@ -227,7 +214,6 @@ extern "C" __declspec(dllexport) int Load(void) mir_getCLI(); InitCommonControls(); - InitI18N(); //init hooks HookEvent(ME_SYSTEM_MODULESLOADED, HookModulesLoaded); diff --git a/plugins/ContactsPlus/src/receive.cpp b/plugins/ContactsPlus/src/receive.cpp index 93bb89a48e..5e61067781 100644 --- a/plugins/ContactsPlus/src/receive.cpp +++ b/plugins/ContactsPlus/src/receive.cpp @@ -25,11 +25,31 @@ /* TRecvContactsData */ -TReceivedItem* TRecvContactsData::AddReceivedItem() { +TRecvContactsData::TRecvContactsData(HANDLE contact) +{ + mhContact = contact; + hHook = NULL; + cbReceived = 0; + maReceived = NULL; + haUin = NULL; +} + +TRecvContactsData::~TRecvContactsData() +{ + if (cbReceived) { + for (int i = 0; i < cbReceived; i++) + delete maReceived[i]; + mir_free(maReceived); + mir_free(haUin); + } +} + +TReceivedItem* TRecvContactsData::AddReceivedItem() +{ int iItem = cbReceived; cbReceived++; - maReceived = (TReceivedItem**)realloc(maReceived, cbReceived*sizeof(TReceivedItem*)); + maReceived = (TReceivedItem**)mir_realloc(maReceived, cbReceived*sizeof(TReceivedItem*)); maReceived[iItem] = new TReceivedItem(); return maReceived[iItem]; @@ -38,8 +58,7 @@ TReceivedItem* TRecvContactsData::AddReceivedItem() { static int RecvDlg_Resize(HWND hwndDlg,LPARAM lParam,UTILRESIZECONTROL *urc) { - switch (urc->wId) - { + switch (urc->wId) { case IDC_CONTACTS: return RD_ANCHORX_WIDTH | RD_ANCHORY_HEIGHT; break; @@ -62,28 +81,24 @@ static int RecvDlg_Resize(HWND hwndDlg,LPARAM lParam,UTILRESIZECONTROL *urc) return RD_ANCHORX_LEFT | RD_ANCHORY_TOP; // default } - -static char* ListView_GetItemTextEx(HWND hLV, int iItem, int iSubItem) +static TCHAR* ListView_GetItemTextEx(HWND hLV, int iItem, int iSubItem) { LVITEM lvi = {0}; - lvi.mask = LVIF_TEXT; lvi.iSubItem = iSubItem; lvi.cchTextMax = 64; - lvi.pszText = (char*)malloc(lvi.cchTextMax); - while (SendMessageT(hLV, LVM_GETITEMTEXT, iItem, (LPARAM)&lvi) == lvi.cchTextMax - 1) - { // loop until the returned size is smaller than buffer size - SAFE_FREE((void**)&lvi.pszText); + lvi.pszText = (TCHAR*)mir_alloc(lvi.cchTextMax * sizeof(TCHAR)); + // loop until the returned size is smaller than buffer size + while (SendMessage(hLV, LVM_GETITEMTEXT, iItem, (LPARAM)&lvi) == lvi.cchTextMax - 1) { lvi.cchTextMax += 64; - lvi.pszText = (char*)malloc(lvi.cchTextMax); + lvi.pszText = (TCHAR*)mir_realloc(lvi.pszText, lvi.cchTextMax * sizeof(TCHAR)); } return lvi.pszText; } - static void EnableGroupCombo(HWND hwndDlg) { - EnableDlgItem(hwndDlg, IDC_GROUPS, SendMessageT(GetDlgItem(hwndDlg, IDC_ENABLEGROUPS), BM_GETCHECK, 0, 0)); + EnableDlgItem(hwndDlg, IDC_GROUPS, SendMessage(GetDlgItem(hwndDlg, IDC_ENABLEGROUPS), BM_GETCHECK, 0, 0)); } static void RebuildGroupCombo(HWND hwndDlg) @@ -92,81 +107,70 @@ static void RebuildGroupCombo(HWND hwndDlg) HWND hGroupsCombo = GetDlgItem(hwndDlg, IDC_GROUPS); if (bHasGroups) { - int curs = SendMessageT(hGroupsCombo, CB_GETCURSEL, 0, 0); + int curs = SendMessage(hGroupsCombo, CB_GETCURSEL, 0, 0); TCHAR* curst; EnableDlgItem(hwndDlg, IDC_ENABLEGROUPS, TRUE); EnableGroupCombo(hwndDlg); if (curs != CB_ERR) { - curst = (char*)_alloca((SendMessageT(hGroupsCombo, CB_GETLBTEXTLEN, curs, 0) + 1) * sizeof(WCHAR)); - SendMessageT(hGroupsCombo, CB_GETLBTEXT, curs, (LPARAM)curst); + curst = (TCHAR*)_alloca((SendMessage(hGroupsCombo, CB_GETLBTEXTLEN, curs, 0) + 1) * sizeof(TCHAR)); + SendMessage(hGroupsCombo, CB_GETLBTEXT, curs, (LPARAM)curst); } - SendMessageT(hGroupsCombo, CB_RESETCONTENT, 0, 0); + SendMessage(hGroupsCombo, CB_RESETCONTENT, 0, 0); TCHAR *szGroup; for (int i=1; (szGroup = pcli->pfnGetGroupName(i, NULL)) != NULL; i++) { - int nIndex = SendMessageT(hGroupsCombo, CB_ADDSTRING, 0, (LPARAM)szGroup); - SendMessageT(hGroupsCombo, CB_SETITEMDATA, nIndex, i); + int nIndex = SendMessage(hGroupsCombo, CB_ADDSTRING, 0, (LPARAM)szGroup); + SendMessage(hGroupsCombo, CB_SETITEMDATA, nIndex, i); } if (curs != CB_ERR) - SendMessageT(hGroupsCombo, CB_SELECTSTRING, -1, (LPARAM)curst); + SendMessage(hGroupsCombo, CB_SELECTSTRING, -1, (LPARAM)curst); else - SendMessageT(hGroupsCombo, CB_SETCURSEL, 0, 0); + SendMessage(hGroupsCombo, CB_SETCURSEL, 0, 0); } - else - { // no groups available + else { + // no groups available EnableDlgItem(hwndDlg, IDC_ENABLEGROUPS, FALSE); EnableDlgItem(hwndDlg, IDC_GROUPS, FALSE); } } -static HANDLE CreateTemporaryContactForItem(HWND hwndDlg, TRecvContactsData* wndData, int iItem) +static HANDLE CreateTemporaryContactForItem(HWND hwndDlg, TRecvContactsData *wndData, int iItem) { - char* caUIN = ListView_GetItemTextEx(GetDlgItem(hwndDlg, IDC_CONTACTS), iItem, 0); - char* szProto =GetContactProto(wndData->mhContact); + TCHAR *caUIN = ListView_GetItemTextEx(GetDlgItem(hwndDlg, IDC_CONTACTS), iItem, 0); + char *szProto = GetContactProto(wndData->mhContact); wndData->rhSearch = (HANDLE)CallProtoService(szProto, PS_BASICSEARCH, 0, (LPARAM)caUIN); // find it - SAFE_FREE((void**)&wndData->haUin); - wndData->haUin = caUIN; + replaceStrT(wndData->haUin, caUIN); for (int j = 0; j < wndData->cbReceived; j++) - if (!strcmpnull(wndData->maReceived[j]->mcaUIN, caUIN)) + if (!lstrcmp(wndData->maReceived[j]->mcaUIN, caUIN)) return (HANDLE)CallProtoService(szProto, PS_ADDTOLISTBYEVENT, MAKEWPARAM(PALF_TEMPORARY, j), (LPARAM)wndData->mhDbEvent); return NULL; } -void RecvListView_AddColumn(HWND hList, int nWidth, const char* szTitle, int nTranslate, int nItem) +void RecvListView_AddColumn(HWND hList, int nWidth, TCHAR *szTitle, int nItem) { LVCOLUMN col; - WCHAR tmp[MAX_PATH]; - - col.mask = LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM; + col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; col.fmt = LVCFMT_LEFT; col.cx = nWidth; - if (nTranslate) { - col.pszText = SRCTranslateT(szTitle, tmp); - } - else { - if (!szTitle) szTitle = "UID"; - col.pszText = ansi_to_tchar(szTitle, CallService(MS_LANGPACK_GETCODEPAGE, 0, 0)); - } + col.pszText = szTitle; col.iSubItem = nItem; - ListView_InsertColumnT(hList, nItem, &col); - if (!nTranslate) - SAFE_FREE((void**)&col.pszText); + ListView_InsertColumn(hList, nItem, &col); } INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { - TRecvContactsData* wndData = (TRecvContactsData*)GetWindowLongPtr(hwndDlg, DWLP_USER); + TRecvContactsData *wndData = (TRecvContactsData*)GetWindowLongPtr(hwndDlg, DWLP_USER); + HANDLE hContact; switch (msg) { case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); { - CLISTEVENT* pcle = (CLISTEVENT*)lParam; /// got it - - TranslateDialogDefault(hwndDlg); + CLISTEVENT *pcle = (CLISTEVENT*)lParam; WindowList_Add(ghRecvWindowList, hwndDlg, pcle->hContact); - SendMessageT(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_CONTACTS))); + SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_CONTACTS))); EnableDlgItem(hwndDlg, IDOK, FALSE); EnableDlgItem(hwndDlg, IDDETAILS, FALSE); wndData = new TRecvContactsData(pcle->hContact); @@ -182,13 +186,13 @@ INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); ListView_SetExtendedListViewStyle(hLV, LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT); // add columns - RecvListView_AddColumn(hLV, 120, (char*)CallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDTEXT, 0), FALSE, 0); - RecvListView_AddColumn(hLV, 100, "Nick", TRUE, 1); - RecvListView_AddColumn(hLV, 100, "First Name", TRUE, 2); - RecvListView_AddColumn(hLV, 100, "Last Name", TRUE, 3); + RecvListView_AddColumn(hLV, 120, _A2T((char*)CallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDTEXT, 0)), 0); + RecvListView_AddColumn(hLV, 100, TranslateT("Nick"), 1); + RecvListView_AddColumn(hLV, 100, TranslateT("First Name"), 2); + RecvListView_AddColumn(hLV, 100, TranslateT("Last Name"), 3); // fill in groups - SendMessageT(GetDlgItem(hwndDlg, IDC_ENABLEGROUPS), BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0); + SendMessage(GetDlgItem(hwndDlg, IDC_ENABLEGROUPS), BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0); RebuildGroupCombo(hwndDlg); { // fill listview with received contacts @@ -216,19 +220,19 @@ INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara TReceivedItem* pItem = wndData->AddReceivedItem(); if (dbe.flags & DBEF_UTF) - pItem->mcaNick = utf8_to_tchar((unsigned char*)pcBlob); + pItem->mcaNick = mir_utf8decodeT(pcBlob); else - pItem->mcaNick = ansi_to_tchar(pcBlob); + pItem->mcaNick = mir_a2t(pcBlob); pcBlob += strsize + 1; // UIN strsize = (int)strlennull(pcBlob); - pItem->mcaUIN = null_strdup(pcBlob); + pItem->mcaUIN = mir_a2t(pcBlob); pcBlob += strsize + 1; // add to listview lvi.iItem = nItem; lvi.pszText = pItem->mcaUIN; ListView_InsertItem(hLV, &lvi); // with image - ListView_SetItemTextT(hLV, nItem, 1, pItem->mcaNick); + ListView_SetItemText(hLV, nItem, 1, pItem->mcaNick); // check for end of contacts if (pcBlob >= pcEnd) break; @@ -240,7 +244,7 @@ INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara wndData->hIcons[2] = InitMButton(hwndDlg, IDC_HISTORY, MAKEINTRESOURCEA(IDI_HISTORY), LPGEN("View User's History")); wndData->hIcons[3] = InitMButton(hwndDlg, IDC_USERMENU, MAKEINTRESOURCEA(IDI_DOWNARROW), LPGEN("User Menu")); - SendMessageT(hwndDlg,DM_UPDATETITLE,0,0); + SendMessage(hwndDlg,DM_UPDATETITLE,0,0); // new dialog init done Utils_RestoreWindowPosition(hwndDlg, NULL, MODULENAME, ""); return TRUE; @@ -254,7 +258,7 @@ INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara if (ListView_GetSelectedCount(hLV) != 1) break; // if not clicking on item, bye wndData->iPopupItem = ListView_GetNextItem(hLV, -1, LVNI_ALL|LVNI_SELECTED); if (wndData->iPopupItem == -1) break; // if no item selected no user details available - return SendMessageT(hwndDlg, WM_COMMAND, ID_POPUP_USERDETAILS, 0); // show user details + return SendMessage(hwndDlg, WM_COMMAND, ID_POPUP_USERDETAILS, 0); // show user details } case LVN_ITEMCHANGED: { @@ -293,39 +297,37 @@ INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara case IDOK: // "Add Selected" button click { // for each selected item, find its index in the hDbEvent // and after that add this item to the DB permanently - char* caUIN; HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); HWND hGroupsCombo = GetDlgItem(hwndDlg, IDC_GROUPS); HWND hGroupsCheck = GetDlgItem(hwndDlg, IDC_ENABLEGROUPS); - int curs = SendMessageT(hGroupsCombo, CB_GETCURSEL, 0, 0); + int curs = SendMessage(hGroupsCombo, CB_GETCURSEL, 0, 0); TCHAR* caGroup = NULL; int nGroupId = -1; - if (curs != CB_ERR && IsWindowEnabled(hGroupsCheck) && SendMessageT(hGroupsCheck, BM_GETCHECK, 0, 0)) + if (curs != CB_ERR && IsWindowEnabled(hGroupsCheck) && SendMessage(hGroupsCheck, BM_GETCHECK, 0, 0)) { //got groups, get the one selected in combo - TCHAR* caGroup = (TCHAR*)_alloca((SendMessageT(hGroupsCombo, CB_GETLBTEXTLEN, curs, 0) + 1) * sizeof(WCHAR)); - SendMessageT(hGroupsCombo, CB_GETLBTEXT, curs, (LPARAM)caGroup); - nGroupId = SendMessageT(hGroupsCombo, CB_GETITEMDATA, curs, 0); + TCHAR* caGroup = (TCHAR*)_alloca((SendMessage(hGroupsCombo, CB_GETLBTEXTLEN, curs, 0) + 1) * sizeof(TCHAR)); + SendMessage(hGroupsCombo, CB_GETLBTEXT, curs, (LPARAM)caGroup); + nGroupId = SendMessage(hGroupsCombo, CB_GETITEMDATA, curs, 0); } for (int i = 0; i < ListView_GetItemCount(hLV); i++) - if (ListView_GetCheckState(hLV, i)) - { // found checked contact item, add it - caUIN = ListView_GetItemTextEx(hLV, i, 0); + if (ListView_GetCheckState(hLV, i)) { + // found checked contact item, add it + TCHAR *caUIN = ListView_GetItemTextEx(hLV, i, 0); for (int j = 0; j < wndData->cbReceived; j++) // determine item index in packet - if (!strcmpnull(wndData->maReceived[j]->mcaUIN, caUIN)) - { - char* szProto =GetContactProto(wndData->mhContact); - HANDLE hContact = (HANDLE)CallProtoService(szProto, PS_ADDTOLISTBYEVENT, MAKEWPARAM(0, j), (LPARAM)wndData->mhDbEvent); - if (hContact && caGroup) - { // use newest group API if available + if (!lstrcmp(wndData->maReceived[j]->mcaUIN, caUIN)) { + char *szProto =GetContactProto(wndData->mhContact); + hContact = (HANDLE)CallProtoService(szProto, PS_ADDTOLISTBYEVENT, MAKEWPARAM(0, j), (LPARAM)wndData->mhDbEvent); + if (hContact && caGroup) { + // use newest group API if available if (ServiceExists(MS_CLIST_CONTACTCHANGEGROUP)) CallService(MS_CLIST_CONTACTCHANGEGROUP, (WPARAM)hContact, (LPARAM)nGroupId); else - DBWriteContactSettingStringT(hContact, "CList", "Group", caGroup); + db_set_ts(hContact, "CList", "Group", caGroup); } break; } - SAFE_FREE((void**)&caUIN); + mir_free(caUIN); } // move to next item break; } @@ -336,22 +338,21 @@ INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); for (int i = 0; i < ListView_GetItemCount(hLV); i++) if (ListView_GetItemState(hLV, i, LVIS_SELECTED)) { - HANDLE hContact = CreateTemporaryContactForItem(hwndDlg, wndData, i); + hContact = CreateTemporaryContactForItem(hwndDlg, wndData, i); if (hContact) CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0); } - break; } + break; + case IDCANCEL: - { - SendMessageT(hwndDlg, WM_CLOSE, 0, 0); - break; - } + SendMessage(hwndDlg, WM_CLOSE, 0, 0); + break; + case IDC_ENABLEGROUPS: - { - EnableGroupCombo(hwndDlg); - break; - } + EnableGroupCombo(hwndDlg); + break; + case IDC_GROUPS: // rebuild group list on popup if (HIWORD(wParam) == CBN_DROPDOWN) @@ -359,26 +360,23 @@ INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara break; case ID_POPUP_ADDUSER: - { - HANDLE hContact = CreateTemporaryContactForItem(hwndDlg, wndData, wndData->iPopupItem); - if (hContact) - DialogAddContactExecute(hwndDlg, hContact); - break; - } + hContact = CreateTemporaryContactForItem(hwndDlg, wndData, wndData->iPopupItem); + if (hContact) + DialogAddContactExecute(hwndDlg, hContact); + break; + case ID_POPUP_USERDETAILS: - { - HANDLE hContact = CreateTemporaryContactForItem(hwndDlg, wndData, wndData->iPopupItem); - if (hContact) - CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0 ); - break; - } + hContact = CreateTemporaryContactForItem(hwndDlg, wndData, wndData->iPopupItem); + if (hContact) + CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0 ); + break; + case ID_POPUP_SENDMESSAGE: - { - HANDLE hContact = CreateTemporaryContactForItem(hwndDlg, wndData, wndData->iPopupItem); - if (hContact) - CallService(MS_MSG_SENDMESSAGE, (WPARAM)hContact, 0); - break; - } + hContact = CreateTemporaryContactForItem(hwndDlg, wndData, wndData->iPopupItem); + if (hContact) + CallService(MS_MSG_SENDMESSAGE, (WPARAM)hContact, 0); + break; + case IDC_USERMENU: { RECT rc; @@ -386,8 +384,9 @@ INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara GetWindowRect(GetDlgItem(hwndDlg,IDC_USERMENU), &rc); TrackPopupMenu(hMenu, 0, rc.left, rc.bottom, 0, hwndDlg, NULL); DestroyMenu(hMenu); - break; } + break; + case IDC_HISTORY: CallService(MS_HISTORY_SHOWCONTACTHISTORY,(WPARAM)wndData->mhContact,0); break; @@ -400,8 +399,9 @@ INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara DialogAddContactExecute(hwndDlg, wndData->mhContact); break; } - break; } + break; + case WM_CONTEXTMENU: { HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); @@ -418,48 +418,50 @@ INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara if (ci==-1) break; // mouse is not over any item wndData->iPopupItem = ci; TrackPopupMenu(GetSubMenu(wndData->mhPopup, 0), TPM_LEFTALIGN|TPM_TOPALIGN, LOWORD(lParam), HIWORD(lParam), 0, hwndDlg, NULL); - break; } + break; + case HM_EVENTSENT: { - ACKDATA *ack=(ACKDATA*)lParam; - if (ack->type!=ACKTYPE_SEARCH) break; // not search ack, go away - if (ack->hProcess!=wndData->rhSearch) break; //not our search, go away - if (ack->result==ACKRESULT_DATA) - { + ACKDATA *ack = (ACKDATA*)lParam; + if (ack->type != ACKTYPE_SEARCH) break; // not search ack, go away + if (ack->hProcess != wndData->rhSearch) break; //not our search, go away + if (ack->result == ACKRESULT_DATA) { HWND hLV = GetDlgItem(hwndDlg, IDC_CONTACTS); - PROTOSEARCHRESULT* psr = (PROTOSEARCHRESULT*)ack->lParam; + PROTOSEARCHRESULT *psr = (PROTOSEARCHRESULT*)ack->lParam; LVFINDINFO fi; fi.flags = LVFI_STRING; fi.psz = wndData->haUin; int iLPos = ListView_FindItem(hLV, -1, &fi); - if (iLPos==-1) iLPos=0; - // ListView_SetItemText(hLV, iLPos, 0, psr->email); // not sent by ICQ, and currently unsupported either - if (strcmpnull(psr->nick, "") && psr->nick) ListView_SetItemText(hLV, iLPos, 1, psr->nick); + if (iLPos == -1) iLPos = 0; + if (lstrcmp(psr->nick, _T("")) && psr->nick) + ListView_SetItemText(hLV, iLPos, 1, psr->nick); ListView_SetItemText(hLV, iLPos, 2, psr->firstName); ListView_SetItemText(hLV, iLPos, 3, psr->lastName); break; } - SAFE_FREE((void**)&wndData->haUin); - break; + mir_free(wndData->haUin); } + break; + case WM_CLOSE: // user closed window, so destroy it WindowList_Remove(ghRecvWindowList, hwndDlg); DestroyWindow(hwndDlg); break; case WM_DESTROY: // last message received by this dialog, cleanup + db_event_markRead(wndData->mhContact, wndData->mhDbEvent); + Utils_SaveWindowPosition(hwndDlg, NULL, MODULENAME, ""); + ImageList_Destroy(wndData->mhListIcon); + UnhookEvent(wndData->hHook); + DestroyMenu(wndData->mhPopup); { - db_event_markRead(wndData->mhContact, wndData->mhDbEvent); - Utils_SaveWindowPosition(hwndDlg, NULL, MODULENAME, ""); - ImageList_Destroy(wndData->mhListIcon); - UnhookEvent(wndData->hHook); - DestroyMenu(wndData->mhPopup); - for (int i=0; i < SIZEOF(wndData->hIcons); i++) + for (int i = 0; i < SIZEOF(wndData->hIcons); i++) DestroyIcon(wndData->hIcons[i]); - delete wndData; // automatically calls destructor - break; } + delete wndData; // automatically calls destructor + break; + case WM_MEASUREITEM: return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); @@ -468,28 +470,27 @@ INT_PTR CALLBACK RecvDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara return CallService(MS_CLIST_MENUDRAWITEM, wParam, lParam); case WM_SIZE: - { // make the dlg resizeable - UTILRESIZEDIALOG urd = {0}; - - if (IsIconic(hwndDlg)) break; - urd.cbSize = sizeof(urd); + if (!IsIconic(hwndDlg)) { + // make the dlg resizeable + UTILRESIZEDIALOG urd = { sizeof(urd) }; urd.hInstance = hInst; urd.hwndDlg = hwndDlg; - urd.lParam = 0; // user-defined urd.lpTemplate = MAKEINTRESOURCEA(IDD_RECEIVE); urd.pfnResizer = RecvDlg_Resize; CallService(MS_UTILS_RESIZEDIALOG, 0, (LPARAM) & urd); - break; } + break; + case WM_GETMINMAXINFO: { MINMAXINFO* mmi=(MINMAXINFO*)lParam; mmi->ptMinTrackSize.x = 480+2*GetSystemMetrics(SM_CXSIZEFRAME); mmi->ptMinTrackSize.y = 130+2*GetSystemMetrics(SM_CYSIZEFRAME); - break; } + break; + case DM_UPDATETITLE: - UpdateDialogTitle(hwndDlg, wndData?wndData->mhContact:NULL, "Contacts from"); + UpdateDialogTitle(hwndDlg, wndData ? wndData->mhContact : NULL, LPGENT("Contacts from")); if (wndData) UpdateDialogAddButton(hwndDlg, wndData->mhContact); break; diff --git a/plugins/ContactsPlus/src/receive.h b/plugins/ContactsPlus/src/receive.h index fe35d94be6..dce1b023ac 100644 --- a/plugins/ContactsPlus/src/receive.h +++ b/plugins/ContactsPlus/src/receive.h @@ -35,27 +35,29 @@ #define IDI_DOWNARROW 264 struct TReceivedItem { - char* mcaUIN; - TCHAR* mcaNick; - ~TReceivedItem() { SAFE_FREE((void**)&mcaUIN); SAFE_FREE((void**)&mcaNick); } - TReceivedItem() { mcaUIN = NULL; mcaNick = NULL; } + TCHAR* mcaUIN; + TCHAR* mcaNick; + ~TReceivedItem() { mir_free(mcaUIN); mir_free(mcaNick); } + TReceivedItem() { mcaUIN = NULL; mcaNick = NULL; } }; -struct TRecvContactsData { - HANDLE mhDbEvent; // handle to recv DB event - HANDLE mhContact; // from whom we received this - HIMAGELIST mhListIcon;// icons for listview - HMENU mhPopup; // popup menu for listview - HANDLE hHook; // hook to event - HANDLE rhSearch; // handle to uin-search - char* haUin; - int iPopupItem; - TReceivedItem** maReceived;// received contacts - int cbReceived; - TReceivedItem* AddReceivedItem(); - HICON hIcons[4]; // icons for dialog - TRecvContactsData(HANDLE contact) { mhContact = contact; hHook = NULL; cbReceived = 0; maReceived = NULL; haUin = NULL; }; - ~TRecvContactsData() { if (cbReceived) { for(int i=0;inContacts = nContacts; + ackData->aContacts = (HANDLE*)mir_alloc(nContacts*sizeof(HANDLE)); + memmove(ackData->aContacts, phContacts, nContacts*sizeof(HANDLE)); // copy the array of hContact for ack array + EnableDlgItem(hwndDlg, IDOK, FALSE); + EnableDlgItem(hwndDlg, IDC_LIST, FALSE); + return TRUE; // Success } +int TSendContactsData::SendContacts(HWND hwndDlg) +{ + char *szProto = GetContactProto(hContact); + int nMaxContacts = CallProtoService(szProto, PS_GETCAPS, PFLAG_MAXCONTACTSPERPACKET, (LPARAM)hContact); -void TSendContactsData::AddContact(HANDLE hContact) { - aContacts = (HANDLE*)realloc(aContacts, (nContacts+1)*sizeof(HANDLE)); - aContacts[nContacts] = hContact; - nContacts++; -} + if (!nMaxContacts) { + ShowErrorDlg(hwndDlg, "The selected contact does not support receiving contacts.", FALSE); + return FALSE; + } + // hook event - we want to receive protocol acknowledgements + HookProtoAck(hwndDlg); -int TSendContactsData::SendContactsPacket(HWND hwndDlg, HANDLE *phContacts, int nContacts) { - HANDLE hProcc = (HANDLE)CallContactService(hContact, PSS_CONTACTS, MAKEWPARAM(0, nContacts), (LPARAM)phContacts); - if (!hProcc) - { // on trivial error - do not close dialog - ShowErrorDlg(hwndDlg, "Contacts transfer failed!", FALSE); - return FALSE; // Failure - } - TAckData* ackData = gaAckData.Add(hProcc, new TAckData(hContact)); - uacklist.Add(hProcc); - ackData->nContacts = nContacts; - ackData->aContacts = (HANDLE*)malloc(nContacts*sizeof(HANDLE)); - memmove(ackData->aContacts, phContacts, nContacts*sizeof(HANDLE)); // copy the array of hContact for ack array - EnableDlgItem(hwndDlg, IDOK, FALSE); - EnableDlgItem(hwndDlg, IDC_LIST, FALSE); - - return TRUE; // Success -} + // send in packets, each of nMaxContacts contacts + for (int j = 0; j < nContacts / nMaxContacts; j++) + if (!SendContactsPacket(hwndDlg, aContacts + j*nMaxContacts, nMaxContacts)) + return FALSE; + if (nContacts%nMaxContacts != 0) + if (!SendContactsPacket(hwndDlg, aContacts + nContacts / nMaxContacts*nMaxContacts, nContacts%nMaxContacts)) + return FALSE; -int TSendContactsData::SendContacts(HWND hwndDlg) { - char* szProto =GetContactProto(hContact); - int nMaxContacts = CallProtoService(szProto, PS_GETCAPS, PFLAG_MAXCONTACTSPERPACKET, (LPARAM)hContact); - - if (!nMaxContacts) { - ShowErrorDlg(hwndDlg, "The selected contact does not support receiving contacts.", FALSE); - return FALSE; - } - // hook event - we want to receive protocol acknowledgements - HookProtoAck(hwndDlg); - - for (int j = 0; j < nContacts / nMaxContacts; j++ ) - { // send in packets, each of nMaxContacts contacts - if (!SendContactsPacket(hwndDlg, aContacts + j*nMaxContacts, nMaxContacts)) - return FALSE; - } - if (nContacts%nMaxContacts!=0) - { - if (!SendContactsPacket(hwndDlg, aContacts + nContacts/nMaxContacts*nMaxContacts, nContacts%nMaxContacts)) - return FALSE; - } - return TRUE; + return TRUE; } - /* Send Dialog Implementation */ static void ResetListOptions(HWND hwndList) { - COLORREF bgColour,fgColour; - - SendMessageT(hwndList,CLM_SETBKBITMAP,0,(LPARAM)(HBITMAP)NULL); - bgColour=GetSysColor(COLOR_WINDOW); - SendMessageT(hwndList,CLM_SETBKCOLOR,bgColour,0); - SendMessageT(hwndList,CLM_SETGREYOUTFLAGS,0,0); - SendMessageT(hwndList,CLM_SETLEFTMARGIN,4,0); - SendMessageT(hwndList,CLM_SETINDENT,10,0); - for(int i=0; i<=FONTID_MAX; i++) - { - fgColour=(COLORREF)SendMessageT(hwndList,CLM_GETTEXTCOLOR,i,0); - if(abs(GetRValue(fgColour)-GetRValue(bgColour))<10 && - abs(GetGValue(fgColour)-GetGValue(bgColour))<10 && - abs(GetBValue(fgColour)-GetBValue(bgColour))<10) - SendMessageT(hwndList,CLM_SETTEXTCOLOR,i,GetSysColor(COLOR_WINDOWTEXT)); - } + COLORREF bgColour, fgColour; + + SendMessage(hwndList, CLM_SETBKBITMAP, 0, (LPARAM)(HBITMAP)NULL); + bgColour = GetSysColor(COLOR_WINDOW); + SendMessage(hwndList, CLM_SETBKCOLOR, bgColour, 0); + SendMessage(hwndList, CLM_SETGREYOUTFLAGS, 0, 0); + SendMessage(hwndList, CLM_SETLEFTMARGIN, 4, 0); + SendMessage(hwndList, CLM_SETINDENT, 10, 0); + for (int i = 0; i <= FONTID_MAX; i++) { + fgColour = (COLORREF)SendMessage(hwndList, CLM_GETTEXTCOLOR, i, 0); + if (abs(GetRValue(fgColour) - GetRValue(bgColour)) < 10 && + abs(GetGValue(fgColour) - GetGValue(bgColour)) < 10 && + abs(GetBValue(fgColour) - GetBValue(bgColour)) < 10) + SendMessage(hwndList, CLM_SETTEXTCOLOR, i, GetSysColor(COLOR_WINDOWTEXT)); + } } - static HANDLE FindNextClistContact(HWND hList, HANDLE hContact, HANDLE *phItem) { HANDLE hNextContact = db_find_next(hContact); HANDLE hNextItem = NULL; - - while (hNextContact && !(hNextItem = (HANDLE)SendMessageT(hList, CLM_FINDCONTACT, (WPARAM)hNextContact,0))) + + while (hNextContact && !(hNextItem = (HANDLE)SendMessage(hList, CLM_FINDCONTACT, (WPARAM)hNextContact, 0))) hNextContact = db_find_next(hNextContact); if (phItem) @@ -204,11 +197,11 @@ static HANDLE FindNextClistContact(HWND hList, HANDLE hContact, HANDLE *phItem) static HANDLE FindFirstClistContact(HWND hList, HANDLE *phItem) { HANDLE hContact = db_find_first(); - HANDLE hItem = (HANDLE)SendMessageT(hList, CLM_FINDCONTACT, (WPARAM)hContact, 0); + HANDLE hItem = (HANDLE)SendMessage(hList, CLM_FINDCONTACT, (WPARAM)hContact, 0); if (hContact && !hItem) return FindNextClistContact(hList, hContact, phItem); - + if (phItem) *phItem = hItem; @@ -220,317 +213,289 @@ bool binListEvent = FALSE; static void SetAllContactChecks(HWND hwndList, HANDLE hReceiver) // doubtful name { - HANDLE hContact, hItem; - - if (binListEvent) return; - binListEvent = TRUE; - char* szProto =GetContactProto(hReceiver); - if (szProto == NULL) return; - - if (CallService(MS_CLUI_GETCAPS, 0, 0) & CLUIF_HIDEEMPTYGROUPS && db_get_b(NULL, "CList", "HideEmptyGroups", SETTING_USEGROUPS_DEFAULT)) - SendMessageT(hwndList, CLM_SETHIDEEMPTYGROUPS, (WPARAM) TRUE, 0); - else - SendMessageT(hwndList, CLM_SETHIDEEMPTYGROUPS, (WPARAM) FALSE, 0); - - hContact = FindFirstClistContact(hwndList, &hItem); - while (hContact) - { - char* szProto2 =GetContactProto(hContact); - - if (strcmpnull(szProto, szProto2)) - { // different protocols or protocol undefined, remove contact, useless anyway - SendMessageT(hwndList, CLM_DELETEITEM, (WPARAM)hItem, 0); - } - else // otherwise uncheck - SendMessageT(hwndList, CLM_SETCHECKMARK,(WPARAM)hItem, 0); - - hContact = FindNextClistContact(hwndList, hContact, &hItem); - } - - binListEvent = FALSE; -} + if (binListEvent) + return; + + binListEvent = TRUE; + char *szProto = GetContactProto(hReceiver); + if (szProto == NULL) + return; + + if (CallService(MS_CLUI_GETCAPS, 0, 0) & CLUIF_HIDEEMPTYGROUPS && db_get_b(NULL, "CList", "HideEmptyGroups", SETTING_USEGROUPS_DEFAULT)) + SendMessage(hwndList, CLM_SETHIDEEMPTYGROUPS, (WPARAM)TRUE, 0); + else + SendMessage(hwndList, CLM_SETHIDEEMPTYGROUPS, (WPARAM)FALSE, 0); + HANDLE hItem, hContact = FindFirstClistContact(hwndList, &hItem); + while (hContact) { + char* szProto2 = GetContactProto(hContact); + + // different protocols or protocol undefined, remove contact, useless anyway + if (strcmpnull(szProto, szProto2)) + SendMessage(hwndList, CLM_DELETEITEM, (WPARAM)hItem, 0); + else // otherwise uncheck + SendMessage(hwndList, CLM_SETCHECKMARK, (WPARAM)hItem, 0); + + hContact = FindNextClistContact(hwndList, hContact, &hItem); + } + + binListEvent = FALSE; +} -INT_PTR CALLBACK SendDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +INT_PTR CALLBACK SendDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { - TSendContactsData* wndData = (TSendContactsData*)GetWindowLongPtr(hwndDlg, DWLP_USER); - - switch (msg) - { - case WM_INITDIALOG: - { - TranslateDialogDefault(hwndDlg); - SendMessageT(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_CONTACTS))); - ResetListOptions(GetDlgItem(hwndDlg,IDC_LIST)); - SetAllContactChecks(GetDlgItem(hwndDlg,IDC_LIST), (HANDLE)lParam); - WindowList_Add(ghSendWindowList, hwndDlg, (HANDLE)lParam); - wndData = new TSendContactsData((HANDLE)lParam); - SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG)wndData); - // new dlg init - wndData->hIcons[0] = InitMButton(hwndDlg, IDC_ADD, MAKEINTRESOURCEA(IDI_ADDCONTACT), LPGEN("Add Contact Permanently to List")); - wndData->hIcons[1] = InitMButton(hwndDlg, IDC_DETAILS, MAKEINTRESOURCEA(IDI_USERDETAILS), LPGEN("View User's Details")); - wndData->hIcons[2] = InitMButton(hwndDlg, IDC_HISTORY, MAKEINTRESOURCEA(IDI_HISTORY), LPGEN("View User's History")); - wndData->hIcons[3] = InitMButton(hwndDlg, IDC_USERMENU, MAKEINTRESOURCEA(IDI_DOWNARROW), LPGEN("User Menu")); - - SendMessageT(hwndDlg,DM_UPDATETITLE,0,0); - // new dialog init done - return TRUE; - } - - case WM_SETFOCUS: - SetFocus(GetDlgItem(hwndDlg,IDC_LIST)); - break; - - case WM_NOTIFY: - if (((LPNMHDR)lParam)->idFrom == IDC_LIST) - { - switch (((LPNMHDR)lParam)->code) - { - case CLN_NEWCONTACT: - case CLN_LISTREBUILT: // rebuild list - if (wndData) SetAllContactChecks(GetDlgItem(hwndDlg,IDC_LIST), wndData->hContact); - case CLN_OPTIONSCHANGED: - ResetListOptions(GetDlgItem(hwndDlg,IDC_LIST)); - break; - } - } - break; - - case WM_TIMER: - if (wParam == TIMERID_MSGSEND) - { - KillTimer(hwndDlg,wParam); - wndData->ShowErrorDlg(hwndDlg, "The contacts send timed out.", TRUE); - } - break; - - case DM_ERRORDECIDED: - { - EnableWindow(hwndDlg,TRUE); - wndData->hError = NULL; - switch(wParam) - { - case MSGERROR_CANCEL: - { - wndData->UnhookProtoAck(); - if (wndData->uacklist.Count) - { - for (int i=0; iuacklist.Count; i++) - { - delete gaAckData.Remove(wndData->uacklist.Items[i]); // remove our ackdata & release structure - } - SAFE_FREE((void**)&wndData->uacklist.Items); - wndData->uacklist.Count = 0; - } - EnableDlgItem(hwndDlg,IDOK,TRUE); - EnableDlgItem(hwndDlg,IDC_LIST,TRUE); - ShowWindow(hwndDlg,SW_SHOWNORMAL); - SetFocus(GetDlgItem(hwndDlg,IDC_LIST)); - break; - } - case MSGERROR_DONE: - // contacts were delivered succesfully after timeout - SetFocus(GetDlgItem(hwndDlg,IDC_LIST)); - wndData->UnhookProtoAck(); - break; - - case MSGERROR_RETRY:// resend timeouted packets - - for (int i=0; iuacklist.Count; i++) - { - TAckData* lla = gaAckData.Remove(wndData->uacklist.Items[i]); - HANDLE hProcc = (HANDLE)CallContactService(wndData->hContact, PSS_CONTACTS, MAKEWPARAM(0, lla->nContacts), (LPARAM)lla->aContacts); - - if (!hProcc) // if fatal do not include - { - wndData->uacklist.Remove(wndData->uacklist.Items[i]); - delete lla; // release the structure - continue; - } - else - { // update process code - wndData->uacklist.Items[i] = hProcc; - gaAckData.Add(hProcc, lla); - } - }// collect TAckData for our window, resend - break; - } - break; - } - - case WM_COMMAND: - { - if (!lParam && CallService(MS_CLIST_MENUPROCESSCOMMAND,MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)wndData->hContact)) - break; - - switch(LOWORD(wParam)) - { - case IDOK: - { - if (!IsWindowEnabled(GetDlgItem(hwndDlg,IDOK))) break; - HANDLE hContact, hItem; - wndData->ClearContacts(); // do not include contacts twice - - HWND hList = GetDlgItem(hwndDlg, IDC_LIST); - hContact = FindFirstClistContact(hList, &hItem); - while (hContact) - { - if (SendMessageT(hList, CLM_GETCHECKMARK, (WPARAM)hItem, 0)) - { // build list of contacts to send - wndData->AddContact(hContact); - } - hContact = FindNextClistContact(hList, hContact, &hItem); - } - /* send contacts */ - if (!wndData->SendContacts(hwndDlg)) - break; - - SetTimer(hwndDlg,TIMERID_MSGSEND,db_get_dw(NULL,"SRMsg","MessageTimeout",TIMEOUT_MSGSEND),NULL); - - break; - } - case IDCANCEL: - { - DestroyWindow(hwndDlg); - break; - } - case ID_SELECTALL: - { // select all contacts - HANDLE hContact, hItem; - HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST); - - hContact = FindFirstClistContact(hwndList, &hItem); - while (hContact) { - SendMessageT(hwndList,CLM_SETCHECKMARK,(WPARAM)hItem, 1); - hContact = FindNextClistContact(hwndList, hContact, &hItem); - }; - break; - } - case IDC_USERMENU: - { - RECT rc; - HMENU hMenu = (HMENU)CallService(MS_CLIST_MENUBUILDCONTACT,(WPARAM)wndData->hContact,0); - - GetWindowRect(GetDlgItem(hwndDlg,IDC_USERMENU),&rc); - TrackPopupMenu(hMenu,0,rc.left,rc.bottom,0,hwndDlg,NULL); - DestroyMenu(hMenu); - break; - } - case IDC_HISTORY: - CallService(MS_HISTORY_SHOWCONTACTHISTORY,(WPARAM)wndData->hContact,0); - break; - - case IDC_DETAILS: - CallService(MS_USERINFO_SHOWDIALOG,(WPARAM)wndData->hContact,0); - break; - - case IDC_ADD: - DialogAddContactExecute(hwndDlg, wndData->hContact); - break; - } - break; - } - case HM_EVENTSENT: - { - ACKDATA *ack=(ACKDATA*)lParam; - DBEVENTINFO dbei={0}; - - if (ack->type != ACKTYPE_CONTACTS) break; - - TAckData* ackData = gaAckData.Get(ack->hProcess); - - if (ackData == NULL) break; // on unknown hprocc go away - - if (ackData->hContact != ack->hContact) break; // this is not ours, strange - - if (ack->result == ACKRESULT_FAILED) - { // some process failed, show error dialog - KillTimer(hwndDlg, TIMERID_MSGSEND); - wndData->ShowErrorDlg(hwndDlg, (char *)ack->lParam, TRUE); - // ackData get used in error handling, released there - break; - } - - dbei.cbSize = sizeof(dbei); - dbei.szModule =GetContactProto(ackData->hContact); - dbei.eventType = EVENTTYPE_CONTACTS; - dbei.flags = DBEF_SENT| DBEF_UTF; - dbei.timestamp = time(NULL); - //make blob - TCTSend* maSend = (TCTSend*)_alloca(ackData->nContacts*sizeof(TCTSend)); - ZeroMemory(maSend, ackData->nContacts*sizeof(TCTSend)); - dbei.cbBlob=0; - char* pBlob; - int i; - for (i=0; inContacts; i++) - { // prepare data & count size - maSend[i].mcaNick = make_utf8_string((WCHAR*)GetContactDisplayNameT(ackData->aContacts[i])); - maSend[i].mcaUIN = GetContactUID(ackData->aContacts[i], FALSE); - dbei.cbBlob += (DWORD)strlennull(maSend[i].mcaUIN) + (DWORD)strlennull((char*)maSend[i].mcaNick) + 2; - } - dbei.pBlob = (PBYTE)_alloca(dbei.cbBlob); - for (i=0, pBlob=(char*)dbei.pBlob; i < ackData->nContacts; i++) - { - strcpy(pBlob, (char*)maSend[i].mcaNick); - pBlob += strlennull(pBlob) + 1; - strcpy(pBlob, maSend[i].mcaUIN); - pBlob += strlennull(pBlob) + 1; - } - db_event_add(ackData->hContact, &dbei); - gaAckData.Remove(ack->hProcess); // do not release here, still needed - wndData->uacklist.Remove(ack->hProcess); // packet confirmed - for (i=0; inContacts; i++) - { - SAFE_FREE((void**)&maSend[i].mcaUIN); - SAFE_FREE((void**)&maSend[i].mcaNick); - } - delete ackData; // all done, release structure - if (!wndData->uacklist.Count) - { - SkinPlaySound("SentContacts"); - KillTimer(hwndDlg, TIMERID_MSGSEND); - - if (wndData->hError) - SendMessageT(wndData->hError, DM_ERRORDECIDED, MSGERROR_DONE, 0); - - SendMessageT(hwndDlg, WM_CLOSE, 0, 0); // all packets confirmed, close the dialog - } - break; - } - - case WM_CLOSE: - { - wndData->UnhookProtoAck(); - DestroyWindow(hwndDlg); - break; - } - case WM_DESTROY: - { - int i; - for (i = 0; i < SIZEOF(wndData->hIcons); i++) - DestroyIcon(wndData->hIcons[i]); - WindowList_Remove(ghSendWindowList, hwndDlg); - delete wndData; - break; - } - case WM_MEASUREITEM: - return CallService(MS_CLIST_MENUMEASUREITEM,wParam,lParam); - - case WM_DRAWITEM: - { - DrawProtocolIcon(hwndDlg, lParam, wndData->hContact); - return CallService(MS_CLIST_MENUDRAWITEM,wParam,lParam); - } - case DM_UPDATETITLE: - { - UpdateDialogTitle(hwndDlg, wndData?wndData->hContact:NULL, "Send Contacts to"); - if (wndData) - UpdateDialogAddButton(hwndDlg, wndData->hContact); - break; - } - } - - return FALSE; + TSendContactsData* wndData = (TSendContactsData*)GetWindowLongPtr(hwndDlg, DWLP_USER); + + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_CONTACTS))); + ResetListOptions(GetDlgItem(hwndDlg, IDC_LIST)); + SetAllContactChecks(GetDlgItem(hwndDlg, IDC_LIST), (HANDLE)lParam); + WindowList_Add(ghSendWindowList, hwndDlg, (HANDLE)lParam); + wndData = new TSendContactsData((HANDLE)lParam); + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG)wndData); + // new dlg init + wndData->hIcons[0] = InitMButton(hwndDlg, IDC_ADD, MAKEINTRESOURCEA(IDI_ADDCONTACT), LPGEN("Add Contact Permanently to List")); + wndData->hIcons[1] = InitMButton(hwndDlg, IDC_DETAILS, MAKEINTRESOURCEA(IDI_USERDETAILS), LPGEN("View User's Details")); + wndData->hIcons[2] = InitMButton(hwndDlg, IDC_HISTORY, MAKEINTRESOURCEA(IDI_HISTORY), LPGEN("View User's History")); + wndData->hIcons[3] = InitMButton(hwndDlg, IDC_USERMENU, MAKEINTRESOURCEA(IDI_DOWNARROW), LPGEN("User Menu")); + + SendMessage(hwndDlg, DM_UPDATETITLE, 0, 0); + // new dialog init done + return TRUE; + + case WM_SETFOCUS: + SetFocus(GetDlgItem(hwndDlg, IDC_LIST)); + break; + + case WM_NOTIFY: + if (((LPNMHDR)lParam)->idFrom == IDC_LIST) { + switch (((LPNMHDR)lParam)->code) { + case CLN_NEWCONTACT: + case CLN_LISTREBUILT: // rebuild list + if (wndData) SetAllContactChecks(GetDlgItem(hwndDlg, IDC_LIST), wndData->hContact); + case CLN_OPTIONSCHANGED: + ResetListOptions(GetDlgItem(hwndDlg, IDC_LIST)); + break; + } + } + break; + + case WM_TIMER: + if (wParam == TIMERID_MSGSEND) { + KillTimer(hwndDlg, wParam); + wndData->ShowErrorDlg(hwndDlg, "The contacts send timed out.", TRUE); + } + break; + + case DM_ERRORDECIDED: + EnableWindow(hwndDlg, TRUE); + wndData->hError = NULL; + switch (wParam) { + case MSGERROR_CANCEL: + wndData->UnhookProtoAck(); + if (wndData->uacklist.Count) { + for (int i = 0; i < wndData->uacklist.Count; i++) + delete gaAckData.Remove(wndData->uacklist.Items[i]); // remove our ackdata & release structure + + mir_free(wndData->uacklist.Items); + wndData->uacklist.Items = NULL; + wndData->uacklist.Count = 0; + } + EnableDlgItem(hwndDlg, IDOK, TRUE); + EnableDlgItem(hwndDlg, IDC_LIST, TRUE); + ShowWindow(hwndDlg, SW_SHOWNORMAL); + SetFocus(GetDlgItem(hwndDlg, IDC_LIST)); + break; + + case MSGERROR_DONE: + // contacts were delivered succesfully after timeout + SetFocus(GetDlgItem(hwndDlg, IDC_LIST)); + wndData->UnhookProtoAck(); + break; + + case MSGERROR_RETRY:// resend timeouted packets + for (int i = 0; i < wndData->uacklist.Count; i++) { + TAckData *lla = gaAckData.Remove(wndData->uacklist.Items[i]); + HANDLE hProcc = (HANDLE)CallContactService(wndData->hContact, PSS_CONTACTS, MAKEWPARAM(0, lla->nContacts), (LPARAM)lla->aContacts); + + if (!hProcc) { // if fatal do not include + wndData->uacklist.Remove(wndData->uacklist.Items[i]); + delete lla; // release the structure + continue; + } + else { + // update process code + wndData->uacklist.Items[i] = hProcc; + gaAckData.Add(hProcc, lla); + } + }// collect TAckData for our window, resend + break; + } + break; + + case WM_COMMAND: + if (!lParam && CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)wndData->hContact)) + break; + + switch (LOWORD(wParam)) { + case IDOK: + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDOK))) { + HANDLE hContact, hItem; + wndData->ClearContacts(); // do not include contacts twice + + HWND hList = GetDlgItem(hwndDlg, IDC_LIST); + hContact = FindFirstClistContact(hList, &hItem); + while (hContact) + { + if (SendMessage(hList, CLM_GETCHECKMARK, (WPARAM)hItem, 0)) + { // build list of contacts to send + wndData->AddContact(hContact); + } + hContact = FindNextClistContact(hList, hContact, &hItem); + } + /* send contacts */ + if (!wndData->SendContacts(hwndDlg)) + break; + + SetTimer(hwndDlg, TIMERID_MSGSEND, db_get_dw(NULL, "SRMsg", "MessageTimeout", TIMEOUT_MSGSEND), NULL); + } + break; + + case IDCANCEL: + DestroyWindow(hwndDlg); + break; + + case ID_SELECTALL: + { + // select all contacts + HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST); + HANDLE hItem, hContact = FindFirstClistContact(hwndList, &hItem); + while (hContact) { + SendMessage(hwndList, CLM_SETCHECKMARK, (WPARAM)hItem, 1); + hContact = FindNextClistContact(hwndList, hContact, &hItem); + } + } + break; + + case IDC_USERMENU: + { + RECT rc; + HMENU hMenu = (HMENU)CallService(MS_CLIST_MENUBUILDCONTACT, (WPARAM)wndData->hContact, 0); + + GetWindowRect(GetDlgItem(hwndDlg, IDC_USERMENU), &rc); + TrackPopupMenu(hMenu, 0, rc.left, rc.bottom, 0, hwndDlg, NULL); + DestroyMenu(hMenu); + } + break; + + case IDC_HISTORY: + CallService(MS_HISTORY_SHOWCONTACTHISTORY, (WPARAM)wndData->hContact, 0); + break; + + case IDC_DETAILS: + CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)wndData->hContact, 0); + break; + + case IDC_ADD: + DialogAddContactExecute(hwndDlg, wndData->hContact); + break; + } + break; + + case HM_EVENTSENT: + { + ACKDATA *ack = (ACKDATA*)lParam; + if (ack->type != ACKTYPE_CONTACTS) + break; + + TAckData *ackData = gaAckData.Get(ack->hProcess); + if (ackData == NULL) + break; // on unknown hprocc go away + + if (ackData->hContact != ack->hContact) + break; // this is not ours, strange + + if (ack->result == ACKRESULT_FAILED) { + // some process failed, show error dialog + KillTimer(hwndDlg, TIMERID_MSGSEND); + wndData->ShowErrorDlg(hwndDlg, (char *)ack->lParam, TRUE); + // ackData get used in error handling, released there + break; + } + + DBEVENTINFO dbei = { sizeof(dbei) }; + dbei.szModule = GetContactProto(ackData->hContact); + dbei.eventType = EVENTTYPE_CONTACTS; + dbei.flags = DBEF_SENT | DBEF_UTF; + dbei.timestamp = time(NULL); + //make blob + TCTSend* maSend = (TCTSend*)_alloca(ackData->nContacts*sizeof(TCTSend)); + ZeroMemory(maSend, ackData->nContacts*sizeof(TCTSend)); + dbei.cbBlob = 0; + char* pBlob; + int i; + for (i = 0; i < ackData->nContacts; i++) { + // prepare data & count size + maSend[i].mcaNick = mir_utf8encodeT(pcli->pfnGetContactDisplayName(ackData->aContacts[i], 0)); + maSend[i].mcaUIN = mir_utf8encodeT(ptrT(GetContactUID(ackData->aContacts[i]))); + dbei.cbBlob += (DWORD)strlennull(maSend[i].mcaUIN) + (DWORD)strlennull((char*)maSend[i].mcaNick) + 2; + } + dbei.pBlob = (PBYTE)_alloca(dbei.cbBlob); + for (i = 0, pBlob = (char*)dbei.pBlob; i < ackData->nContacts; i++) { + strcpy(pBlob, (char*)maSend[i].mcaNick); + pBlob += strlennull(pBlob) + 1; + strcpy(pBlob, maSend[i].mcaUIN); + pBlob += strlennull(pBlob) + 1; + } + db_event_add(ackData->hContact, &dbei); + gaAckData.Remove(ack->hProcess); // do not release here, still needed + wndData->uacklist.Remove(ack->hProcess); // packet confirmed + for (i = 0; i < ackData->nContacts; i++) { + mir_free(maSend[i].mcaUIN); + mir_free(maSend[i].mcaNick); + } + delete ackData; // all done, release structure + if (!wndData->uacklist.Count) { + SkinPlaySound("SentContacts"); + KillTimer(hwndDlg, TIMERID_MSGSEND); + + if (wndData->hError) + SendMessage(wndData->hError, DM_ERRORDECIDED, MSGERROR_DONE, 0); + + SendMessage(hwndDlg, WM_CLOSE, 0, 0); // all packets confirmed, close the dialog + } + } + break; + + case WM_MEASUREITEM: + return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); + + case WM_DRAWITEM: + DrawProtocolIcon(hwndDlg, lParam, wndData->hContact); + return CallService(MS_CLIST_MENUDRAWITEM, wParam, lParam); + + case DM_UPDATETITLE: + UpdateDialogTitle(hwndDlg, wndData ? wndData->hContact : NULL, TranslateT("Send Contacts to")); + if (wndData) + UpdateDialogAddButton(hwndDlg, wndData->hContact); + break; + + case WM_CLOSE: + wndData->UnhookProtoAck(); + DestroyWindow(hwndDlg); + break; + + case WM_DESTROY: + for (int i = 0; i < SIZEOF(wndData->hIcons); i++) + DestroyIcon(wndData->hIcons[i]); + WindowList_Remove(ghSendWindowList, hwndDlg); + delete wndData; + break; + } + + return FALSE; } @@ -538,49 +503,43 @@ INT_PTR CALLBACK SendDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPar INT_PTR CALLBACK ErrorDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { - switch(msg) - { - case WM_INITDIALOG: - { - RECT rc, rcParent; - - TranslateDialogDefault(hwndDlg); - - if (lParam) - { - WCHAR tmp[MAX_PATH]; - - SetDlgItemTextT(hwndDlg, IDC_ERRORTEXT, SRCTranslateT((char*)lParam, tmp)); - } - GetWindowRect(hwndDlg, &rc); - GetWindowRect(GetParent(hwndDlg), &rcParent); - SetWindowPos(hwndDlg, 0, - (rcParent.left+rcParent.right-(rc.right-rc.left))/2, - (rcParent.top+rcParent.bottom-(rc.bottom-rc.top))/2, - 0, 0, SWP_NOZORDER|SWP_NOSIZE); - } - return TRUE; - - case WM_COMMAND: - switch(LOWORD(wParam)) - { - case IDOK: - SendMessageT(GetParent(hwndDlg), DM_ERRORDECIDED, MSGERROR_RETRY, 0); - DestroyWindow(hwndDlg); - break; - - case IDCANCEL: - SendMessageT(GetParent(hwndDlg), DM_ERRORDECIDED, MSGERROR_CANCEL, 0); - DestroyWindow(hwndDlg); - break; - } - break; - case DM_ERRORDECIDED: - if (wParam!=MSGERROR_DONE) break; - SendMessageT(GetParent(hwndDlg), DM_ERRORDECIDED, MSGERROR_DONE, 0); - DestroyWindow(hwndDlg); - break; - } - - return FALSE; + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + { + if (lParam) + SetDlgItemText(hwndDlg, IDC_ERRORTEXT, TranslateTS((TCHAR*)lParam)); + + RECT rc, rcParent; + GetWindowRect(hwndDlg, &rc); + GetWindowRect(GetParent(hwndDlg), &rcParent); + SetWindowPos(hwndDlg, 0, + (rcParent.left + rcParent.right - (rc.right - rc.left)) / 2, + (rcParent.top + rcParent.bottom - (rc.bottom - rc.top)) / 2, + 0, 0, SWP_NOZORDER | SWP_NOSIZE); + } + return TRUE; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: + SendMessage(GetParent(hwndDlg), DM_ERRORDECIDED, MSGERROR_RETRY, 0); + DestroyWindow(hwndDlg); + break; + + case IDCANCEL: + SendMessage(GetParent(hwndDlg), DM_ERRORDECIDED, MSGERROR_CANCEL, 0); + DestroyWindow(hwndDlg); + break; + } + break; + + case DM_ERRORDECIDED: + if (wParam != MSGERROR_DONE) break; + SendMessage(GetParent(hwndDlg), DM_ERRORDECIDED, MSGERROR_DONE, 0); + DestroyWindow(hwndDlg); + break; + } + + return FALSE; } diff --git a/plugins/ContactsPlus/src/send.h b/plugins/ContactsPlus/src/send.h index c8580a4eb1..73908b4ecf 100644 --- a/plugins/ContactsPlus/src/send.h +++ b/plugins/ContactsPlus/src/send.h @@ -68,19 +68,20 @@ struct TSendContactsData { // hope uack is released automaticly, static propert ~TSendContactsData(); }; -struct TAckData { +struct TAckData +{ HANDLE hContact; // to whom was it sent HANDLE* aContacts; // obj int nContacts; // how many TAckData(HANDLE contact) { hContact = contact; aContacts = NULL; nContacts = 0;}; - ~TAckData() { if (nContacts) SAFE_FREE((void**)&aContacts); } + ~TAckData() { mir_free(aContacts); } }; typedef TAckData* PAckData; struct TCTSend { char* mcaUIN; - unsigned char* mcaNick; + char* mcaNick; }; struct gAckItem { // some shit here @@ -94,10 +95,10 @@ struct gAckList { gAckItem** Items; int Count; TAckData* Get(HANDLE hProcc) { for (int i=0; ihProcc==hProcc) { return Items[i]->ackData; }; return NULL; }; - TAckData* Add(HANDLE hProcc, TAckData* ackData) { Items=(gAckItem**)realloc(Items, (Count+1)*sizeof(gAckItem*)); Items[Count]=new gAckItem(hProcc, ackData); Count++; return ackData; }; + TAckData* Add(HANDLE hProcc, TAckData* ackData) { Items=(gAckItem**)mir_realloc(Items, (Count+1)*sizeof(gAckItem*)); Items[Count]=new gAckItem(hProcc, ackData); Count++; return ackData; }; TAckData* Remove(HANDLE hProcc) { for (int i=0; ihProcc==hProcc) { TAckData* data=Items[i]->ackData; delete Items[i]; memmove(Items+i, Items+i+1, (Count-i-1)*sizeof(gAckItem*)); Count--; return data; }; return NULL; }; gAckList() { Count = 0; Items = NULL; } - ~gAckList() { if (Count) { for (int i=0; ihwndItem==GetDlgItem(hwndDlg, IDC_PROTOCOL)) - { - HICON hIcon = LoadContactProtoIcon(hContact); - if (hIcon) - { - DrawIconEx(dis->hDC,dis->rcItem.left,dis->rcItem.top,hIcon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL); - DestroyIcon(hIcon); - } - } + LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; + + if (dis->hwndItem == GetDlgItem(hwndDlg, IDC_PROTOCOL)) + { + HICON hIcon = LoadContactProtoIcon(hContact); + if (hIcon) + { + DrawIconEx(dis->hDC, dis->rcItem.left, dis->rcItem.top, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL); + DestroyIcon(hIcon); + } + } } -void UpdateDialogTitle(HWND hwndDlg, HANDLE hContact, char* pszTitleStart) +void UpdateDialogTitle(HWND hwndDlg, HANDLE hContact, TCHAR *pszTitleStart) { - TCHAR newtitle[512]; - WCHAR str[MAX_PATH]; - TCHAR *oldTitle; - TCHAR *szStatus; - char *szProto; - - if (hContact) - { - szProto =GetContactProto(hContact); - if (szProto) - { - TCHAR *uid = GetContactUID(hContact, TRUE); - TCHAR *contactName = GetContactDisplayNameT(hContact); - - oldTitle = GetDlgItemTextT(hwndDlg, IDC_NAME); - - if (strcmpT(uid?uid:contactName, oldTitle)) - SetDlgItemTextT(hwndDlg, IDC_NAME, uid?uid:contactName); - - szStatus = pcli->pfnGetStatusModeDescription(szProto == NULL ? ID_STATUS_OFFLINE : db_get_w(hContact,szProto,"Status",ID_STATUS_OFFLINE), 0); - mir_sntprintf(newtitle, 256, "%s %s (%s)", SRCTranslateT(pszTitleStart, str), contactName, szStatus); - - SAFE_FREE((void**)&uid); - SAFE_FREE((void**)&oldTitle); - } - else - strncpyT(newtitle, SRCTranslateT(pszTitleStart, str), 256); - } - else - strncpyT(newtitle, SRCTranslateT(pszTitleStart, str), 256); - - oldTitle = GetWindowTextT(hwndDlg); - - if (strcmpT(newtitle, oldTitle)) - SetWindowTextT(hwndDlg, newtitle); - - SAFE_FREE((void**)&oldTitle); + TCHAR newtitle[512]; + lstrcpyn(newtitle, TranslateTS(pszTitleStart), SIZEOF(newtitle)); + + if (hContact) { + char *szProto = GetContactProto(hContact); + if (szProto) { + ptrT uid(GetContactUID(hContact)); + TCHAR *contactName = pcli->pfnGetContactDisplayName(hContact, 0); + + TCHAR oldTitle[MAX_PATH]; + GetDlgItemText(hwndDlg, IDC_NAME, oldTitle, SIZEOF(oldTitle)); + + if (lstrcmp(uid ? uid : contactName, oldTitle)) + SetDlgItemText(hwndDlg, IDC_NAME, uid ? uid : contactName); + + TCHAR *szStatus = pcli->pfnGetStatusModeDescription(szProto == NULL ? ID_STATUS_OFFLINE : db_get_w(hContact, szProto, "Status", ID_STATUS_OFFLINE), 0); + mir_sntprintf(newtitle, 256, _T("%s %s (%s)"), TranslateTS(pszTitleStart), contactName, szStatus); + } + } + + SetWindowText(hwndDlg, newtitle); } void UpdateDialogAddButton(HWND hwndDlg, HANDLE hContact) { - int bVisible = db_get_b(hContact,"CList","NotOnList",0); - - ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), bVisible?SW_SHOW:SW_HIDE); + int bVisible = db_get_b(hContact, "CList", "NotOnList", 0); + ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), bVisible ? SW_SHOW : SW_HIDE); } HICON InitMButton(HWND hDlg, int idButton, LPCSTR szIcon, char *szTip) { - HWND hButton = GetDlgItem(hDlg, idButton); - HICON hIcon = (HICON)LoadImage(GetModuleHandle(NULL),szIcon,IMAGE_ICON,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0); + HWND hButton = GetDlgItem(hDlg, idButton); + HICON hIcon = (HICON)LoadImageA(GetModuleHandle(NULL), szIcon, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0); - SendMessageT(hButton, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); - SendMessageT(hButton, BUTTONSETASFLATBTN, TRUE, 0); - SendMessageT(hButton, BUTTONADDTOOLTIP, (WPARAM)szTip, 0); - - return hIcon; + SendMessage(hButton, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); + SendMessage(hButton, BUTTONSETASFLATBTN, TRUE, 0); + SendMessage(hButton, BUTTONADDTOOLTIP, (WPARAM)szTip, 0); + return hIcon; } HICON LoadContactProtoIcon(HANDLE hContact) { - char* szProto =GetContactProto(hContact); - if (szProto) - return (HICON)CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0); - return NULL; + char *szProto = GetContactProto(hContact); + if (szProto) + return (HICON)CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0); + return NULL; } void EnableDlgItem(HWND hwndDlg, UINT control, int state) { - EnableWindow(GetDlgItem(hwndDlg, control), state); + EnableWindow(GetDlgItem(hwndDlg, control), state); } -LRESULT SendMessageT(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - return SendMessageW(hWnd, Msg, wParam, lParam); -} - TCHAR* GetWindowTextT(HWND hWnd) { - int len = GetWindowTextLengthW(hWnd) + 1; - WCHAR* txt = (WCHAR*)malloc(len * sizeof(WCHAR)); + int len = GetWindowTextLength(hWnd) + 1; + TCHAR* txt = (TCHAR*)mir_alloc(len * sizeof(TCHAR)); if (txt) { txt[0] = 0; - GetWindowTextW(hWnd, txt, len); + GetWindowText(hWnd, txt, len); } - return (TCHAR*)txt; -} - -BOOL SetWindowTextT(HWND hWnd, TCHAR* lpString) -{ - return SetWindowTextW(hWnd, (WCHAR*)lpString); -} - -TCHAR* GetDlgItemTextT(HWND hDlg, int nIDDlgItem) -{ - return GetWindowTextT(GetDlgItem(hDlg, nIDDlgItem)); -} - -BOOL SetDlgItemTextT(HWND hDlg, int nIDDlgItem, TCHAR* lpString) -{ - return SetWindowTextT(GetDlgItem(hDlg, nIDDlgItem), lpString); -} - -HWND CreateDialogParamT(HINSTANCE hInstance, const char* szTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam) -{ - return CreateDialogParamW(hInstance, (LPCWSTR)szTemplate, hWndParent, lpDialogFunc, dwInitParam); -} - -int ListView_InsertColumnT(HWND hwnd, int iCol, const LPLVCOLUMN pcol) -{ - return SendMessageT(hwnd, LVM_INSERTCOLUMNW, (WPARAM)iCol, (LPARAM)pcol); -} - -void ListView_SetItemTextT(HWND hwnd, int i, int iSubItem, TCHAR* pszText) -{ - LV_ITEM lvi = {0}; - - lvi.iSubItem = iSubItem; - lvi.pszText = pszText; - SendMessageT(hwnd, LVM_SETITEMTEXTW, (WPARAM)i, (LPARAM)&lvi); -} - - - -size_t __fastcall strlenT(const TCHAR *string) -{ - if (string) - return wcslen((WCHAR*)string); - return 0; + return txt; } TCHAR* __fastcall strdupT(const TCHAR *string) { if (string) - return (TCHAR*)wcsdup((WCHAR*)string); + return (TCHAR*)wcsdup((TCHAR*)string); return NULL; } - -int __fastcall strcmpT(const TCHAR *string1, const TCHAR *string2) -{ - if (!string1 || !string2) return 1; - - return wcscmp((WCHAR*)string1, (WCHAR*)string2); -} - -TCHAR* __fastcall strcpyT(TCHAR* dest, const TCHAR* src) -{ - if (src) - return (TCHAR*)wcscpy((WCHAR*)dest, (WCHAR*)src); - return dest; -} - -TCHAR* __fastcall strncpyT(TCHAR* dest, const TCHAR* src, size_t len) -{ - if (src) - return (TCHAR*)wcsncpy((WCHAR*)dest, (WCHAR*)src, len); - return dest; -} - -TCHAR* __fastcall strcatT(TCHAR* dest, const TCHAR* src) -{ - if (src) - return (TCHAR*)wcscat((WCHAR*)dest, (WCHAR*)src); - return dest; -} - -TCHAR* __fastcall SRCTranslateT(const char* src, const WCHAR* unibuf) -{ // this takes Ascii strings only!!! - char* szRes = NULL; - - if (!strlennull(src)) - { // for the case of empty strings - return ""; - } - - WCHAR *unicode; - int wchars, err; - - wchars = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, - (int)strlennull(src), NULL, 0); - - if (wchars == 0) return NULL; // Failure - - unicode = (WCHAR*)unibuf; - if (!unicode) - unicode = (WCHAR*)malloc((wchars + 1) * sizeof(WCHAR)); - - unicode[wchars] = 0; - - err = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, - (int)strlennull(src), unicode, wchars); - if (err != wchars) return NULL; // Failure - - return (TCHAR*)TranslateW(unicode); -} - -static BOOL bHasCP_UTF8 = FALSE; - - -void InitI18N(void) -{ - CPINFO CPInfo; - - - bHasCP_UTF8 = GetCPInfo(CP_UTF8, &CPInfo); -} - - -// Scans a string encoded in UTF-8 to verify that it contains -// only valid sequences. It will return 1 if the string contains -// only legitimate encoding sequences; otherwise it will return 0; -// From 'Secure Programming Cookbook', John Viega & Matt Messier, 2003 -int UTF8_IsValid(const unsigned char* pszInput) -{ - int nb, i; - const unsigned char* c = pszInput; - - if (!pszInput) return 0; - - for (c = pszInput; *c; c += (nb + 1)) - { - if (!(*c & 0x80)) - nb = 0; - else if ((*c & 0xc0) == 0x80) return 0; - else if ((*c & 0xe0) == 0xc0) nb = 1; - else if ((*c & 0xf0) == 0xe0) nb = 2; - else if ((*c & 0xf8) == 0xf0) nb = 3; - else if ((*c & 0xfc) == 0xf8) nb = 4; - else if ((*c & 0xfe) == 0xfc) nb = 5; - - for (i = 1; i<=nb; i++) // we this forward, do not cross end of string - if ((*(c + i) & 0xc0) != 0x80) - return 0; - } - - return 1; -} - - -/* - * The following UTF8 routines are - * - * Copyright (C) 2001 Peter Harris - * Copyright (C) 2001 Edmund Grimley Evans - * - * under a GPL license - * - * -------------------------------------------------------------- - * Convert a string between UTF-8 and the locale's charset. - * Invalid bytes are replaced by '#', and characters that are - * not available in the target encoding are replaced by '?'. - * - * If the locale's charset is not set explicitly then it is - * obtained using nl_langinfo(CODESET), where available, the - * environment variable CHARSET, or assumed to be US-ASCII. - * - * Return value of conversion functions: - * - * -1 : memory allocation failed - * 0 : data was converted exactly - * 1 : valid data was converted approximately (using '?') - * 2 : input was invalid (but still converted, using '#') - * 3 : unknown encoding (but still converted, using '?') - */ - - - -/* - * Convert a string between UTF-8 and the locale's charset. - */ -unsigned char *make_utf8_string(const wchar_t *unicode) -{ - int size = 0; - int index = 0; - int out_index = 0; - unsigned char* out; - unsigned short c; - - if (!unicode) return NULL; - - /* first calculate the size of the target string */ - c = unicode[index++]; - while (c) - { - if (c < 0x0080) - size += 1; - else if (c < 0x0800) - size += 2; - else - size += 3; - c = unicode[index++]; - } - - out = (unsigned char*)malloc(size + 1); - if (out == NULL) - return NULL; - index = 0; - - c = unicode[index++]; - while (c) - { - if (c < 0x080) - { - out[out_index++] = (unsigned char)c; - } - else if (c < 0x800) - { - out[out_index++] = 0xc0 | (c >> 6); - out[out_index++] = 0x80 | (c & 0x3f); - } - else - { - out[out_index++] = 0xe0 | (c >> 12); - out[out_index++] = 0x80 | ((c >> 6) & 0x3f); - out[out_index++] = 0x80 | (c & 0x3f); - } - c = unicode[index++]; - } - out[out_index] = 0x00; - - return out; -} - - - -WCHAR *make_unicode_string(const unsigned char *utf8) -{ - int size = 0, index = 0, out_index = 0; - wchar_t *out; - unsigned char c; - - if (!utf8) return NULL; - - /* first calculate the size of the target string */ - c = utf8[index++]; - while (c) - { - if ((c & 0x80) == 0) - { - index += 0; - } - else if ((c & 0xe0) == 0xe0) - { - index += 2; - } - else - { - index += 1; - } - size += 1; - c = utf8[index++]; - } - - out = (wchar_t*)malloc((size + 1) * sizeof(wchar_t)); - if (out == NULL) - return NULL; - index = 0; - - c = utf8[index++]; - while (c) - { - if ((c & 0x80) == 0) - { - out[out_index++] = c; - } - else if ((c & 0xe0) == 0xe0) - { - out[out_index] = (c & 0x1F) << 12; - c = utf8[index++]; - out[out_index] |= (c & 0x3F) << 6; - c = utf8[index++]; - out[out_index++] |= (c & 0x3F); - } - else - { - out[out_index] = (c & 0x3F) << 6; - c = utf8[index++]; - out[out_index++] |= (c & 0x3F); - } - c = utf8[index++]; - } - out[out_index] = 0; - - return out; -} - - -// Returns 0 on error, 1 on success -static int utf8_decode(const unsigned char *from, char **to) -{ - int nResult = 0; - -// _ASSERTE(!(*to)); // You passed a non-zero pointer, make sure it doesnt point to unfreed memory - - // Validate the string - if (!UTF8_IsValid(from)) - return 0; - - // Use the native conversion routines when available - if (bHasCP_UTF8) - { - WCHAR *wszTemp = NULL; - int inlen = (int)strlennull((char*)from); - - wszTemp = (WCHAR *)_alloca(sizeof(WCHAR) * (inlen + 1)); - - // Convert the UTF-8 string to UCS - if (MultiByteToWideChar(CP_UTF8, 0, (char*)from, -1, wszTemp, inlen + 1)) - { - // Convert the UCS string to local ANSI codepage - *to = (char*)malloc(inlen+1); - if (WideCharToMultiByte(CP_ACP, 0, wszTemp, -1, *to, inlen+1, NULL, NULL)) - { - nResult = 1; - } - else - { - SAFE_FREE((void**)to); - } - } - } - else - { - wchar_t *unicode; - int chars; - int err; - - unicode = make_unicode_string(from); - if (unicode == NULL) - { -// fprintf(stderr, "Out of memory processing string from UTF8 to UNICODE16\n"); - return 0; - } - - chars = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, unicode, -1, NULL, 0, NULL, NULL); - - if(chars == 0) - { -// fprintf(stderr, "Unicode translation error %d\n", GetLastError()); - SAFE_FREE((void**)&unicode); - return 0; - } - - *to = (char*)malloc((chars + 1)*sizeof(unsigned char)); - if (*to == NULL) - { -// fprintf(stderr, "Out of memory processing string to local charset\n"); - SAFE_FREE((void**)&unicode); - return 0; - } - - err = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, unicode, -1, *to, chars, NULL, NULL); - if (err != chars) - { -// fprintf(stderr, "Unicode translation error %d\n", GetLastError()); - SAFE_FREE((void**)&unicode); - SAFE_FREE((void**)to); - return 0; - } - - SAFE_FREE((void**)&unicode); - - nResult = 1; - } - - return nResult; -} - - - -TCHAR* ansi_to_tchar(const char* src, int codepage) -{ - WCHAR *unicode; - int wchars, err; - - wchars = MultiByteToWideChar(codepage, MB_PRECOMPOSED, src, (int)strlennull(src), NULL, 0); - - if (wchars == 0) return NULL; // Failure - - unicode = (WCHAR*)malloc((wchars + 1) * sizeof(WCHAR)); - unicode[wchars] = 0; - - err = MultiByteToWideChar(codepage, MB_PRECOMPOSED, src, (int)strlennull(src), unicode, wchars); - if (err != wchars) - { - SAFE_FREE((void**)&unicode); - return NULL; // Failure - } - - return (TCHAR*)unicode; -} - -char* tchar_to_ansi(const TCHAR* src) -{ - char *ansi; - int chars; - int err; - - chars = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, (WCHAR*)src, -1, NULL, 0, NULL, NULL); - - if (chars == 0) return NULL; // Failure - - ansi = (char*)malloc((chars + 1)*sizeof(char)); - if (ansi == NULL) return NULL; // Failure - - err = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, (WCHAR*)src, -1, ansi, chars, NULL, NULL); - if (err != chars) - { - SAFE_FREE((void**)&ansi); - return NULL; - } - return ansi; -} - -TCHAR* utf8_to_tchar(const unsigned char* utf) -{ - return (TCHAR*)make_unicode_string(utf); -} \ No newline at end of file diff --git a/plugins/ContactsPlus/src/utils.h b/plugins/ContactsPlus/src/utils.h index adb29ff1fd..f89ee6ca9b 100644 --- a/plugins/ContactsPlus/src/utils.h +++ b/plugins/ContactsPlus/src/utils.h @@ -24,24 +24,17 @@ #ifndef __UTILS_H #define __UTILS_H - extern HINSTANCE hInst; // utils.cpp -void __fastcall SAFE_FREE(void** p); size_t __fastcall strlennull(const char *string); int __fastcall strcmpnull(const char *str1, const char *str2); char* __fastcall null_strdup(const char *string); -char *GetContactUID(HANDLE hContact, int bTchar); -TCHAR *GetContactDisplayNameT(HANDLE hContact); - -int DBGetContactSettingT(HANDLE hContact, const char *szModule, const char* szSetting, DBVARIANT *dbv); -TCHAR* DBGetContactSettingStringT(HANDLE hContact, const char *szModule,const char* szSetting, TCHAR* szDef); -int DBWriteContactSettingStringT(HANDLE hContact, const char *szModule, const char* szSetting, TCHAR* szValue); +TCHAR* GetContactUID(HANDLE hContact); void DrawProtocolIcon(HWND hwndDlg, LPARAM lParam, HANDLE hContact); -void UpdateDialogTitle(HWND hwndDlg, HANDLE hContact, char* pszTitleStart); +void UpdateDialogTitle(HWND hwndDlg, HANDLE hContact, TCHAR *pszTitleStart); void UpdateDialogAddButton(HWND hwndDlg, HANDLE hContact); HICON InitMButton(HWND hDlg, int idButton, LPCSTR szIcon, char* szTip); @@ -52,30 +45,4 @@ HICON LoadContactProtoIcon(HANDLE hContact); void EnableDlgItem(HWND hwndDlg, UINT control, int state); -/// Unicode 2 in 1 Framework -size_t __fastcall strlenT(const TCHAR *string); -TCHAR* __fastcall strdupT(const TCHAR *string); -int __fastcall strcmpT(const TCHAR *string1, const TCHAR *string2); -TCHAR* __fastcall strcpyT(TCHAR* dest, const TCHAR* src); -TCHAR* __fastcall strncpyT(TCHAR* dest, const TCHAR* src, size_t len); -TCHAR* __fastcall strcatT(TCHAR* dest, const TCHAR* src); - -LRESULT SendMessageT(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); -TCHAR* GetWindowTextT(HWND hWnd); -BOOL SetWindowTextT(HWND hWnd, TCHAR* lpString); -TCHAR* GetDlgItemTextT(HWND hDlg, int nIDDlgItem); -BOOL SetDlgItemTextT(HWND hDlg, int nIDDlgItem, TCHAR* lpString); -HWND CreateDialogParamT(HINSTANCE hInstance, const char* szTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam); -int ListView_InsertColumnT(HWND hwnd, int iCol, const LPLVCOLUMN pcol); -void ListView_SetItemTextT(HWND hwnd, int i, int iSubItem, TCHAR* pszText); - -TCHAR* __fastcall SRCTranslateT(const char* src, const WCHAR* unibuf); - -void InitI18N(void); -TCHAR* ansi_to_tchar(const char* string, int codepage = CP_ACP); -char* tchar_to_ansi(const TCHAR* src); -TCHAR* utf8_to_tchar(const unsigned char* utf); -unsigned char *make_utf8_string(const wchar_t *unicode); - - #endif /* __UTILS_H */ \ No newline at end of file -- cgit v1.2.3