void InitGroupMenus(void) { GroupMenuParam gmp = {}; // Group menu CreateServiceFunction("CLISTMENUSGroup/ExecService", GroupMenuExecService); CreateServiceFunction("CLISTMENUSGroup/FreeOwnerDataGroupMenu", FreeOwnerDataGroupMenu); hEventPreBuildGroupMenu = CreateHookableEvent(ME_CLIST_PREBUILDGROUPMENU); HookEvent(ME_CLIST_PREBUILDGROUPMENU, OnBuildGroupMenu); hGroupMenuObject = Menu_AddObject("GroupMenu", LPGEN("Group menu"), 0, "CLISTMENUSGroup/ExecService"); Menu_ConfigureObject(hGroupMenuObject, MCO_OPT_USERDEFINEDITEMS, TRUE); Menu_ConfigureObject(hGroupMenuObject, MCO_OPT_FREE_SERVICE, "CLISTMENUSGroup/FreeOwnerDataGroupMenu"); Menu_ConfigureObject(hGroupMenuObject, MCO_OPT_ONADD_SERVICE, "CLISTMENUSGroup/GroupMenuOnAddService"); { CMenuItem mi; SET_UID(mi, 0x2f75bc72, 0xd836, 0x4922, 0x9f, 0xe, 0xed, 0x9e, 0xe7, 0x2b, 0x84, 0xf0); mi.position = 100000; mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_GROUPADD); mi.pszService = "CLISTMENUSGroup/CreateGroupHelper"; mi.name.a = LPGEN("&New group"); Menu_AddGroupMenuItem(&mi); CreateServiceFunction(mi.pszService, CreateGroupHelper); SET_UID(mi, 0xe6269658, 0x69, 0x4094, 0x9b, 0x35, 0x4e, 0x80, 0x29, 0x26, 0xf, 0x8e); mi.position = 500001; mi.hIcolibItem = NULL; mi.pszService = MS_CLIST_SETHIDEOFFLINE; mi.name.a = LPGEN("&Hide offline users"); gmp.wParam = -1; hHideOfflineUsersMenuItem = Menu_AddGroupMenuItem(&mi, &gmp); SET_UID(mi, 0xeded7371, 0xf6e6, 0x48c3, 0x8c, 0x9e, 0x62, 0xc1, 0xd5, 0xcb, 0x51, 0xbc); mi.position = 500002; mi.pszService = "CLISTMENUSGroup/HideOfflineRootHelper"; mi.name.a = LPGEN("Hide &offline users out here"); hHideOfflineUsersOutHereMenuItem = Menu_AddGroupMenuItem(&mi); CreateServiceFunction(mi.pszService, HideOfflineRootHelper); SET_UID(mi, 0x4c17b9cf, 0x513a, 0x41d8, 0x8d, 0x2b, 0x89, 0x44, 0x81, 0x14, 0x0, 0x91); mi.position = 500003; mi.pszService = "CLISTMENUSGroup/HideGroupsHelper"; mi.name.a = LPGEN("Hide &empty groups"); hHideEmptyGroupsMenuItem = Menu_AddGroupMenuItem(&mi); CreateServiceFunction(mi.pszService, HideGroupsHelper); SET_UID(mi, 0xfcbdbbb1, 0xa553, 0x49ac, 0xa5, 0xdf, 0xb4, 0x81, 0x38, 0xf, 0xa0, 0xc7); mi.position = 500004; mi.pszService = "CLISTMENUSGroup/UseGroupsHelper"; mi.name.a = LPGEN("Disable &groups"); hDisableGroupsMenuItem = Menu_AddGroupMenuItem(&mi); CreateServiceFunction(mi.pszService, UseGroupsHelper); SET_UID(mi, 0xfffb8733, 0xa3e4, 0x4566, 0xa6, 0x6e, 0x4c, 0x4c, 0x7c, 0xe9, 0x56, 0x99); mi.position = 1900000; mi.pszService = "CloseAction"; mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_EXIT); mi.name.a = LPGEN("E&xit"); Menu_AddGroupMenuItem(&mi); } // SubGroup menu CreateServiceFunction("CLISTMENUSSubGroup/ExecService", SubGroupMenuExecService); CreateServiceFunction("CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu", FreeOwnerDataSubGroupMenu); CreateServiceFunction("CLISTMENUSSubGroup/SubGroupMenuCheckService", SubGroupMenuCheckService); CreateServiceFunction("CLISTMENUSSubGroup/GroupMenuExecProxy", GroupMenuExecProxy); hEventPreBuildSubGroupMenu = CreateHookableEvent(ME_CLIST_PREBUILDSUBGROUPMENU); HookEvent(ME_CLIST_PREBUILDSUBGROUPMENU, OnBuildSubGroupMenu); hSubGroupMenuObject = Menu_AddObject("SubGroupMenu", LPGEN("Subgroup menu"), 0, "CLISTMENUSSubGroup/ExecService"); Menu_ConfigureObject(hSubGroupMenuObject, MCO_OPT_USERDEFINEDITEMS, TRUE); Menu_ConfigureObject(hSubGroupMenuObject, MCO_OPT_FREE_SERVICE, "CLISTMENUSSubGroup/FreeOwnerDataSubGroupMenu"); Menu_ConfigureObject(hSubGroupMenuObject, MCO_OPT_CHECK_SERVICE, "CLISTMENUSSubGroup/SubGroupMenuCheckService"); { CMenuItem mi; SET_UID(mi, 0xd208f1d2, 0x7220, 0x4d37, 0xb6, 0xe4, 0xd5, 0x4a, 0xe8, 0xa3, 0xf4, 0x53); mi.position = 1000; mi.hIcolibItem = Skin_GetIconHandle(SKINICON_AUTH_ADD); mi.pszService = "CLISTMENUSSubGroup/GroupMenuExecProxy"; mi.name.a = LPGEN("&New subgroup"); gmp.wParam = POPUP_NEWSUBGROUP; Menu_AddSubGroupMenuItem(&mi, &gmp); SET_UID(mi, 0xd85f5ff0, 0x12ca, 0x464d, 0x86, 0x51, 0x53, 0x36, 0x9f, 0x1d, 0x80, 0x45); mi.position = 1001; mi.hIcolibItem = 0; mi.name.a = LPGEN("&Hide offline users in here"); gmp.wParam = POPUP_GROUPHIDEOFFLINE; hHideOfflineUsersHereMenuItem = Menu_AddSubGroupMenuItem(&mi, &gmp); SET_UID(mi, 0xf0953dd, 0x5c31, 0x48a4, 0xb4, 0x16, 0x89, 0x5, 0x97, 0xd0, 0x75, 0x3e); mi.position = 900001; mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_RENAME); mi.name.a = LPGEN("&Rename group"); gmp.wParam = POPUP_RENAMEGROUP; Menu_AddSubGroupMenuItem(&mi, &gmp); SET_UID(mi, 0xb0d63cda, 0xa743, 0x4cfa, 0xa6, 0x2d, 0x50, 0xc0, 0x90, 0xe7, 0x6a, 0xc4); mi.position = 900002; mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_DELETE); mi.name.a = LPGEN("&Delete group"); gmp.wParam = POPUP_DELETEGROUP; Menu_AddSubGroupMenuItem(&mi, &gmp); } }
void IconsInit(void) { Icon_Register(g_hInst, LPGEN("Simple Status Message"), iconList, SIZEOF(iconList), "SimpleStatusMsg"); }
#include "common.h" static IconItem iconList[] = { // toolbar { LPGEN("Popups are enabled"), ICO_TB_POPUP_ON, IDI_POPUP }, { LPGEN("Popups are disabled"), ICO_TB_POPUP_OFF, IDI_NOPOPUP }, // common { LPGEN("Popups are enabled"), ICO_POPUP_ON, IDI_POPUP }, { LPGEN("Popups are disabled"), ICO_POPUP_OFF, IDI_NOPOPUP }, { LPGEN("Popup History"), ICO_HISTORY, IDI_HISTORY }, }; void InitIcons() { Icon_Register(hInst, SECT_TOLBAR, iconList, 2); Icon_Register(hInst, SECT_POPUP, iconList+2, 3); }
#define INDEX_OFFLINE 5 #define INDEX_META 6 #define INDEX_GROUPS 7 #define INDEX_SOUNDS 8 static HWND hwndContactTree; struct { char *name, *pszService; int iconidUp, iconidDn; char *tooltipUp, *tooltipDn; bool bCustomIcon, bDefVisible; HANDLE hButton; } static stdButtons[] = { { LPGEN("Show main menu"), TTBI_MAINMENUBUTT, SKINICON_OTHER_MAINMENU, 0, LPGEN("Show main menu"), NULL, 0, 1 }, { LPGEN("Show options page"), "Options/OptionsCommand", SKINICON_OTHER_OPTIONS, 0, LPGEN("Show options page"), NULL, 0, 1 }, { LPGEN("Show accounts manager"), "Protos/ShowAccountManager", SKINICON_OTHER_ACCMGR, 0, LPGEN("Show accounts manager"), NULL, 0, 0 }, { LPGEN("Find/add contacts"), MS_FINDADD_FINDADD, SKINICON_OTHER_FINDUSER, 0, LPGEN("Find/add contacts"), NULL, 0, 1 }, { LPGEN("Show status menu"), TTBI_STATUSMENUBUTT, SKINICON_OTHER_STATUS, 0, LPGEN("Show status menu"), NULL, 0, 0 }, { LPGEN("Show/hide offline contacts"), TTBI_SHOWHIDEOFFLINE, IDI_HIDEOFFLINE, IDI_SHOWOFFLINE, LPGEN("Hide offline contacts"), LPGEN("Show offline contacts"), 1, 1 }, { LPGEN("Enable/disable metacontacts"), "MetaContacts/OnOff", IDI_METAOFF, IDI_METAON, LPGEN("Disable metacontacts"), LPGEN("Enable metacontacts"), 1, 1 }, { LPGEN("Enable/disable groups"), TTBI_GROUPSHOWHIDE, IDI_GROUPSOFF, IDI_GROUPSON, LPGEN("Enable groups"), LPGEN("Disable groups"), 1, 1 }, { LPGEN("Enable/disable sounds"), TTBI_SOUNDSONOFF, IDI_SOUNDSOFF, IDI_SOUNDSON, LPGEN("Disable sounds"), LPGEN("Enable sounds"), 1, 1 }, { LPGEN("Minimize contact list"), MS_CLIST_SHOWHIDE, SKINICON_OTHER_SHOWHIDE, 0, LPGEN("Minimize contact list"), NULL, 0, 1 }, { LPGEN("Exit"), "CloseAction", SKINICON_OTHER_EXIT, 0, LPGEN("Exit"), NULL, 0, 0 } }; /////////////////////////////////////////////////////////////////////////////// int OnSettingChanging(WPARAM hContact, LPARAM lParam)
INT_PTR CALLBACK DlgProcUrlRecv(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { struct UrlRcvData *dat = (struct UrlRcvData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); Window_SetIcon_IcoLib(hwndDlg, SKINICON_EVENT_URL); Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add contact permanently to list")); Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View user's details")); Button_SetIcon_IcoLib(hwndDlg, IDC_HISTORY, SKINICON_OTHER_HISTORY, LPGEN("View user's history")); Button_SetIcon_IcoLib(hwndDlg, IDC_USERMENU, SKINICON_OTHER_DOWNARROW, LPGEN("User menu")); dat = (struct UrlRcvData*)mir_alloc(sizeof(struct UrlRcvData)); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); dat->hContact = ((CLISTEVENT*)lParam)->hContact; dat->hDbEvent = ((CLISTEVENT*)lParam)->hDbEvent; WindowList_Add(hUrlWindowList, hwndDlg, dat->hContact); { DBEVENTINFO dbei = { sizeof(dbei) }; dbei.cbBlob = db_event_getBlobSize(dat->hDbEvent); dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob); db_event_get(dat->hDbEvent, &dbei); SetDlgItemTextA(hwndDlg, IDC_URL, (char*)dbei.pBlob); SetDlgItemTextA(hwndDlg, IDC_MSG, (char*)dbei.pBlob+mir_strlen((char*)dbei.pBlob)+1); mir_free(dbei.pBlob); db_event_markRead(dat->hContact, dat->hDbEvent); TCHAR *contactName = pcli->pfnGetContactDisplayName(dat->hContact, 0), msg[128]; mir_sntprintf(msg, _countof(msg), TranslateT("URL from %s"), contactName); SetWindowText(hwndDlg, msg); SetDlgItemText(hwndDlg, IDC_FROM, contactName); SendDlgItemMessage(hwndDlg, IDOK, BUTTONSETARROW, 1, 0); TCHAR str[128]; TimeZone_PrintTimeStamp(NULL, dbei.timestamp, _T("t d"), str, _countof(str), 0); SetDlgItemText(hwndDlg, IDC_DATE, str); } // From message dlg if ( !db_get_b(dat->hContact, "CList", "NotOnList", 0)) ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), SW_HIDE); SendMessage(hwndDlg, DM_UPDATETITLE, 0, 0); // From message dlg end Utils_RestoreWindowPositionNoSize(hwndDlg, NULL, "SRUrl", "recv"); return TRUE; case WM_MEASUREITEM: return Menu_MeasureItem((LPMEASUREITEMSTRUCT)lParam); case WM_DRAWITEM: { LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; if (dis->hwndItem == GetDlgItem(hwndDlg, IDC_PROTOCOL)) { char *szProto = GetContactProto(dat->hContact); if (szProto) { HICON hIcon = (HICON)CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0); if (hIcon) { DrawIconEx(dis->hDC, dis->rcItem.left, dis->rcItem.top, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL); DestroyIcon(hIcon); } } } } return Menu_DrawItem((LPDRAWITEMSTRUCT)lParam); case DM_UPDATETITLE: sttUpdateTitle(hwndDlg, dat->hContact); break; case WM_COMMAND: if (!dat) break; if (CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)dat->hContact)) break; switch(LOWORD(wParam)) { case IDOK: { RECT rc; char url[256]; HMENU hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_CONTEXT)); HMENU hSubMenu = GetSubMenu(hMenu, 6); TranslateMenu(hSubMenu); GetWindowRect((HWND)lParam, &rc); GetDlgItemTextA(hwndDlg, IDC_URL, url, _countof(url)); switch(TrackPopupMenu(hSubMenu, TPM_RETURNCMD, rc.left, rc.bottom, 0, hwndDlg, NULL)) { case IDM_OPENNEW: Utils_OpenUrl(url); break; case IDM_OPENEXISTING: Utils_OpenUrl(url); break; case IDM_COPYLINK: { if ( !OpenClipboard(hwndDlg)) break; EmptyClipboard(); HGLOBAL hData = GlobalAlloc(GMEM_MOVEABLE, mir_strlen(url)+1); mir_strcpy((char*)GlobalLock(hData), url); GlobalUnlock(hData); SetClipboardData(CF_TEXT, hData); CloseClipboard(); break; } } DestroyMenu(hMenu); } return TRUE; case IDC_USERMENU: { RECT rc; HMENU hMenu = Menu_BuildContactMenu(dat->hContact); 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)dat->hContact, 0); break; case IDC_DETAILS: CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)dat->hContact, 0); break; case IDC_ADD: { ADDCONTACTSTRUCT acs = {0}; acs.hContact = dat->hContact; acs.handleType = HANDLE_CONTACT; CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); } if ( !db_get_b(dat->hContact, "CList", "NotOnList", 0)) { ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE); } break; case IDC_REPLY: CallService(MS_MSG_SENDMESSAGE, (WPARAM)dat->hContact, 0); //fall through case IDCANCEL: DestroyWindow(hwndDlg); return TRUE; } break; case WM_DESTROY: Window_FreeIcon_IcoLib(hwndDlg); Button_FreeIcon_IcoLib(hwndDlg, IDC_ADD); Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); Button_FreeIcon_IcoLib(hwndDlg, IDC_HISTORY); Button_FreeIcon_IcoLib(hwndDlg, IDC_USERMENU); WindowList_Remove(hUrlWindowList, hwndDlg); mir_free(dat); Utils_SaveWindowPosition(hwndDlg, NULL, "SRUrl", "recv"); break; } return FALSE; }
INT_PTR CALLBACK AccMgrDlgProc(HWND hwndDlg,UINT message, WPARAM wParam, LPARAM lParam) { struct TAccMgrData *dat = (struct TAccMgrData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch(message) { case WM_INITDIALOG: { TAccMgrData *dat = (TAccMgrData *)mir_alloc(sizeof(TAccMgrData)); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); TranslateDialogDefault(hwndDlg); Window_SetIcon_IcoLib( hwndDlg, SKINICON_OTHER_ACCMGR ); Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("New account")); Button_SetIcon_IcoLib(hwndDlg, IDC_EDIT, SKINICON_OTHER_RENAME, LPGEN("Edit")); Button_SetIcon_IcoLib(hwndDlg, IDC_REMOVE, SKINICON_OTHER_DELETE, LPGEN("Remove account")); Button_SetIcon_IcoLib(hwndDlg, IDC_OPTIONS, SKINICON_OTHER_OPTIONS, LPGEN( "Configure...")); Button_SetIcon_IcoLib(hwndDlg, IDC_UPGRADE, SKINICON_OTHER_ACCMGR, LPGEN("Upgrade account")); EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVE), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTIONS), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_UPGRADE), FALSE); { LOGFONT lf; HDC hdc; HFONT hfnt; TEXTMETRIC tm; GetObject((HFONT)SendMessage(hwndDlg, WM_GETFONT, 0, 0), sizeof(lf), &lf); dat->hfntText = CreateFontIndirect(&lf); GetObject((HFONT)SendMessage(hwndDlg, WM_GETFONT, 0, 0), sizeof(lf), &lf); lf.lfWeight = FW_BOLD; dat->hfntTitle = CreateFontIndirect(&lf); hdc = GetDC(hwndDlg); hfnt = ( HFONT )SelectObject(hdc, dat->hfntTitle); GetTextMetrics(hdc, &tm); dat->titleHeight = tm.tmHeight; SelectObject(hdc, dat->hfntText); GetTextMetrics(hdc, &tm); dat->textHeight = tm.tmHeight; SelectObject(hdc, hfnt); ReleaseDC(hwndDlg, hdc); dat->normalHeight = 4 + max(dat->titleHeight, GetSystemMetrics(SM_CYSMICON)); dat->selectedHeight = dat->normalHeight + 4 + 2 * dat->textHeight; SendDlgItemMessage(hwndDlg, IDC_NAME, WM_SETFONT, (WPARAM)dat->hfntTitle, 0); SendDlgItemMessage(hwndDlg, IDC_TXT_ACCOUNT, WM_SETFONT, (WPARAM)dat->hfntTitle, 0); SendDlgItemMessage(hwndDlg, IDC_TXT_ADDITIONAL, WM_SETFONT, (WPARAM)dat->hfntTitle, 0); } dat->iSelected = -1; sttSubclassAccList(GetDlgItem(hwndDlg, IDC_ACCLIST), TRUE); SendMessage( hwndDlg, WM_MY_REFRESH, 0, 0 ); Utils_RestoreWindowPositionNoSize(hwndDlg, NULL, "AccMgr", ""); } return TRUE; case WM_CTLCOLORSTATIC: switch ( GetDlgCtrlID(( HWND )lParam )) { case IDC_WHITERECT: case IDC_NAME: SetBkColor(( HDC )wParam, GetSysColor( COLOR_WINDOW )); return ( INT_PTR )GetSysColorBrush( COLOR_WINDOW ); } break; case WM_MEASUREITEM: { LPMEASUREITEMSTRUCT lps = (LPMEASUREITEMSTRUCT)lParam; PROTOACCOUNT *acc = (PROTOACCOUNT *)lps->itemData; if ((lps->CtlID != IDC_ACCLIST) || !acc) break; lps->itemWidth = 10; lps->itemHeight = dat->normalHeight; } return TRUE; case WM_DRAWITEM: { int tmp, size, length; TCHAR *text; HICON hIcon; HBRUSH hbrBack; SIZE sz; int cxIcon = GetSystemMetrics(SM_CXSMICON); int cyIcon = GetSystemMetrics(SM_CYSMICON); LPDRAWITEMSTRUCT lps = (LPDRAWITEMSTRUCT)lParam; PROTOACCOUNT *acc = (PROTOACCOUNT *)lps->itemData; if ((lps->CtlID != IDC_ACCLIST) || (lps->itemID == -1) || !acc) break; SetBkMode(lps->hDC, TRANSPARENT); if (lps->itemState & ODS_SELECTED) { hbrBack = GetSysColorBrush(COLOR_HIGHLIGHT); SetTextColor(lps->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); } else { hbrBack = GetSysColorBrush(COLOR_WINDOW); SetTextColor(lps->hDC, GetSysColor(COLOR_WINDOWTEXT)); } FillRect(lps->hDC, &lps->rcItem, hbrBack); lps->rcItem.left += 2; lps->rcItem.top += 2; lps->rcItem.bottom -= 2; if ( acc->bOldProto ) tmp = SKINICON_OTHER_ON; else if ( acc->bDynDisabled ) tmp = SKINICON_OTHER_OFF; else tmp = acc->bIsEnabled ? SKINICON_OTHER_TICK : SKINICON_OTHER_NOTICK; hIcon = LoadSkinnedIcon(tmp); DrawIconEx(lps->hDC, lps->rcItem.left, lps->rcItem.top, hIcon, cxIcon, cyIcon, 0, hbrBack, DI_NORMAL); IconLib_ReleaseIcon(hIcon, 0); lps->rcItem.left += cxIcon + 2; if (acc->ppro) { hIcon = acc->ppro->GetIcon( PLI_PROTOCOL | PLIF_SMALL ); DrawIconEx(lps->hDC, lps->rcItem.left, lps->rcItem.top, hIcon, cxIcon, cyIcon, 0, hbrBack, DI_NORMAL); DestroyIcon(hIcon); } lps->rcItem.left += cxIcon + 2; length = SendDlgItemMessage(hwndDlg, IDC_ACCLIST, LB_GETTEXTLEN, lps->itemID, 0); size = max(length+1, 256); text = (TCHAR *)_alloca(sizeof(TCHAR) * size); SendDlgItemMessage(hwndDlg, IDC_ACCLIST, LB_GETTEXT, lps->itemID, (LPARAM)text); SelectObject(lps->hDC, dat->hfntTitle); tmp = lps->rcItem.bottom; lps->rcItem.bottom = lps->rcItem.top + max(cyIcon, dat->titleHeight); DrawText(lps->hDC, text, -1, &lps->rcItem, DT_LEFT|DT_NOPREFIX|DT_SINGLELINE|DT_END_ELLIPSIS|DT_VCENTER); lps->rcItem.bottom = tmp; GetTextExtentPoint32(lps->hDC, text, length, &sz); lps->rcItem.top += max(cxIcon, sz.cy) + 2; if (lps->itemID == (unsigned)dat->iSelected) { SelectObject(lps->hDC, dat->hfntText); mir_sntprintf(text, size, _T("%s: ") _T(TCHAR_STR_PARAM), TranslateT("Protocol"), acc->szProtoName); length = lstrlen(text); DrawText(lps->hDC, text, -1, &lps->rcItem, DT_LEFT|DT_NOPREFIX|DT_SINGLELINE|DT_END_ELLIPSIS); GetTextExtentPoint32(lps->hDC, text, length, &sz); lps->rcItem.top += sz.cy + 2; if (acc->ppro && Proto_IsProtocolLoaded(acc->szProtoName)) { char *szIdName; TCHAR *tszIdName; CONTACTINFO ci = { 0 }; szIdName = (char *)acc->ppro->GetCaps( PFLAG_UNIQUEIDTEXT, 0 ); tszIdName = szIdName ? mir_a2t(szIdName) : mir_tstrdup(TranslateT("Account ID")); ci.cbSize = sizeof(ci); ci.hContact = NULL; ci.szProto = acc->szModuleName; ci.dwFlag = CNF_UNIQUEID | CNF_TCHAR; if ( !CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM) & ci)) { switch (ci.type) { case CNFT_ASCIIZ: mir_sntprintf( text, size, _T("%s: %s"), tszIdName, ci.pszVal ); mir_free(ci.pszVal); break; case CNFT_DWORD: mir_sntprintf( text, size, _T("%s: %d"), tszIdName, ci.dVal ); break; } } else mir_sntprintf(text, size, _T("%s: %s"), tszIdName, TranslateT("<unknown>")); mir_free(tszIdName); } else mir_sntprintf(text, size, TranslateT("Protocol is not loaded.")); length = lstrlen(text); DrawText(lps->hDC, text, -1, &lps->rcItem, DT_LEFT|DT_NOPREFIX|DT_SINGLELINE|DT_END_ELLIPSIS); GetTextExtentPoint32(lps->hDC, text, length, &sz); lps->rcItem.top += sz.cy + 2; } } return TRUE; case WM_MY_REFRESH: { HWND hList = GetDlgItem(hwndDlg, IDC_ACCLIST); int i = ListBox_GetCurSel(hList); PROTOACCOUNT *acc = (i == LB_ERR) ? NULL : (PROTOACCOUNT *)ListBox_GetItemData(hList, i); dat->iSelected = -1; SendMessage( hList, LB_RESETCONTENT, 0, 0 ); for (i = 0; i < accounts.getCount(); ++i) { int iItem = SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)accounts[i]->tszAccountName); SendMessage(hList, LB_SETITEMDATA, iItem, (LPARAM)accounts[i]); if (accounts[i] == acc) ListBox_SetCurSel(hList, iItem); } dat->iSelected = ListBox_GetCurSel(hList); // -1 if error => nothing selected in our case if (dat->iSelected >= 0) sttSelectItem(dat, hList, dat->iSelected); else if (acc && acc->hwndAccMgrUI) ShowWindow(acc->hwndAccMgrUI, SW_HIDE); sttUpdateAccountInfo(hwndDlg, dat); } break; case WM_CONTEXTMENU: if ( GetWindowLongPtr(( HWND )wParam, GWL_ID ) == IDC_ACCLIST ) { HWND hwndList = GetDlgItem( hwndDlg, IDC_ACCLIST ); POINT pt = { (signed short)LOWORD( lParam ), (signed short)HIWORD( lParam ) }; int iItem = ListBox_GetCurSel( hwndList ); if (( pt.x == -1 ) && ( pt.y == -1 )) { if (iItem != LB_ERR) { RECT rc; ListBox_GetItemRect( hwndList, iItem, &rc ); pt.x = rc.left + GetSystemMetrics(SM_CXSMICON) + 4; pt.y = rc.top + 4 + max(GetSystemMetrics(SM_CXSMICON), dat->titleHeight); ClientToScreen( hwndList, &pt ); } } else { // menu was activated with mouse => find item under cursor & set focus to our control. POINT ptItem = pt; ScreenToClient( hwndList, &ptItem ); iItem = (short)LOWORD(SendMessage(hwndList, LB_ITEMFROMPOINT, 0, MAKELPARAM(ptItem.x, ptItem.y))); if (iItem != LB_ERR) { ListBox_SetCurSel(hwndList, iItem); sttUpdateAccountInfo(hwndDlg, dat); sttSelectItem(dat, hwndList, iItem); SetFocus(hwndList); } } if ( iItem != LB_ERR ) { PROTOACCOUNT* pa = (PROTOACCOUNT*)ListBox_GetItemData(hwndList, iItem); HMENU hMenu = CreatePopupMenu(); if ( !pa->bOldProto && !pa->bDynDisabled ) AppendMenu(hMenu, MF_STRING, 1, TranslateT("Rename")); AppendMenu(hMenu, MF_STRING, 3, TranslateT("Delete")); if ( Proto_IsAccountEnabled( pa )) AppendMenu(hMenu, MF_STRING, 4, TranslateT("Configure")); if ( pa->bOldProto || pa->bDynDisabled ) AppendMenu(hMenu, MF_STRING, 5, TranslateT("Upgrade")); AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); AppendMenu(hMenu, MF_STRING, 0, TranslateT("Cancel")); switch (TrackPopupMenu( hMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, NULL )) { case 1: PostMessage(hwndList, WM_MY_RENAME, 0, 0); break; case 2: sttClickButton(hwndDlg, IDC_EDIT); break; case 3: sttClickButton(hwndDlg, IDC_REMOVE); break; case 4: sttClickButton(hwndDlg, IDC_OPTIONS); break; case 5: sttClickButton(hwndDlg, IDC_UPGRADE); break; } DestroyMenu( hMenu ); } } break; case WM_COMMAND: switch( LOWORD(wParam)) { case IDC_ACCLIST: { HWND hwndList = GetDlgItem(hwndDlg, IDC_ACCLIST); switch (HIWORD(wParam)) { case LBN_SELCHANGE: sttUpdateAccountInfo(hwndDlg, dat); sttSelectItem(dat, hwndList, ListBox_GetCurSel(hwndList)); SetFocus(hwndList); break; case LBN_DBLCLK: PostMessage(hwndList, WM_MY_RENAME, 0, 0); break; case LBN_MY_CHECK: { PROTOACCOUNT *pa = (PROTOACCOUNT *)ListBox_GetItemData(hwndList, lParam); if ( pa ) { if ( pa->bOldProto || pa->bDynDisabled) break; pa->bIsEnabled = !pa->bIsEnabled; if ( pa->bIsEnabled ) { if ( ActivateAccount( pa )) { pa->ppro->OnEvent( EV_PROTO_ONLOAD, 0, 0 ); if (!DBGetContactSettingByte(NULL, "CList", "MoveProtoMenus", FALSE)) pa->ppro->OnEvent( EV_PROTO_ONMENU, 0, 0 ); } else pa->type = PROTOTYPE_DISPROTO; } else { DWORD dwStatus = CallProtoService(pa->szModuleName, PS_GETSTATUS, 0, 0); if (dwStatus >= ID_STATUS_ONLINE) { if (IDCANCEL == ::MessageBox(hwndDlg, TranslateT("Account is online. Disable account?"), TranslateT("Accounts"), MB_OKCANCEL)) { pa->bIsEnabled = 1; //stay enabled } } if ( !pa->bIsEnabled ) DeactivateAccount( pa, true, false ); } WriteDbAccounts(); NotifyEventHooks( hAccListChanged, PRAC_CHECKED, ( LPARAM )pa ); sttUpdateAccountInfo(hwndDlg, dat); RedrawWindow(hwndList, NULL, NULL, RDW_INVALIDATE); } } break; case LBN_MY_RENAME: { int iItem = ListBox_GetCurSel(hwndList); PROTOACCOUNT *pa = (PROTOACCOUNT *)ListBox_GetItemData(hwndList, iItem); if ( pa ) { mir_free(pa->tszAccountName); pa->tszAccountName = (TCHAR*)lParam; WriteDbAccounts(); NotifyEventHooks(hAccListChanged, PRAC_CHANGED, (LPARAM)pa); ListBox_DeleteString(hwndList, iItem); iItem = ListBox_AddString(hwndList, pa->tszAccountName); ListBox_SetItemData(hwndList, iItem, (LPARAM)pa); ListBox_SetCurSel(hwndList, iItem); sttSelectItem(dat, hwndList, iItem); RedrawWindow(hwndList, NULL, NULL, RDW_INVALIDATE); } else mir_free((TCHAR*)lParam); } break; } } break; case IDC_ADD: { AccFormDlgParam param = { PRAC_ADDED, NULL }; if ( IDOK == DialogBoxParam( hMirandaInst, MAKEINTRESOURCE(IDD_ACCFORM), hwndDlg, AccFormDlgProc, (LPARAM)¶m )) SendMessage( hwndDlg, WM_MY_REFRESH, 0, 0 ); } break; case IDC_EDIT: { HWND hList = GetDlgItem( hwndDlg, IDC_ACCLIST ); int idx = ListBox_GetCurSel( hList ); if ( idx != -1 ) PostMessage(hList, WM_MY_RENAME, 0, 0); } break; case IDC_REMOVE: { HWND hList = GetDlgItem( hwndDlg, IDC_ACCLIST ); int idx = ListBox_GetCurSel( hList ); if ( idx != -1 ) { PROTOACCOUNT* pa = ( PROTOACCOUNT* )ListBox_GetItemData( hList, idx ); TCHAR buf[ 200 ]; mir_sntprintf( buf, SIZEOF(buf), TranslateT( "Account %s is being deleted" ), pa->tszAccountName ); if (pa->bOldProto) { MessageBox( NULL, TranslateT( "You need to disable plugin to delete this account" ), buf, MB_ICONERROR | MB_OK ); break; } if ( IDYES == MessageBox( NULL, TranslateT( errMsg ), buf, MB_ICONSTOP | MB_DEFBUTTON2 | MB_YESNO )) { // lock controls to avoid changes during remove process ListBox_SetCurSel( hList, -1 ); sttUpdateAccountInfo( hwndDlg, dat ); EnableWindow( hList, FALSE ); EnableWindow( GetDlgItem(hwndDlg, IDC_ADD), FALSE ); ListBox_SetItemData( hList, idx, 0 ); accounts.remove( pa ); CheckProtocolOrder(); WriteDbAccounts(); NotifyEventHooks( hAccListChanged, PRAC_REMOVED, ( LPARAM )pa ); UnloadAccount( pa, true, true ); SendMessage( hwndDlg, WM_MY_REFRESH, 0, 0 ); EnableWindow( hList, TRUE ); EnableWindow( GetDlgItem(hwndDlg, IDC_ADD), TRUE ); } } } break; case IDC_OPTIONS: { HWND hList = GetDlgItem( hwndDlg, IDC_ACCLIST ); int idx = ListBox_GetCurSel( hList ); if ( idx != -1 ) { PROTOACCOUNT* pa = ( PROTOACCOUNT* )ListBox_GetItemData( hList, idx ); if ( pa->bOldProto ) { OPENOPTIONSDIALOG ood; ood.cbSize = sizeof(ood); ood.pszGroup = "Network"; ood.pszPage = pa->szModuleName; ood.pszTab = NULL; CallService( MS_OPT_OPENOPTIONS, 0, (LPARAM)&ood ); } else OpenAccountOptions( pa ); } } break; case IDC_UPGRADE: { HWND hList = GetDlgItem( hwndDlg, IDC_ACCLIST ); int idx = ListBox_GetCurSel( hList ); if ( idx != -1 ) { AccFormDlgParam param = { PRAC_UPGRADED, ( PROTOACCOUNT* )ListBox_GetItemData( hList, idx ) }; DialogBoxParam( hMirandaInst, MAKEINTRESOURCE(IDD_ACCFORM), hwndDlg, AccFormDlgProc, (LPARAM)¶m ); } } break; case IDC_LNK_NETWORK: { PSHNOTIFY pshn = {0}; pshn.hdr.code = PSN_APPLY; pshn.hdr.hwndFrom = hwndDlg; SendMessage(hwndDlg, WM_NOTIFY, 0, (LPARAM)&pshn); OPENOPTIONSDIALOG ood = {0}; ood.cbSize = sizeof(ood); ood.pszPage = "Network"; CallService( MS_OPT_OPENOPTIONS, 0, (LPARAM)&ood ); break; } case IDC_LNK_ADDONS: CallService(MS_UTILS_OPENURL, TRUE, (LPARAM)"http://addons.miranda-im.org/"); break; case IDOK: { PSHNOTIFY pshn = {0}; pshn.hdr.code = PSN_APPLY; pshn.hdr.hwndFrom = hwndDlg; SendMessage(hwndDlg, WM_NOTIFY, 0, (LPARAM)&pshn); DestroyWindow(hwndDlg); break; } case IDCANCEL: { PSHNOTIFY pshn = {0}; pshn.hdr.code = PSN_RESET; pshn.hdr.hwndFrom = hwndDlg; SendMessage(hwndDlg, WM_NOTIFY, 0, (LPARAM)&pshn); DestroyWindow(hwndDlg); break; } } case PSM_CHANGED: { HWND hList = GetDlgItem( hwndDlg, IDC_ACCLIST ); int idx = ListBox_GetCurSel( hList ); if ( idx != -1 ) { PROTOACCOUNT *acc = (PROTOACCOUNT *)ListBox_GetItemData(hList, idx); if (acc) { acc->bAccMgrUIChanged = TRUE; SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } } break; } case WM_NOTIFY: switch(((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { int i; PSHNOTIFY pshn = {0}; pshn.hdr.code = PSN_APPLY; for (i = 0; i < accounts.getCount(); ++i) { if ( accounts[i]->hwndAccMgrUI && accounts[i]->bAccMgrUIChanged ) { pshn.hdr.hwndFrom = accounts[i]->hwndAccMgrUI; SendMessage(accounts[i]->hwndAccMgrUI, WM_NOTIFY, 0, (LPARAM)&pshn); accounts[i]->bAccMgrUIChanged = FALSE; } } return TRUE; } case PSN_RESET: { int i; PSHNOTIFY pshn = {0}; pshn.hdr.code = PSN_RESET; for (i = 0; i < accounts.getCount(); ++i) { if ( accounts[i]->hwndAccMgrUI && accounts[i]->bAccMgrUIChanged ) { pshn.hdr.hwndFrom = accounts[i]->hwndAccMgrUI; SendMessage(accounts[i]->hwndAccMgrUI, WM_NOTIFY, 0, (LPARAM)&pshn); accounts[i]->bAccMgrUIChanged = FALSE; } } return TRUE; } } break; } break; case WM_DESTROY: { for (int i = 0; i < accounts.getCount(); ++i) { accounts[i]->bAccMgrUIChanged = FALSE; if (accounts[i]->hwndAccMgrUI) { DestroyWindow(accounts[i]->hwndAccMgrUI); accounts[i]->hwndAccMgrUI = NULL; } } } Window_FreeIcon_IcoLib( hwndDlg ); Button_FreeIcon_IcoLib( hwndDlg, IDC_ADD ); Button_FreeIcon_IcoLib( hwndDlg, IDC_EDIT ); Button_FreeIcon_IcoLib( hwndDlg, IDC_REMOVE ); Button_FreeIcon_IcoLib( hwndDlg, IDC_OPTIONS ); Button_FreeIcon_IcoLib( hwndDlg, IDC_UPGRADE ); Utils_SaveWindowPosition( hwndDlg, NULL, "AccMgr", ""); sttSubclassAccList(GetDlgItem(hwndDlg, IDC_ACCLIST), FALSE); DeleteObject(dat->hfntTitle); DeleteObject(dat->hfntText); mir_free(dat); hAccMgr = NULL; break; } return FALSE; }
a) event notify stuff, messages posted from the popups to avoid threading issues. b) tray icon handling c) send later job management. Periodically process the queue of open deferred send jobs. */ #include "commonheaders.h" static UINT WM_TASKBARCREATED; static HANDLE hSvcHotkeyProcessor = 0; static HOTKEYDESC _hotkeydescs[] = { { 0, "tabsrmm_mostrecent", LPGEN("Most recent unread session"), TABSRMM_HK_SECTION_IM, MS_TABMSG_HOTKEYPROCESS, HOTKEYCODE(HOTKEYF_CONTROL|HOTKEYF_SHIFT, 'R'), TABSRMM_HK_LASTUNREAD }, { 0, "tabsrmm_paste_and_send", LPGEN("Paste and send"), TABSRMM_HK_SECTION_GENERIC, 0, HOTKEYCODE(HOTKEYF_CONTROL|HOTKEYF_SHIFT, 'D'), TABSRMM_HK_PASTEANDSEND }, { 0, "tabsrmm_uprefs", LPGEN("Contact's messaging prefs"), TABSRMM_HK_SECTION_IM, 0, HOTKEYCODE(HOTKEYF_CONTROL|HOTKEYF_SHIFT, 'C'), TABSRMM_HK_SETUSERPREFS }, { 0, "tabsrmm_copts", LPGEN("Container options"), TABSRMM_HK_SECTION_GENERIC, 0, HOTKEYCODE(HOTKEYF_CONTROL, 'O'), TABSRMM_HK_CONTAINEROPTIONS }, { 0, "tabsrmm_nudge", LPGEN("Send nudge"), TABSRMM_HK_SECTION_IM, 0, HOTKEYCODE(HOTKEYF_CONTROL, 'N'), TABSRMM_HK_NUDGE }, { 0, "tabsrmm_sendfile", LPGEN("Send a file"), TABSRMM_HK_SECTION_IM, 0, HOTKEYCODE(HOTKEYF_ALT, 'F'), TABSRMM_HK_SENDFILE }, { 0, "tabsrmm_quote", LPGEN("Quote message"), TABSRMM_HK_SECTION_IM, 0, HOTKEYCODE(HOTKEYF_ALT, 'Q'), TABSRMM_HK_QUOTEMSG }, { 0, "tabsrmm_sendlater", LPGEN("Toggle send later"), TABSRMM_HK_SECTION_IM, 0, HOTKEYCODE(HOTKEYF_CONTROL|HOTKEYF_SHIFT, 'S'), TABSRMM_HK_TOGGLESENDLATER }, { 0, "tabsrmm_send", LPGEN("Send message"), TABSRMM_HK_SECTION_GENERIC, 0, 0, TABSRMM_HK_SEND }, { 0, "tabsrmm_emot", LPGEN("Smiley selector"), TABSRMM_HK_SECTION_GENERIC, 0, HOTKEYCODE(HOTKEYF_ALT, 'E'), TABSRMM_HK_EMOTICONS }, { 0, "tabsrmm_hist", LPGEN("Show message history"), TABSRMM_HK_SECTION_GENERIC, 0, HOTKEYCODE(HOTKEYF_ALT, 'H'), TABSRMM_HK_HISTORY }, { 0, "tabsrmm_umenu", LPGEN("Show user menu"), TABSRMM_HK_SECTION_IM, 0, HOTKEYCODE(HOTKEYF_ALT, 'D'), TABSRMM_HK_USERMENU }, { 0, "tabsrmm_udet", LPGEN("Show user details"), TABSRMM_HK_SECTION_IM, 0, HOTKEYCODE(HOTKEYF_ALT, 'U'), TABSRMM_HK_USERDETAILS }, { 0, "tabsrmm_tbar", LPGEN("Toggle toolbar"), TABSRMM_HK_SECTION_GENERIC, 0, HOTKEYCODE(HOTKEYF_ALT|HOTKEYF_SHIFT, 'T'), TABSRMM_HK_TOGGLETOOLBAR }, { 0, "tabsrmm_ipanel", LPGEN("Toggle info panel"), TABSRMM_HK_SECTION_GENERIC, 0, HOTKEYCODE(HOTKEYF_ALT|HOTKEYF_CONTROL, 'I'), TABSRMM_HK_TOGGLEINFOPANEL },
PLUGININFOEX pluginInfo={ sizeof(PLUGININFOEX), __PLUGIN_NAME, PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM), __DESCRIPTION, __AUTHOR, __AUTHOREMAIL, __COPYRIGHT, __AUTHORWEB, UNICODE_AWARE, // {1AAC15E8-DCEC-4050-B66F-2AA0E6120C22} {0x1aac15e8, 0xdcec, 0x4050, {0xb6, 0x6f, 0x2a, 0xa0, 0xe6, 0x12, 0xc, 0x22}} }; static IconItem icon = { LPGEN("Paste It"), "PasteIt_main", IDI_MENU }; XML_API xi = {0}; int hLangpack = 0; BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { hInst = hModule; return TRUE; } extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) { gMirandaVersion = mirandaVersion; return &pluginInfo; }
mir_sntprintf(cmdLine, SIZEOF(cmdLine), _T("\"%s\" /restart:%d /svc:dbchecker"), mirandaPath, GetCurrentProcessId()); CallService("CloseAction", 0, 0); CreateProcess(mirandaPath, cmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); } return 0; } static INT_PTR RestartMe(WPARAM wParam, LPARAM lParam) { CallService(MS_SYSTEM_RESTART, 1, 0); return 0; } static IconItem iconList[] = { { LPGEN("Load profile"), SRV_LOAD_PM, IDI_LoadPM }, { LPGEN("Change profile"), SRV_CHANGE_PM, IDI_ChangePM }, { LPGEN("Check database"), SRV_CHECK_DB, IDI_Dbchecker }, { LPGEN("Restart"), SRV_RESTART_ME, IDI_Restart } }; static int OnModulesLoaded(WPARAM, LPARAM) { CLISTMENUITEM mi = { sizeof(mi) }; mi.position = -500200000; mi.pszPopupName = LPGEN("Database"); for (int i = 0; i < SIZEOF(iconList); i++) { mi.pszName = iconList[i].szDescr; mi.pszService = iconList[i].szName; mi.icolibItem = iconList[i].hIcolib;
extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { hInst = hinstDLL; return TRUE; } extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) { return &pluginInfoEx; } //------------ INIT FUNCTIONS ------------// static IconItem iconList[] = { { LPGEN("FTP Server 1"), "ftp1", IDI_FTP0 }, { LPGEN("FTP Server 2"), "ftp2", IDI_FTP1 }, { LPGEN("FTP Server 3"), "ftp3", IDI_FTP2 }, { LPGEN("FTP Server 4"), "ftp4", IDI_FTP3 }, { LPGEN("FTP Server 5"), "ftp5", IDI_FTP4 }, { LPGEN("Send file"), "main", IDI_MENU }, { LPGEN("Clipboard"), "clipboard", IDI_CLIPBOARD }, { LPGEN("Pause"), "pause", IDI_PAUSE }, { LPGEN("Resume"), "resume", IDI_RESUME }, { LPGEN("Delete from list"), "clear", IDI_CLEAR }, { LPGEN("Delete from FTP"), "delete", IDI_DELETE } }; static void InitIcolib() { Icon_Register(hInst, LPGEN("FTP File"), iconList, SIZEOF(iconList), MODULE);
static void InitIcolib() { Icon_Register(hInst, LPGEN("FTP File"), iconList, SIZEOF(iconList), MODULE); }
// Load icons void LoadIcons(void) { Icon_Register(hInst, LPGEN("Nudge"), iconList, _countof(iconList)); }
DefaultNudge.Load(); GlobalNudge.Load(); int numberOfProtocols = 0; PROTOACCOUNT **ppProtocolDescriptors; Proto_EnumAccounts(&numberOfProtocols, &ppProtocolDescriptors); for (int i = 0; i < numberOfProtocols; i++) Nudge_AddAccount(ppProtocolDescriptors[i]); shake.Load(); } static IconItem iconList[] = { { LPGEN("Nudge as Default"), "Nudge_Default", IDI_NUDGE } }; // Load icons void LoadIcons(void) { Icon_Register(hInst, LPGEN("Nudge"), iconList, _countof(iconList)); } // Nudge support static int TabsrmmButtonPressed(WPARAM wParam, LPARAM lParam) { CustomButtonClickData *cbcd = (CustomButtonClickData *)lParam; if (!mir_strcmp(cbcd->pszModule, "Nudge")) NudgeSend(wParam, 0);
// Get next event in chain hExistingDbEvent = db_event_next(hContact, hExistingDbEvent); } } // reset last event hPreviousContact = INVALID_CONTACT_ID; return FALSE; } ///////////////////////////////////////////////////////////////////////////////////////// // icons static IconItem iconList[] = { { LPGEN("Import..."), "import_main", IDI_IMPORT } }; HICON GetIcon(int iIconId, bool size) { for (int i = 0; i < _countof(iconList); i++) if (iconList[i].defIconID == iIconId) return IcoLib_GetIconByHandle(iconList[i].hIcolib, size); return NULL; } HANDLE GetIconHandle(int iIconId) { for (int i = 0; i < _countof(iconList); i++) if (iconList[i].defIconID == iIconId)
static HGENMENU hShowIfOflineItem = NULL; static HANDLE hOnContactMenuBuild_FAV = NULL; static TCHAR *FAVMENUROOTNAME = LPGENT("&Contact rate"); static TCHAR *rates[] = { LPGENT("None"), LPGENT("Low"), LPGENT("Medium"), LPGENT("High") }; static IconItem iconList[] = { { LPGEN("Contact rate: none"), "Rate1", IDI_FAVORITE_0 }, { LPGEN("Contact rate: low"), "Rate2", IDI_FAVORITE_1 }, { LPGEN("Contact rate: medium"), "Rate3", IDI_FAVORITE_2 }, { LPGEN("Contact rate: high"), "Rate4", IDI_FAVORITE_3 } }; static int FAV_OnContactMenuBuild(WPARAM hContact, LPARAM) { BYTE bContactRate = db_get_b(hContact, "CList", "Rate", 0); if (bContactRate > SIZEOF(rates) - 1) bContactRate = SIZEOF(rates) - 1; BOOL bModifyMenu = FALSE; CLISTMENUITEM mi = { sizeof(mi) }; mi.icolibItem = iconList[bContactRate].hIcolib;
static INT_PTR CALLBACK ButOrderOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hTree = GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE); OrderData *dat = (OrderData*)GetWindowLongPtr(hTree, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); dat = (OrderData*)malloc( sizeof(OrderData)); SetWindowLongPtr(hTree, GWLP_USERDATA, (LONG_PTR)dat); dat->dragging = 0; SetWindowLongPtr(hTree, GWL_STYLE, GetWindowLongPtr(hTree, GWL_STYLE)|TVS_NOHSCROLL); SetDlgItemInt(hwndDlg, IDC_BUTTHEIGHT, g_ctrl->nButtonHeight, FALSE); SendDlgItemMessage(hwndDlg, IDC_SPIN_HEIGHT, UDM_SETRANGE, 0, MAKELONG(50,10)); SendDlgItemMessage(hwndDlg, IDC_SPIN_HEIGHT, UDM_SETPOS, 0, MAKELONG(g_ctrl->nButtonHeight,0)); SetDlgItemInt(hwndDlg, IDC_BUTTWIDTH, g_ctrl->nButtonWidth, FALSE); SendDlgItemMessage(hwndDlg, IDC_SPIN_WIDTH, UDM_SETRANGE, 0, MAKELONG(50,10)); SendDlgItemMessage(hwndDlg, IDC_SPIN_WIDTH, UDM_SETPOS, 0, MAKELONG(g_ctrl->nButtonWidth,0)); SetDlgItemInt(hwndDlg, IDC_BUTTGAP, g_ctrl->nButtonSpace, FALSE); SendDlgItemMessage(hwndDlg, IDC_SPIN_GAP, UDM_SETRANGE, 0, MAKELONG(20,0)); SendDlgItemMessage(hwndDlg, IDC_SPIN_GAP, UDM_SETPOS, 0, MAKELONG(g_ctrl->nButtonSpace,0)); CheckDlgButton(hwndDlg, IDC_USEFLAT, g_ctrl->bFlatButtons ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_AUTORESIZE, g_ctrl->bAutoSize ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_SINGLELINE, g_ctrl->bSingleLine ? BST_CHECKED : BST_UNCHECKED); BuildTree(hwndDlg); EnableWindow(GetDlgItem(hwndDlg, IDC_ENAME), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_EPATH), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_DELLBUTTON), FALSE); OptionshWnd = hwndDlg; return TRUE; case WM_COMMAND: if (HIWORD(wParam) == EN_CHANGE && OptionshWnd) { switch(LOWORD(wParam)) { case IDC_ENAME: case IDC_EPATH: break; default: SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } break; } if ((HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DBLCLK)) { int ctrlid = LOWORD(wParam); //----- Launch buttons ----- if (ctrlid == IDC_BROWSE) { TCHAR str[MAX_PATH]; OPENFILENAME ofn = {0}; GetDlgItemText(hwndDlg, IDC_EPATH, str, _countof(str)); ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; ofn.hwndOwner = hwndDlg; ofn.hInstance = NULL; ofn.lpstrFilter = NULL; ofn.lpstrFile = str; ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_EXPLORER; ofn.nMaxFile = _countof(str); ofn.nMaxFileTitle = MAX_PATH; ofn.lpstrDefExt = _T("exe"); if (!GetOpenFileName(&ofn)) break; SetDlgItemText(hwndDlg, IDC_EPATH, str); break; } SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); if (ctrlid == IDC_LBUTTONSET) { TVITEM tvi ={0}; tvi.hItem = TreeView_GetSelection(hTree); if (tvi.hItem == NULL) break; tvi.mask = TVIF_PARAM; TreeView_GetItem(hTree, &tvi); TopButtonInt* btn = (TopButtonInt*)tvi.lParam; TCHAR buf [256]; // probably, condition not needs if (btn->dwFlags & TTBBF_ISLBUTTON) { if (!(btn->dwFlags & TTBBF_OPTIONAL)) { // create button TTBButton ttb = { 0 }; ttb.hIconDn = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_RUN), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); ttb.dwFlags = TTBBF_VISIBLE | TTBBF_ISLBUTTON | TTBBF_INTERNAL | TTBBF_OPTIONAL; ttb.name = NULL; ttb.program = NULL; int id = btn->id; btn = CreateButton(&ttb); btn->id = id; tvi.lParam = (LPARAM)btn; TreeView_SetItem(hTree, &tvi); } GetDlgItemText(hwndDlg, IDC_ENAME, buf, _countof(buf)); replaceStr(btn->pszName, _T2A(buf)); tvi.mask = TVIF_TEXT; tvi.pszText = buf; TreeView_SetItem(hTree, &tvi); GetDlgItemText(hwndDlg, IDC_EPATH, buf, _countof(buf)); replaceStrT(btn->ptszProgram, buf); } break; } if (ctrlid == IDC_ADDLBUTTON) { // create button TTBButton ttb = { 0 }; ttb.hIconDn = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_RUN), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); ttb.dwFlags = TTBBF_VISIBLE | TTBBF_ISLBUTTON | TTBBF_INTERNAL | TTBBF_OPTIONAL; ttb.name = LPGEN("Default"); ttb.program = _T("Execute Path"); TopButtonInt* b = CreateButton(&ttb); // get selection for insert TVITEM tvi = {0}; tvi.hItem = TreeView_GetSelection(hTree); // insert item AddLine(hTree, b, tvi.hItem, dat->himlButtonIcons); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; } //----- Separators ----- if (ctrlid == IDC_ADDSEP) { // create button TTBButton ttb = { 0 }; ttb.dwFlags = TTBBF_VISIBLE | TTBBF_ISSEPARATOR | TTBBF_INTERNAL | TTBBF_OPTIONAL; TopButtonInt* b = CreateButton(&ttb); // get selection for insert TVITEM tvi = {0}; tvi.hItem = TreeView_GetSelection(hTree); // insert item AddLine(hTree, b, tvi.hItem, dat->himlButtonIcons); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; } if (ctrlid == IDC_REMOVEBUTTON) { TVITEM tvi = {0}; tvi.hItem = TreeView_GetSelection(hTree); if (tvi.hItem == NULL) break; tvi.mask = TVIF_PARAM; TreeView_GetItem(hTree, &tvi); TopButtonInt* btn = (TopButtonInt*)tvi.lParam; // if button enabled for separator and launch only, no need condition // except possible service button introducing if (btn->dwFlags & (TTBBF_ISSEPARATOR | TTBBF_ISLBUTTON)) { // delete if was added in options if (btn->dwFlags & TTBBF_OPTIONAL) delete btn; TreeView_DeleteItem(hTree,tvi.hItem); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } break; } } break; case WM_NOTIFY: switch(((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: g_ctrl->nButtonHeight = GetDlgItemInt(hwndDlg, IDC_BUTTHEIGHT, NULL, FALSE); g_ctrl->nButtonWidth = GetDlgItemInt(hwndDlg, IDC_BUTTWIDTH, NULL, FALSE); g_ctrl->nButtonSpace = GetDlgItemInt(hwndDlg, IDC_BUTTGAP, NULL, FALSE); g_ctrl->bFlatButtons = (BYTE)IsDlgButtonChecked(hwndDlg, IDC_USEFLAT); g_ctrl->bAutoSize = (BYTE)IsDlgButtonChecked(hwndDlg, IDC_AUTORESIZE); g_ctrl->bSingleLine = (BYTE)IsDlgButtonChecked(hwndDlg, IDC_SINGLELINE); db_set_dw(0, TTB_OPTDIR, "BUTTHEIGHT", g_ctrl->nButtonHeight); db_set_dw(0, TTB_OPTDIR, "BUTTWIDTH", g_ctrl->nButtonWidth); db_set_dw(0, TTB_OPTDIR, "BUTTGAP", g_ctrl->nButtonSpace); db_set_b(0, TTB_OPTDIR, "UseFlatButton", g_ctrl->bFlatButtons); db_set_b(0, TTB_OPTDIR, "SingleLine", g_ctrl->bSingleLine); db_set_b(0, TTB_OPTDIR, "AutoSize", g_ctrl->bAutoSize); SaveTree(hwndDlg); RecreateWindows(); ArrangeButtons(); } break; case IDC_BUTTONORDERTREE: switch (((LPNMHDR)lParam)->code) { case TVN_BEGINDRAG: SetCapture(hwndDlg); dat->dragging = 1; dat->hDragItem = ((LPNMTREEVIEW)lParam)->itemNew.hItem; TreeView_SelectItem(hTree, dat->hDragItem); break; case NM_CLICK: { TVHITTESTINFO hti; hti.pt.x = (short)LOWORD(GetMessagePos()); hti.pt.y = (short)HIWORD(GetMessagePos()); ScreenToClient(((LPNMHDR)lParam)->hwndFrom, &hti.pt); if (TreeView_HitTest(((LPNMHDR)lParam)->hwndFrom, &hti)) if (hti.flags & TVHT_ONITEMSTATEICON) { SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); TreeView_SelectItem(hTree, hti.hItem); } } break; case TVN_SELCHANGED: { HTREEITEM hti = TreeView_GetSelection(hTree); if (hti == NULL) break; TopButtonInt *btn = (TopButtonInt*)((LPNMTREEVIEW)lParam)->itemNew.lParam; mir_cslock lck(csButtonsHook); if (btn->dwFlags & TTBBF_ISLBUTTON) { bool enable = (btn->dwFlags & TTBBF_INTERNAL) !=0; EnableWindow(GetDlgItem(hwndDlg, IDC_ENAME), enable); EnableWindow(GetDlgItem(hwndDlg, IDC_EPATH), enable); EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVEBUTTON), enable); EnableWindow(GetDlgItem(hwndDlg, IDC_LBUTTONSET), enable); if (btn->pszName != NULL) SetDlgItemTextA(hwndDlg, IDC_ENAME, btn->pszName); else SetDlgItemTextA(hwndDlg, IDC_ENAME, ""); if (btn->ptszProgram != NULL) SetDlgItemText(hwndDlg, IDC_EPATH, btn->ptszProgram); else SetDlgItemTextA(hwndDlg, IDC_EPATH, ""); } else { EnableWindow(GetDlgItem(hwndDlg,IDC_REMOVEBUTTON), (btn->dwFlags & TTBBF_ISSEPARATOR)?TRUE:FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ENAME), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_EPATH), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_LBUTTONSET), FALSE); SetDlgItemTextA(hwndDlg, IDC_ENAME, ""); SetDlgItemTextA(hwndDlg, IDC_EPATH, ""); } } } break; } break; case WM_MOUSEMOVE: if (dat->dragging) { TVHITTESTINFO hti; hti.pt.x = (short)LOWORD(lParam); hti.pt.y = (short)HIWORD(lParam); ClientToScreen(hwndDlg, &hti.pt); ScreenToClient(hTree, &hti.pt); TreeView_HitTest(hTree, &hti); if (hti.flags & (TVHT_ONITEM | TVHT_ONITEMRIGHT)) { HTREEITEM it=hti.hItem; hti.pt.y -= TreeView_GetItemHeight(hTree)/2; TreeView_HitTest(hTree, &hti); if (!(hti.flags&TVHT_ABOVE)) TreeView_SetInsertMark(hTree,hti.hItem,1); else TreeView_SetInsertMark(hTree,it,0); } else { if (hti.flags & TVHT_ABOVE) SendMessage(hTree, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), 0); if (hti.flags & TVHT_BELOW) SendMessage(hTree, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); TreeView_SetInsertMark(hTree, NULL, 0); } } break; case WM_LBUTTONUP: if (dat->dragging) { TreeView_SetInsertMark(hTree, NULL, 0); dat->dragging = 0; ReleaseCapture(); TVHITTESTINFO hti; hti.pt.x = (short)LOWORD(lParam); hti.pt.y = (short)HIWORD(lParam); ClientToScreen(hwndDlg, &hti.pt); ScreenToClient(hTree, &hti.pt); hti.pt.y -= TreeView_GetItemHeight(hTree)/2; TreeView_HitTest(hTree, &hti); if (dat->hDragItem == hti.hItem) break; if (hti.flags&TVHT_ABOVE) hti.hItem=TVI_FIRST; TVITEM tvi; tvi.mask = TVIF_HANDLE|TVIF_PARAM; tvi.hItem = (HTREEITEM) dat->hDragItem; TreeView_GetItem(hTree, &tvi); if ( (hti.flags & (TVHT_ONITEM | TVHT_ONITEMRIGHT)) || (hti.hItem==TVI_FIRST)) { TVINSERTSTRUCT tvis; TCHAR name[128]; tvis.item.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_STATE; tvis.item.stateMask = 0xFFFFFFFF; tvis.item.pszText = name; tvis.item.cchTextMax = _countof(name); tvis.item.hItem = dat->hDragItem; TreeView_GetItem(hTree, &tvis.item); TreeView_DeleteItem(hTree, dat->hDragItem); tvis.hParent = NULL; tvis.hInsertAfter = hti.hItem; TreeView_SelectItem(hTree, TreeView_InsertItem(hTree, &tvis)); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } } break; case WM_DESTROY: if (dat) { ImageList_Destroy(dat->himlButtonIcons); free(dat); } OptionshWnd = NULL; break; } return FALSE; }
void CIcqProto::handleUserOnline(BYTE *buf, size_t wLen, serverthread_info*) { DWORD dwPort = 0; DWORD dwRealIP = 0; DWORD dwUIN; uid_str szUID; DWORD dwDirectConnCookie = 0; DWORD dwWebPort = 0; DWORD dwFT1 = 0, dwFT2 = 0, dwFT3 = 0; const char *szClient = NULL; BYTE bClientId = 0; WORD wVersion = 0; WORD wTLVCount; WORD wWarningLevel; WORD wStatusFlags; WORD wStatus = 0, wOldStatus = 0; BYTE nTCPFlag = 0; char szStrBuf[MAX_PATH]; // Unpack the sender's user ID if (!unpackUID(&buf, &wLen, &dwUIN, &szUID)) return; // Syntax check if (wLen < 4) return; // Warning level? unpackWord(&buf, &wWarningLevel); wLen -= 2; // TLV count unpackWord(&buf, &wTLVCount); wLen -= 2; // Ignore status notification if the user is not already on our list MCONTACT hContact = HContactFromUID(dwUIN, szUID, NULL); if (hContact == INVALID_CONTACT_ID) { debugLogA("Ignoring user online (%s)", strUID(dwUIN, szUID)); return; } // Read user info TLVs oscar_tlv_chain *pChain; oscar_tlv *pTLV; // Syntax check if (wLen < 4) return; // Get chain if (!(pChain = readIntoTLVChain(&buf, wLen, wTLVCount))) return; // Get Class word WORD wClass = pChain->getWord(0x01, 1); int nIsICQ = wClass & CLASS_ICQ; if (dwUIN) { // Get DC info TLV pTLV = pChain->getTLV(0x0C, 1); if (pTLV && (pTLV->wLen >= 15)) { BYTE *pBuffer = pTLV->pData; nIsICQ = TRUE; unpackDWord(&pBuffer, &dwRealIP); unpackDWord(&pBuffer, &dwPort); unpackByte(&pBuffer, &nTCPFlag); unpackWord(&pBuffer, &wVersion); unpackDWord(&pBuffer, &dwDirectConnCookie); unpackDWord(&pBuffer, &dwWebPort); // Web front port pBuffer += 4; // Client features // Get faked time signatures, used to identify clients if (pTLV->wLen >= 0x23) { unpackDWord(&pBuffer, &dwFT1); unpackDWord(&pBuffer, &dwFT2); unpackDWord(&pBuffer, &dwFT3); } } // Get Status info TLV pTLV = pChain->getTLV(0x06, 1); if (pTLV && (pTLV->wLen >= 4)) { BYTE *pBuffer = pTLV->pData; unpackWord(&pBuffer, &wStatusFlags); unpackWord(&pBuffer, &wStatus); } else if (!nIsICQ) { // Connected thru AIM client, guess by user class if (wClass & CLASS_AWAY) wStatus = ID_STATUS_AWAY; else if (wClass & CLASS_WIRELESS) wStatus = ID_STATUS_ONTHEPHONE; else wStatus = ID_STATUS_ONLINE; wStatusFlags = 0; } else { // Huh? No status TLV? Lets guess then... wStatusFlags = 0; wStatus = ICQ_STATUS_ONLINE; } } else { nIsICQ = FALSE; if (wClass & CLASS_AWAY) wStatus = ID_STATUS_AWAY; else if (wClass & CLASS_WIRELESS) wStatus = ID_STATUS_ONTHEPHONE; else wStatus = ID_STATUS_ONLINE; wStatusFlags = 0; } debugLogA("Flags are %x", wStatusFlags); debugLogA("Status is %x", wStatus); // Get IP TLV DWORD dwIP = pChain->getDWord(0x0A, 1); // Get Online Since TLV DWORD dwOnlineSince = pChain->getDWord(0x03, 1); // Get Away Since TLV DWORD dwAwaySince = pChain->getDWord(0x29, 1); // Get Member Since TLV DWORD dwMemberSince = pChain->getDWord(0x05, 1); // Get Idle timer TLV WORD wIdleTimer = pChain->getWord(0x04, 1); time_t tIdleTS = 0; if (wIdleTimer) { time(&tIdleTS); tIdleTS -= (wIdleTimer*60); } if (wIdleTimer) debugLogA("Idle timer is %u.", wIdleTimer); debugLogA("Online since %s", time2text(dwOnlineSince)); if (dwAwaySince) debugLogA("Status was set on %s", time2text(dwAwaySince)); // Check client capabilities if (hContact != NULL) { wOldStatus = getContactStatus(hContact); // Collect all Capability info from TLV chain BYTE *capBuf = NULL; WORD capLen = 0; // Get Location Capability Info TLVs oscar_tlv *pFullTLV = pChain->getTLV(0x0D, 1); oscar_tlv *pShortTLV = pChain->getTLV(0x19, 1); if (pFullTLV && (pFullTLV->wLen >= BINARY_CAP_SIZE)) capLen += pFullTLV->wLen; if (pShortTLV && (pShortTLV->wLen >= 2)) capLen += (pShortTLV->wLen * 8); capBuf = (BYTE*)_alloca(capLen + BINARY_CAP_SIZE); if (capLen) { BYTE *pCapability = capBuf; capLen = 0; // we need to recount that if (pFullTLV && (pFullTLV->wLen >= BINARY_CAP_SIZE)) { // copy classic Capabilities BYTE *cData = pFullTLV->pData; int cLen = pFullTLV->wLen; while (cLen) { // be impervious to duplicates (AOL sends them sometimes) if (!capLen || !MatchCapability(capBuf, capLen, (capstr*)cData, BINARY_CAP_SIZE)) { // not present, add memcpy(pCapability, cData, BINARY_CAP_SIZE); capLen += BINARY_CAP_SIZE; pCapability += BINARY_CAP_SIZE; } cData += BINARY_CAP_SIZE; cLen -= BINARY_CAP_SIZE; } } if (pShortTLV && (pShortTLV->wLen >= 2)) { // copy short Capabilities capstr tmp; BYTE *cData = pShortTLV->pData; int cLen = pShortTLV->wLen; memcpy(tmp, capShortCaps, BINARY_CAP_SIZE); while (cLen) { // be impervious to duplicates (AOL sends them sometimes) tmp[2] = cData[0]; tmp[3] = cData[1]; if (!capLen || !MatchCapability(capBuf, capLen, &tmp, BINARY_CAP_SIZE)) { // not present, add memcpy(pCapability, tmp, BINARY_CAP_SIZE); capLen += BINARY_CAP_SIZE; pCapability += BINARY_CAP_SIZE; } cData += 2; cLen -= 2; } } debugLogA("Detected %d capability items.", capLen / BINARY_CAP_SIZE); } if (capLen) { // Update the contact's capabilies if present in packet SetCapabilitiesFromBuffer(hContact, capBuf, capLen, wOldStatus == ID_STATUS_OFFLINE); char *szCurrentClient = wOldStatus == ID_STATUS_OFFLINE ? NULL : getSettingStringUtf(hContact, "MirVer", NULL); szClient = detectUserClient(hContact, nIsICQ, wClass, dwOnlineSince, szCurrentClient, wVersion, dwFT1, dwFT2, dwFT3, dwDirectConnCookie, dwWebPort, capBuf, capLen, &bClientId, szStrBuf); // Check if the client changed, if not do not change if (szCurrentClient && !strcmpnull(szCurrentClient, szClient)) szClient = (const char*)-1; SAFE_FREE(&szCurrentClient); } else if (wOldStatus == ID_STATUS_OFFLINE) { // Remove the contact's capabilities if coming from offline ClearAllContactCapabilities(hContact); // no capability debugLogA("No capability info TLVs"); szClient = detectUserClient(hContact, nIsICQ, wClass, dwOnlineSince, NULL, wVersion, dwFT1, dwFT2, dwFT3, dwDirectConnCookie, dwWebPort, NULL, capLen, &bClientId, szStrBuf); } else // Capabilities not present in update packet, do not touch szClient = (const char*)-1; // we don't want to client be overwritten // handle Xtraz status char *moodData = NULL; WORD moodSize = 0; unpackSessionDataItem(pChain, 0x0E, (BYTE**)&moodData, &moodSize, NULL); if (capLen || wOldStatus == ID_STATUS_OFFLINE) handleXStatusCaps(dwUIN, szUID, hContact, capBuf, capLen, moodData, moodSize); else handleXStatusCaps(dwUIN, szUID, hContact, NULL, 0, moodData, moodSize); // Determine support for extended status messages if (pChain->getWord(0x08, 1) == 0x0A06) SetContactCapabilities(hContact, CAPF_STATUS_MESSAGES); else if (wOldStatus == ID_STATUS_OFFLINE) ClearContactCapabilities(hContact, CAPF_STATUS_MESSAGES); if (wOldStatus == ID_STATUS_OFFLINE) { if (CheckContactCapabilities(hContact, CAPF_SRV_RELAY)) debugLogA("Supports advanced messages"); else debugLogA("Does NOT support advanced messages"); } if (!nIsICQ) { // AIM clients does not advertise these, but do support them SetContactCapabilities(hContact, CAPF_UTF | CAPF_TYPING); // Server relayed messages are only supported by ICQ clients ClearContactCapabilities(hContact, CAPF_SRV_RELAY); if (dwUIN && wOldStatus == ID_STATUS_OFFLINE) debugLogA("Logged in with AIM client"); } if (nIsICQ && wVersion < 8) { ClearContactCapabilities(hContact, CAPF_SRV_RELAY); if (wOldStatus == ID_STATUS_OFFLINE) debugLogA("Forcing simple messages due to compability issues"); } // Process Avatar Hash pTLV = pChain->getTLV(0x1D, 1); if (pTLV) handleAvatarContactHash(dwUIN, szUID, hContact, pTLV->pData, pTLV->wLen); else handleAvatarContactHash(dwUIN, szUID, hContact, NULL, 0); // Process Status Note parseStatusNote(dwUIN, szUID, hContact, pChain); } // Free TLV chain disposeChain(&pChain); // Save contacts details in database if (hContact != NULL) { setDword(hContact, "LogonTS", dwOnlineSince); setDword(hContact, "AwayTS", dwAwaySince); setDword(hContact, "IdleTS", tIdleTS); if (dwMemberSince) setDword(hContact, "MemberTS", dwMemberSince); if (nIsICQ) { // on AIM these are not used setDword(hContact, "DirectCookie", dwDirectConnCookie); setByte(hContact, "DCType", (BYTE)nTCPFlag); setWord(hContact, "UserPort", (WORD)(dwPort & 0xffff)); setWord(hContact, "Version", wVersion); } else { delSetting(hContact, "DirectCookie"); delSetting(hContact, "DCType"); delSetting(hContact, "UserPort"); delSetting(hContact, "Version"); } // if no detection, set uknown if (!szClient) szClient = (nIsICQ ? "Unknown" : "Unknown AIM"); if (szClient != (char*)-1) { db_set_utf(hContact, m_szModuleName, "MirVer", szClient); setByte(hContact, "ClientID", bClientId); } if (wOldStatus == ID_STATUS_OFFLINE) { setDword(hContact, "IP", dwIP); setDword(hContact, "RealIP", dwRealIP); } else { // if not first notification only write significant information if (dwIP) setDword(hContact, "IP", dwIP); if (dwRealIP) setDword(hContact, "RealIP", dwRealIP); } setWord(hContact, "Status", (WORD)IcqStatusToMiranda(wStatus)); // Update info? if (dwUIN) { // check if the local copy of user details is up-to-date if (IsMetaInfoChanged(hContact)) icq_QueueUser(hContact); } } LPCTSTR ptszStatus = pcli->pfnGetStatusModeDescription(IcqStatusToMiranda(wStatus), 0); if (wOldStatus != IcqStatusToMiranda(wStatus)) { // And a small log notice... if status was changed if (nIsICQ) debugLogA("%u changed status to %S (v%d).", dwUIN, ptszStatus, wVersion); else debugLogA("%s changed status to %S.", strUID(dwUIN, szUID), ptszStatus); } if (szClient == cliSpamBot) { if (getByte("KillSpambots", DEFAULT_KILLSPAM_ENABLED) && db_get_b(hContact, "CList", "NotOnList", 0)) { // kill spammer icq_DequeueUser(dwUIN); icq_sendRemoveContact(dwUIN, NULL); AddToSpammerList(dwUIN); if (getByte("PopupsSpamEnabled", DEFAULT_SPAM_POPUPS_ENABLED)) ShowPopupMsg(hContact, LPGEN("Spambot Detected"), LPGEN("Contact deleted & further events blocked."), POPTYPE_SPAM); CallService(MS_DB_CONTACT_DELETE, hContact, 0); debugLogA("Contact %u deleted", dwUIN); } } }
void registerLogicTokens() { registerIntToken(AND, parseAnd, TRF_UNPARSEDARGS | TRF_FUNCTION, LPGEN("Logical Expressions")"\t(x,y, ...)\t"LPGEN("performs logical AND (x && y && ...)")); registerIntToken(STR_FALSE, parseFalse, TRF_FIELD, LPGEN("Logical Expressions")"\t"LPGEN("Boolean FALSE")); registerIntToken(FOR, parseFor, TRF_UNPARSEDARGS | TRF_FUNCTION, LPGEN("Logical Expressions")"\t(w,x,y,z)\t"LPGEN("performs w, then shows z and performs y while x is TRUE")); registerIntToken(IF, parseIf, TRF_UNPARSEDARGS | TRF_FUNCTION, LPGEN("Logical Expressions")"\t(x,y,z)\t"LPGEN("shows y if x is TRUE, otherwise it shows z")); registerIntToken(IF2, parseIf2, TRF_UNPARSEDARGS | TRF_FUNCTION, LPGEN("Logical Expressions")"\t(x,y)\t"LPGEN("shows x if x is TRUE, otherwise it shows y (if(x,x,y))")); registerIntToken(IF3, parseIf3, TRF_UNPARSEDARGS | TRF_FUNCTION, LPGEN("Logical Expressions")"\t(x,y, ...)\t"LPGEN("the first argument parsed successfully")); registerIntToken(IFEQUAL, parseIfequal, TRF_UNPARSEDARGS | TRF_FUNCTION, LPGEN("Logical Expressions")"\t(w,x,y,z)\t"LPGEN("y if w = x, else z")); registerIntToken(IFGREATER, parseIfgreater, TRF_UNPARSEDARGS | TRF_FUNCTION, LPGEN("Logical Expressions")"\t(w,x,y,z)\t"LPGEN("y if w > x, else z")); registerIntToken(IFLONGER, parseIflonger, TRF_UNPARSEDARGS | TRF_FUNCTION, LPGEN("Logical Expressions")"\t(w,x,y,z)\t"LPGEN("y if string length of w > x, else z")); registerIntToken(EQUAL, parseEqual, TRF_FUNCTION, LPGEN("Logical Expressions")"\t(x,y)\t"LPGEN("TRUE if x = y")); registerIntToken(GREATER, parseGreater, TRF_FUNCTION, LPGEN("Logical Expressions")"\t(x,y)\t"LPGEN("TRUE if x > y")); registerIntToken(LONGER, parseLonger, TRF_FUNCTION, LPGEN("Logical Expressions")"\t(x,y)\t"LPGEN("TRUE if x is longer than y")); registerIntToken(NOT, parseNot, TRF_UNPARSEDARGS | TRF_FUNCTION, LPGEN("Logical Expressions")"\t(x)\t"LPGEN("performs logical NOT (!x)")); registerIntToken(OR, parseOr, TRF_UNPARSEDARGS | TRF_FUNCTION, LPGEN("Logical Expressions")"\t(x,y,...)\t"LPGEN("performs logical OR (x || y || ...)")); registerIntToken(STR_TRUE, parseTrue, TRF_FIELD, LPGEN("Logical Expressions")"\t"LPGEN("Boolean TRUE")); registerIntToken(XOR, parseXor, TRF_UNPARSEDARGS | TRF_FUNCTION, LPGEN("Logical Expressions")"\t(x,y)\t"LPGEN("performs logical XOR (x ^ y)")); }
*/ #include "commonheaders.h" #include <io.h> struct StandardIconDescription { int id; const char* description; int resource_id; int pf2; const char* section; }; static const struct StandardIconDescription mainIcons[] = { { SKINICON_OTHER_MIRANDA, LPGEN("Miranda IM"), -IDI_MIRANDA }, { SKINICON_EVENT_MESSAGE, LPGEN("Message"), -IDI_RECVMSG }, { SKINICON_EVENT_URL, LPGEN("URL"), -IDI_URL }, { SKINICON_EVENT_FILE, LPGEN("File"), -IDI_FILE }, { SKINICON_OTHER_USERONLINE, LPGEN("User Online"), -IDI_USERONLINE }, { SKINICON_OTHER_GROUPOPEN, LPGEN("Group (Open)"), -IDI_GROUPOPEN }, { SKINICON_OTHER_GROUPSHUT, LPGEN("Group (Closed)"), -IDI_GROUPSHUT }, { SKINICON_OTHER_CONNECTING, LPGEN("Connecting"), -IDI_LOAD }, { SKINICON_OTHER_ADDCONTACT, LPGEN("Add Contact"), -IDI_ADDCONTACT }, { SKINICON_OTHER_USERDETAILS, LPGEN("User Details"), -IDI_USERDETAILS }, { SKINICON_OTHER_HISTORY, LPGEN("History"), -IDI_HISTORY }, { SKINICON_OTHER_DOWNARROW, LPGEN("Down Arrow"), -IDI_DOWNARROW }, { SKINICON_OTHER_FINDUSER, LPGEN("Find User"), -IDI_FINDUSER }, { SKINICON_OTHER_OPTIONS, LPGEN("Options"), -IDI_OPTIONS }, { SKINICON_OTHER_SENDEMAIL, LPGEN("Send E-mail"), -IDI_SENDEMAIL }, { SKINICON_OTHER_DELETE, LPGEN("Delete"), -IDI_DELETE },
// // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // ----------------------------------------------------------------------------- // DESCRIPTION: // // ChangeInfo Plugin stuff // // ----------------------------------------------------------------------------- #include "icqoscar.h" static FieldNamesItem months[] = { { 1, LPGEN("January") }, { 2, LPGEN("February") }, { 3, LPGEN("March") }, { 4, LPGEN("April") }, { 5, LPGEN("May") }, { 6, LPGEN("June") }, { 7, LPGEN("July") }, { 8, LPGEN("August") }, { 9, LPGEN("September") }, { 10, LPGEN("October") }, { 11, LPGEN("November") }, { 12, LPGEN("December") }, { 0, NULL } }; const int ageRange[] = { 13, 0x7FFF }; // 14, 130
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); 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) { // build list of contacts to send if (SendMessage(hList, CLM_GETCHECKMARK, (WPARAM)hItem, 0)) 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++) { strcpynull(pBlob, (char*)maSend[i].mcaNick); pBlob += strlennull(pBlob) + 1; strcpynull(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; }
se.hwnd = hwnd; se.extraFlags = (unsigned int)(LOWORD(subType)); se.local = (void*)dat->sendBuffer; mwe.local = (void*) & se; } return NotifyEventHooks(PluginConfig.m_event_MsgWin, 0, (LPARAM)&mwe); } /* * standard icon definitions */ static TIconDesc _toolbaricons[] = { { "tabSRMM_mlog", LPGEN("Message Log Options"), &PluginConfig.g_buttonBarIcons[2], -IDI_MSGLOGOPT, 1 }, { "tabSRMM_multi", LPGEN("Image tag"), &PluginConfig.g_buttonBarIcons[3], -IDI_IMAGETAG, 1 }, { "tabSRMM_quote", LPGEN("Quote text"), &PluginConfig.g_buttonBarIcons[8], -IDI_QUOTE, 1 }, { "tabSRMM_save", LPGEN("Save and close"), &PluginConfig.g_buttonBarIcons[7], -IDI_SAVE, 1 }, { "tabSRMM_send", LPGEN("Send message"), &PluginConfig.g_buttonBarIcons[9], -IDI_SEND, 1 }, { "tabSRMM_avatar", LPGEN("Edit user notes"), &PluginConfig.g_buttonBarIcons[10], -IDI_CONTACTPIC, 1 }, { "tabSRMM_close", LPGEN("Close"), &PluginConfig.g_buttonBarIcons[6], -IDI_CLOSEMSGDLG, 1 } }; static TIconDesc _exttoolbaricons[] = { { "tabSRMM_emoticon", LPGEN("Smiley button"), &PluginConfig.g_buttonBarIcons[11], -IDI_SMILEYICON, 1 }, { "tabSRMM_bold", LPGEN("Format bold"), &PluginConfig.g_buttonBarIcons[17], -IDI_FONTBOLD, 1 }, { "tabSRMM_italic", LPGEN("Format italic"), &PluginConfig.g_buttonBarIcons[18], -IDI_FONTITALIC, 1 }, { "tabSRMM_underline", LPGEN("Format underline"), &PluginConfig.g_buttonBarIcons[19], -IDI_FONTUNDERLINE, 1 }, { "tabSRMM_face", LPGEN("Font face"), &PluginConfig.g_buttonBarIcons[20], -IDI_FONTFACE, 1 },
INT_PTR CALLBACK DlgProcUrlSend(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { struct UrlSendData* dat = (struct UrlSendData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); Window_SetIcon_IcoLib(hwndDlg, SKINICON_EVENT_URL); Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add contact permanently to list")); Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View user's details")); Button_SetIcon_IcoLib(hwndDlg, IDC_HISTORY, SKINICON_OTHER_HISTORY, LPGEN("View user's history")); Button_SetIcon_IcoLib(hwndDlg, IDC_USERMENU, SKINICON_OTHER_DOWNARROW, LPGEN("User menu")); SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_LIMITTEXT, 450, 0); dat = (struct UrlSendData*)mir_alloc(sizeof(struct UrlSendData)); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); dat->hContact = lParam; dat->hAckEvent = NULL; dat->hSendId = NULL; dat->sendBuffer = NULL; WindowList_Add(hUrlWindowList, hwndDlg, dat->hContact); { TCHAR *str = pcli->pfnGetContactDisplayName(dat->hContact, 0); SetDlgItemText(hwndDlg, IDC_NAME, str); } GetOpenBrowserUrls(hwndDlg, GetDlgItem(hwndDlg, IDC_URLS)); SendDlgItemMessage(hwndDlg, IDC_URLS, CB_SETCURSEL, 0, 0); if (SendDlgItemMessage(hwndDlg, IDC_URLS, CB_GETCOUNT, 0, 0))SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_URLS, CBN_SELCHANGE), 0); EnableWindow(GetDlgItem(hwndDlg, IDOK), (SendDlgItemMessage(hwndDlg, IDC_URLS, CB_GETCURSEL, 0, 0) == CB_ERR)?FALSE:TRUE); Utils_RestoreWindowPositionNoSize(hwndDlg, NULL, "SRUrl", "send"); mir_subclassWindow( GetDlgItem(hwndDlg, IDC_MESSAGE), SendEditSubclassProc); mir_subclassWindow( GetWindow(GetDlgItem(hwndDlg, IDC_URLS), GW_CHILD), SendEditSubclassProc); // From message dlg if ( !db_get_b(dat->hContact, "CList", "NotOnList", 0)) ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), SW_HIDE); SendMessage(hwndDlg, DM_UPDATETITLE, 0, 0); // From message dlg end return TRUE; case WM_DDE_DATA: case WM_DDE_ACK: return DdeMessage(hwndDlg, msg, wParam, lParam); case WM_TIMER: if (wParam == 0) { //ICQ sendurl timed out KillTimer(hwndDlg, 0); MessageBox(hwndDlg, TranslateT("Send timed out"), _T(""), MB_OK); EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_URLS), TRUE); SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETREADONLY, FALSE, 0); } break; case WM_MEASUREITEM: return Menu_MeasureItem((LPMEASUREITEMSTRUCT)lParam); case WM_DRAWITEM: { LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; if (dis->hwndItem == GetDlgItem(hwndDlg, IDC_PROTOCOL)) { char *szProto = GetContactProto(dat->hContact); if (szProto) { HICON hIcon = (HICON)CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0); if (hIcon) { DrawIconEx(dis->hDC, dis->rcItem.left, dis->rcItem.top, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL); DestroyIcon(hIcon); } } } } return Menu_DrawItem((LPDRAWITEMSTRUCT)lParam); case DM_UPDATETITLE: sttUpdateTitle(hwndDlg, dat->hContact); break; case WM_COMMAND: if (CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)dat->hContact)) break; switch (LOWORD(wParam)) { case IDOK: { char *body, *url; int bodySize, urlSize; urlSize = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_URLS))+1; url = (char*)mir_alloc(urlSize); GetDlgItemTextA(hwndDlg, IDC_URLS, url, urlSize); if (url[0] == 0) { mir_free(url); break; } bodySize = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_MESSAGE))+1; body = (char*)mir_alloc(bodySize); GetDlgItemTextA(hwndDlg, IDC_MESSAGE, body, bodySize); dat->sendBuffer = (char*)mir_realloc(dat->sendBuffer, mir_strlen(url)+mir_strlen(body)+2); mir_strcpy(dat->sendBuffer, url); mir_strcpy(dat->sendBuffer+mir_strlen(url)+1, body); dat->hAckEvent = HookEventMessage(ME_PROTO_ACK, hwndDlg, HM_EVENTSENT); dat->hSendId = (HANDLE)CallContactService(dat->hContact, PSS_URL, 0, (LPARAM)dat->sendBuffer); mir_free(url); mir_free(body); //create a timeout timer SetTimer(hwndDlg, 0, TIMEOUT_URLSEND, NULL); EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_URLS), FALSE); SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_SETREADONLY, TRUE, 0); return TRUE; } case IDCANCEL: DestroyWindow(hwndDlg); return TRUE; case IDC_URLS: if (HIWORD(wParam) == CBN_SELCHANGE) { int i, urlSize; char *title; i = SendDlgItemMessage(hwndDlg, IDC_URLS, CB_GETCURSEL, 0, 0); title = (char*)SendDlgItemMessage(hwndDlg, IDC_URLS, CB_GETITEMDATA, (WPARAM)i, 0); SetDlgItemTextA(hwndDlg, IDC_MESSAGE, title); urlSize = SendDlgItemMessage(hwndDlg, IDC_URLS, CB_GETLBTEXTLEN, (WPARAM)i, 0); EnableWindow(GetDlgItem(hwndDlg, IDOK), (urlSize>0)); } else if (HIWORD(wParam) == CBN_EDITCHANGE) { int urlSize = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_URLS)); EnableWindow(GetDlgItem(hwndDlg, IDOK), (urlSize>0)); } break; case IDC_USERMENU: { RECT rc; HMENU hMenu = Menu_BuildContactMenu(dat->hContact); 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)dat->hContact, 0); break; case IDC_DETAILS: CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)dat->hContact, 0); break; case IDC_ADD: ADDCONTACTSTRUCT acs = {0}; acs.hContact = dat->hContact; acs.handleType = HANDLE_CONTACT; acs.szProto = 0; CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); if ( !db_get_b(dat->hContact, "CList", "NotOnList", 0)) ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE); } break; case HM_EVENTSENT: { ACKDATA *ack = (ACKDATA*)lParam; if (ack->hProcess != dat->hSendId) break; if (ack->hContact != dat->hContact) break; if (ack->type != ACKTYPE_URL || ack->result != ACKRESULT_SUCCESS) break; DBEVENTINFO dbei = { 0 }; dbei.cbSize = sizeof(dbei); dbei.eventType = EVENTTYPE_URL; dbei.flags = DBEF_SENT; dbei.szModule = GetContactProto(dat->hContact); dbei.timestamp = time(NULL); dbei.cbBlob = (DWORD)(mir_strlen(dat->sendBuffer)+mir_strlen(dat->sendBuffer+mir_strlen(dat->sendBuffer)+1)+2); dbei.pBlob = (PBYTE)dat->sendBuffer; db_event_add(dat->hContact, &dbei); KillTimer(hwndDlg, 0); DestroyWindow(hwndDlg); } break; case WM_DESTROY: Window_FreeIcon_IcoLib(hwndDlg); Button_FreeIcon_IcoLib(hwndDlg, IDC_ADD); Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); Button_FreeIcon_IcoLib(hwndDlg, IDC_HISTORY); Button_FreeIcon_IcoLib(hwndDlg, IDC_USERMENU); WindowList_Remove(hUrlWindowList, hwndDlg); if (dat->hAckEvent) UnhookEvent(dat->hAckEvent); if (dat->sendBuffer != NULL) mir_free(dat->sendBuffer); mir_free(dat); Utils_SaveWindowPosition(hwndDlg, NULL, "SRUrl", "send"); for (int i = SendDlgItemMessage(hwndDlg, IDC_URLS, CB_GETCOUNT, 0, 0)-1;i>=0;i--) mir_free((char*)SendDlgItemMessage(hwndDlg, IDC_URLS, CB_GETITEMDATA, i, 0)); break; } return FALSE; }
void CAimProto::admin_error(unsigned short error) { switch(error) { case 0x01: ShowPopup(LPGEN("Check your Screen Name."), ERROR_POPUP); break; case 0x02: ShowPopup(LPGEN("Check your Password."), ERROR_POPUP); break; case 0x03: ShowPopup(LPGEN("Check your Email Address."), ERROR_POPUP); break; case 0x04: ShowPopup(LPGEN("Service temporarily unavailable."), ERROR_POPUP); break; case 0x05: ShowPopup(LPGEN("Field change temporarily unavailable."), ERROR_POPUP); break; case 0x06: ShowPopup(LPGEN("Invalid Screen Name."), ERROR_POPUP); break; case 0x07: ShowPopup(LPGEN("Invalid Password."), ERROR_POPUP); break; case 0x08: ShowPopup(LPGEN("Invalid Email."), ERROR_POPUP); break; case 0x09: ShowPopup(LPGEN("Invalid Registration Preference."), ERROR_POPUP); break; case 0x0a: ShowPopup(LPGEN("Invalid Old Password."), ERROR_POPUP); break; case 0x0b: ShowPopup(LPGEN("Invalid Screen Name Length."), ERROR_POPUP); break; case 0x0c: ShowPopup(LPGEN("Invalid Password Length."), ERROR_POPUP); break; case 0x0d: ShowPopup(LPGEN("Invalid Email Length."), ERROR_POPUP); break; case 0x0e: ShowPopup(LPGEN("Invalid Old Password Length."), ERROR_POPUP); break; case 0x0f: ShowPopup(LPGEN("Need Old Password."), ERROR_POPUP); break; case 0x10: ShowPopup(LPGEN("Read Only Field."), ERROR_POPUP); break; case 0x11: ShowPopup(LPGEN("Write Only Field."), ERROR_POPUP); break; case 0x12: ShowPopup(LPGEN("Unsupported Type."), ERROR_POPUP); break; case 0x13: ShowPopup(LPGEN("An Error has occured."), ERROR_POPUP); break; case 0x14: ShowPopup(LPGEN("Incorrect SNAC format."), ERROR_POPUP); break; case 0x15: ShowPopup(LPGEN("Invalid Account."), ERROR_POPUP); break; case 0x16: ShowPopup(LPGEN("Delete Account."), ERROR_POPUP); break; case 0x17: ShowPopup(LPGEN("Expired Account."), ERROR_POPUP); break; case 0x18: ShowPopup(LPGEN("No Database access."), ERROR_POPUP); break; case 0x19: ShowPopup(LPGEN("Invalid Database fields."), ERROR_POPUP); break; case 0x1a: ShowPopup(LPGEN("Bad Database status."), ERROR_POPUP); break; case 0x1b: ShowPopup(LPGEN("Migration Cancel."), ERROR_POPUP); break; case 0x1c: ShowPopup(LPGEN("Internal Error."), ERROR_POPUP); break; case 0x1d: ShowPopup(LPGEN("There is already a Pending Request for this Screen Name."), ERROR_POPUP); break; case 0x1e: ShowPopup(LPGEN("Not DT status."), ERROR_POPUP); break; case 0x1f: ShowPopup(LPGEN("Outstanding Confirmation."), ERROR_POPUP); break; case 0x20: ShowPopup(LPGEN("No Email Address."), ERROR_POPUP); break; case 0x21: ShowPopup(LPGEN("Over Limit."), ERROR_POPUP); break; case 0x22: ShowPopup(LPGEN("Email Host Fail."), ERROR_POPUP); break; case 0x23: ShowPopup(LPGEN("DNS Fail."), ERROR_POPUP); break; } }
but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "commonheaders.h" static LIST<void> arProtoHooks(5); static IconItem iconList[] = { { LPGEN("Delete Selected"), "cross", IDI_CROSS }, { LPGEN("Recent Message"), "recent", IDI_HISTORY }, { LPGEN("Predefined Message"), "predef", IDI_MESSAGE }, { LPGEN("Add to Predefined"), "add", IDI_PLUS }, { LPGEN("Clear History"), "clear", IDI_CHIST }, { LPGEN("Copy Away Message"), "copy", IDI_COPY }, { LPGEN("Change Status Message"), "csmsg", IDI_CSMSG, }, { LPGEN("Go to URL in Away Message"), "gotourl", IDI_GOTOURL } }; void IconsInit(void) { Icon_Register(g_hInst, LPGEN("Simple Status Message"), iconList, SIZEOF(iconList), "SimpleStatusMsg"); } HICON LoadIconEx(const char* name)
void CAimProto::get_error(unsigned short error) { switch(error) { case 0x01: ShowPopup(LPGEN("Invalid SNAC header."), ERROR_POPUP); break; case 0x02: ShowPopup(LPGEN("Server rate limit exceeded."), ERROR_POPUP); break; case 0x03: ShowPopup(LPGEN("Client rate limit exceeded"), ERROR_POPUP); break; case 0x04: ShowPopup(LPGEN("Recipient is not logged in."), ERROR_POPUP); break; case 0x05: ShowPopup(LPGEN("Requested service is unavailable."), ERROR_POPUP); break; case 0x06: ShowPopup(LPGEN("Requested service is not defined."), ERROR_POPUP); break; case 0x07: ShowPopup(LPGEN("You sent obsolete SNAC."), ERROR_POPUP); break; case 0x08: ShowPopup(LPGEN("Not supported by server."), ERROR_POPUP); break; case 0x09: ShowPopup(LPGEN("Not supported by the client."), ERROR_POPUP); break; case 0x0a: ShowPopup(LPGEN("Refused by client."), ERROR_POPUP); break; case 0x0b: ShowPopup(LPGEN("Reply too big."), ERROR_POPUP); break; case 0x0c: ShowPopup(LPGEN("Response lost."), ERROR_POPUP); break; case 0x0d: ShowPopup(LPGEN("Request denied."), ERROR_POPUP); break; case 0x0e: ShowPopup(LPGEN("Incorrect SNAC format."), ERROR_POPUP); break; case 0x0f: ShowPopup(LPGEN("Insufficient rights."), ERROR_POPUP); break; case 0x10: ShowPopup(LPGEN("Recipient blocked."), ERROR_POPUP); break; case 0x11: ShowPopup(LPGEN("Sender too evil."), ERROR_POPUP); break; case 0x12: ShowPopup(LPGEN("Receiver too evil."), ERROR_POPUP); break; case 0x13: ShowPopup(LPGEN("User temporarily unavailable."), ERROR_POPUP); break; case 0x14: ShowPopup(LPGEN("No Match."), ERROR_POPUP); break; case 0x15: ShowPopup(LPGEN("List overflow."), ERROR_POPUP); break; case 0x16: ShowPopup(LPGEN("Request ambiguous."), ERROR_POPUP); break; case 0x17: ShowPopup(LPGEN("Server queue full."), ERROR_POPUP); break; case 0x18: ShowPopup(LPGEN("Not while on AOL."), ERROR_POPUP); break; } }
#include "stdafx.h" TCHAR g_dllpath[1024]; static IconItem iconList[] = { { LPGEN(LANG_ICON_OTR), ICON_OTR, IDI_OTR }, { LPGEN(LANG_ICON_PRIVATE), ICON_PRIVATE, IDI_PRIVATE }, { LPGEN(LANG_ICON_UNVERIFIED), ICON_UNVERIFIED, IDI_UNVERIFIED }, { LPGEN(LANG_ICON_FINISHED), ICON_FINISHED, IDI_FINISHED }, { LPGEN(LANG_ICON_NOT_PRIVATE), ICON_NOT_PRIVATE, IDI_INSECURE } }; void InitIcons() { Icon_Register(hInst, "OTR", iconList, SIZEOF(iconList)); } HICON LoadIcon(const char* name, int big) { return Skin_GetIcon(name, big); } HANDLE GetIconHandle(const char* name) { return Skin_GetIconHandle(name); } void ReleaseIcon(const char* name, int big) { Skin_ReleaseIcon(name, big); }
void InitGroupMenus(void) { HICON hicon = LoadIconFromExternalFile("clisticons.dll",2,TRUE,TRUE,"NewGroup","Contact list","New Group",-IDI_NEWGROUP2,0); NewGroupIconidx = ImageList_AddIcon(hCListImages,hicon ); CreateServiceFunction("CLISTMENUSGroup/ExecService",GroupMenuExecService); CreateServiceFunction("CLISTMENUSGroup/FreeOwnerDataGroupMenu",FreeOwnerDataGroupMenu); CreateServiceFunction("CLISTMENUSGroup/GroupMenuonAddService",GroupMenuonAddService); CreateServiceFunction("CLISTMENUSGroup/HideGroupsHelper",HideGroupsHelper); CreateServiceFunction("CLISTMENUSGroup/UseGroupsHelper",UseGroupsHelper); CreateServiceFunction("CLISTMENUSGroup/HideOfflineRootHelper",HideOfflineRootHelper); CreateServiceFunction("CList/AddGroupMenuItem",AddGroupMenuItem); CreateServiceFunction(MS_CLIST_REMOVEGROUPMENUITEM,RemoveGroupMenuItem); CreateServiceFunction(MS_CLIST_MENUBUILDGROUP,BuildGroupMenu); hPreBuildGroupMenuEvent = CreateHookableEvent(ME_CLIST_PREBUILDGROUPMENU); HookEvent(ME_CLIST_PREBUILDGROUPMENU,OnBuildGroupMenu); InitSubGroupMenus(); // Group menu hGroupMenuObject = MO_CreateMenuObject("GroupMenu", LPGEN("Group menu"), 0, "CLISTMENUSGroup/ExecService"); MO_SetMenuObjectParam(hGroupMenuObject, OPT_USERDEFINEDITEMS, TRUE); MO_SetMenuObjectParam(hGroupMenuObject, OPT_MENUOBJECT_SET_FREE_SERVICE, "CLISTMENUSGroup/FreeOwnerDataGroupMenu"); MO_SetMenuObjectParam(hGroupMenuObject, OPT_MENUOBJECT_SET_ONADD_SERVICE, "CLISTMENUSGroup/GroupMenuonAddService"); { //add exit command to menu GroupMenuParam gmp; CLISTMENUITEM mi = { sizeof(mi) }; mi.position = 1900000; mi.pszService = "CloseAction"; mi.pszName = LPGEN("E&xit"); AddGroupMenuItem(0,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 500; mi.pszService = MS_CLIST_SHOWHIDE; mi.pszName = LPGEN("&Hide/Show"); hHideShowMainMenuItem = (HANDLE)AddGroupMenuItem(0,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 200000; mi.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_FINDUSER)); mi.pszService = "FindAdd/FindAddCommand"; mi.pszName = LPGEN("&Find/Add Contacts..."); AddGroupMenuItem(0,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 300000; mi.pszService = ""; mi.pszName = LPGEN("&Main menu"); hGroupMainMenuItemProxy = (HANDLE)AddGroupMenuItem(0,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 300100; mi.pszService = ""; mi.pszName = LPGEN("&Status"); hGroupStatusMenuItemProxy = (HANDLE)AddGroupMenuItem(0,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 400000; mi.hIcon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_OPTIONS)); mi.pszService = "Options/OptionsCommand"; mi.pszName = LPGEN("&Options..."); AddGroupMenuItem(0,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 500000; mi.hIcon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_CLIENTMIRANDA)); mi.pszService = "Help/AboutCommand"; mi.pszName = LPGEN("&About"); //AddGroupMenuItem(0,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 100000; mi.hIcon = ImageList_GetIcon(hCListImages,NewGroupIconidx,0); mi.pszService = MS_CLIST_GROUPCREATE; mi.pszName = LPGEN("&New Group"); hNewGroupMenuItem = (HGENMENU)AddGroupMenuItem(0,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 100001; mi.hIcon = NULL; mi.pszService = MS_CLIST_SETHIDEOFFLINE; mi.pszName = LPGEN("&Hide Offline Users"); gmp.lParam = 0;gmp.wParam = -1; hHideOfflineUsersMenuItem = (HGENMENU)AddGroupMenuItem((WPARAM)&gmp,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 100002; mi.hIcon = NULL; mi.pszService = "CLISTMENUSGroup/HideOfflineRootHelper"; mi.pszName = LPGEN("Hide &Offline Users out here"); hHideOfflineUsersOutHereMenuItem = (HGENMENU)AddGroupMenuItem(0,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 100003; mi.hIcon = NULL; mi.pszService = "CLISTMENUSGroup/HideGroupsHelper"; mi.pszName = LPGEN("Hide &Empty Groups"); hHideEmptyGroupsMenuItem = (HGENMENU)AddGroupMenuItem(0,(LPARAM)&mi); memset(&mi,0,sizeof(mi)); mi.cbSize = sizeof(mi); mi.position = 100004; mi.hIcon = NULL; mi.pszService = "CLISTMENUSGroup/UseGroupsHelper"; mi.pszName = LPGEN("Disable &Groups"); hDisableGroupsMenuItem = (HGENMENU)AddGroupMenuItem(0,(LPARAM)&mi); HookEvent(ME_SKIN2_ICONSCHANGED,OnIconLibIconChanged); } }
void CSkypeProto::InitMenus() { hChooserMenu = MO_CreateMenuObject("SkypeAccountChooser", LPGEN("Skype menu chooser"), 0, "Skype/MenuChoose"); ////////////////////////////////////////////////////////////////////////////////////// // Contact menu initialization CLISTMENUITEM mi = { 0 }; mi.cbSize = sizeof(CLISTMENUITEM); mi.flags = CMIF_TCHAR | CMIF_NOTOFFLINE; // "Request authorization" mi.pszService = MODULE"/RequestAuth"; mi.ptszName = LPGENT("Request authorization"); mi.position = -201001000 + CMI_AUTH_REQUEST; mi.icolibItem = ::LoadSkinnedIconHandle(SKINICON_AUTH_REQUEST); CSkypeProto::contactMenuItems[CMI_AUTH_REQUEST] = ::Menu_AddContactMenuItem(&mi); ::CreateServiceFunction(mi.pszService, GlobalService<&CSkypeProto::RequestAuth>); // "Grant authorization" mi.pszService = MODULE"/GrantAuth"; mi.ptszName = LPGENT("Grant authorization"); mi.position = -201001000 + CMI_AUTH_GRANT; mi.icolibItem = ::LoadSkinnedIconHandle(SKINICON_AUTH_GRANT); CSkypeProto::contactMenuItems[CMI_AUTH_GRANT] = ::Menu_AddContactMenuItem(&mi); ::CreateServiceFunction(mi.pszService, GlobalService<&CSkypeProto::GrantAuth>); // "Revoke authorization" mi.pszService = MODULE"/RevokeAuth"; mi.ptszName = LPGENT("Revoke authorization"); mi.position = -201001000 + CMI_AUTH_REVOKE; mi.icolibItem = ::LoadSkinnedIconHandle(SKINICON_AUTH_REVOKE); CSkypeProto::contactMenuItems[CMI_AUTH_REVOKE] = ::Menu_AddContactMenuItem(&mi); ::CreateServiceFunction(mi.pszService, GlobalService<&CSkypeProto::RevokeAuth>); // "Block" mi.pszService = MODULE"/Block"; mi.ptszName = LPGENT("Block this person..."); mi.position = -200001000 + CMI_BLOCK; mi.icolibItem = CSkypeProto::GetSkinIconHandle("block"); CSkypeProto::contactMenuItems[CMI_BLOCK] = ::Menu_AddContactMenuItem(&mi); ::CreateServiceFunction(mi.pszService, GlobalService<&CSkypeProto::BlockCommand>); mi.pszService = MODULE"/SyncHistory"; mi.ptszName = LPGENT("View old messages..."); mi.flags = CMIF_TCHAR | CMIF_ROOTPOPUP; mi.position = -200001000 + CMI_HISTORY; mi.icolibItem = ::LoadSkinnedIconHandle(SKINICON_OTHER_HISTORY); CSkypeProto::contactMenuItems[CMI_HISTORY] = ::Menu_AddContactMenuItem(&mi); mi.flags &= ~CMIF_ROOTPOPUP; mi.pszService = MODULE"/SyncHistoryDay"; mi.ptszName = LPGENT("for last day"); mi.flags |= CMIF_CHILDPOPUP; mi.position = -200001000 + CMI_HISTORY + 100; mi.hParentMenu = CSkypeProto::contactMenuItems[CMI_HISTORY]; ::Menu_AddContactMenuItem(&mi); ::CreateServiceFunction(mi.pszService, GlobalService<&CSkypeProto::SyncLastDayHistoryCommand>); mi.pszService = MODULE"/SyncHistoryWeek"; mi.ptszName = LPGENT("for last week"); mi.flags |= CMIF_CHILDPOPUP; mi.position = -200001000 + CMI_HISTORY + 1001; mi.hParentMenu = CSkypeProto::contactMenuItems[CMI_HISTORY]; ::Menu_AddContactMenuItem(&mi); ::CreateServiceFunction(mi.pszService, GlobalService<&CSkypeProto::SyncLastWeekHistoryCommand>); mi.pszService = MODULE"/SyncHistoryMonth"; mi.ptszName = LPGENT("for last month"); mi.flags |= CMIF_CHILDPOPUP; mi.position = -200001000 + CMI_HISTORY + 102; mi.hParentMenu = CSkypeProto::contactMenuItems[CMI_HISTORY]; ::Menu_AddContactMenuItem(&mi); ::CreateServiceFunction(mi.pszService, GlobalService<&CSkypeProto::SyncLastMonthHistoryCommand>); mi.pszService = MODULE"/SyncHistory3Month"; mi.ptszName = LPGENT("for last 3 month"); mi.flags |= CMIF_CHILDPOPUP; mi.position = -200001000 + CMI_HISTORY + 103; mi.hParentMenu = CSkypeProto::contactMenuItems[CMI_HISTORY]; ::Menu_AddContactMenuItem(&mi); ::CreateServiceFunction(mi.pszService, GlobalService<&CSkypeProto::SyncLast3MonthHistoryCommand>); mi.pszService = MODULE"/SyncHistoryYear"; mi.ptszName = LPGENT("for last year"); mi.flags |= CMIF_CHILDPOPUP; mi.position = -200001000 + CMI_HISTORY + 104; mi.hParentMenu = CSkypeProto::contactMenuItems[CMI_HISTORY]; ::Menu_AddContactMenuItem(&mi); ::CreateServiceFunction(mi.pszService, GlobalService<&CSkypeProto::SyncLastYearHistoryCommand>); mi.pszService = MODULE"/SyncHistoryAllTime"; mi.ptszName = LPGENT("for all time"); mi.flags |= CMIF_CHILDPOPUP; mi.position = -200001000 + CMI_HISTORY + 105; mi.hParentMenu = CSkypeProto::contactMenuItems[CMI_HISTORY]; ::Menu_AddContactMenuItem(&mi); ::CreateServiceFunction(mi.pszService, GlobalService<&CSkypeProto::SyncAllTimeHistoryCommand>); }
int MirandaLoaded(WPARAM, LPARAM) { LoadMsgTreeModule(); LoadCListModule(); InitUpdateMsgs(); g_IconList.ReloadIcons(); int numAccs = 0; PROTOACCOUNT **accs; Proto_EnumAccounts(&numAccs, &accs); for (int i = 0, CurProtoIndex = 0; i < numAccs && CurProtoIndex < MAXICQACCOUNTS; i++) { HANDLE hHook = HookEvent(CString(accs[i]->szModuleName) + ME_ICQ_STATUSMSGREQ, StatusMsgReqHooks[CurProtoIndex]); if (hHook) { ICQProtoList[CurProtoIndex] = accs[i]->szModuleName; CurProtoIndex++; } } CreateServiceFunction(MS_AWAYSYS_SETCONTACTSTATMSG, SetContactStatMsg); CreateServiceFunction(MS_AWAYSYS_AUTOREPLY_TOGGLE, ToggleSendOnEvent); CreateServiceFunction(MS_AWAYSYS_AUTOREPLY_ON, srvAutoreplyOn); CreateServiceFunction(MS_AWAYSYS_AUTOREPLY_OFF, srvAutoreplyOff); CreateServiceFunction(MS_AWAYSYS_AUTOREPLY_USEDEFAULT, srvAutoreplyUseDefault); CreateServiceFunction(MS_AWAYMSG_GETSTATUSMSGW, GetStatusMsgW); CreateServiceFunction(MS_NAS_GETSTATEA, GetStateA); CreateServiceFunction(MS_NAS_SETSTATEA, SetStateA); CreateServiceFunction(MS_NAS_GETSTATEW, GetStateW); CreateServiceFunction(MS_NAS_SETSTATEW, SetStateW); CreateServiceFunction(MS_NAS_INVOKESTATUSWINDOW, InvokeStatusWindow); // and old AwaySysMod service, for compatibility reasons CreateServiceFunction(MS_AWAYSYS_SETSTATUSMODE, SetStatusMode); HookEvent(ME_TTB_MODULELOADED, Create_TopToolbar); HookEvent(ME_OPT_INITIALISE, OptsDlgInit); HookEvent(ME_CLIST_STATUSMODECHANGE, StatusChanged); HookEvent(ME_CS_STATUSCHANGEEX, CSStatusChange); // for compatibility with StartupStatus and AdvancedAutoAway HookEvent(ME_DB_CONTACT_SETTINGCHANGED, DBSettingChanged); HookEvent(ME_DB_EVENT_FILTER_ADD, MsgEventAdded); HookEvent(ME_CLIST_PREBUILDCONTACTMENU, PreBuildContactMenu); HookEvent(ME_SKIN_ICONSCHANGED, IconsChanged); HookEvent(ME_IDLE_CHANGED, IdleChangeEvent); g_hReadWndList = WindowList_Create(); int SendOnEvent = CContactSettings(g_ProtoStates[(char*)NULL].Status).Autoreply; CMenuItem mi; mi.position = 1000020000; mi.flags = CMIF_TCHAR | CMIF_NOTOFFLINE; mi.hIcolibItem = iconList[SendOnEvent ? 1 : 0].hIcolib; mi.name.t = SendOnEvent ? DISABLE_SOE_COMMAND : ENABLE_SOE_COMMAND; mi.pszService = MS_AWAYSYS_AUTOREPLY_TOGGLE; g_hToggleSOEMenuItem = Menu_AddMainMenuItem(&mi); memset(&mi, 0, sizeof(mi)); mi.position = -2000005000; mi.flags = CMIF_TCHAR | CMIF_NOTOFFLINE | CMIF_HIDDEN; mi.name.t = LPGENT("Read status message"); // never seen... mi.pszService = MS_AWAYMSG_SHOWAWAYMSG; g_hReadStatMenuItem = Menu_AddContactMenuItem(&mi); if (g_MoreOptPage.GetDBValueCopy(IDC_MOREOPTDLG_USEMENUITEM)) { memset(&mi, 0, sizeof(mi)); mi.flags = CMIF_TCHAR | CMIF_HIDDEN; mi.name.t = LPGENT("Set status message"); // will never be shown mi.position = 1000020000; mi.hIcolibItem = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_MSGICON)); mi.pszService = MS_AWAYSYS_SETCONTACTSTATMSG; g_hContactMenuItem = Menu_AddContactMenuItem(&mi); memset(&mi, 0, sizeof(mi)); mi.flags = CMIF_TCHAR; mi.hIcolibItem = NULL; mi.position = 1000020000; mi.name.t = LPGENT("Autoreply"); g_hToggleSOEContactMenuItem = Menu_AddContactMenuItem(&mi); mi.flags = CMIF_TCHAR; mi.root = g_hToggleSOEContactMenuItem; mi.position = 1000020000; mi.hIcolibItem = iconList[1].hIcolib; mi.name.t = LPGENT("On"); mi.pszService = MS_AWAYSYS_AUTOREPLY_ON; g_hAutoreplyOnContactMenuItem = Menu_AddContactMenuItem(&mi); mi.hIcolibItem = iconList[0].hIcolib; mi.name.t = LPGENT("Off"); mi.pszService = MS_AWAYSYS_AUTOREPLY_OFF; g_hAutoreplyOffContactMenuItem = Menu_AddContactMenuItem(&mi); mi.hIcolibItem = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_DOT)); mi.name.t = LPGENT("Use the default setting"); mi.pszService = MS_AWAYSYS_AUTOREPLY_USEDEFAULT; g_hAutoreplyUseDefaultContactMenuItem = Menu_AddContactMenuItem(&mi); } // add that funky thingy (just tweaked a bit, was spotted in Miranda's src code) // we have to read the status message from contacts too... err CreateServiceFunction(MS_AWAYMSG_SHOWAWAYMSG, GetContactStatMsg); SkinAddNewSoundEx(AWAYSYS_STATUSMSGREQUEST_SOUND, NULL, LPGEN("NewAwaySys: Incoming status message request")); if (ServiceExists(MS_VARS_REGISTERTOKEN)) { CreateServiceFunction(MS_AWAYSYS_FREEVARMEM, srvFreeVarMem); CreateServiceFunction(MS_AWAYSYS_VARIABLESHANDLER, srvVariablesHandler); TOKENREGISTER tr = { sizeof(tr) }; tr.szService = MS_AWAYSYS_VARIABLESHANDLER; tr.szCleanupService = MS_AWAYSYS_FREEVARMEM; tr.memType = TR_MEM_OWNER; for (int i = 0; i < _countof(Variables); i++) { tr.flags = Variables[i].Flags | TRF_CALLSVC | TRF_TCHAR; tr.tszTokenString = Variables[i].Name; tr.szHelpText = Variables[i].Descr; CallService(MS_VARS_REGISTERTOKEN, 0, (LPARAM)&tr); } } HookEvent(ME_MODERNOPT_INITIALIZE, ModernOptInitialise); return 0; }