summaryrefslogtreecommitdiff
path: root/protocols/Weather/src/proto.h
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Weather/src/proto.h')
-rw-r--r--protocols/Weather/src/proto.h296
1 files changed, 296 insertions, 0 deletions
diff --git a/protocols/Weather/src/proto.h b/protocols/Weather/src/proto.h
new file mode 100644
index 0000000000..b44c193110
--- /dev/null
+++ b/protocols/Weather/src/proto.h
@@ -0,0 +1,296 @@
+#pragma once
+
+struct WIDATAITEM
+{
+ WIDATAITEM(const wchar_t *_1, const wchar_t *_2, const CMStringW &_3) :
+ Name(_1),
+ Unit(_2),
+ Value(_3)
+ {}
+
+ const wchar_t *Name, *Unit;
+ CMStringW Value;
+};
+
+struct WIDATAITEMLIST : public OBJLIST<WIDATAITEM>
+{
+ WIDATAITEMLIST() :
+ OBJLIST<WIDATAITEM>(20)
+ {}
+
+ WIDATAITEM* Find(const wchar_t *pwszName)
+ {
+ for (auto &it : *this)
+ if (!mir_wstrcmp(it->Name, pwszName))
+ return it;
+ return 0;
+ }
+};
+
+struct WEATHERINFO
+{
+ MCONTACT hContact;
+ TCHAR id[128];
+ TCHAR city[128];
+ TCHAR update[64];
+ TCHAR cond[128];
+ TCHAR temp[16];
+ TCHAR low[16];
+ TCHAR high[16];
+ TCHAR feel[16];
+ TCHAR wind[16];
+ TCHAR winddir[64];
+ TCHAR dewpoint[16];
+ TCHAR pressure[16];
+ TCHAR humid[16];
+ TCHAR vis[16];
+ TCHAR sunrise[32];
+ TCHAR sunset[32];
+};
+
+struct MYOPTIONS
+{
+ // main options
+ uint8_t AutoUpdate;
+ uint8_t CAutoUpdate;
+ uint8_t UpdateOnlyConditionChanged;
+ uint8_t RemoveOldData;
+ uint8_t MakeItalic;
+
+ uint16_t UpdateTime;
+ uint16_t AvatarSize;
+
+ // units
+ uint16_t tUnit;
+ uint16_t wUnit;
+ uint16_t vUnit;
+ uint16_t pUnit;
+ uint16_t dUnit;
+ uint16_t eUnit;
+ wchar_t DegreeSign[4];
+ uint8_t DoNotAppendUnit;
+ uint8_t NoFrac;
+
+ // advanced
+ uint8_t DisCondIcon;
+
+ // popup options
+ uint8_t UpdatePopup;
+ uint8_t AlertPopup;
+ uint8_t PopupOnChange;
+ uint8_t ShowWarnings;
+
+ // popup colors
+ uint8_t UseWinColors;
+ COLORREF BGColour;
+ COLORREF TextColour;
+
+ // popup actions
+ uint32_t LeftClickAction;
+ uint32_t RightClickAction;
+
+ // popup delay
+ uint32_t pDelay;
+
+ // other misc stuff
+ wchar_t Default[64];
+ MCONTACT DefStn;
+};
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Protocol class
+
+class CWeatherProto : public PROTO<CWeatherProto>
+{
+ friend class CEditDlg;
+ friend class CPopupOptsDlg;
+ friend class CBriefInfoDlg;
+ friend class COptionsTextDlg;
+ friend class CGeneralOptionsDlg;
+ friend class WeatherUserInfoDlg;
+
+ class CProtoImpl
+ {
+ friend class CWeatherProto;
+ CWeatherProto &m_proto;
+
+ CTimer m_start, m_update;
+
+ void OnStart(CTimer *pTimer)
+ {
+ pTimer->Stop();
+ m_proto.StartUpdate();
+ }
+
+ void OnUpdate(CTimer *)
+ {
+ m_proto.DoUpdate();
+ }
+
+ CProtoImpl(CWeatherProto &pro) :
+ m_proto(pro),
+ m_start(Miranda_GetSystemWindow(), UINT_PTR(this) + 1),
+ m_update(Miranda_GetSystemWindow(), UINT_PTR(this) + 2)
+ {
+ m_start.OnEvent = Callback(this, &CProtoImpl::OnStart);
+ m_update.OnEvent = Callback(this, &CProtoImpl::OnUpdate);
+ }
+ }
+ m_impl;
+
+ // avatars
+ void AvatarDownloaded(MCONTACT hContact);
+
+ INT_PTR __cdecl AdvancedStatusIconSvc(WPARAM, LPARAM);
+ INT_PTR __cdecl GetAvatarInfoSvc(WPARAM, LPARAM);
+
+ // contacts
+ INT_PTR __cdecl ViewLog(WPARAM, LPARAM);
+ INT_PTR __cdecl LoadForecast(WPARAM, LPARAM);
+ INT_PTR __cdecl WeatherMap(WPARAM, LPARAM);
+ INT_PTR __cdecl EditSettings(WPARAM, LPARAM);
+
+ int __cdecl BriefInfoEvt(WPARAM, LPARAM);
+
+ bool IsMyContact(MCONTACT hContact);
+
+ // conversions
+ void numToStr(double num, wchar_t *str, size_t strSize);
+
+ void GetTemp(const wchar_t *tempchar, const wchar_t *unit, wchar_t *str);
+ void GetSpeed(const wchar_t *tempchar, const wchar_t *unit, wchar_t *str);
+ void GetPressure(const wchar_t *tempchar, const wchar_t *unit, wchar_t *str);
+ void GetDist(const wchar_t *tempchar, const wchar_t *unit, wchar_t *str);
+ void GetElev(const wchar_t *tempchar, const wchar_t *unit, wchar_t *str);
+
+ // data
+ void ConvertDataValue(WIDATAITEM *UpdateData);
+ void EraseAllInfo(void);
+ WEATHERINFO LoadWeatherInfo(MCONTACT hContact);
+
+ MHttpResponse* RunQuery(const wchar_t *id, int days);
+
+ // menu items
+ HGENMENU hEnableDisableMenu;
+
+ void InitMenuItems();
+ void UpdateMenu(BOOL State);
+
+ INT_PTR __cdecl EnableDisableCmd(WPARAM, LPARAM);
+
+ // mwin
+ void AddFrameWindow(MCONTACT hContact);
+ void RemoveFrameWindow(MCONTACT hContact);
+
+ void InitMwin(void);
+ void DestroyMwin(void);
+
+ INT_PTR __cdecl Mwin_MenuClicked(WPARAM, LPARAM);
+
+ // options
+ void LoadOptions();
+ void SaveOptions();
+ void RestartTimer();
+ void InitPopupOptions(WPARAM);
+
+ int __cdecl OptInit(WPARAM, LPARAM);
+
+ CMStringW GetTextValue(int c);
+ void GetVarsDescr(CMStringW &str);
+
+ // popups
+ int WPShowMessage(const wchar_t *lpzText, int kind);
+ int WeatherPopup(MCONTACT hContact, bool bNew);
+
+ // search
+ bool CheckSearch();
+
+ int IDSearch(wchar_t *id, int searchId);
+ int NameSearch(wchar_t *name, int searchId);
+
+ void __cdecl NameSearchThread(void *);
+ void __cdecl BasicSearchThread(void *);
+
+ // update weather
+ std::vector<MCONTACT> m_updateList;
+
+ // check if weather is currently updating
+ bool m_bThreadRunning;
+ mir_cs m_csUpdate;
+
+ void DoUpdate();
+ void StartUpdate();
+
+ int GetWeatherData(MCONTACT hContact);
+ int UpdateWeather(MCONTACT hContact);
+ void UpdateListAdd(MCONTACT hContact);
+ MCONTACT UpdateGetFirst();
+ void DestroyUpdateList(void);
+
+ void __cdecl UpdateThread(void *);
+ void UpdateAll(BOOL AutoUpdate, BOOL RemoveOld);
+
+ INT_PTR __cdecl UpdateSingleStation(WPARAM, LPARAM);
+ INT_PTR __cdecl UpdateSingleRemove(WPARAM, LPARAM);
+
+ INT_PTR __cdecl UpdateAllInfo(WPARAM, LPARAM);
+ INT_PTR __cdecl UpdateAllRemove(WPARAM, LPARAM);
+
+ // user info
+ int __cdecl UserInfoInit(WPARAM, LPARAM);
+
+public:
+ CWeatherProto(const char *protoName, const wchar_t *userName);
+ ~CWeatherProto();
+
+ MYOPTIONS opt;
+
+ CMOption<bool> m_bPopups;
+ CMOption<wchar_t *> m_szApiKey;
+ INT_PTR __cdecl BriefInfo(WPARAM, LPARAM);
+
+ int MapCondToStatus(MCONTACT hContact);
+ HICON GetStatusIcon(MCONTACT hContact);
+ HICON GetStatusIconBig(MCONTACT hContact);
+
+ static LRESULT CALLBACK CWeatherProto::PopupWndProc(HWND hWnd, UINT uMsg, WPARAM, LPARAM);
+
+ // PROTO_INTERFACE
+ MCONTACT AddToList(int flags, PROTOSEARCHRESULT *psr) override;
+ HANDLE SearchBasic(const wchar_t *id) override;
+ HANDLE SearchAdvanced(MWindow owner) override;
+ MWindow CreateExtendedSearchUI(MWindow owner) override;
+
+ INT_PTR GetCaps(int type, MCONTACT hContact) override;
+ int SetStatus(int iNewStatus) override;
+
+ void __cdecl GetAwayMsgThread(void *arg);
+ HANDLE GetAwayMsg(MCONTACT hContact) override;
+
+ void __cdecl AckThreadProc(void *arg);
+ int GetInfo(MCONTACT hContact, int) override;
+
+ bool OnContactDeleted(MCONTACT, uint32_t flags) override;
+ void OnModulesLoaded() override;
+ void OnShutdown() override;
+
+ static void GlobalMenuInit();
+ int __cdecl BuildContactMenu(MCONTACT);
+
+ int __cdecl OnToolbarLoaded(WPARAM, LPARAM);
+};
+
+typedef CProtoDlgBase<CWeatherProto> CWeatherDlgBase;
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Plugin class
+
+struct CMPlugin : public ACCPROTOPLUGIN<CWeatherProto>
+{
+ CMPlugin();
+
+ HINSTANCE hIconsDll = nullptr;
+
+ int Load() override;
+ int Unload() override;
+};