diff options
Diffstat (limited to 'protocols/Weather/src/weather_contacts.cpp')
-rw-r--r-- | protocols/Weather/src/weather_contacts.cpp | 511 |
1 files changed, 174 insertions, 337 deletions
diff --git a/protocols/Weather/src/weather_contacts.cpp b/protocols/Weather/src/weather_contacts.cpp index 2833521275..2f5a08f4ef 100644 --- a/protocols/Weather/src/weather_contacts.cpp +++ b/protocols/Weather/src/weather_contacts.cpp @@ -25,23 +25,20 @@ the contact. #include "stdafx.h" -static void OpenUrl(wchar_t *format, wchar_t *id) +bool CWeatherProto::IsMyContact(MCONTACT hContact) { - wchar_t loc[512]; - GetID(id); - mir_snwprintf(loc, format, id); - Utils_OpenUrlW(loc); + return hContact && !mir_strcmp(m_szModuleName, Proto_GetBaseAccountName(hContact)); } -//============ BASIC CONTACTS FUNCTIONS AND LINKS ============ - +///////////////////////////////////////////////////////////////////////////////////////// // view weather log for the contact // wParam = current contact -INT_PTR ViewLog(WPARAM wParam, LPARAM lParam) + +INT_PTR CWeatherProto::ViewLog(WPARAM wParam, LPARAM lParam) { // see if the log path is set DBVARIANT dbv; - if (!g_plugin.getWString(wParam, "Log", &dbv)) { + if (!getWString(wParam, "Log", &dbv)) { if (dbv.pszVal[0] != 0) ShellExecute((HWND)lParam, L"open", dbv.pwszVal, L"", L"", SW_SHOW); db_free(&dbv); @@ -52,352 +49,203 @@ INT_PTR ViewLog(WPARAM wParam, LPARAM lParam) return 0; } +///////////////////////////////////////////////////////////////////////////////////////// // read complete forecast // wParam = current contact -INT_PTR LoadForecast(WPARAM wParam, LPARAM) + +INT_PTR CWeatherProto::LoadForecast(WPARAM hContact, LPARAM) { - wchar_t id[256], loc2[256]; - GetStationID(wParam, id, _countof(id)); - if (id[0] != 0) { - // check if the complte forecast URL is set. If it is not, display warning and quit - if (db_get_wstatic(wParam, MODULENAME, "InfoURL", loc2, _countof(loc2)) || loc2[0] == 0) { - MessageBox(nullptr, TranslateT("The URL for complete forecast has not been set. You can set it from the Edit Settings dialog."), TranslateT("Weather Protocol"), MB_ICONINFORMATION); - return 1; - } + CMStringW wszID(getMStringW(hContact, "ID")); + if (!wszID.IsEmpty()) { // set the url and open the webpage - OpenUrl(loc2, id); + CMStringA szUrl("https://www.visualcrossing.com/weather-forecast/" + mir_urlEncode(T2Utf(wszID)) + "/metric"); + Utils_OpenUrl(szUrl); } return 0; } +///////////////////////////////////////////////////////////////////////////////////////// // load weather map // wParam = current contact -INT_PTR WeatherMap(WPARAM wParam, LPARAM) -{ - wchar_t id[256], loc2[256]; - GetStationID(wParam, id, _countof(id)); - if (id[0] != 0) { - // check if the weather map URL is set. If it is not, display warning and quit - if (db_get_wstatic(wParam, MODULENAME, "MapURL", loc2, _countof(loc2)) || loc2[0] == 0) { - MessageBox(nullptr, TranslateT("The URL for weather map has not been set. You can set it from the Edit Settings dialog."), TranslateT("Weather Protocol"), MB_ICONINFORMATION); - return 1; - } +INT_PTR CWeatherProto::WeatherMap(WPARAM hContact, LPARAM) +{ + CMStringW wszID(getMStringW(hContact, "ID")); + if (!wszID.IsEmpty()) { // set the url and open the webpage - OpenUrl(loc2, id); + CMStringA szUrl("https://www.visualcrossing.com/weather-history/" + mir_urlEncode(T2Utf(wszID)) + "/metric"); + Utils_OpenUrl(szUrl); } return 0; } -//============ EDIT SETTINGS ============ - -typedef struct -{ - MCONTACT hContact; - HICON hRename; - HICON hUserDetail; - HICON hFile; - HICON hSrchAll; -} CntSetWndDataType; - +///////////////////////////////////////////////////////////////////////////////////////// // edit weather settings // lParam = current contact -static INT_PTR CALLBACK DlgProcChange(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) + +class CEditDlg : public CWeatherDlgBase { - DBVARIANT dbv; - wchar_t str[MAX_DATA_LEN], str2[256], city[256], filter[256], *chop; - char loc[512]; - OPENFILENAME ofn; // common dialog box structure MCONTACT hContact; - WIDATA *sData; - CntSetWndDataType *wndData = nullptr; - - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - - wndData = (CntSetWndDataType*)mir_alloc(sizeof(CntSetWndDataType)); - wndData->hContact = hContact = lParam; - wndData->hRename = Skin_LoadIcon(SKINICON_OTHER_RENAME); - wndData->hUserDetail = Skin_LoadIcon(SKINICON_OTHER_USERDETAILS); - wndData->hFile = Skin_LoadIcon(SKINICON_EVENT_FILE); - wndData->hSrchAll = Skin_LoadIcon(SKINICON_OTHER_SEARCHALL); - - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)wndData); - - // set button images - SendDlgItemMessage(hwndDlg, IDC_GETNAME, BM_SETIMAGE, IMAGE_ICON, (LPARAM)wndData->hRename); - SendDlgItemMessage(hwndDlg, IDC_SVCINFO, BM_SETIMAGE, IMAGE_ICON, (LPARAM)wndData->hUserDetail); - SendDlgItemMessage(hwndDlg, IDC_BROWSE, BM_SETIMAGE, IMAGE_ICON, (LPARAM)wndData->hFile); - SendDlgItemMessage(hwndDlg, IDC_VIEW1, BM_SETIMAGE, IMAGE_ICON, (LPARAM)wndData->hSrchAll); - SendDlgItemMessage(hwndDlg, IDC_RESET1, BM_SETIMAGE, IMAGE_ICON, (LPARAM)wndData->hRename); - SendDlgItemMessage(hwndDlg, IDC_VIEW2, BM_SETIMAGE, IMAGE_ICON, (LPARAM)wndData->hSrchAll); - SendDlgItemMessage(hwndDlg, IDC_RESET2, BM_SETIMAGE, IMAGE_ICON, (LPARAM)wndData->hRename); + CCtrlEdit edtName; + CCtrlButton btnExternal, btnChange; + CCtrlMButton btnBrowse; + + wchar_t str[MAX_DATA_LEN], str2[256]; + +public: + CEditDlg(CWeatherProto *ppro, MCONTACT _1) : + CWeatherDlgBase(ppro, IDD_EDIT), + hContact(_1), + edtName(this, IDC_NAME), + btnBrowse(this, IDC_BROWSE, SKINICON_EVENT_FILE, LPGEN("Browse")), + btnChange(this, IDC_CHANGE), + btnExternal(this, IDC_External) + { + edtName.OnChange = Callback(this, &CEditDlg::onChanged_Name); + + btnBrowse.OnClick = Callback(this, &CEditDlg::onClick_Browse); + btnChange.OnClick = Callback(this, &CEditDlg::onClick_Change); + btnExternal.OnClick = Callback(this, &CEditDlg::onClick_External); + } + + bool OnInitDialog() override + { // make all buttons flat - SendDlgItemMessage(hwndDlg, IDC_GETNAME, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hwndDlg, IDC_SVCINFO, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hwndDlg, IDC_BROWSE, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hwndDlg, IDC_VIEW1, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hwndDlg, IDC_RESET1, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hwndDlg, IDC_VIEW2, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hwndDlg, IDC_RESET2, BUTTONSETASFLATBTN, TRUE, 0); - - // set tooltip for the buttons - SendDlgItemMessage(hwndDlg, IDC_GETNAME, BUTTONADDTOOLTIP, (WPARAM)LPGENW("Get city name from ID"), BATF_UNICODE); - SendDlgItemMessage(hwndDlg, IDC_SVCINFO, BUTTONADDTOOLTIP, (WPARAM)LPGENW("Weather INI information"), BATF_UNICODE); - SendDlgItemMessage(hwndDlg, IDC_BROWSE, BUTTONADDTOOLTIP, (WPARAM)LPGENW("Browse"), BATF_UNICODE); - SendDlgItemMessage(hwndDlg, IDC_VIEW1, BUTTONADDTOOLTIP, (WPARAM)LPGENW("View webpage"), BATF_UNICODE); - SendDlgItemMessage(hwndDlg, IDC_RESET1, BUTTONADDTOOLTIP, (WPARAM)LPGENW("Reset to default"), BATF_UNICODE); - SendDlgItemMessage(hwndDlg, IDC_VIEW2, BUTTONADDTOOLTIP, (WPARAM)LPGENW("View webpage"), BATF_UNICODE); - SendDlgItemMessage(hwndDlg, IDC_RESET2, BUTTONADDTOOLTIP, (WPARAM)LPGENW("Reset to default"), BATF_UNICODE); + btnBrowse.MakeFlat(); // save the handle for the contact - WindowList_Add(hWindowList, hwndDlg, hContact); + WindowList_Add(hWindowList, m_hwnd, hContact); // start to get the settings // if the setting not exist, leave the dialog box blank - if (!g_plugin.getWString(hContact, "ID", &dbv)) { - SetDlgItemText(hwndDlg, IDC_ID, dbv.pwszVal); + DBVARIANT dbv; + if (!m_proto->getWString(hContact, "ID", &dbv)) { + SetDlgItemText(m_hwnd, IDC_ID, dbv.pwszVal); // check if the station is a default station - CheckDlgButton(hwndDlg, IDC_DEFA, mir_wstrcmp(dbv.pwszVal, opt.Default) != 0 ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_DEFA, mir_wstrcmp(dbv.pwszVal, m_proto->opt.Default) != 0 ? BST_CHECKED : BST_UNCHECKED); db_free(&dbv); } - if (!g_plugin.getWString(hContact, "Nick", &dbv)) { - SetDlgItemText(hwndDlg, IDC_NAME, dbv.pwszVal); + if (!m_proto->getWString(hContact, "Nick", &dbv)) { + SetDlgItemText(m_hwnd, IDC_NAME, dbv.pwszVal); db_free(&dbv); } - if (!g_plugin.getWString(hContact, "Log", &dbv)) { - SetDlgItemText(hwndDlg, IDC_LOG, dbv.pwszVal); + if (!m_proto->getWString(hContact, "Log", &dbv)) { + SetDlgItemText(m_hwnd, IDC_LOG, dbv.pwszVal); // if the log path is not empty, check the checkbox for external log - if (dbv.pwszVal[0]) CheckDlgButton(hwndDlg, IDC_External, BST_CHECKED); + if (dbv.pwszVal[0]) CheckDlgButton(m_hwnd, IDC_External, BST_CHECKED); db_free(&dbv); } // enable/disable the browse button depending on the value of external log checkbox - EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), (uint8_t)IsDlgButtonChecked(hwndDlg, IDC_External)); + EnableWindow(GetDlgItem(m_hwnd, IDC_BROWSE), (uint8_t)IsDlgButtonChecked(m_hwnd, IDC_External)); // other checkbox options - CheckDlgButton(hwndDlg, IDC_DPop, g_plugin.getByte(hContact, "DPopUp", FALSE) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_DAutoUpdate, g_plugin.getByte(hContact, "DAutoUpdate", FALSE) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_Internal, g_plugin.getByte(hContact, "History", 0) ? BST_CHECKED : BST_UNCHECKED); - - if (!g_plugin.getWString(hContact, "InfoURL", &dbv)) { - SetDlgItemText(hwndDlg, IDC_IURL, dbv.pwszVal); - db_free(&dbv); - } - if (!g_plugin.getWString(hContact, "MapURL", &dbv)) { - SetDlgItemText(hwndDlg, IDC_MURL, dbv.pwszVal); - db_free(&dbv); - } + CheckDlgButton(m_hwnd, IDC_DPop, m_proto->getByte(hContact, "DPopUp", FALSE) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_DAutoUpdate, m_proto->getByte(hContact, "DAutoUpdate", FALSE) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_Internal, m_proto->getByte(hContact, "History", 0) ? BST_CHECKED : BST_UNCHECKED); // display the dialog box and free memory - Utils_RestoreWindowPositionNoMove(hwndDlg, NULL, MODULENAME, "EditSetting_"); - ShowWindow(hwndDlg, SW_SHOW); - break; - - case WM_COMMAND: - wndData = (CntSetWndDataType*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - hContact = wndData ? wndData->hContact : NULL; - - switch (LOWORD(wParam)) { - case IDC_ID: - // check if there are 2 parts in the ID (svc/id) seperated by "/" - // if not, don't let user change the setting - GetDlgItemText(hwndDlg, IDC_ID, str, _countof(str)); - chop = wcschr(str, '/'); - if (chop == nullptr) - EnableWindow(GetDlgItem(hwndDlg, IDC_CHANGE), FALSE); - else - EnableWindow(GetDlgItem(hwndDlg, IDC_CHANGE), TRUE); - break; - - case IDC_NAME: - // check if station name is entered - // if not, don't let user change the setting - GetDlgItemText(hwndDlg, IDC_NAME, str, _countof(str)); - EnableWindow(GetDlgItem(hwndDlg, IDC_CHANGE), str[0] != 0); - break; - - case IDC_GETNAME: - // the button for getting station name from the internet - // this function uses the ID search for add/find weather station - if (!CheckSearch()) - return TRUE; // don't download if update is in progress - - // get the weather update data using the string in the ID field - GetDlgItemText(hwndDlg, IDC_ID, str, _countof(str)); - GetSvc(str); - sData = GetWIData(str); - GetDlgItemText(hwndDlg, IDC_ID, str, _countof(str)); - GetID(str); - // if ID search is available, do it - if (sData->IDSearch.Available) { - // load the page - mir_snprintf(loc, sData->IDSearch.SearchURL, str); - str[0] = 0; - wchar_t *pData = nullptr; - if (InternetDownloadFile(loc, nullptr, sData->UserAgent, &pData) == 0) { - wchar_t *szInfo = pData; - wchar_t *search = wcsstr(szInfo, sData->IDSearch.NotFoundStr); - - // if the page is found (ie. valid ID), get the name of the city - if (search == nullptr) - GetDataValue(&sData->IDSearch.Name, str, &szInfo); - } - // free memory - mir_free(pData); - } + Utils_RestoreWindowPositionNoSize(m_hwnd, NULL, MODULENAME, "EditSetting_"); + ShowWindow(m_hwnd, SW_SHOW); + return true; + } - // give no station name but only ID if the search is unavailable - if (str[0] != 0) - SetDlgItemText(hwndDlg, IDC_NAME, str); - break; - - case IDC_External: - // enable/disable the borwse button depending if the external log is enabled - EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), (uint8_t)IsDlgButtonChecked(hwndDlg, IDC_External)); - if (!(uint8_t)IsDlgButtonChecked(hwndDlg, IDC_External)) - return TRUE; - __fallthrough; - - case IDC_BROWSE: - // browse for the external log file - GetDlgItemText(hwndDlg, IDC_LOG, str, _countof(str)); - // Initialize OPENFILENAME - memset(&ofn, 0, sizeof(OPENFILENAME)); - ofn.lStructSize = sizeof(OPENFILENAME); - ofn.hwndOwner = hwndDlg; - ofn.lpstrFile = str; - ofn.nMaxFile = _countof(str); - - // set filters - mir_snwprintf(filter, L"%s (*.txt)%c*.txt%c%s (*.*)%c*.*%c%c", TranslateT("Text Files"), 0, 0, TranslateT("All Files"), 0, 0, 0); - ofn.lpstrFilter = filter; - ofn.nFilterIndex = 1; - ofn.lpstrFileTitle = nullptr; - ofn.nMaxFileTitle = 0; - ofn.lpstrInitialDir = nullptr; - ofn.Flags = OFN_PATHMUSTEXIST; - - // Display a Open dialog box and put the file name on the dialog - if (GetOpenFileName(&ofn)) - SetDlgItemText(hwndDlg, IDC_LOG, ofn.lpstrFile); - // if there is no log file specified, disable external logging - EnableWindow(GetDlgItem(hwndDlg, IDC_CHANGE), ofn.lpstrFile[0] != 0); - break; - - case IDC_VIEW1: - // view the page for more info - GetDlgItemText(hwndDlg, IDC_IURL, str, _countof(str)); - if (str[0] == 0) - return TRUE; - GetDlgItemText(hwndDlg, IDC_ID, str2, _countof(str2)); - OpenUrl(str, str2); - break; - - case IDC_VIEW2: - // view the page for weather map - GetDlgItemText(hwndDlg, IDC_MURL, str, _countof(str)); - if (str[0] == 0) - return TRUE; - GetDlgItemText(hwndDlg, IDC_ID, str2, _countof(str2)); - OpenUrl(str, str2); - break; - - case IDC_RESET1: - // reset the more info url to service default - GetDlgItemText(hwndDlg, IDC_ID, str, _countof(str)); - GetSvc(str); - sData = GetWIData(str); - SetDlgItemTextA(hwndDlg, IDC_IURL, sData->DefaultURL); - break; - - case IDC_RESET2: - // reset the weathe map url to service default - GetDlgItemText(hwndDlg, IDC_ID, str, _countof(str)); - GetSvc(str); - sData = GetWIData(str); - SetDlgItemText(hwndDlg, IDC_MURL, sData->DefaultMap); - break; - - case IDC_SVCINFO: - // display the information of the ini file used by the weather station - GetDlgItemText(hwndDlg, IDC_ID, str, _countof(str)); - GetSvc(str); - GetINIInfo(str); - break; - - case IDC_CHANGE: - // temporary disable the protocol while applying the change - // start writing the new settings to database - GetDlgItemText(hwndDlg, IDC_ID, str, _countof(str)); - g_plugin.setWString(hContact, "ID", str); - if ((uint8_t)IsDlgButtonChecked(hwndDlg, IDC_DEFA)) { // if default station is set - mir_wstrcpy(opt.Default, str); - opt.DefStn = hContact; - g_plugin.setWString("Default", opt.Default); - } - GetDlgItemText(hwndDlg, IDC_NAME, city, _countof(city)); - g_plugin.setWString(hContact, "Nick", city); - mir_snwprintf(str2, TranslateT("Current weather information for %s."), city); - if ((uint8_t)IsDlgButtonChecked(hwndDlg, IDC_External)) { - GetDlgItemText(hwndDlg, IDC_LOG, str, _countof(str)); - g_plugin.setWString(hContact, "Log", str); - } - else g_plugin.delSetting(hContact, "Log"); - - GetDlgItemText(hwndDlg, IDC_IURL, str, _countof(str)); - g_plugin.setWString(hContact, "InfoURL", str); - - GetDlgItemText(hwndDlg, IDC_MURL, str, _countof(str)); - g_plugin.setWString(hContact, "MapURL", str); - g_plugin.setWord(hContact, "Status", ID_STATUS_OFFLINE); - g_plugin.setWord(hContact, "StatusIcon", -1); - AvatarDownloaded(hContact); - g_plugin.setWString(hContact, "About", str2); - g_plugin.setByte(hContact, "History", (uint8_t)IsDlgButtonChecked(hwndDlg, IDC_Internal)); - g_plugin.setByte(hContact, "Overwrite", (uint8_t)IsDlgButtonChecked(hwndDlg, IDC_Overwrite)); - g_plugin.setByte(hContact, "File", (uint8_t)IsDlgButtonChecked(hwndDlg, IDC_External)); - g_plugin.setByte(hContact, "DPopUp", (uint8_t)IsDlgButtonChecked(hwndDlg, IDC_DPop)); - g_plugin.setByte(hContact, "DAutoUpdate", (uint8_t)IsDlgButtonChecked(hwndDlg, IDC_DAutoUpdate)); - - // re-enable the protocol and update the data for the station - g_plugin.setString(hContact, "LastCondition", "None"); - UpdateSingleStation(hContact, 0); - __fallthrough; - - case IDCANCEL: - // remove the dialog from window list and close it - DestroyWindow(hwndDlg); - break; + void OnDestroy() override + { + SetWindowLongPtr(m_hwnd, GWLP_USERDATA, 0); + + WindowList_Remove(hWindowList, m_hwnd); + Utils_SaveWindowPosition(m_hwnd, NULL, MODULENAME, "EditSetting_"); + } + + void onChanged_Name(CCtrlEdit *) + { + // check if station name is entered + // if not, don't let user change the setting + GetDlgItemText(m_hwnd, IDC_NAME, str, _countof(str)); + EnableWindow(GetDlgItem(m_hwnd, IDC_CHANGE), str[0] != 0); + } + + void onClick_External(CCtrlButton *) + { + // enable/disable the borwse button depending if the external log is enabled + EnableWindow(GetDlgItem(m_hwnd, IDC_BROWSE), (uint8_t)IsDlgButtonChecked(m_hwnd, IDC_External)); + if (!(uint8_t)IsDlgButtonChecked(m_hwnd, IDC_External)) + return; + + onClick_Browse(0); + } + + void onClick_Browse(CCtrlButton *) + { + // browse for the external log file + GetDlgItemText(m_hwnd, IDC_LOG, str, _countof(str)); + + // Initialize OPENFILENAME + OPENFILENAME ofn = {}; + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = m_hwnd; + ofn.lpstrFile = str; + ofn.nMaxFile = _countof(str); + + // set filters + wchar_t filter[256]; + mir_snwprintf(filter, L"%s (*.txt)%c*.txt%c%s (*.*)%c*.*%c%c", TranslateT("Text Files"), 0, 0, TranslateT("All Files"), 0, 0, 0); + ofn.lpstrFilter = filter; + ofn.nFilterIndex = 1; + ofn.lpstrFileTitle = nullptr; + ofn.nMaxFileTitle = 0; + ofn.lpstrInitialDir = nullptr; + ofn.Flags = OFN_PATHMUSTEXIST; + + // Display a Open dialog box and put the file name on the dialog + if (GetOpenFileName(&ofn)) + SetDlgItemText(m_hwnd, IDC_LOG, ofn.lpstrFile); + + // if there is no log file specified, disable external logging + EnableWindow(GetDlgItem(m_hwnd, IDC_CHANGE), ofn.lpstrFile[0] != 0); + } + + void onClick_Change(CCtrlButton *) + { + // temporary disable the protocol while applying the change + // start writing the new settings to database + GetDlgItemText(m_hwnd, IDC_ID, str, _countof(str)); + m_proto->setWString(hContact, "ID", str); + if ((uint8_t)IsDlgButtonChecked(m_hwnd, IDC_DEFA)) { // if default station is set + mir_wstrcpy(m_proto->opt.Default, str); + m_proto->opt.DefStn = hContact; + m_proto->setWString("Default", m_proto->opt.Default); + } + + wchar_t city[256]; + GetDlgItemText(m_hwnd, IDC_NAME, city, _countof(city)); + m_proto->setWString(hContact, "Nick", city); + mir_snwprintf(str2, TranslateT("Current weather information for %s."), city); + if ((uint8_t)IsDlgButtonChecked(m_hwnd, IDC_External)) { + GetDlgItemText(m_hwnd, IDC_LOG, str, _countof(str)); + m_proto->setWString(hContact, "Log", str); } - break; - - case WM_CLOSE: - // remove the dialog from window list and close it - DestroyWindow(hwndDlg); - break; - - case WM_DESTROY: - wndData = (CntSetWndDataType*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - IcoLib_ReleaseIcon(wndData->hFile); - IcoLib_ReleaseIcon(wndData->hRename); - IcoLib_ReleaseIcon(wndData->hSrchAll); - IcoLib_ReleaseIcon(wndData->hUserDetail); - mir_free(wndData); - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); - - WindowList_Remove(hWindowList, hwndDlg); - Utils_SaveWindowPosition(hwndDlg, NULL, MODULENAME, "EditSetting_"); - break; + else m_proto->delSetting(hContact, "Log"); + + m_proto->setWord(hContact, "Status", ID_STATUS_OFFLINE); + m_proto->setWord(hContact, "StatusIcon", -1); + m_proto->AvatarDownloaded(hContact); + m_proto->setWString(hContact, "About", str2); + m_proto->setByte(hContact, "History", (uint8_t)IsDlgButtonChecked(m_hwnd, IDC_Internal)); + m_proto->setByte(hContact, "Overwrite", (uint8_t)IsDlgButtonChecked(m_hwnd, IDC_Overwrite)); + m_proto->setByte(hContact, "File", (uint8_t)IsDlgButtonChecked(m_hwnd, IDC_External)); + m_proto->setByte(hContact, "DPopUp", (uint8_t)IsDlgButtonChecked(m_hwnd, IDC_DPop)); + m_proto->setByte(hContact, "DAutoUpdate", (uint8_t)IsDlgButtonChecked(m_hwnd, IDC_DAutoUpdate)); + + // re-enable the protocol and update the data for the station + m_proto->setString(hContact, "LastCondition", "None"); + m_proto->UpdateSingleStation(hContact, 0); } - return FALSE; -} +}; -// show edit settings dialog -// wParam = current contact -INT_PTR EditSettings(WPARAM wParam, LPARAM) +INT_PTR CWeatherProto::EditSettings(WPARAM wParam, LPARAM) { HWND hEditDlg = WindowList_Find(hWindowList, wParam); @@ -410,34 +258,29 @@ INT_PTR EditSettings(WPARAM wParam, LPARAM) else { // if the dialog box is not opened, open a new one if (IsMyContact(wParam)) - CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_EDIT), nullptr, DlgProcChange, (LPARAM)wParam); + (new CEditDlg(this, wParam))->Create(); } return 0; } -//============ CONTACT DELETION ============ -// +///////////////////////////////////////////////////////////////////////////////////////// // when a contact is deleted, make sure some other contact take over the default station -// wParam = deleted contact -int ContactDeleted(WPARAM wParam, LPARAM) -{ - if (!IsMyContact(wParam)) - return 0; - removeWindow(wParam); +bool CWeatherProto::OnContactDeleted(MCONTACT hContact, uint32_t) +{ + RemoveFrameWindow(hContact); // exit this function if it is not default station - ptrW tszID(g_plugin.getWStringA(wParam, "ID")); - if (tszID != NULL) - if (mir_wstrcmp(tszID, opt.Default)) - return 0; + ptrW tszID(getWStringA(hContact, "ID")); + if (mir_wstrcmp(tszID, opt.Default)) + return true; // now the default station is deleted, try to get a new one // start looking for other weather stations - for (auto &hContact : Contacts(MODULENAME)) { - tszID = g_plugin.getWStringA(hContact, "ID"); + for (auto &cc: AccContacts()) { + tszID = getWStringA(cc, "ID"); if (tszID == NULL) continue; @@ -445,27 +288,21 @@ int ContactDeleted(WPARAM wParam, LPARAM) // this is the first weather station encountered from the search if (mir_wstrcmp(opt.Default, tszID)) { wcsncpy_s(opt.Default, tszID, _TRUNCATE); - opt.DefStn = hContact; - ptrW tszNick(g_plugin.getWStringA(hContact, "Nick")); + opt.DefStn = cc; + ptrW tszNick(getWStringA(cc, "Nick")); if (tszNick != NULL) { wchar_t str[255]; mir_snwprintf(str, TranslateT("%s is now the default weather station"), (wchar_t*)tszNick); MessageBox(nullptr, str, TranslateT("Weather Protocol"), MB_OK | MB_ICONINFORMATION); } - g_plugin.setWString("Default", opt.Default); - return 0; // exit this function quickly + setWString("Default", opt.Default); + return true; } } // got here if no more weather station left opt.Default[0] = 0; // no default station opt.DefStn = NULL; - g_plugin.setWString("Default", opt.Default); - return 0; -} - -BOOL IsMyContact(MCONTACT hContact) -{ - const char *szProto = Proto_GetBaseAccountName(hContact); - return szProto != nullptr && mir_strcmp(MODULENAME, szProto) == 0; + setWString("Default", opt.Default); + return true; } |