static int lua_CreateRoot(lua_State *L) { int hMenuObject = lua_tointeger(L, 1); const char *name = luaL_checkstring(L, 2); int position = lua_tointeger(L, 3); HANDLE hIcon = (HANDLE)lua_touserdata(L, 4); HGENMENU res = Menu_CreateRoot(MO_MAIN, ptrT(Utf8DecodeT(name)), position, hIcon); lua_pushlightuserdata(L, res); return 1; }
INT_PTR CALLBACK DlgProcAdded(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { HANDLE hDbEvent = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View user's details")); Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add contact permanently to list")); hDbEvent = (HANDLE)lParam; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); //blob is: uin(DWORD), hcontact(HANDLE), nick(ASCIIZ), first(ASCIIZ), last(ASCIIZ), email(ASCIIZ) DBEVENTINFO dbei = { sizeof(dbei) }; dbei.cbBlob = db_event_getBlobSize(hDbEvent); dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); db_event_get(hDbEvent, &dbei); DWORD uin = *(PDWORD)dbei.pBlob; HANDLE hContact = DbGetAuthEventContact(&dbei); char* nick = (char*)dbei.pBlob + sizeof(DWORD)*2; char* first = nick + strlen(nick) + 1; char* last = first + strlen(first) + 1; char* email = last + strlen(last) + 1; SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0)); SendMessage(hwndDlg, WM_SETICON, ICON_BIG, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_LARGE, 0)); PROTOACCOUNT* acc = ProtoGetAccount(dbei.szModule); TCHAR* lastT = dbei.flags & DBEF_UTF ? Utf8DecodeT(last) : mir_a2t(last); TCHAR* firstT = dbei.flags & DBEF_UTF ? Utf8DecodeT(first) : mir_a2t(first); TCHAR* nickT = dbei.flags & DBEF_UTF ? Utf8DecodeT(nick) : mir_a2t(nick); TCHAR* emailT = dbei.flags & DBEF_UTF ? Utf8DecodeT(email) : mir_a2t(email); TCHAR name[128] = _T(""); int off = 0; if (firstT[0] && lastT[0]) off = mir_sntprintf(name, SIZEOF(name), _T("%s %s"), firstT, lastT); else if (firstT[0]) off = mir_sntprintf(name, SIZEOF(name), _T("%s"), firstT); else if (lastT[0]) off = mir_sntprintf(name, SIZEOF(name), _T("%s"), lastT); if (nickT[0]) { if (off) mir_sntprintf(name + off, SIZEOF(name) - off, _T(" (%s)"), nickT); else mir_sntprintf(name, SIZEOF(name), _T("%s"), nickT); } if ( !name[0]) _tcscpy(name, TranslateT("<Unknown>")); TCHAR hdr[256]; if (uin && emailT[0]) mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s added you to the contact list\n%u (%s) on %s"), name, uin, emailT, acc->tszAccountName); else if (uin) mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s added you to the contact list\n%u on %s"), name, uin, acc->tszAccountName); else mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s added you to the contact list\n%s on %s"), name, emailT[0] ? emailT : TranslateT("(Unknown)"), acc->tszAccountName); SetDlgItemText(hwndDlg, IDC_HEADERBAR, hdr); mir_free(lastT); mir_free(firstT); mir_free(nickT); mir_free(emailT); SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA, (LONG_PTR)hContact); if (hContact == INVALID_HANDLE_VALUE || !db_get_b(hContact, "CList", "NotOnList", 0)) ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE); } return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_ADD: { ADDCONTACTSTRUCT acs = {0}; acs.handle = hDbEvent; acs.handleType = HANDLE_EVENT; acs.szProto = ""; CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); HANDLE hContact = (HANDLE)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA); if ((hContact == INVALID_HANDLE_VALUE) || !db_get_b(hContact, "CList", "NotOnList", 0)) ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE); break; } case IDC_DETAILS: { HANDLE hContact = (HANDLE)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA); CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0); break; } case IDOK: { ADDCONTACTSTRUCT acs = {0}; acs.handle = hDbEvent; acs.handleType = HANDLE_EVENT; acs.szProto = ""; CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); } //fall through case IDCANCEL: DestroyWindow(hwndDlg); break; } break; case WM_DESTROY: Button_FreeIcon_IcoLib(hwndDlg, IDC_ADD); Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0)); DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0)); break; } return FALSE; }
INT_PTR CALLBACK DlgProcAuthReq(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { HANDLE hDbEvent = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View user's details")); Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add contact permanently to list")); { hDbEvent = (HANDLE)lParam; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); //blob is: uin(DWORD), hcontact(HANDLE), nick(ASCIIZ), first(ASCIIZ), last(ASCIIZ), email(ASCIIZ), reason(ASCIIZ) DBEVENTINFO dbei = { sizeof(dbei) }; dbei.cbBlob = db_event_getBlobSize(hDbEvent); dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); db_event_get(hDbEvent, &dbei); DWORD uin = *(PDWORD)dbei.pBlob; HANDLE hContact = DbGetAuthEventContact(&dbei); char *nick = (char*)dbei.pBlob + sizeof(DWORD)*2; char *first = nick + strlen(nick) + 1; char *last = first + strlen(first) + 1; char *email = last + strlen(last) + 1; char *reason = email + strlen(email) + 1; SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0)); SendMessage(hwndDlg, WM_SETICON, ICON_BIG, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_LARGE, 0)); PROTOACCOUNT* acc = ProtoGetAccount(dbei.szModule); ptrT lastT(dbei.flags & DBEF_UTF ? Utf8DecodeT(last) : mir_a2t(last)); ptrT firstT(dbei.flags & DBEF_UTF ? Utf8DecodeT(first) : mir_a2t(first)); ptrT nickT(dbei.flags & DBEF_UTF ? Utf8DecodeT(nick) : mir_a2t(nick)); ptrT emailT(dbei.flags & DBEF_UTF ? Utf8DecodeT(email) : mir_a2t(email)); ptrT reasonT(dbei.flags & DBEF_UTF ? Utf8DecodeT(reason) : mir_a2t(reason)); TCHAR name[128] = _T(""); int off = 0; if (firstT[0] && lastT[0]) off = mir_sntprintf(name, SIZEOF(name), _T("%s %s"), (TCHAR*)firstT, (TCHAR*)lastT); else if (firstT[0]) off = mir_sntprintf(name, SIZEOF(name), _T("%s"), (TCHAR*)firstT); else if (lastT[0]) off = mir_sntprintf(name, SIZEOF(name), _T("%s"), (TCHAR*)lastT); if (nickT[0]) { if (off) mir_sntprintf(name + off, SIZEOF(name) - off, _T(" (%s)"), (TCHAR*)nickT); else mir_sntprintf(name, SIZEOF(name), _T("%s"), (TCHAR*)nickT); } if ( !name[0]) _tcscpy(name, TranslateT("<Unknown>")); TCHAR hdr[256]; if (uin && emailT[0]) mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s requested authorization\n%u (%s) on %s"), name, uin, (TCHAR*)emailT, acc->tszAccountName); else if (uin) mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s requested authorization\n%u on %s"), name, uin, acc->tszAccountName); else mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s requested authorization\n%s on %s"), name, emailT[0] ? (TCHAR*)emailT : TranslateT("(Unknown)"), acc->tszAccountName); SetDlgItemText(hwndDlg, IDC_HEADERBAR, hdr); SetDlgItemText(hwndDlg, IDC_REASON, reasonT); if (hContact == INVALID_HANDLE_VALUE || !db_get_b(hContact, "CList", "NotOnList", 0)) ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE); SendDlgItemMessage(hwndDlg, IDC_DENYREASON, EM_LIMITTEXT, 255, 0); if (CallProtoService(dbei.szModule, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_NOAUTHDENYREASON) { EnableWindow(GetDlgItem(hwndDlg, IDC_DENYREASON), FALSE); SetDlgItemText(hwndDlg, IDC_DENYREASON, TranslateT("Feature is not supported by protocol")); } if ( !db_get_b(hContact, "CList", "NotOnList", 0)) { EnableWindow(GetDlgItem(hwndDlg, IDC_ADDCHECK), FALSE); CheckDlgButton(hwndDlg, IDC_ADDCHECK, BST_UNCHECKED); } else CheckDlgButton(hwndDlg, IDC_ADDCHECK, BST_CHECKED); SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA, (LONG_PTR)hContact); } return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_DETAILS: CallService(MS_USERINFO_SHOWDIALOG, GetWindowLongPtr((HWND)lParam, GWLP_USERDATA), 0); break; case IDC_DECIDELATER: DestroyWindow(hwndDlg); break; case IDOK: { DBEVENTINFO dbei = { sizeof(dbei) }; db_event_get(hDbEvent, &dbei); CallProtoService(dbei.szModule, PS_AUTHALLOW, (WPARAM)hDbEvent, 0); if (IsDlgButtonChecked(hwndDlg, IDC_ADDCHECK)) { ADDCONTACTSTRUCT acs = {0}; acs.handle = hDbEvent; acs.handleType = HANDLE_EVENT; acs.szProto = ""; CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); } } DestroyWindow(hwndDlg); break; case IDCANCEL: { DBEVENTINFO dbei = { sizeof(dbei) }; db_event_get(hDbEvent, &dbei); if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_DENYREASON))) { TCHAR szReason[256]; GetDlgItemText(hwndDlg, IDC_DENYREASON, szReason, SIZEOF(szReason)); CallProtoService(dbei.szModule, PS_AUTHDENYT, (WPARAM)hDbEvent, (LPARAM)szReason); } else CallProtoService(dbei.szModule, PS_AUTHDENYT, (WPARAM)hDbEvent, 0); } DestroyWindow(hwndDlg); break; } break; case WM_DESTROY: Button_FreeIcon_IcoLib(hwndDlg, IDC_ADD); Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0)); DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0)); break; } return FALSE; }
static TCHAR* getEventString(DBEVENTINFO *dbei, LPSTR &buf) { LPSTR in = buf; buf += strlen(buf) + 1; return (dbei->flags & DBEF_UTF) ? Utf8DecodeT(in) : mir_a2t(in); }
static INT_PTR DbEventGetText(WPARAM wParam, LPARAM lParam) { DBEVENTGETTEXT* egt = (DBEVENTGETTEXT*)lParam; BOOL bIsDenyUnicode = (egt->datatype & DBVTF_DENYUNICODE); DBEVENTINFO* dbei = egt->dbei; DBEVENTTYPEDESCR* et = ( DBEVENTTYPEDESCR* )DbEventTypeGet( ( WPARAM )dbei->szModule, ( LPARAM )dbei->eventType ); if ( et && ServiceExists( et->textService )) return CallService( et->textService, wParam, lParam ); if ( !dbei->pBlob ) return 0; if ( dbei->eventType == EVENTTYPE_FILE ) { char* filename = ((char *)dbei->pBlob) + sizeof(DWORD); char* descr = filename + lstrlenA( filename ) + 1; char* str = (*descr == 0) ? filename : descr; switch ( egt->datatype ) { case DBVT_WCHAR: return ( INT_PTR )(( dbei->flags & DBEF_UTF ) ? Utf8DecodeT( str ) : mir_a2t( str )); case DBVT_ASCIIZ: return ( INT_PTR )(( dbei->flags & DBEF_UTF ) ? Utf8Decode( mir_strdup( str ), NULL ) : mir_strdup( str )); } return 0; } // temporary fix for bug with event types conflict between jabber chat states notifications // and srmm's status changes, must be commented out in future releases if ( dbei->eventType == 25368 && dbei->cbBlob == 1 && dbei->pBlob[0] == 1 ) return 0; egt->datatype &= ~DBVTF_DENYUNICODE; if ( egt->datatype == DBVT_WCHAR ) { WCHAR* msg = NULL; if ( dbei->flags & DBEF_UTF ) { char* str = (char*)alloca(dbei->cbBlob + 1); if (str == NULL) return NULL; memcpy(str, dbei->pBlob, dbei->cbBlob); str[dbei->cbBlob] = 0; Utf8DecodeCP( str, egt->codepage, &msg ); } else { size_t msglen = strlen(( char* )dbei->pBlob) + 1, msglenW = 0; if ( msglen != dbei->cbBlob ) { size_t i, count = (( dbei->cbBlob - msglen ) / sizeof( WCHAR )); WCHAR* p = ( WCHAR* )&dbei->pBlob[ msglen ]; for ( i=0; i < count; i++ ) { if ( p[i] == 0 ) { msglenW = i; break; } } } if ( msglenW > 0 && msglenW < msglen && !bIsDenyUnicode ) msg = mir_wstrdup(( WCHAR* )&dbei->pBlob[ msglen ] ); else { msg = ( WCHAR* )mir_alloc( sizeof(WCHAR) * msglen ); MultiByteToWideChar( egt->codepage, 0, (char *) dbei->pBlob, -1, msg, (int)msglen ); } } return ( INT_PTR )msg; } else if ( egt->datatype == DBVT_ASCIIZ ) { char* msg = mir_strdup(( char* )dbei->pBlob ); if (dbei->flags & DBEF_UTF) Utf8DecodeCP( msg, egt->codepage, NULL ); return ( INT_PTR )msg; } return 0; }
INT_PTR CALLBACK DlgProcAbout(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static int iState = 0; switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { TCHAR filename[MAX_PATH], *productCopyright; DWORD unused; DWORD verInfoSize; UINT blockSize; PVOID pVerInfo; GetModuleFileName(NULL,filename,SIZEOF(filename)); verInfoSize=GetFileVersionInfoSize(filename,&unused); pVerInfo=mir_alloc(verInfoSize); GetFileVersionInfo(filename,0,verInfoSize,pVerInfo); VerQueryValue(pVerInfo,_T("\\StringFileInfo\\000004b0\\LegalCopyright"),(LPVOID*)&productCopyright,&blockSize); SetDlgItemText(hwndDlg,IDC_DEVS,productCopyright); mir_free(pVerInfo); } { char productVersion[56], *p; int isAnsi = 0; TCHAR str[64]; CallService(MS_SYSTEM_GETVERSIONTEXT,SIZEOF(productVersion),(LPARAM)productVersion); // Hide Unicode from version text as it is assumed at this point p = strstr(productVersion, " Unicode"); if (p) *p = '\0'; else isAnsi = 1; mir_sntprintf(str,SIZEOF(str),_T(STR_VERSION_FORMAT), TranslateT("v"), productVersion, isAnsi?" ANSI":""); { TCHAR oldTitle[256], newTitle[256]; GetDlgItemText( hwndDlg, IDC_HEADERBAR, oldTitle, SIZEOF( oldTitle )); mir_sntprintf( newTitle, SIZEOF(newTitle), oldTitle, str ); SetDlgItemText( hwndDlg, IDC_HEADERBAR, newTitle ); } mir_sntprintf(str,SIZEOF(str),TranslateT("Built %s %s"),_T(__DATE__),_T(__TIME__)); SetDlgItemText(hwndDlg,IDC_BUILDTIME,str); } ShowWindow(GetDlgItem(hwndDlg, IDC_CREDITSFILE), SW_HIDE); { HRSRC hResInfo = FindResource(hMirandaInst,MAKEINTRESOURCE(IDR_CREDITS),_T("TEXT")); DWORD ResSize = SizeofResource(hMirandaInst,hResInfo); HGLOBAL hRes = LoadResource(hMirandaInst,hResInfo); char* pszMsg = (char*)LockResource(hRes); if (pszMsg) { char* pszMsgt = (char*)alloca(ResSize + 1); memcpy(pszMsgt, pszMsg, ResSize); pszMsgt[ResSize] = 0; TCHAR *ptszMsg; if (ResSize >=3 && pszMsgt[0] == '\xef' && pszMsgt[1] == '\xbb' && pszMsgt[2] == '\xbf') ptszMsg = Utf8DecodeT(pszMsgt + 3); else ptszMsg = mir_a2t_cp(pszMsgt, 1252); SetDlgItemText(hwndDlg, IDC_CREDITSFILE, ptszMsg); UnlockResource(pszMsg); mir_free(ptszMsg); } FreeResource(hRes); } Window_SetIcon_IcoLib(hwndDlg, SKINICON_OTHER_MIRANDA); return TRUE; case WM_COMMAND: switch( LOWORD( wParam )) { case IDOK: case IDCANCEL: DestroyWindow(hwndDlg); return TRUE; case IDC_CONTRIBLINK: if (iState) { iState = 0; SetDlgItemText(hwndDlg, IDC_CONTRIBLINK, TranslateT("Credits >")); ShowWindow(GetDlgItem(hwndDlg, IDC_DEVS), SW_SHOW); ShowWindow(GetDlgItem(hwndDlg, IDC_BUILDTIME), SW_SHOW); ShowWindow(GetDlgItem(hwndDlg, IDC_CREDITSFILE), SW_HIDE); } else { iState = 1; SetDlgItemText(hwndDlg, IDC_CONTRIBLINK, TranslateT("< Copyright")); ShowWindow(GetDlgItem(hwndDlg, IDC_DEVS), SW_HIDE); ShowWindow(GetDlgItem(hwndDlg, IDC_BUILDTIME), SW_HIDE); ShowWindow(GetDlgItem(hwndDlg, IDC_CREDITSFILE), SW_SHOW); } break; } break; case WM_CTLCOLOREDIT: case WM_CTLCOLORSTATIC: switch ( GetWindowLongPtr(( HWND )lParam, GWL_ID )) { case IDC_WHITERECT: case IDC_BUILDTIME: case IDC_CREDITSFILE: case IDC_DEVS: SetTextColor((HDC)wParam,GetSysColor(COLOR_WINDOWTEXT)); break; default: return FALSE; } SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW)); return (INT_PTR)GetSysColorBrush(COLOR_WINDOW); case WM_DESTROY: Window_FreeIcon_IcoLib( hwndDlg ); { HFONT hFont=(HFONT)SendDlgItemMessage(hwndDlg,IDC_VERSION,WM_GETFONT,0,0); SendDlgItemMessage(hwndDlg,IDC_VERSION,WM_SETFONT,SendDlgItemMessage(hwndDlg,IDOK,WM_GETFONT,0,0),0); DeleteObject(hFont); } break; } return FALSE; }