/* Weather Protocol plugin for Miranda IM Copyright (C) 2005-2011 Boris Krasnovskiy All Rights Reserved Copyright (C) 2002-2005 Calvin Che 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; version 2 of the License. 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 . */ /* This file contains the includes, weather constants/declarations, the structs, and the primitives for some of the functions. */ //============ THE INCLUDES =========== #include #include #include #include #include #include #include #include #include #include #include #define MIRANDA_VER 0x0700 #define MIRANDA_CUSTOM_LP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "m_cluiframes.h" #include #include "m_weather.h" #include "resource.h" #include "version.h" //============ CONSTANTS ============ // status #define NOSTATUSDATA 1 // limits #define MAX_TEXT_SIZE 4096 #define MAX_DATA_LEN 1024 // db info mangement mode #define WDBM_REMOVE 1 #define WDBM_DETAILDISPLAY 2 // more info list column width #define LIST_COLUMN 150 // others #define NODATA Translate("N/A") #define UM_SETCONTACT 40000 // weather update error codes #define INVALID_ID_FORMAT 10 #define INVALID_SVC 11 #define INVALID_ID 12 #define SVC_NOT_FOUND 20 #define NETLIB_ERROR 30 #define DATA_EMPTY 40 #define DOC_NOT_FOUND 42 #define DOC_TOO_SHORT 43 #define UNKNOWN_ERROR 99 // weather update error text #define E10 Translate("Invalid ID format, missing \"/\" (10)") #define E11 Translate("Invalid service (11)") #define E12 Translate("Invalid station (12)") #define E20 Translate("Weather service ini for this station is not found (20)") #define E30 Translate("Netlib error - check your internet connection (30)") #define E40 Translate("Empty data is retrieved (40)") #define E42 Translate("Document not found (42)") #define E43 Translate("Document too short to contain any weather data (43)") #define E99 Translate("Unknown error (99)") // HTTP error... not all translated // 100 Continue // 101 Switching Protocols // 200 OK // 201 Created // 202 Accepted // 203 Non-Authoritative Information #define E204 Translate("HTTP Error: No content (204)") // 205 Reset Content // 206 Partial Content // 300 Multiple Choices #define E301 Translate("HTTP Error: Data moved (301)") // 302 Found // 303 See Other // 304 Not Modified #define E305 Translate("HTTP Error: Use proxy (305)") // 306 (Unused) #define E307 Translate("HTTP Error: Temporary redirect (307)") #define E400 Translate("HTTP Error: Bad request (400)") #define E401 Translate("HTTP Error: Unauthorized (401)") #define E402 Translate("HTTP Error: Payment required (402)") #define E403 Translate("HTTP Error: Forbidden (403)") #define E404 Translate("HTTP Error: Not found (404)") #define E405 Translate("HTTP Error: Method not allowed (405)") // 406 Not Acceptable #define E407 Translate("HTTP Error: Proxy authentication required (407)") // 408 Request Timeout // 409 Conflict #define E410 Translate("HTTP Error: Gone (410)") // 411 Length Required // 412 Precondition Failed // 413 Request Entity Too Large // 414 Request-URI Too Long // 415 Unsupported Media Type // 416 Requested Range Not Satisfiable // 417 Expectation Failed #define E500 Translate("HTTP Error: Internal server error (500)") // 501 Not Implemented #define E502 Translate("HTTP Error: Bad gateway (502)") #define E503 Translate("HTTP Error: Service unavailable (503)") #define E504 Translate("HTTP Error: Gateway timeout (504)") // 505 HTTP Version Not Supported // defaults constants #define C_DEFAULT Translate("%n [%t, %c]") #define N_DEFAULT Translate("%c\nTemperature: %t\nFeel-Like: %f\nPressure: %p\nWind: %i %w\nHumidity: %m\nDew Point: %e\nVisibility: %v\n\nSun Rise: %r\nSun Set: %y\n\n5 Days Forecast:\n%[Forecast Day 1]\n%[Forecast Day 2]\n%[Forecast Day 3]\n%[Forecast Day 4]\n%[Forecast Day 5]") #define B_DEFAULT Translate("Feel-Like: %f\nPressure: %p\nWind: %i %w\nHumidity: %m\nDew Point: %e\nVisibility: %v\n\nSun Rise: %r\nSun Set: %y\n\n5 Days Forecast:\n%[Forecast Day 1]\n%[Forecast Day 2]\n%[Forecast Day 3]\n%[Forecast Day 4]\n%[Forecast Day 5]") #define b_DEFAULT Translate("Weather Condition for %n as of %u") #define X_DEFAULT N_DEFAULT #define H_DEFAULT Translate("%c, %t (feel-like %f) Wind: %i %w Humidity: %m") #define E_DEFAULT Translate("%n at %u: %c, %t (feel-like %f) Wind: %i %w Humidity: %m") #define P_DEFAULT Translate("%n (%u)") #define p_DEFAULT Translate("%c, %t\nToday: High %h, Low %l") //============ OPTION STRUCT ============ // option struct typedef struct { // main options BOOL AutoUpdate; BOOL CAutoUpdate; BOOL StartupUpdate; WORD UpdateTime; WORD AvatarSize; BOOL NewBrowserWin; BOOL NoProtoCondition; BOOL UpdateOnlyConditionChanged; BOOL RemoveOldData; BOOL MakeItalic; // units WORD tUnit; WORD wUnit; WORD vUnit; WORD pUnit; WORD dUnit; char DegreeSign[4]; BOOL DoNotAppendUnit; BOOL NoFrac; // texts char *cText; char *bTitle; char *bText; char *nText; char *eText; char *hText; char *xText; char *sText; // advanced BOOL DisCondIcon; // popup options BOOL UsePopup; BOOL UpdatePopup; BOOL AlertPopup; BOOL PopupOnChange; BOOL ShowWarnings; // popup colors BOOL UseWinColors; COLORREF BGColour; COLORREF TextColour; // popup actions DWORD LeftClickAction; DWORD RightClickAction; // popup delay DWORD pDelay; // popup texts char *pTitle; char *pText; // other misc stuff char Default[64]; HANDLE DefStn; } MYOPTIONS; void DestroyOptions(void); //============ STRUCT USED TO MAKE AN UPDATE LIST ============ struct WCONTACTLIST { HANDLE hContact; struct WCONTACTLIST *next; }; typedef struct WCONTACTLIST UPDATELIST; extern UPDATELIST *UpdateListHead; extern UPDATELIST *UpdateListTail; void DestroyUpdateList(void); //============ DATA FORMAT STRUCT ============ #define WID_NORMAL 0 #define WID_SET 1 #define WID_BREAK 2 typedef struct { char *Name; char *Start; char *End; char *Unit; char *Url; char *Break; int Type; } WIDATAITEM; struct WITEMLIST { WIDATAITEM Item; struct WITEMLIST *Next; }; typedef struct WITEMLIST WIDATAITEMLIST; typedef struct { BOOL Available; char *SearchURL; char *NotFoundStr; WIDATAITEM Name; } WIIDSEARCH; typedef struct { BOOL Available; char *First; WIDATAITEM Name; WIDATAITEM ID; } WINAMESEARCHTYPE; typedef struct { char *SearchURL; char *NotFoundStr; char *SingleStr; WINAMESEARCHTYPE Single; WINAMESEARCHTYPE Multiple; } WINAMESEARCH; struct STRLIST { char *Item; struct STRLIST *Next; }; typedef struct STRLIST WICONDITEM; typedef struct { WICONDITEM *Head; WICONDITEM *Tail; } WICONDLIST; typedef struct { char *FileName; char *ShortFileName; BOOL Enabled; // header char *DisplayName; char *InternalName; char *Description; char *Author; char *Version; int InternalVer; size_t MemUsed; // default char *DefaultURL; char *DefaultMap; char *UpdateURL; char *UpdateURL2; char *UpdateURL3; char *UpdateURL4; char *Cookie; // items int UpdateDataCount; WIDATAITEMLIST *UpdateData; WIDATAITEMLIST *UpdateDataTail; WIIDSEARCH IDSearch; WINAMESEARCH NameSearch; WICONDLIST CondList[10]; } WIDATA; //============ DATA LIST (LINKED LIST) ============ struct DATALIST { WIDATA Data; struct DATALIST *next; }; typedef struct DATALIST WIDATALIST; //============ GLOBAL VARIABLES ============ extern WIDATALIST *WIHead; extern WIDATALIST *WITail; extern HINSTANCE hInst; extern HWND hPopupWindow; extern HWND hWndSetup; extern MYOPTIONS opt; extern unsigned status; extern unsigned old_status; extern HANDLE hDataWindowList; extern HANDLE hNetlibUser, hNetlibHttp; extern HANDLE hHookWeatherUpdated; extern HANDLE hHookWeatherError; extern HANDLE hWindowList; extern HANDLE hMwinMenu; extern UINT_PTR timerId; // check if weather is currently updating extern BOOL ThreadRunning; //============ FUNCTION PRIMITIVES ============ // functions in weather.c void UpgradeContact(DWORD lastver, HANDLE hContact); // functions in weather_addstn.c INT_PTR WeatherAddToList(WPARAM wParam,LPARAM lParam); BOOL CheckSearch(); int IDSearch(char *id, const int searchId); int NameSearch(char *name, const int searchId); INT_PTR WeatherBasicSearch(WPARAM wParam,LPARAM lParam); INT_PTR WeatherCreateAdvancedSearchUI(WPARAM wParam, LPARAM lParam); INT_PTR WeatherAdvancedSearch(WPARAM wParam, LPARAM lParam); int WeatherAdd(WPARAM wParam, LPARAM lParam); // functions used in weather_contacts.c INT_PTR ViewLog(WPARAM wParam,LPARAM lParam); INT_PTR LoadForecast(WPARAM wParam,LPARAM lParam); INT_PTR WeatherMap(WPARAM wParam,LPARAM lParam); INT_PTR EditSettings(WPARAM wParam,LPARAM lParam); INT_PTR CALLBACK DlgProcChange(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); int ContactDeleted(WPARAM wParam,LPARAM lParam); BOOL IsMyContact(HANDLE hContact); // functions in weather_conv.c BOOL is_number(char *s); extern unsigned lpcp; void InitUniConv(void); LPWSTR ConvToUnicode(LPCSTR str2); UINT GetDlgItemTextWth(HWND hDlg, int nIDDlgItem, LPSTR lpString, int nMaxCount); BOOL SetDlgItemTextWth(HWND hDlg, int nIDDlgItem, LPCSTR lpString); BOOL SetWindowTextWth(HWND hWnd, LPCSTR lpString); void ListView_SetItemTextWth(HWND hwndLV, int i, int iSubItem_, LPSTR pszText_); int ListView_InsertItemWth(HWND hwnd, LV_ITEM *pitem); int ListView_InsertColumnWth(HWND hwnd, int iCol, LV_COLUMN *pitem); void GetTemp(char *tempchar, char *unit, char *str); void GetSpeed(char *tempchar, char *unit, char *str); void GetPressure(char *tempchar, char *unit, char *str); void GetDist(char *tempchar, char *unit, char *str); WORD GetIcon(const char* cond, WIDATA *Data); void FixStr(const char *orig, char* str); void CaseConv(char *str); void TrimString(char *str); void ConvertBackslashes(char *str); char *GetSearchStr(char *dis); char *GetDisplay(WEATHERINFO *w, const char *dis, char* str); INT_PTR GetDisplaySvcFunc(WPARAM wParam, LPARAM lParam); void GetSvc(char *pszID); void GetID(char *pszID); char *GetError(int code); // functions in weather_data.c void GetStationID(HANDLE hContact, char* id, size_t idlen); WEATHERINFO LoadWeatherInfo(HANDLE Change); int DBGetData(HANDLE hContact, char *setting, DBVARIANT *dbv); int DBGetStaticString(HANDLE hContact, const char *szModule, const char *valueName, char *dest, size_t dest_len); void EraseAllInfo(DWORD lastver); void LoadStationData(char *pszFile, char *pszShortFile, WIDATA *Data); void GetDataValue(WIDATAITEM *UpdateData, char *Data, char** szInfo); void ConvertDataValue(WIDATAITEM *UpdateData, char *Data); void wSetData(char **Data, const char *Value); void wfree(char **Data); void DBDataManage(HANDLE hContact, WORD Mode, WPARAM wParam, LPARAM lParam); int GetWeatherDataFromDB(const char *szSetting, LPARAM lparam); // functions in weather_http.c int InternetDownloadFile (char *szUrl, char *cookie, char** szData); void NetlibInit(); void NetlibHttpDisconnect(void); // functions in weather_ini.c void WIListAdd(WIDATA Data); WIDATA* GetWIData(char *pszServ); BOOL IsContainedInCondList(const char *pszStr, WICONDLIST *List); void DestroyWIList(); BOOL LoadWIData(BOOL dial); void FreeWIData(WIDATA *Data); INT_PTR CALLBACK DlgProcSetup(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); // functions in weather_info.c void GetINIInfo(char *pszSvc); void MoreVarList(); // functions in weather_opt.c void SetTextDefault(const char* in); void LoadOptions(); void SaveOptions(); int OptInit(WPARAM wParam,LPARAM lParam); INT_PTR CALLBACK OptionsProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam); void SetIconDefault(); void RemoveIconSettings(); BOOL CALLBACK TextOptionsProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam); BOOL CALLBACK AdvOptionsProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam); INT_PTR CALLBACK DlgProcText(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK DlgPopUpOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); // functions in weather_popup.c int WeatherPopup(WPARAM wParam, LPARAM lParam); int WeatherError(WPARAM wParam, LPARAM lParam); int WPShowMessage(char* lpzText, WORD kind); LRESULT CALLBACK PopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK PopupWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void SelectMenuItem(HMENU hMenu, int Check); // functions in weather_svcs.c void InitServices(void); void DestroyServices(void); INT_PTR WeatherSetStatus(WPARAM new_status, LPARAM lParam); INT_PTR WeatherGetCaps(WPARAM wParam, LPARAM lParam); INT_PTR WeatherGetName(WPARAM wParam, LPARAM lParam); INT_PTR WeatherGetStatus(WPARAM wParam, LPARAM lParam); INT_PTR WeatherLoadIcon(WPARAM wParam, LPARAM lParam); void UpdateMenu(BOOL State); void UpdatePopupMenu(BOOL State); void AddMenuItems(); void AvatarDownloaded(HANDLE hContact); // functions in weather_update.c int UpdateWeather(HANDLE hContact); int RetrieveWeather(HANDLE hContact, WEATHERINFO *winfo); void UpdateAll(BOOL AutoUpdate, BOOL RemoveOld); void UpdateThreadProc(LPVOID hWnd); INT_PTR UpdateSingleStation(WPARAM wParam,LPARAM lParam); INT_PTR UpdateAllInfo(WPARAM wParam,LPARAM lParam); INT_PTR UpdateSingleRemove(WPARAM wParam,LPARAM lParam); INT_PTR UpdateAllRemove(WPARAM wParam,LPARAM lParam); int GetWeatherData(HANDLE hContact); void CALLBACK timerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); void CALLBACK timerProc2(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); // function from multiwin module void InitMwin(void); void DestroyMwin(void); INT_PTR Mwin_MenuClicked(WPARAM wParam, LPARAM lParam); int BuildContactMenu(WPARAM wparam, LPARAM lparam); void UpdateMwinData(HANDLE hContact); void removeWindow(HANDLE hContact); // functions in weather_userinfo.c int UserInfoInit(WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK DlgProcUIPage(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK DlgProcMoreData(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); #define WM_UPDATEDATA WM_USER + 2687 int BriefInfo(WPARAM wParam, LPARAM lParam); INT_PTR BriefInfoSvc(WPARAM wParam, LPARAM lParam); void LoadBriefInfoText(HWND hwndDlg, HANDLE hContact); INT_PTR CALLBACK DlgProcBrief(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); void InitIcons(void); HICON LoadIconEx(const char* name, BOOL big); HANDLE GetIconHandle(const char* name); void ReleaseIconEx(HICON hIcon);