/* * This code implements window handling (connection error) * * (c) majvan 2002,2004 */ #include "../stdafx.h" #define BADCONNECTTITLE LPGEN("%s - connection error") #define BADCONNECTMSG LPGEN("An error occurred. Error code: %d")//is in use? //-------------------------------------------------------------------------------------------------- LRESULT CALLBACK BadConnectPopupProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_COMMAND: // if clicked and it's new mail popup window if ((HIWORD(wParam) == STN_CLICKED) && (PUGetPluginData(hWnd))) { PROCESS_INFORMATION pi; STARTUPINFOW si; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); CAccount *ActualAccount = (CAccount *)PUGetPluginData(hWnd); SReadGuard sra(ActualAccount->AccountAccessSO); if (sra.Succeeded()) { if (ActualAccount->BadConnectN.App != nullptr) { wchar_t *Command; if (ActualAccount->BadConnectN.AppParam != nullptr) Command = new wchar_t[mir_wstrlen(ActualAccount->BadConnectN.App) + mir_wstrlen(ActualAccount->BadConnectN.AppParam) + 6]; else Command = new wchar_t[mir_wstrlen(ActualAccount->BadConnectN.App) + 6]; if (Command != nullptr) { mir_wstrcpy(Command, L"\""); mir_wstrcat(Command, ActualAccount->BadConnectN.App); mir_wstrcat(Command, L"\" "); if (ActualAccount->BadConnectN.AppParam != nullptr) mir_wstrcat(Command, ActualAccount->BadConnectN.AppParam); CreateProcessW(nullptr, Command, nullptr, nullptr, FALSE, NORMAL_PRIORITY_CLASS, nullptr, nullptr, &si, &pi); delete[] Command; } } } PUDeletePopup(hWnd); } break; case UM_INITPOPUP: //This is the equivalent to WM_INITDIALOG you'd get if you were the maker of dialog popups. break; case WM_CONTEXTMENU: PUDeletePopup(hWnd); break; } return DefWindowProc(hWnd, msg, wParam, lParam); } INT_PTR CALLBACK DlgProcYAMNBadConnection(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { CMStringA szTitle; wchar_t *Message1W = nullptr; POPUPDATAW BadConnectPopup = {}; CAccount *ActualAccount = ((BadConnectionParam *)lParam)->account; uint32_t ErrorCode = ((BadConnectionParam *)lParam)->errcode; { SReadGuard sra(ActualAccount->AccountAccessSO); if (!sra.Succeeded()) return FALSE; szTitle.Format(Translate(BADCONNECTTITLE), ActualAccount->Name); BOOL ShowPopup = ActualAccount->BadConnectN.Flags & YAMN_ACC_POP; BOOL ShowMsg = ActualAccount->BadConnectN.Flags & YAMN_ACC_MSG; BOOL ShowIco = ActualAccount->BadConnectN.Flags & YAMN_ACC_ICO; if (ShowPopup) { BadConnectPopup.lchIcon = g_plugin.getIcon(IDI_BADCONNECT); BadConnectPopup.colorBack = ActualAccount->BadConnectN.Flags & YAMN_ACC_POPC ? ActualAccount->BadConnectN.PopupB : GetSysColor(COLOR_BTNFACE); BadConnectPopup.colorText = ActualAccount->BadConnectN.Flags & YAMN_ACC_POPC ? ActualAccount->BadConnectN.PopupT : GetSysColor(COLOR_WINDOWTEXT); BadConnectPopup.iSeconds = ActualAccount->BadConnectN.PopupTime; BadConnectPopup.PluginWindowProc = BadConnectPopupProc; BadConnectPopup.PluginData = ActualAccount; mir_wstrncpy(BadConnectPopup.lpwzContactName, _A2T(ActualAccount->Name), _countof(BadConnectPopup.lpwzContactName)); } if (ActualAccount->Plugin->Fcn != nullptr && ActualAccount->Plugin->Fcn->GetErrorStringWFcnPtr != nullptr) { Message1W = ActualAccount->Plugin->Fcn->GetErrorStringWFcnPtr(ErrorCode); SetDlgItemText(hDlg, IDC_STATICMSG, Message1W); wcsncpy_s(BadConnectPopup.lpwzText, Message1W, _TRUNCATE); if (ShowPopup) PUAddPopupW(&BadConnectPopup); } else if (ActualAccount->Plugin->Fcn != nullptr && ActualAccount->Plugin->Fcn->GetErrorStringAFcnPtr != nullptr) { Message1W = ActualAccount->Plugin->Fcn->GetErrorStringWFcnPtr(ErrorCode); SetDlgItemText(hDlg, IDC_STATICMSG, Message1W); wcsncpy_s(BadConnectPopup.lpwzText, Message1W, _TRUNCATE); if (ShowPopup) PUAddPopupW(&BadConnectPopup); } else { Message1W = TranslateT("Unknown error"); SetDlgItemText(hDlg, IDC_STATICMSG, Message1W); wcsncpy_s(BadConnectPopup.lpwzText, Message1W, _TRUNCATE); if (ShowPopup) PUAddPopupW(&BadConnectPopup); } if (!ShowMsg && !ShowIco) DestroyWindow(hDlg); } SetWindowTextA(hDlg, szTitle); if (ActualAccount->Plugin->Fcn != nullptr && ActualAccount->Plugin->Fcn->DeleteErrorStringFcnPtr != nullptr && Message1W != nullptr) ActualAccount->Plugin->Fcn->DeleteErrorStringFcnPtr(Message1W); return 0; } case WM_DESTROY: { NOTIFYICONDATA nid = {}; nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hDlg; Shell_NotifyIcon(NIM_DELETE, &nid); PostQuitMessage(0); } break; case WM_YAMN_NOTIFYICON: switch (lParam) { case WM_LBUTTONDBLCLK: ShowWindow(hDlg, SW_SHOWNORMAL); SetForegroundWindow(hDlg); break; } return 0; case WM_CHAR: switch ((wchar_t)wParam) { case 27: case 13: DestroyWindow(hDlg); break; } break; case WM_SYSCOMMAND: switch (wParam) { case SC_CLOSE: DestroyWindow(hDlg); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_BTNOK: DestroyWindow(hDlg); } break; } return 0; } static void __cdecl BadConnection(void *Param) { MSG msg; HWND hBadConnect; CAccount *ActualAccount; auto *MyParam = (BadConnectionParam *)Param; ActualAccount = MyParam->account; SCGuard sc(ActualAccount->UsingThreads); hBadConnect = CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_DLGBADCONNECT), nullptr, DlgProcYAMNBadConnection, (LPARAM)MyParam); Window_SetIcon_IcoLib(hBadConnect, g_plugin.getIconHandle(IDI_BADCONNECT)); SReadGuard sra(ActualAccount->AccountAccessSO); if (WAIT_OBJECT_0 == sra) { Skin_PlaySound(YAMN_CONNECTFAILSOUND); if (ActualAccount->BadConnectN.Flags & YAMN_ACC_MSG) ShowWindow(hBadConnect, SW_SHOWNORMAL); if (ActualAccount->BadConnectN.Flags & YAMN_ACC_ICO) { NOTIFYICONDATA nid = {}; nid.cbSize = sizeof(nid); nid.hWnd = hBadConnect; nid.hIcon = g_plugin.getIcon(IDI_BADCONNECT); nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nid.uCallbackMessage = WM_YAMN_NOTIFYICON; mir_snwprintf(nid.szTip, L"%S%s", ActualAccount->Name, TranslateT(" - connection error")); Shell_NotifyIcon(NIM_ADD, &nid); } sra.Uninit(); UpdateWindow(hBadConnect); while (GetMessage(&msg, nullptr, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } delete MyParam; } void RunBadConnection(CAccount *acc, UINT_PTR iErrorCode, void *pUserInfo) { BadConnectionParam param = { acc, iErrorCode, pUserInfo }; mir_forkthread(BadConnection, new BadConnectionParam(param)); }