From 0636a97b72400c3be89919c5dae2c693e7401757 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Mon, 3 Feb 2014 15:57:46 +0000 Subject: fix for one very rare crash in ICQ User Details git-svn-id: http://svn.miranda-ng.org/main/trunk@8028 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/IcqOscarJ/src/changeinfo/editlist.cpp | 163 +++++++++++------------- 1 file changed, 77 insertions(+), 86 deletions(-) (limited to 'protocols/IcqOscarJ/src') diff --git a/protocols/IcqOscarJ/src/changeinfo/editlist.cpp b/protocols/IcqOscarJ/src/changeinfo/editlist.cpp index c4ba1157c0..b18cc30a68 100644 --- a/protocols/IcqOscarJ/src/changeinfo/editlist.cpp +++ b/protocols/IcqOscarJ/src/changeinfo/editlist.cpp @@ -31,22 +31,18 @@ static ChangeInfoData *dataListEdit = NULL; static HWND hwndListEdit = NULL; -static LRESULT CALLBACK ListEditSubclassProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) +static LRESULT CALLBACK ListEditSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - switch(msg) { + switch (msg) { case WM_LBUTTONUP: mir_callNextSubclass(hwnd, ListEditSubclassProc, msg, wParam, lParam); - { - POINT pt; - - pt.x = (short)LOWORD(lParam); - pt.y = (short)HIWORD(lParam); + { + POINT pt = { (short)LOWORD(lParam), (short)HIWORD(lParam) }; ClientToScreen(hwnd, &pt); - if (SendMessage(hwnd, WM_NCHITTEST, 0, MAKELPARAM(pt.x, pt.y)) == HTVSCROLL) break; - } - { - int i = SendMessage(hwnd, LB_GETCURSEL, 0, 0); + if (SendMessage(hwnd, WM_NCHITTEST, 0, MAKELPARAM(pt.x, pt.y)) == HTVSCROLL) + break; + int i = SendMessage(hwnd, LB_GETCURSEL, 0, 0); if (dataListEdit) dataListEdit->EndListEdit(i != LB_ERR); } @@ -54,13 +50,13 @@ static LRESULT CALLBACK ListEditSubclassProc(HWND hwnd,UINT msg,WPARAM wParam,LP case WM_CHAR: if (wParam != '\r') break; - { + { int i = SendMessage(hwnd, LB_GETCURSEL, 0, 0); - if (dataListEdit) dataListEdit->EndListEdit(i != LB_ERR); } return 0; + case WM_KILLFOCUS: if (dataListEdit) dataListEdit->EndListEdit(1); @@ -71,41 +67,38 @@ static LRESULT CALLBACK ListEditSubclassProc(HWND hwnd,UINT msg,WPARAM wParam,LP void ChangeInfoData::BeginListEdit(int iItem, RECT *rc, int iSetting, WORD wVKey) { - int j,n; - POINT pt; - int itemHeight; - char str[MAX_PATH]; - if (dataListEdit) dataListEdit->EndListEdit(0); - pt.x=pt.y=0; - ClientToScreen(hwndList,&pt); - OffsetRect(rc,pt.x,pt.y); - InflateRect(rc,-2,-2); - rc->left-=2; + POINT pt = { 0, 0 }; + ClientToScreen(hwndList, &pt); + OffsetRect(rc, pt.x, pt.y); + InflateRect(rc, -2, -2); + rc->left -= 2; iEditItem = iItem; ListView_RedrawItems(hwndList, iEditItem, iEditItem); UpdateWindow(hwndList); dataListEdit = this; - hwndListEdit = CreateWindowEx(WS_EX_TOOLWINDOW|WS_EX_TOPMOST, _T("LISTBOX"), _T(""), WS_POPUP|WS_BORDER|WS_VSCROLL, rc->left, rc->bottom, rc->right - rc->left, 150, NULL, NULL, hInst, NULL); + hwndListEdit = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, _T("LISTBOX"), _T(""), WS_POPUP | WS_BORDER | WS_VSCROLL, rc->left, rc->bottom, rc->right - rc->left, 150, NULL, NULL, hInst, NULL); SendMessage(hwndListEdit, WM_SETFONT, (WPARAM)hListFont, 0); - itemHeight = SendMessage(hwndListEdit, LB_GETITEMHEIGHT, 0, 0); + int itemHeight = SendMessage(hwndListEdit, LB_GETITEMHEIGHT, 0, 0); FieldNamesItem *list = (FieldNamesItem*)setting[iSetting].pList; - if (list == countryField) - { // some country codes were changed leaving old details uknown, convert it for the user - if (settingData[iSetting].value == 420) settingData[iSetting].value = 42; // conversion of obsolete codes (OMG!) - else if (settingData[iSetting].value == 421) settingData[iSetting].value = 4201; - else if (settingData[iSetting].value == 102) settingData[iSetting].value = 1201; + // some country codes were changed leaving old details uknown, convert it for the user + if (list == countryField) { + if (settingData[iSetting].value == 420) + settingData[iSetting].value = 42; // conversion of obsolete codes (OMG!) + else if (settingData[iSetting].value == 421) + settingData[iSetting].value = 4201; + else if (settingData[iSetting].value == 102) + settingData[iSetting].value = 1201; } - n = ListBoxAddStringUtf(hwndListEdit, "Unspecified"); - for (j=0; ; j++) - if (!list[j].text) - { + int j, n = ListBoxAddStringUtf(hwndListEdit, "Unspecified"); + for (j = 0;; j++) + if (!list[j].text) { SendMessage(hwndListEdit, LB_SETITEMDATA, n, j); if ((settingData[iSetting].value == 0 && list[j].code == 0) || (setting[iSetting].dbType != DBVT_ASCIIZ && settingData[iSetting].value == list[j].code)) @@ -113,66 +106,64 @@ void ChangeInfoData::BeginListEdit(int iItem, RECT *rc, int iSetting, WORD wVKey break; } - for (j=0; list[j].text; j++) - { - n = ListBoxAddStringUtf(hwndListEdit, list[j].text); - SendMessage(hwndListEdit, LB_SETITEMDATA, n, j); - if ((setting[iSetting].dbType == DBVT_ASCIIZ && (!strcmpnull((char*)settingData[iSetting].value, list[j].text)) - || (setting[iSetting].dbType == DBVT_ASCIIZ && (!strcmpnull((char*)settingData[iSetting].value, ICQTranslateUtfStatic(list[j].text, str, MAX_PATH)))) - || ((char*)settingData[iSetting].value == NULL && list[j].code == 0)) - || (setting[iSetting].dbType != DBVT_ASCIIZ && settingData[iSetting].value == list[j].code)) - SendMessage(hwndListEdit, LB_SETCURSEL, n, 0); - } - SendMessage(hwndListEdit, LB_SETTOPINDEX, SendMessage(hwndListEdit, LB_GETCURSEL, 0, 0) - 3, 0); - int listCount = SendMessage(hwndListEdit, LB_GETCOUNT, 0, 0); - if (itemHeight * listCount < 150) - SetWindowPos(hwndListEdit, 0, 0, 0, rc->right - rc->left, itemHeight * listCount + GetSystemMetrics(SM_CYBORDER) * 2, SWP_NOZORDER|SWP_NOMOVE); - mir_subclassWindow(hwndListEdit, ListEditSubclassProc); - AnimateWindow(hwndListEdit, 200, AW_SLIDE|AW_ACTIVATE|AW_VER_POSITIVE); - ShowWindow(hwndListEdit, SW_SHOW); - SetFocus(hwndListEdit); - if (wVKey) - PostMessage(hwndListEdit, WM_KEYDOWN, wVKey, 0); + for (j = 0; list[j].text; j++) { + char str[MAX_PATH]; + n = ListBoxAddStringUtf(hwndListEdit, list[j].text); + SendMessage(hwndListEdit, LB_SETITEMDATA, n, j); + if ((setting[iSetting].dbType == DBVT_ASCIIZ && (!strcmpnull((char*)settingData[iSetting].value, list[j].text)) + || (setting[iSetting].dbType == DBVT_ASCIIZ && (!strcmpnull((char*)settingData[iSetting].value, ICQTranslateUtfStatic(list[j].text, str, MAX_PATH)))) + || ((char*)settingData[iSetting].value == NULL && list[j].code == 0)) + || (setting[iSetting].dbType != DBVT_ASCIIZ && settingData[iSetting].value == list[j].code)) + SendMessage(hwndListEdit, LB_SETCURSEL, n, 0); + } + SendMessage(hwndListEdit, LB_SETTOPINDEX, SendMessage(hwndListEdit, LB_GETCURSEL, 0, 0) - 3, 0); + int listCount = SendMessage(hwndListEdit, LB_GETCOUNT, 0, 0); + if (itemHeight * listCount < 150) + SetWindowPos(hwndListEdit, 0, 0, 0, rc->right - rc->left, itemHeight * listCount + GetSystemMetrics(SM_CYBORDER) * 2, SWP_NOZORDER | SWP_NOMOVE); + mir_subclassWindow(hwndListEdit, ListEditSubclassProc); + AnimateWindow(hwndListEdit, 200, AW_SLIDE | AW_ACTIVATE | AW_VER_POSITIVE); + ShowWindow(hwndListEdit, SW_SHOW); + SetFocus(hwndListEdit); + if (wVKey) + PostMessage(hwndListEdit, WM_KEYDOWN, wVKey, 0); } void ChangeInfoData::EndListEdit(int save) { - if (hwndListEdit == NULL || iEditItem == -1 || this != dataListEdit) return; - if (save) - { + if (hwndListEdit == NULL || iEditItem == -1 || this != dataListEdit) + return; + + if (save) { int iItem = SendMessage(hwndListEdit, LB_GETCURSEL, 0, 0); int i = SendMessage(hwndListEdit, LB_GETITEMDATA, iItem, 0); - - if (setting[iEditItem].dbType == DBVT_ASCIIZ) - { - char *szNewValue = (((FieldNamesItem*)setting[iEditItem].pList)[i].text); - if (((FieldNamesItem*)setting[iEditItem].pList)[i].code || setting[iEditItem].displayType & LIF_ZEROISVALID) - { - settingData[iEditItem].changed = strcmpnull(szNewValue, (char*)settingData[iEditItem].value); - SAFE_FREE((void**)&settingData[iEditItem].value); - settingData[iEditItem].value = (LPARAM)null_strdup(szNewValue); + if (iItem != -1 && i != -1) { + FieldNamesItem &pItem = ((FieldNamesItem*)setting[iEditItem].pList)[i]; + + if (setting[iEditItem].dbType == DBVT_ASCIIZ) { + char *szNewValue = pItem.text; + if (pItem.code || (setting[iEditItem].displayType & LIF_ZEROISVALID)) { + settingData[iEditItem].changed = strcmpnull(szNewValue, (char*)settingData[iEditItem].value); + SAFE_FREE((void**)&settingData[iEditItem].value); + settingData[iEditItem].value = (LPARAM)null_strdup(szNewValue); + } + else { + settingData[iEditItem].changed = (char*)settingData[iEditItem].value != NULL; + SAFE_FREE((void**)&settingData[iEditItem].value); + } } - else - { - settingData[iEditItem].changed = (char*)settingData[iEditItem].value!=NULL; - SAFE_FREE((void**)&settingData[iEditItem].value); + else { + settingData[iEditItem].changed = pItem.code != settingData[iEditItem].value; + settingData[iEditItem].value = pItem.code; + } + + if (settingData[iEditItem].changed) { + char buf[MAX_PATH]; + TCHAR tbuf[MAX_PATH]; + if (utf8_to_tchar_static(ICQTranslateUtfStatic(pItem.text, buf, SIZEOF(buf)), tbuf, SIZEOF(buf))) + ListView_SetItemText(hwndList, iEditItem, 1, tbuf); + + EnableDlgItem(GetParent(hwndList), IDC_SAVE, TRUE); } - } - else - { - settingData[iEditItem].changed = ((FieldNamesItem*)setting[iEditItem].pList)[i].code != settingData[iEditItem].value; - settingData[iEditItem].value = ((FieldNamesItem*)setting[iEditItem].pList)[i].code; - } - if (settingData[iEditItem].changed) - { - char buf[MAX_PATH]; - TCHAR tbuf[MAX_PATH]; - - if (utf8_to_tchar_static(ICQTranslateUtfStatic(((FieldNamesItem*)setting[iEditItem].pList)[i].text, buf, SIZEOF(buf)), tbuf, SIZEOF(buf))) - ListView_SetItemText(hwndList, iEditItem, 1, tbuf); - - EnableDlgItem(GetParent(hwndList), IDC_SAVE, TRUE); - } } ListView_RedrawItems(hwndList, iEditItem, iEditItem); -- cgit v1.2.3