/* Plugin of Miranda IM for communicating with users of the AIM protocol. Copyright (c) 2008-2009 Boris Krasnovskiy Copyright (C) 2005-2006 Aaron Myles Landwehr 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 "stdafx.h" ///////////////////////////////////////////////////////////////////////////////////////// // Icons init static IconItem iconList[] = { { LPGEN("ICQ"), "icq", IDI_ICQ }, { LPGEN("Add"), "add", IDI_ADD }, { LPGEN("Block"), "block", IDI_BLOCK }, { LPGEN("Profile"), "profile", IDI_PROFILE }, { LPGEN("AOL mail"), "mail", IDI_MAIL }, { LPGEN("AIM icon"), "aim", IDI_AIM }, { LPGEN("Hiptop"), "hiptop", IDI_HIPTOP }, { LPGEN("AOL bot"), "bot", IDI_BOT }, { LPGEN("Admin"), "admin", IDI_ADMIN }, { LPGEN("Confirmed"), "confirm", IDI_CONFIRMED }, { LPGEN("Not confirmed"), "uconfirm", IDI_UNCONFIRMED }, { LPGEN("Blocked list"), "away", IDI_AWAY }, { LPGEN("Idle"), "idle", IDI_IDLE }, { LPGEN("AOL"), "aol", IDI_AOL }, { LPGEN("Foreground color"), "foreclr", IDI_FOREGROUNDCOLOR }, { LPGEN("Background color"), "backclr", IDI_BACKGROUNDCOLOR }, { LPGEN("Bold"), "bold", IDI_BOLD }, { LPGEN("Not bold"), "nbold", IDI_NBOLD }, { LPGEN("Italic"), "italic", IDI_ITALIC }, { LPGEN("Not italic"), "nitalic", IDI_NITALIC }, { LPGEN("Underline"), "undrln", IDI_UNDERLINE }, { LPGEN("Not underline"), "nundrln", IDI_NUNDERLINE }, { LPGEN("Subscript"), "sub_scrpt", IDI_SUBSCRIPT }, { LPGEN("Not subscript"), "nsub_scrpt", IDI_NSUBSCRIPT }, { LPGEN("Superscript"), "sup_scrpt", IDI_SUPERSCRIPT }, { LPGEN("Not superscript"), "nsup_scrpt", IDI_NSUPERSCRIPT }, { LPGEN("Normal script"), "norm_scrpt", IDI_NORMALSCRIPT }, { LPGEN("Not normal script"), "nnorm_scrpt", IDI_NNORMALSCRIPT } }; void InitIcons(void) { Icon_Register(hInstance, "Protocols/AIM", iconList, 14, "AIM"); Icon_Register(hInstance, "Protocols/AIM/" LPGEN("Profile editor"), iconList + 14, 14, "AIM"); } HICON LoadIconEx(const char *name, bool big) { char szSettingName[100]; mir_snprintf(szSettingName, "AIM_%s", name); return IcoLib_GetIcon(szSettingName, big); } HANDLE GetIconHandle(const char *name) { for (int i = 0; i < _countof(iconList); i++) if (!mir_strcmp(iconList[i].szName, name)) return iconList[i].hIcolib; return nullptr; } void ReleaseIconEx(const char *name, bool big) { char szSettingName[100]; mir_snprintf(szSettingName, "%s_%s", "AIM", name); IcoLib_Release(szSettingName, big); } ///////////////////////////////////////////////////////////////////////////////////////// // Extra Icons extern OBJLIST g_Instances; static HANDLE bot_icon, icq_icon, aol_icon, hiptop_icon; static HANDLE admin_icon, confirmed_icon, unconfirmed_icon; static HANDLE hExtraAT, hExtraES; static const char* extra_AT_icon_name[5] = { "uconfirm", "confirm", "icq", "aol", "admin", }; static const char* extra_ES_icon_name[2] = { "bot", "hiptop", }; static void set_AT_icon(CAimProto* ppro, MCONTACT hContact) { if (ppro->isChatRoom(hContact)) return; unsigned i = ppro->getByte(hContact, AIM_KEY_AC, 0) - 1; ExtraIcon_SetIcon(hExtraAT, hContact, (i < 5) ? GetIconHandle(extra_AT_icon_name[i]) : nullptr); } static void set_ES_icon(CAimProto* ppro, MCONTACT hContact) { if (ppro->isChatRoom(hContact)) return; unsigned i = ppro->getByte(hContact, AIM_KEY_ET, 0) - 1; ExtraIcon_SetIcon(hExtraAT, hContact, (i < 2) ? GetIconHandle(extra_ES_icon_name[i]) : nullptr); } void set_contact_icon(CAimProto* ppro, MCONTACT hContact) { if (!ppro->getByte(AIM_KEY_AT, 0)) set_AT_icon(ppro, hContact); if (!ppro->getByte(AIM_KEY_ES, 0)) set_ES_icon(ppro, hContact); } void remove_AT_icons(CAimProto* ppro) { for (MCONTACT hContact = db_find_first(ppro->m_szModuleName); hContact; hContact = db_find_next(hContact, ppro->m_szModuleName)) if (!ppro->isChatRoom(hContact)) ExtraIcon_Clear(hExtraAT, hContact); } void remove_ES_icons(CAimProto* ppro) { for (MCONTACT hContact = db_find_first(ppro->m_szModuleName); hContact; hContact = db_find_next(hContact, ppro->m_szModuleName)) if (!ppro->isChatRoom(hContact)) ExtraIcon_Clear(hExtraES, hContact); } void add_AT_icons(CAimProto* ppro) { for (MCONTACT hContact = db_find_first(ppro->m_szModuleName); hContact; hContact = db_find_next(hContact, ppro->m_szModuleName)) set_AT_icon(ppro, hContact); } void add_ES_icons(CAimProto* ppro) { for (MCONTACT hContact = db_find_first(ppro->m_szModuleName); hContact; hContact = db_find_next(hContact, ppro->m_szModuleName)) set_ES_icon(ppro, hContact); } void InitExtraIcons(void) { hExtraAT = ExtraIcon_RegisterIcolib("aimaccounttype", LPGEN("AIM account type"), "AIM_aol"); hExtraES = ExtraIcon_RegisterIcolib("aimextstatus", LPGEN("AIM extended status"), "AIM_hiptop"); } ///////////////////////////////////////////////////////////////////////////////////////// // OnPreBuildContactMenu int CAimProto::OnPreBuildContactMenu(WPARAM hContact, LPARAM) { bool bIsChatRoom = isChatRoom(hContact); //see if we should add the html away message context menu items Menu_ShowItem(m_hHTMLAwayContextMenuItem, getWord(hContact, AIM_KEY_ST, ID_STATUS_OFFLINE) == ID_STATUS_AWAY && !bIsChatRoom); Menu_ShowItem(m_hAddToServerListContextMenuItem, !getBuddyId(hContact, 1) && m_state != 0 && !bIsChatRoom); ptrA id(getStringA(hContact, AIM_KEY_SN)); if (id == NULL) return 0; switch (m_pd_mode) { case 1: Menu_ModifyItem(m_hBlockContextMenuItem, LPGENW("&Block")); break; case 2: Menu_ModifyItem(m_hBlockContextMenuItem, LPGENW("&Unblock")); break; case 3: Menu_ModifyItem(m_hBlockContextMenuItem, m_allow_list.find_id(id) ? LPGENW("&Block") : LPGENW("&Unblock")); break; case 4: Menu_ModifyItem(m_hBlockContextMenuItem, m_block_list.find_id(id) ? LPGENW("&Unblock") : LPGENW("&Block")); break; default: Menu_ShowItem(m_hBlockContextMenuItem, false); break; } return 0; } void CAimProto::InitMainMenus(void) { CMenuItem mi; mi.root = Menu_GetProtocolRoot(this); mi.pszService = "/ManageAccount"; CreateProtoService(mi.pszService, &CAimProto::ManageAccount); mi.position = 201001; mi.hIcolibItem = GetIconHandle("aim"); mi.name.a = LPGEN("Manage account"); m_hMainMenu[0] = Menu_AddProtoMenuItem(&mi, m_szModuleName); mi.pszService = "/InstantIdle"; CreateProtoService(mi.pszService, &CAimProto::InstantIdle); mi.position = 201002; mi.hIcolibItem = GetIconHandle("idle"); mi.name.a = LPGEN("Instant idle"); m_hMainMenu[1] = Menu_AddProtoMenuItem(&mi, m_szModuleName); mi.pszService = "/JoinChatRoom"; CreateProtoService(mi.pszService, &CAimProto::JoinChatUI); mi.position = 201003; mi.hIcolibItem = GetIconHandle("aol"); mi.name.a = LPGEN("Join chat room"); m_hMainMenu[2] = Menu_AddProtoMenuItem(&mi, m_szModuleName); } void CAimProto::InitContactMenus(void) { CMenuItem mi; SET_UID(mi, 0xb961e2af, 0x87a, 0x4fbf, 0xb5, 0x32, 0x6, 0xe2, 0x18, 0xad, 0x29, 0xac); CreateProtoService("/GetHTMLAwayMsg", &CAimProto::GetHTMLAwayMsg); mi.pszService = "/GetHTMLAwayMsg"; mi.position = -2000006000; mi.hIcolibItem = GetIconHandle("away"); mi.name.a = LPGEN("Read &HTML away message"); mi.flags = CMIF_NOTOFFLINE | CMIF_HIDDEN; m_hHTMLAwayContextMenuItem = Menu_AddContactMenuItem(&mi, m_szModuleName); SET_UID(mi, 0x7f7e4c24, 0x821c, 0x450f, 0x93, 0x76, 0xbe, 0x65, 0xe9, 0x2f, 0xb6, 0xc2); CreateProtoService("/GetProfile", &CAimProto::GetProfile); mi.pszService = "/GetProfile"; mi.position = -2000005090; mi.hIcolibItem = GetIconHandle("profile"); mi.name.a = LPGEN("Read profile"); mi.flags = CMIF_NOTOFFLINE; Menu_AddContactMenuItem(&mi, m_szModuleName); SET_UID(mi, 0x3928ba10, 0x69bc, 0x4ec9, 0x96, 0x48, 0xa4, 0x1b, 0xbe, 0x58, 0x4a, 0x7e); CreateProtoService("/AddToServerList", &CAimProto::AddToServerList); mi.pszService = "/AddToServerList"; mi.position = -2000005080; mi.hIcolibItem = GetIconHandle("add"); mi.name.a = LPGEN("Add to server list"); mi.flags = CMIF_NOTONLINE | CMIF_HIDDEN; m_hAddToServerListContextMenuItem = Menu_AddContactMenuItem(&mi, m_szModuleName); SET_UID(mi, 0xc6169b8f, 0x53ab, 0x4242, 0xbe, 0x90, 0xe2, 0x4a, 0xa5, 0x73, 0x88, 0x32); CreateProtoService("/BlockCommand", &CAimProto::BlockBuddy); mi.pszService = "/BlockCommand"; mi.position = -2000005060; mi.hIcolibItem = GetIconHandle("block"); mi.name.a = LPGEN("&Block"); mi.flags = CMIF_HIDDEN; m_hBlockContextMenuItem = Menu_AddContactMenuItem(&mi, m_szModuleName); }