From 6860b3202f3c8218288fad2778529ba76463015c Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Sat, 13 Oct 2012 09:07:09 +0000 Subject: MSN: folders restructurization git-svn-id: http://svn.miranda-ng.org/main/trunk@1901 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/MSN/src/msn_menu.cpp | 513 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 513 insertions(+) create mode 100644 protocols/MSN/src/msn_menu.cpp (limited to 'protocols/MSN/src/msn_menu.cpp') diff --git a/protocols/MSN/src/msn_menu.cpp b/protocols/MSN/src/msn_menu.cpp new file mode 100644 index 0000000000..1913483b36 --- /dev/null +++ b/protocols/MSN/src/msn_menu.cpp @@ -0,0 +1,513 @@ +/* +Plugin of Miranda IM for communicating with users of the MSN Messenger protocol. +Copyright (c) 2006-2012 Boris Krasnovskiy. +Copyright (c) 2003-2005 George Hazan. +Copyright (c) 2002-2003 Richard Hughes (original version). + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "msn_global.h" +#include "msn_proto.h" + +static HANDLE hPrebuildMenuHook; +static HGENMENU + hBlockMenuItem, + hLiveSpaceMenuItem, + hNetmeetingMenuItem, + hChatInviteMenuItem, + hOpenInboxMenuItem; +HANDLE hNetMeeting, hBlockCom, hSendHotMail, hInviteChat, hViewProfile; + +///////////////////////////////////////////////////////////////////////////////////////// +// Block command callback function + +INT_PTR CMsnProto::MsnBlockCommand(WPARAM wParam, LPARAM) +{ + if (msnLoggedIn) + { + const HANDLE hContact = (HANDLE)wParam; + + char tEmail[MSN_MAX_EMAIL_LEN]; + getStaticString(hContact, "e-mail", tEmail, sizeof(tEmail)); + + if (Lists_IsInList(LIST_BL, tEmail)) + deleteSetting(hContact, "ApparentMode"); + else + setWord(hContact, "ApparentMode", ID_STATUS_OFFLINE); + } + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// MsnGotoInbox - goes to the Inbox folder at the live.com + +INT_PTR CMsnProto::MsnGotoInbox(WPARAM, LPARAM) +{ + HANDLE hContact = MSN_HContactFromEmail(MyOptions.szEmail); + if (hContact) CallService(MS_CLIST_REMOVEEVENT, (WPARAM)hContact, (LPARAM) 1); + + MsnInvokeMyURL(true, "http://mail.live.com?rru=inbox"); + return 0; +} + +INT_PTR CMsnProto::MsnSendHotmail(WPARAM wParam, LPARAM) +{ + const HANDLE hContact = (HANDLE)wParam; + char szEmail[MSN_MAX_EMAIL_LEN]; + + if (MSN_IsMeByContact(hContact, szEmail)) + MsnGotoInbox(0, 0); + else if (msnLoggedIn) + { + char szEmailEnc[MSN_MAX_EMAIL_LEN*3], szUrl[256]; + + UrlEncode(szEmail, szEmailEnc, sizeof(szEmailEnc)); + mir_snprintf(szUrl, sizeof(szUrl), "http://mail.live.com?rru=compose?to=%s", szEmailEnc); + MsnInvokeMyURL(true, szUrl); + } + + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// MsnSetupAlerts - goes to the alerts section at the live.com + +INT_PTR CMsnProto::MsnSetupAlerts(WPARAM, LPARAM) +{ + MsnInvokeMyURL(false, "http://alerts.live.com"); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// MsnViewProfile - view a contact's profile + +INT_PTR CMsnProto::MsnViewProfile(WPARAM wParam, LPARAM) +{ + const HANDLE hContact = (HANDLE)wParam; + char buf[64], *cid; + + if (hContact == NULL) + cid = mycid; + else + { + cid = buf; + if (getStaticString(hContact, "CID", buf, 30)) + return 0; + } + + char tUrl[256]; + mir_snprintf(tUrl, sizeof(tUrl), "http://cid-%I64X.profiles.live.com", _atoi64(cid)); + MsnInvokeMyURL(false, tUrl); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// MsnEditProfile - goes to the Profile section at the live.com + +INT_PTR CMsnProto::MsnEditProfile(WPARAM, LPARAM) +{ + MsnViewProfile(0, 0); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// MsnInviteCommand - invite command callback function + +INT_PTR CMsnProto::MsnInviteCommand(WPARAM, LPARAM) +{ + DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_CHATROOM_INVITE), NULL, DlgInviteToChat, + LPARAM(new InviteChatParam(NULL, NULL, this))); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// MsnRebuildContactMenu - gray or ungray the block menus according to contact's status + +int CMsnProto::OnPrebuildContactMenu(WPARAM wParam, LPARAM) +{ + const HANDLE hContact = (HANDLE)wParam; + char szEmail[MSN_MAX_EMAIL_LEN]; + + CLISTMENUITEM mi = {0}; + mi.cbSize = sizeof(mi); + + if (!MSN_IsMyContact(hContact)) return 0; + + bool isMe = MSN_IsMeByContact(hContact, szEmail); + if (szEmail[0]) + { + int listId = Lists_GetMask(szEmail); + + bool noChat = !(listId & LIST_FL) || isMe || getByte(hContact, "ChatRoom", 0); + + mi.flags = CMIM_NAME | CMIM_FLAGS | CMIF_ICONFROMICOLIB; + if (noChat) mi.flags |= CMIF_HIDDEN; + mi.pszName = (char*)((listId & LIST_BL) ? "&Unblock" : "&Block"); + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hBlockMenuItem, (LPARAM)&mi); + + mi.flags = CMIM_NAME | CMIM_FLAGS | CMIF_ICONFROMICOLIB; + if (!emailEnabled) mi.flags |= CMIF_HIDDEN; + mi.pszName = isMe ? LPGEN("Open &Hotmail Inbox") : LPGEN("Send &Hotmail E-mail"); + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hOpenInboxMenuItem, (LPARAM)&mi); + + mi.flags = CMIM_FLAGS | CMIF_ICONFROMICOLIB | CMIF_NOTOFFLINE; + if (noChat) mi.flags |= CMIF_HIDDEN; + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hNetmeetingMenuItem, (LPARAM)&mi); + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hChatInviteMenuItem, (LPARAM)&mi); + } + + return 0; +} + +int CMsnProto::OnContactDoubleClicked(WPARAM wParam, LPARAM) +{ + const HANDLE hContact = (HANDLE)wParam; + + if (emailEnabled && MSN_IsMeByContact(hContact)) + { + MsnSendHotmail(wParam, 0); + return 1; + } + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// MsnSendNetMeeting - Netmeeting callback function + +INT_PTR CMsnProto::MsnSendNetMeeting(WPARAM wParam, LPARAM) +{ + if (!msnLoggedIn) return 0; + + HANDLE hContact = HANDLE(wParam); + + char szEmail[MSN_MAX_EMAIL_LEN]; + if (MSN_IsMeByContact(hContact, szEmail)) return 0; + + ThreadData* thread = MSN_GetThreadByContact(szEmail); + + if (thread == NULL) { + MessageBox(NULL, TranslateT("You must be talking to start Netmeeting"), TranslateT("MSN Protocol"), MB_OK | MB_ICONERROR); + return 0; + } + + char msg[1024]; + + mir_snprintf(msg, sizeof(msg), + "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n\r\n" + "Application-Name: NetMeeting\r\n" + "Application-GUID: {44BBA842-CC51-11CF-AAFA-00AA00B6015C}\r\n" + "Session-Protocol: SM1\r\n" + "Invitation-Command: INVITE\r\n" + "Invitation-Cookie: %i\r\n" + "Session-ID: {1A879604-D1B8-11D7-9066-0003FF431510}\r\n\r\n", + MSN_GenRandom()); + + thread->sendMessage('N', NULL, 1, msg, MSG_DISABLE_HDR); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// SetNicknameCommand - sets nick name + +static INT_PTR CALLBACK DlgProcSetNickname(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwndDlg); + + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); + CMsnProto* proto = (CMsnProto*)lParam; + + SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadIconEx("main", true)); + SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIconEx("main")); + SendMessage(GetDlgItem(hwndDlg, IDC_NICKNAME), EM_LIMITTEXT, 129, 0); + + DBVARIANT dbv; + if (!proto->getTString("Nick", &dbv)) { + SetDlgItemText(hwndDlg, IDC_NICKNAME, dbv.ptszVal); + MSN_FreeVariant(&dbv); + } + return TRUE; + } + case WM_COMMAND: + switch(wParam) + { + case IDOK: + { + CMsnProto* proto = (CMsnProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + if (proto->msnLoggedIn) + { + TCHAR str[130]; + GetDlgItemText(hwndDlg, IDC_NICKNAME, str, SIZEOF(str)); + proto->MSN_SendNickname(str); + } + } + + case IDCANCEL: + DestroyWindow(hwndDlg); + break; + } + break; + + case WM_CLOSE: + DestroyWindow(hwndDlg); + break; + + case WM_DESTROY: + ReleaseIconEx("main"); + ReleaseIconEx("main", true); + break; + } + return FALSE; +} + +INT_PTR CMsnProto::SetNicknameUI(WPARAM, LPARAM) +{ + HWND hwndSetNickname = CreateDialogParam (hInst, MAKEINTRESOURCE(IDD_SETNICKNAME), + NULL, DlgProcSetNickname, (LPARAM)this); + + SetForegroundWindow(hwndSetNickname); + SetFocus(hwndSetNickname); + ShowWindow(hwndSetNickname, SW_SHOW); + return 0; +} + +////////////////////////////////////////////////////////////////////////////////////// +// Menus initialization + +void CMsnProto::MsnInitMainMenu(void) +{ + char servicefunction[100]; + strcpy(servicefunction, m_szModuleName); + char* tDest = servicefunction + strlen(servicefunction); + + CLISTMENUITEM mi = {0}; + mi.cbSize = sizeof(mi); + + HGENMENU hRoot = MO_GetProtoRootMenu(m_szModuleName); + if (hRoot == NULL) + { + mi.popupPosition = 500085000; + mi.hParentMenu = HGENMENU_ROOT; + mi.flags = CMIF_ICONFROMICOLIB | CMIF_ROOTPOPUP | CMIF_TCHAR | CMIF_KEEPUNTRANSLATED; + mi.icolibItem = GetIconHandle(IDI_MSN); + mi.ptszName = m_tszUserName; + hRoot = mainMenuRoot = Menu_AddProtoMenuItem(&mi); + } + else + { + MsnRemoveMainMenus(); + mainMenuRoot = NULL; + } + + mi.flags = CMIF_ICONFROMICOLIB | CMIF_CHILDPOPUP; + mi.hParentMenu = hRoot; + mi.pszService = servicefunction; + + strcpy(tDest, MS_SET_NICKNAME_UI); + CreateProtoService(MS_SET_NICKNAME_UI, &CMsnProto::SetNicknameUI); + mi.position = 201001; + mi.icolibItem = GetIconHandle(IDI_MSN); + mi.pszName = LPGEN("Set &Nickname"); + menuItemsMain[0] = Menu_AddProtoMenuItem(&mi); + + strcpy(tDest, MSN_INVITE); + CreateProtoService(MSN_INVITE, &CMsnProto::MsnInviteCommand); + mi.position = 201002; + mi.icolibItem = GetIconHandle(IDI_INVITE); + mi.pszName = LPGEN("Create &Chat"); + menuItemsMain[0] = Menu_AddProtoMenuItem(&mi); + + strcpy(tDest, MS_GOTO_INBOX); + CreateProtoService(MS_GOTO_INBOX, &CMsnProto::MsnGotoInbox); + mi.position = 201003; + mi.icolibItem = GetIconHandle(IDI_INBOX); + mi.pszName = LPGEN("Display &Hotmail Inbox"); + menuItemsMain[1] = Menu_AddProtoMenuItem(&mi); + + strcpy(tDest, MS_EDIT_PROFILE); + CreateProtoService(MS_EDIT_PROFILE, &CMsnProto::MsnEditProfile); + mi.position = 201004; + mi.icolibItem = GetIconHandle(IDI_PROFILE); + mi.pszName = LPGEN("View &Profile"); + menuItemsMain[2] = Menu_AddProtoMenuItem(&mi); + + strcpy(tDest, MS_EDIT_ALERTS); + CreateProtoService(MS_EDIT_ALERTS, &CMsnProto::MsnSetupAlerts); + mi.position = 201004; + mi.icolibItem = GetIconHandle(IDI_PROFILE); + mi.pszName = LPGEN("Setup Live &Alerts"); + menuItemsMain[3] = Menu_AddProtoMenuItem(&mi); + + MSN_EnableMenuItems(m_iStatus >= ID_STATUS_ONLINE); +} + +void CMsnProto::MsnRemoveMainMenus(void) +{ + if (mainMenuRoot) + CallService(MS_CLIST_REMOVEMAINMENUITEM, (WPARAM)mainMenuRoot, 0); +} + +void CMsnProto::MSN_EnableMenuItems(bool bEnable) +{ + CLISTMENUITEM mi = {0}; + mi.cbSize = sizeof(mi); + mi.flags = CMIM_FLAGS; + if (!bEnable) + mi.flags |= CMIF_GRAYED; + + for (unsigned i=0; i < SIZEOF(menuItemsMain); i++) + { + if (menuItemsMain[i] != NULL) + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)menuItemsMain[i], (LPARAM)&mi); + } + + if (bEnable) + { + mi.flags = CMIM_FLAGS; + if (!emailEnabled) mi.flags |= CMIF_HIDDEN; + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)menuItemsMain[1], (LPARAM)&mi); + } +} + +////////////////////////////////////////////////////////////////////////////////////// + +static CMsnProto* GetProtoInstanceByHContact(HANDLE hContact) +{ + char* szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM) hContact, 0); + if (szProto == NULL) + return NULL; + + for (int i = 0; i < g_Instances.getCount(); i++) + if (!strcmp(szProto, g_Instances[i].m_szModuleName)) + return &g_Instances[i]; + + return NULL; +} + +static INT_PTR MsnMenuBlockCommand(WPARAM wParam, LPARAM lParam) +{ + CMsnProto* ppro = GetProtoInstanceByHContact((HANDLE)wParam); + return (ppro) ? ppro->MsnBlockCommand(wParam, lParam) : 0; +} + +static INT_PTR MsnMenuViewProfile(WPARAM wParam, LPARAM lParam) +{ + CMsnProto* ppro = GetProtoInstanceByHContact((HANDLE)wParam); + return (ppro) ? ppro->MsnViewProfile(wParam, lParam) : 0; +} + +static INT_PTR MsnMenuSendNetMeeting(WPARAM wParam, LPARAM lParam) +{ + CMsnProto* ppro = GetProtoInstanceByHContact((HANDLE)wParam); + return (ppro) ? ppro->MsnSendNetMeeting(wParam, lParam) : 0; +} + +static INT_PTR MsnMenuSendHotmail(WPARAM wParam, LPARAM lParam) +{ + CMsnProto* ppro = GetProtoInstanceByHContact((HANDLE)wParam); + return (ppro) ? ppro->MsnSendHotmail(wParam, lParam) : 0; +} + +static void sttEnableMenuItem(HANDLE hMenuItem, bool bEnable) +{ + CLISTMENUITEM clmi = {0}; + clmi.cbSize = sizeof(CLISTMENUITEM); + clmi.flags = CMIM_FLAGS; + if (!bEnable) + clmi.flags |= CMIF_HIDDEN; + + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuItem, (LPARAM)&clmi); +} + +static int MSN_OnPrebuildContactMenu(WPARAM wParam, LPARAM lParam) +{ + CMsnProto* ppro = GetProtoInstanceByHContact((HANDLE)wParam); + if (ppro) + ppro->OnPrebuildContactMenu(wParam, lParam); + else + { + sttEnableMenuItem(hBlockMenuItem, false); + sttEnableMenuItem(hLiveSpaceMenuItem, false); + sttEnableMenuItem(hNetmeetingMenuItem, false); + sttEnableMenuItem(hChatInviteMenuItem, false); + sttEnableMenuItem(hOpenInboxMenuItem, false); + } + + return 0; +} + +void MSN_InitContactMenu(void) +{ + char servicefunction[100]; + strcpy(servicefunction, "MSN"); + char* tDest = servicefunction + strlen(servicefunction); + + CLISTMENUITEM mi = {0}; + mi.cbSize = sizeof(mi); + mi.flags = CMIF_ICONFROMICOLIB; + mi.pszService = servicefunction; + + strcpy(tDest, MSN_BLOCK); + hBlockCom = CreateServiceFunction(servicefunction, MsnMenuBlockCommand); + mi.position = -500050000; + mi.icolibItem = GetIconHandle(IDI_MSNBLOCK); + mi.pszName = LPGEN("&Block"); + hBlockMenuItem = Menu_AddContactMenuItem(&mi); + + strcpy(tDest, MSN_VIEW_PROFILE); + hViewProfile = CreateServiceFunction(servicefunction, MsnMenuViewProfile); + mi.position = -500050003; + mi.icolibItem = GetIconHandle(IDI_PROFILE); + mi.pszName = LPGEN("View &Profile"); + hLiveSpaceMenuItem = Menu_AddContactMenuItem(&mi); + + strcpy(tDest, MSN_NETMEETING); + hNetMeeting = CreateServiceFunction(servicefunction, MsnMenuSendNetMeeting); + mi.flags = CMIF_ICONFROMICOLIB | CMIF_NOTOFFLINE; + mi.position = -500050002; + mi.icolibItem = GetIconHandle(IDI_NETMEETING); + mi.pszName = LPGEN("&Start Netmeeting"); + hNetmeetingMenuItem = Menu_AddContactMenuItem(&mi); + + strcpy(tDest, "/SendHotmail"); + hSendHotMail = CreateServiceFunction(servicefunction, MsnMenuSendHotmail); + mi.position = -2000010005; + mi.flags = CMIF_ICONFROMICOLIB | CMIF_HIDDEN; + mi.icolibItem = LoadSkinnedIconHandle(SKINICON_OTHER_SENDEMAIL); + mi.pszName = LPGEN("Open &Hotmail Inbox"); + hOpenInboxMenuItem = Menu_AddContactMenuItem(&mi); + + hPrebuildMenuHook = HookEvent(ME_CLIST_PREBUILDCONTACTMENU, MSN_OnPrebuildContactMenu); +} + +void MSN_RemoveContactMenus(void) +{ + UnhookEvent(hPrebuildMenuHook); + + CallService(MS_CLIST_REMOVECONTACTMENUITEM, (WPARAM)hBlockMenuItem, 0); + CallService(MS_CLIST_REMOVECONTACTMENUITEM, (WPARAM)hLiveSpaceMenuItem, 0); + CallService(MS_CLIST_REMOVECONTACTMENUITEM, (WPARAM)hNetmeetingMenuItem, 0); + CallService(MS_CLIST_REMOVECONTACTMENUITEM, (WPARAM)hChatInviteMenuItem, 0); + CallService(MS_CLIST_REMOVECONTACTMENUITEM, (WPARAM)hOpenInboxMenuItem, 0); + + DestroyServiceFunction(hNetMeeting); + DestroyServiceFunction(hBlockCom); + DestroyServiceFunction(hSendHotMail); + DestroyServiceFunction(hInviteChat); + DestroyServiceFunction(hViewProfile); +} -- cgit v1.2.3