#include "common.h" NASettings g_settings; INT_PTR CALLBACK DlgProcOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { char buf[10]; CheckDlgButton(hwndDlg, NA_LOCAL_CHECK, g_settings.local_only ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, NA_DEBUG_MSG_CHECK, g_settings.debug_messages ? BST_CHECKED : BST_UNCHECKED); if (IsLogService) { LS_LOGINFO pli; pli.szID = LOG_ID; pli.hContact = NULL; pli.szLogPath = NULL; pli.Flags = 0; pli.cbSize = sizeof(LS_LOGINFO); if (!CallService(MS_LOGSERVICE_GETLOGINFO, (WPARAM)(LS_LOGINFO *) &pli, 0)) { CheckDlgButton(hwndDlg, NA_LOG_CHECK, (pli.Flags && LSLI_LOGENABLED) ? BST_CHECKED : BST_UNCHECKED); } std::tstring InLogService = TranslateT("Services"); InLogService += _T(" -> "); InLogService += TranslateT("LogService"); InLogService += _T(" -> "); InLogService += TranslateT(LOG_ID); SetDlgItemText(hwndDlg, NA_LOG_FILENAME, InLogService.c_str()); } else { CheckDlgButton(hwndDlg, NA_LOG_CHECK, g_settings.log_to_file ? BST_CHECKED : BST_UNCHECKED); SetDlgItemTextA(hwndDlg, NA_LOG_FILENAME, g_settings.log_filename.c_str()); } EnableWindow(GetDlgItem(hwndDlg, NA_LOG_CHECK), !IsLogService); EnableWindow(GetDlgItem(hwndDlg, NA_LOG_FILENAME), !IsLogService); EnableWindow(GetDlgItem(hwndDlg, NA_LOG_BROWSE), !IsLogService); EnableWindow(GetDlgItem(hwndDlg, NA_DEBUG_MSG_CHECK), IsDlgButtonChecked(hwndDlg, NA_LOG_CHECK) ? 1 : 0); CheckDlgButton(hwndDlg, NA_PCSPEAKER_CHECK, g_settings.use_pcspeaker ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, NA_ALLOW_EXECUTE, g_settings.allow_execute ? BST_CHECKED : BST_UNCHECKED); SetDlgItemTextA(hwndDlg, NA_PORT, itoa(g_settings.port, buf, 10)); SetDlgItemTextA(hwndDlg, NA_PASSWORD, g_settings.password.c_str()); UINT state; switch (g_settings.sound) { case g_settings.always: state = BST_CHECKED; break; case g_settings.never: state = BST_UNCHECKED; break; case g_settings.request: default: state = BST_INDETERMINATE; break; } CheckDlgButton(hwndDlg, NA_SOUND_CHECK, state); } return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case NA_SOUND_CHECK: case NA_PCSPEAKER_CHECK: case NA_LOCAL_CHECK: case NA_DEBUG_MSG_CHECK: case NA_LOG_CHECK: case NA_PORT: case NA_PASSWORD: case NA_LOG_FILENAME: SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } if (HIWORD(wParam) == BN_CLICKED) { switch (LOWORD(wParam)) { case NA_LOG_BROWSE: TCHAR szTemp[MAX_PATH+1], szTemp1[MAX_PATH+1], szProfileDir[MAX_PATH+1]; GetDlgItemText(hwndDlg, NA_LOG_FILENAME, szTemp, MAX_PATH); OPENFILENAME ofn = {0}; ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = szTemp; ofn.nMaxFile = MAX_PATH; ofn.hwndOwner = hwndDlg; ofn.lpstrFilter = TranslateT("Log (*.log)\0*.log\0Text (*.txt)\0*.txt\0All Files (*.*)\0*.*\0"); ofn.nFilterIndex = 1; // Use profile directory as default, if path is not specified CallService(MS_DB_GETPROFILEPATH, (WPARAM)MAX_PATH, (LPARAM) szProfileDir); ofn.lpstrInitialDir = szProfileDir; ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; ofn.lpstrDefExt = _T("log"); if ( GetOpenFileName(&ofn)) { PathToRelativeT(szTemp, szTemp1); SetDlgItemText(hwndDlg, NA_LOG_FILENAME, szTemp1); SendMessage(GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0); } return 0; } } break; case WM_NOTIFY: if (((LPNMHDR)lParam)->idFrom != 0) break; switch (((LPNMHDR)lParam)->code) { case PSN_RESET: return TRUE; case PSN_APPLY: { UINT state = IsDlgButtonChecked(hwndDlg, NA_SOUND_CHECK); NASettings s; switch (state) { case BST_CHECKED: s.sound = s.always; break; case BST_INDETERMINATE: s.sound = s.request; break; case BST_UNCHECKED: default: s.sound = s.never; break; } s.local_only = IsDlgButtonChecked(hwndDlg, NA_LOCAL_CHECK) != BST_UNCHECKED; s.debug_messages = IsDlgButtonChecked(hwndDlg, NA_DEBUG_MSG_CHECK) != BST_UNCHECKED; s.log_to_file = IsDlgButtonChecked(hwndDlg, NA_LOG_CHECK) != BST_UNCHECKED; s.use_pcspeaker = IsDlgButtonChecked(hwndDlg, NA_PCSPEAKER_CHECK) != BST_UNCHECKED; s.allow_execute = IsDlgButtonChecked(hwndDlg, NA_ALLOW_EXECUTE) != BST_UNCHECKED; TCHAR buf[1000]; if (!GetDlgItemText(hwndDlg, NA_PORT, buf, sizeof buf - 1)) buf[0] = '\0'; int port = _ttoi(buf); if (port <= 0 || port > 65535) MessageBox(0, TranslateT("Invalid port number"), TranslateT("NotifyAnything"), MB_ICONWARNING | MB_OK); else s.port = port; if (!GetDlgItemText(hwndDlg, NA_PASSWORD, buf, sizeof buf - 1)) buf[0] = '\0'; s.password = _T2A(buf); if (!IsLogService) { if (!GetDlgItemText(hwndDlg, NA_LOG_FILENAME, buf, sizeof buf - 1)) buf[0] = '\0'; s.log_filename = _T2A(buf); } g_settings = s; save_settings(); stop_threads(); start_threads(); return TRUE; } } break; } return FALSE; } void save_settings() { db_set_b(NULL, PlugName, "local_only", g_settings.local_only); db_set_b(NULL, PlugName, "debug_messages", g_settings.debug_messages); db_set_b(NULL, PlugName, "log_to_file", g_settings.log_to_file); db_set_b(NULL, PlugName, "beep", g_settings.sound); db_set_b(NULL, PlugName, "use_pcspeaker", g_settings.use_pcspeaker); db_set_b(NULL, PlugName, "allow_execute", g_settings.allow_execute); db_set_dw(NULL, PlugName, "port", g_settings.port); db_set_s(NULL, PlugName, "password", g_settings.password.c_str()); db_set_s(NULL, PlugName, "log_filename", g_settings.log_filename.c_str()); } void load_settings() { g_settings.local_only = db_get_b(NULL, PlugName, "local_only", 1) != 0; g_settings.debug_messages = db_get_b(NULL, PlugName, "debug_messages", 0) != 0; g_settings.log_to_file = db_get_b(NULL, PlugName, "log_to_file", 0) != 0; g_settings.sound = NASettings::sound_t(db_get_b(NULL, PlugName, "beep", g_settings.request)); g_settings.use_pcspeaker = db_get_b(NULL, PlugName, "use_pcspeaker", 0) != 0; g_settings.allow_execute = db_get_b(NULL, PlugName, "allow_execute", 0) != 0; g_settings.port = db_get_dw(NULL, PlugName, "port", 12001); DBVARIANT dbv; if(!db_get(NULL, PlugName, "password", &dbv)) { g_settings.password = dbv.pszVal; db_free(&dbv); } if(!db_get(NULL, PlugName, "log_filename", &dbv)) { g_settings.log_filename = dbv.pszVal; db_free(&dbv); } else g_settings.log_filename = g_mirandaDir + "\\"+LOG_ID+".log"; } int OptionsInitialize(WPARAM wParam, LPARAM lParam) { OPTIONSDIALOGPAGE odp = { sizeof(odp) }; odp.pszTemplate = MAKEINTRESOURCEA(NA_OPTIONS); odp.pfnDlgProc = DlgProcOpts; odp.pszTitle = "Notify Anything"; odp.pszGroup = Translate("Plugins"); odp.position = 100000000; odp.hInstance = hInst; odp.groupPosition = 910000000; odp.flags = ODPF_BOLDGROUPS; Options_AddPage(wParam, &odp); return 0; }