diff options
Diffstat (limited to 'protocols/Weather/src/weather_svcs.cpp')
-rw-r--r-- | protocols/Weather/src/weather_svcs.cpp | 274 |
1 files changed, 86 insertions, 188 deletions
diff --git a/protocols/Weather/src/weather_svcs.cpp b/protocols/Weather/src/weather_svcs.cpp index daeb7f8bd1..6f897e3d7a 100644 --- a/protocols/Weather/src/weather_svcs.cpp +++ b/protocols/Weather/src/weather_svcs.cpp @@ -26,89 +26,8 @@ building/changing the weather menu items. #include "stdafx.h" -static HGENMENU hEnableDisableMenu; - extern VARSW g_pwszIconsName; -//============ MIRANDA PROTOCOL SERVICES ============ - -// protocol service function for setting weather protocol status -INT_PTR WeatherSetStatus(WPARAM new_status, LPARAM) -{ - // if we don't want to show status for default station - if (status != new_status) { - old_status = status; - status = new_status = new_status != ID_STATUS_OFFLINE ? ID_STATUS_ONLINE : ID_STATUS_OFFLINE; - - if (!opt.NoProtoCondition) { - ProtoBroadcastAck(MODULENAME, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)old_status, status); - - UpdateMenu(new_status != ID_STATUS_OFFLINE); - if (new_status != ID_STATUS_OFFLINE) - UpdateAll(FALSE, FALSE); - } - } - - return 0; -} - -// get capabilities protocol service function -INT_PTR WeatherGetCaps(WPARAM wParam, LPARAM) -{ - INT_PTR ret = 0; - - switch (wParam) { - case PFLAGNUM_1: - // support search and visible list - ret = PF1_BASICSEARCH | PF1_ADDSEARCHRES | PF1_EXTSEARCH | PF1_MODEMSGRECV; - break; - - case PFLAGNUM_2: - ret = PF2_ONLINE | PF2_INVISIBLE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_LIGHTDND | PF2_HEAVYDND | PF2_FREECHAT; - break; - - case PFLAGNUM_4: - ret = PF4_AVATARS | PF4_NOCUSTOMAUTH | PF4_NOAUTHDENYREASON | PF4_FORCEAUTH; - break; - - case PFLAGNUM_5: /* this is PFLAGNUM_5 change when alpha SDK is released */ - ret = PF2_INVISIBLE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_LIGHTDND | PF2_HEAVYDND | PF2_FREECHAT; - break; - - case PFLAG_UNIQUEIDTEXT: - ret = (INT_PTR)TranslateT("Station ID"); - break; - } - return ret; -} - -// protocol service function to get the current status of the protocol -INT_PTR WeatherGetStatus(WPARAM, LPARAM) -{ - return status; -} - -// protocol service function to get the icon of the protocol -INT_PTR WeatherLoadIcon(WPARAM wParam, LPARAM) -{ - return (LOWORD(wParam) == PLI_PROTOCOL) ? (INT_PTR)CopyIcon(g_plugin.getIcon(IDI_ICON)) : 0; -} - -static void __cdecl AckThreadProc(HANDLE param) -{ - Sleep(100); - ProtoBroadcastAck(MODULENAME, (DWORD_PTR)param, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE)1); -} - -// nothing to do here because weather proto do not need to retrieve contact info form network -// so just return a 0 -INT_PTR WeatherGetInfo(WPARAM, LPARAM lParam) -{ - CCSDATA *ccs = (CCSDATA *)lParam; - mir_forkthread(AckThreadProc, (void*)ccs->hContact); - return 0; -} - ///////////////////////////////////////////////////////////////////////////////////////// // avatars @@ -132,7 +51,7 @@ static statusIcons[MAX_COND] = { L"Light", 130, ID_STATUS_INVISIBLE }, }; -INT_PTR WeatherGetAvatarInfo(WPARAM, LPARAM lParam) +INT_PTR CWeatherProto::GetAvatarInfoSvc(WPARAM, LPARAM lParam) { wchar_t szSearchPath[MAX_PATH]; GetModuleFileName(GetModuleHandle(nullptr), szSearchPath, _countof(szSearchPath)); @@ -144,7 +63,7 @@ INT_PTR WeatherGetAvatarInfo(WPARAM, LPARAM lParam) szSearchPath[0] = 0; PROTO_AVATAR_INFORMATION *pai = (PROTO_AVATAR_INFORMATION*)lParam; - int iCond = g_plugin.getWord(pai->hContact, "StatusIcon", -1); + int iCond = getWord(pai->hContact, "StatusIcon", -1); if (iCond < 0 || iCond >= MAX_COND) return GAIR_NOAVATAR; @@ -163,34 +82,15 @@ INT_PTR WeatherGetAvatarInfo(WPARAM, LPARAM lParam) return GAIR_NOAVATAR; } -void AvatarDownloaded(MCONTACT hContact) +void CWeatherProto::AvatarDownloaded(MCONTACT hContact) { PROTO_AVATAR_INFORMATION ai = {}; ai.hContact = hContact; - if (WeatherGetAvatarInfo(GAIF_FORCE, (LPARAM)&ai) == GAIR_SUCCESS) - ProtoBroadcastAck(MODULENAME, hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS, &ai); + if (GetAvatarInfoSvc(GAIF_FORCE, (LPARAM)&ai) == GAIR_SUCCESS) + ProtoBroadcastAck(hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS, &ai); else - ProtoBroadcastAck(MODULENAME, hContact, ACKTYPE_AVATAR, ACKRESULT_STATUS, nullptr); -} - -static void __cdecl WeatherGetAwayMsgThread(void *arg) -{ - Sleep(100); - - MCONTACT hContact = (DWORD_PTR)arg; - ptrW wszStatus(db_get_wsa(hContact, "CList", "StatusMsg")); - ProtoBroadcastAck(MODULENAME, hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, wszStatus); -} - -static INT_PTR WeatherGetAwayMsg(WPARAM, LPARAM lParam) -{ - CCSDATA* ccs = (CCSDATA*)lParam; - if (ccs == nullptr) - return 0; - - mir_forkthread(WeatherGetAwayMsgThread, (void*)ccs->hContact); - return 1; + ProtoBroadcastAck(hContact, ACKTYPE_AVATAR, ACKRESULT_STATUS, nullptr); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -202,18 +102,18 @@ void ClearStatusIcons() it.clistIconId = 0; } -int MapCondToStatus(MCONTACT hContact) +int CWeatherProto::MapCondToStatus(MCONTACT hContact) { - int iCond = g_plugin.getWord(hContact, "StatusIcon", -1); + int iCond = getWord(hContact, "StatusIcon", -1); if (iCond < 0 || iCond >= MAX_COND) return ID_STATUS_OFFLINE; return statusIcons[iCond].status; } -HICON GetStatusIcon(MCONTACT hContact) +HICON CWeatherProto::GetStatusIcon(MCONTACT hContact) { - int iCond = g_plugin.getWord(hContact, "StatusIcon", -1); + int iCond = getWord(hContact, "StatusIcon", -1); if (iCond < 0 || iCond >= MAX_COND) return nullptr; @@ -224,9 +124,9 @@ HICON GetStatusIcon(MCONTACT hContact) return ImageList_GetIcon(Clist_GetImageList(), pIcon.clistIconId, ILD_NORMAL); } -HICON GetStatusIconBig(MCONTACT hContact) +HICON CWeatherProto::GetStatusIconBig(MCONTACT hContact) { - int iCond = g_plugin.getWord(hContact, "StatusIcon", -1); + int iCond = getWord(hContact, "StatusIcon", -1); if (iCond < 0 || iCond >= MAX_COND) return nullptr; @@ -236,12 +136,12 @@ HICON GetStatusIconBig(MCONTACT hContact) return hIcon; } -static INT_PTR WeatherAdvancedStatusIcon(WPARAM hContact, LPARAM) +INT_PTR CWeatherProto::AdvancedStatusIconSvc(WPARAM hContact, LPARAM) { if (!hContact || !g_plugin.hIconsDll) return -1; - int iCond = g_plugin.getWord(hContact, "StatusIcon", -1); + int iCond = getWord(hContact, "StatusIcon", -1); if (iCond < 0 || iCond >= MAX_COND) return -1; @@ -252,34 +152,14 @@ static INT_PTR WeatherAdvancedStatusIcon(WPARAM hContact, LPARAM) return MAKELONG(0, pIcon.clistIconId); } -//============ PROTOCOL INITIALIZATION ============ -// protocol services -void InitServices(void) -{ - CreateProtoServiceFunction(MODULENAME, PS_GETCAPS, WeatherGetCaps); - CreateProtoServiceFunction(MODULENAME, PS_LOADICON, WeatherLoadIcon); - CreateProtoServiceFunction(MODULENAME, PS_SETSTATUS, WeatherSetStatus); - CreateProtoServiceFunction(MODULENAME, PS_GETSTATUS, WeatherGetStatus); - CreateProtoServiceFunction(MODULENAME, PS_BASICSEARCH, WeatherBasicSearch); - CreateProtoServiceFunction(MODULENAME, PS_SEARCHBYEMAIL, WeatherBasicSearch); - CreateProtoServiceFunction(MODULENAME, PS_ADDTOLIST, WeatherAddToList); - CreateProtoServiceFunction(MODULENAME, PS_GETINFO, WeatherGetInfo); - CreateProtoServiceFunction(MODULENAME, PS_GETAVATARINFO, WeatherGetAvatarInfo); - CreateProtoServiceFunction(MODULENAME, PS_GETAWAYMSG, WeatherGetAwayMsg); - CreateProtoServiceFunction(MODULENAME, PS_CREATEADVSEARCHUI, WeatherCreateAdvancedSearchUI); - CreateProtoServiceFunction(MODULENAME, PS_SEARCHBYADVANCED, WeatherAdvancedSearch); - CreateProtoServiceFunction(MODULENAME, PS_GETADVANCEDSTATUSICON, WeatherAdvancedStatusIcon); - - CreateProtoServiceFunction(MODULENAME, MS_WEATHER_GETDISPLAY, GetDisplaySvcFunc); -} - -//============ MENU INITIALIZATION ============ +///////////////////////////////////////////////////////////////////////////////////////// +// menus -void UpdateMenu(BOOL State) +void CWeatherProto::UpdateMenu(BOOL State) { // update option setting opt.CAutoUpdate = State; - g_plugin.setByte("AutoUpdate", (uint8_t)State); + setByte("AutoUpdate", (uint8_t)State); if (State) { // to enable auto-update Menu_ModifyItem(hEnableDisableMenu, LPGENW("Auto Update Enabled"), g_plugin.getIconHandle(IDI_ICON)); @@ -293,119 +173,137 @@ void UpdateMenu(BOOL State) CallService(MS_TTB_SETBUTTONSTATE, (WPARAM)hTBButton, !State ? TTBST_PUSHED : 0); } +///////////////////////////////////////////////////////////////////////////////////////// // update the weather auto-update menu item when click on it -static INT_PTR EnableDisableCmd(WPARAM wParam, LPARAM lParam) + +INT_PTR CWeatherProto::EnableDisableCmd(WPARAM wParam, LPARAM lParam) { UpdateMenu(wParam == TRUE ? (BOOL)lParam : !opt.CAutoUpdate); return 0; } -// displays contact info dialog -static INT_PTR BriefInfoSvc(WPARAM wParam, LPARAM lParam) +///////////////////////////////////////////////////////////////////////////////////////// +// adding weather contact menus + +static std::vector<HGENMENU> g_menuItems; + +static int OnPrebuildMenu(WPARAM hContact, LPARAM) { - return BriefInfo(wParam, lParam); + auto *ppro = CMPlugin::getInstance(hContact); + for (auto &it : g_menuItems) + Menu_ShowItem(it, ppro != 0); + + if (ppro) + ppro->BuildContactMenu(hContact); + return 0; } -// adding weather contact menus -// copied and modified form "modified MSN Protocol" -void AddMenuItems(void) +void CWeatherProto::GlobalMenuInit() { CMenuItem mi(&g_plugin); // contact menu SET_UID(mi, 0x266ef52b, 0x869a, 0x4cac, 0xa9, 0xf8, 0xea, 0x5b, 0xb8, 0xab, 0xe0, 0x24); - CreateServiceFunction(MS_WEATHER_UPDATE, UpdateSingleStation); mi.position = -0x7FFFFFFA; mi.hIcolibItem = g_plugin.getIconHandle(IDI_UPDATE); mi.name.a = LPGEN("Update Weather"); - mi.pszService = MS_WEATHER_UPDATE; - Menu_AddContactMenuItem(&mi, MODULENAME); + mi.pszService = MODULENAME "/Update"; + g_menuItems.push_back(Menu_AddContactMenuItem(&mi)); + CreateServiceFunction(mi.pszService, GlobalService<&CWeatherProto::UpdateSingleStation>); SET_UID(mi, 0x45361b4, 0x8de, 0x44b4, 0x8f, 0x11, 0x9b, 0xe9, 0x6e, 0xa8, 0x83, 0x54); - CreateServiceFunction(MS_WEATHER_REFRESH, UpdateSingleRemove); mi.position = -0x7FFFFFF9; mi.hIcolibItem = g_plugin.getIconHandle(IDI_UPDATE2); mi.name.a = LPGEN("Remove Old Data then Update"); - mi.pszService = MS_WEATHER_REFRESH; - Menu_AddContactMenuItem(&mi, MODULENAME); + mi.pszService = MODULENAME "/Refresh"; + g_menuItems.push_back(Menu_AddContactMenuItem(&mi)); + CreateServiceFunction(mi.pszService, GlobalService<&CWeatherProto::UpdateSingleRemove>); SET_UID(mi, 0x4232975e, 0xb181, 0x46a5, 0xb7, 0x6e, 0xd2, 0x5f, 0xef, 0xb8, 0xc4, 0x4d); - CreateServiceFunction(MS_WEATHER_BRIEF, BriefInfoSvc); mi.position = -0x7FFFFFF8; mi.hIcolibItem = g_plugin.getIconHandle(IDI_S); mi.name.a = LPGEN("Brief Information"); - mi.pszService = MS_WEATHER_BRIEF; - Menu_AddContactMenuItem(&mi, MODULENAME); + mi.pszService = MODULENAME "/Brief"; + g_menuItems.push_back(Menu_AddContactMenuItem(&mi)); + CreateServiceFunction(mi.pszService, GlobalService<&CWeatherProto::BriefInfo>); SET_UID(mi, 0x3d6ed729, 0xd49a, 0x4ae9, 0x8e, 0x2, 0x9f, 0xe0, 0xf0, 0x2c, 0xcc, 0xb1); - CreateServiceFunction(MS_WEATHER_COMPLETE, LoadForecast); mi.position = -0x7FFFFFF7; mi.hIcolibItem = g_plugin.getIconHandle(IDI_READ); mi.name.a = LPGEN("Read Complete Forecast"); - mi.pszService = MS_WEATHER_COMPLETE; - Menu_AddContactMenuItem(&mi, MODULENAME); + mi.pszService = MODULENAME "/CompleteForecast"; + g_menuItems.push_back(Menu_AddContactMenuItem(&mi)); + CreateServiceFunction(mi.pszService, GlobalService<&CWeatherProto::LoadForecast>); SET_UID(mi, 0xc4b6c5e0, 0x13c3, 0x4e02, 0x8a, 0xeb, 0xeb, 0x8a, 0xe2, 0x66, 0x40, 0xd4); - CreateServiceFunction(MS_WEATHER_MAP, WeatherMap); mi.position = -0x7FFFFFF6; mi.hIcolibItem = g_plugin.getIconHandle(IDI_MAP); mi.name.a = LPGEN("Weather Map"); - mi.pszService = MS_WEATHER_MAP; - Menu_AddContactMenuItem(&mi, MODULENAME); + mi.pszService = MODULENAME "/Map"; + g_menuItems.push_back(Menu_AddContactMenuItem(&mi)); + CreateServiceFunction(mi.pszService, GlobalService<&CWeatherProto::WeatherMap>); SET_UID(mi, 0xee3ad7f4, 0x3377, 0x4e4c, 0x8f, 0x3c, 0x3b, 0xf5, 0xd4, 0x86, 0x28, 0x25); - CreateServiceFunction(MS_WEATHER_LOG, ViewLog); mi.position = -0x7FFFFFF5; mi.hIcolibItem = g_plugin.getIconHandle(IDI_LOG); mi.name.a = LPGEN("View Log"); - mi.pszService = MS_WEATHER_LOG; - Menu_AddContactMenuItem(&mi, MODULENAME); + mi.pszService = MODULENAME "/Log"; + g_menuItems.push_back(Menu_AddContactMenuItem(&mi)); + CreateServiceFunction(mi.pszService, GlobalService<&CWeatherProto::ViewLog>); SET_UID(mi, 0x1b01cd6a, 0xe5ee, 0x42b4, 0xa1, 0x6d, 0x43, 0xb9, 0x4, 0x58, 0x43, 0x2e); - CreateServiceFunction(MS_WEATHER_EDIT, EditSettings); mi.position = -0x7FFFFFF4; mi.hIcolibItem = g_plugin.getIconHandle(IDI_EDIT); mi.name.a = LPGEN("Edit Settings"); - mi.pszService = MS_WEATHER_EDIT; - Menu_AddContactMenuItem(&mi, MODULENAME); + mi.pszService = MODULENAME "/Edit"; + g_menuItems.push_back(Menu_AddContactMenuItem(&mi)); + CreateServiceFunction(mi.pszService, GlobalService<&CWeatherProto::EditSettings>); - // adding main menu items - mi.root = g_plugin.addRootMenu(MO_MAIN, LPGENW("Weather"), 500099000); + if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) { + SET_UID(mi, 0xe193fe9b, 0xf6ad, 0x41ac, 0x95, 0x29, 0x45, 0x4, 0x44, 0xb1, 0xeb, 0x5d); + mi.pszService = MODULENAME "/mwin_menu"; + CreateServiceFunction(mi.pszService, GlobalService<&CWeatherProto::Mwin_MenuClicked>); + mi.position = -0x7FFFFFF0; + mi.hIcolibItem = Skin_GetIconHandle(SKINICON_OTHER_FRAME); + mi.root = nullptr; + mi.name.a = LPGEN("Display in a frame"); + g_menuItems.push_back(hMwinMenu = Menu_AddContactMenuItem(&mi)); + } + + HookEvent(ME_CLIST_PREBUILDCONTACTMENU, &OnPrebuildMenu); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// adding main menu items + +void CWeatherProto::InitMenuItems() +{ + CMenuItem mi(&g_plugin); + mi.root = g_plugin.addRootMenu(MO_MAIN, m_tszUserName, 500099000); Menu_ConfigureItem(mi.root, MCI_OPT_UID, "82809D2F-2CF0-4E15-9350-D257A7748552"); SET_UID(mi, 0x5ad16188, 0xe0a0, 0x4c31, 0x85, 0xc3, 0xe4, 0x85, 0x79, 0x7e, 0x4b, 0x9c); - CreateServiceFunction(MS_WEATHER_ENABLED, EnableDisableCmd); mi.name.a = LPGEN("Enable/Disable Weather Update"); mi.hIcolibItem = g_plugin.getIconHandle(IDI_ICON); mi.position = 10100001; - mi.pszService = MS_WEATHER_ENABLED; - hEnableDisableMenu = Menu_AddMainMenuItem(&mi); + mi.pszService = "/EnableDisable"; + hEnableDisableMenu = Menu_AddMainMenuItem(&mi, m_szModuleName); UpdateMenu(opt.AutoUpdate); + CreateProtoService(mi.pszService, &CWeatherProto::EnableDisableCmd); SET_UID(mi, 0x2b1c2054, 0x2991, 0x4025, 0x87, 0x73, 0xb6, 0xf7, 0x85, 0xac, 0xc7, 0x37); - CreateServiceFunction(MS_WEATHER_UPDATEALL, UpdateAllInfo); mi.position = 20100001; mi.hIcolibItem = g_plugin.getIconHandle(IDI_UPDATE); mi.name.a = LPGEN("Update All Weather"); - mi.pszService = MS_WEATHER_UPDATEALL; - Menu_AddMainMenuItem(&mi); + mi.pszService = "/UpdateAll"; + Menu_AddMainMenuItem(&mi, m_szModuleName); + CreateProtoService(mi.pszService, &CWeatherProto::UpdateAllInfo); SET_UID(mi, 0x8234c00e, 0x788e, 0x424f, 0xbc, 0xc4, 0x2, 0xfd, 0x67, 0x58, 0x2d, 0x19); - CreateServiceFunction(MS_WEATHER_REFRESHALL, UpdateAllRemove); mi.position = 20100002; mi.hIcolibItem = g_plugin.getIconHandle(IDI_UPDATE2); mi.name.a = LPGEN("Remove Old Data then Update All"); - mi.pszService = MS_WEATHER_REFRESHALL; - Menu_AddMainMenuItem(&mi); - - if (ServiceExists(MS_CLIST_FRAMES_ADDFRAME)) { - SET_UID(mi, 0xe193fe9b, 0xf6ad, 0x41ac, 0x95, 0x29, 0x45, 0x4, 0x44, 0xb1, 0xeb, 0x5d); - mi.pszService = "Weather/mwin_menu"; - CreateServiceFunction(mi.pszService, Mwin_MenuClicked); - mi.position = -0x7FFFFFF0; - mi.hIcolibItem = nullptr; - mi.root = nullptr; - mi.name.a = LPGEN("Display in a frame"); - hMwinMenu = Menu_AddContactMenuItem(&mi, MODULENAME); - } + mi.pszService = "/RefreshAll"; + Menu_AddMainMenuItem(&mi, m_szModuleName); + CreateProtoService(mi.pszService, &CWeatherProto::UpdateAllRemove); } |