diff options
Diffstat (limited to 'src/windows/identity/ui/cfg_notif_wnd.c')
-rw-r--r-- | src/windows/identity/ui/cfg_notif_wnd.c | 313 |
1 files changed, 313 insertions, 0 deletions
diff --git a/src/windows/identity/ui/cfg_notif_wnd.c b/src/windows/identity/ui/cfg_notif_wnd.c new file mode 100644 index 0000000..aafa12d --- /dev/null +++ b/src/windows/identity/ui/cfg_notif_wnd.c @@ -0,0 +1,313 @@ +/*
+ * Copyright (c) 2004 Massachusetts Institute of Technology
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* $Id$ */
+
+#include<khmapp.h>
+#include<assert.h>
+
+typedef struct tag_notif_data {
+ khui_config_node node;
+
+ BOOL monitor;
+ BOOL renew;
+ BOOL warn1;
+ BOOL warn2;
+
+ khui_tracker tc_renew;
+ khui_tracker tc_warn1;
+ khui_tracker tc_warn2;
+} notif_data;
+
+static void
+read_params(notif_data * d) {
+ khm_handle csp_cw;
+ khm_int32 rv;
+ khm_int32 t;
+
+ rv = khc_open_space(NULL, L"CredWindow", KHM_PERM_READ, &csp_cw);
+ assert(KHM_SUCCEEDED(rv));
+
+ rv = khc_read_int32(csp_cw, L"Monitor", &t);
+ assert(KHM_SUCCEEDED(rv));
+ d->monitor = !!t;
+
+ rv = khc_read_int32(csp_cw, L"AllowAutoRenew", &t);
+ assert(KHM_SUCCEEDED(rv));
+ d->renew = !!t;
+
+ rv = khc_read_int32(csp_cw, L"AllowWarn", &t);
+ assert(KHM_SUCCEEDED(rv));
+ d->warn1 = !!t;
+
+ rv = khc_read_int32(csp_cw, L"AllowCritical", &t);
+ assert(KHM_SUCCEEDED(rv));
+ d->warn2 = !!t;
+
+ rv = khc_read_int32(csp_cw, L"AutoRenewThreshold", &t);
+ assert(KHM_SUCCEEDED(rv));
+ d->tc_renew.current = t;
+
+ rv = khc_read_int32(csp_cw, L"WarnThreshold", &t);
+ assert(KHM_SUCCEEDED(rv));
+ d->tc_warn1.current = t;
+
+ rv = khc_read_int32(csp_cw, L"CriticalThreshold", &t);
+ assert(KHM_SUCCEEDED(rv));
+ d->tc_warn2.current = t;
+
+ rv = khc_read_int32(csp_cw, L"MaxThreshold", &t);
+ assert(KHM_SUCCEEDED(rv));
+ d->tc_renew.max = t;
+ d->tc_warn1.max = t;
+ d->tc_warn2.max = t;
+
+ rv = khc_read_int32(csp_cw, L"MinThreshold", &t);
+ assert(KHM_SUCCEEDED(rv));
+ d->tc_renew.min = t;
+ d->tc_warn1.min = t;
+ d->tc_warn2.min = t;
+
+ khc_close_space(csp_cw);
+}
+
+static void
+check_for_modification(notif_data * d) {
+ notif_data t;
+
+ ZeroMemory(&t, sizeof(t));
+
+ read_params(&t);
+
+ if ((!!d->monitor) != (!!t.monitor) ||
+ (!!d->renew) != (!!t.renew) ||
+ (!!d->warn1) != (!!t.warn1) ||
+ (!!d->warn2) != (!!t.warn2) ||
+ d->tc_renew.current != t.tc_renew.current ||
+ d->tc_warn1.current != t.tc_warn1.current ||
+ d->tc_warn2.current != t.tc_warn2.current) {
+
+ khui_cfg_set_flags(d->node,
+ KHUI_CNFLAG_MODIFIED,
+ KHUI_CNFLAG_MODIFIED);
+
+ } else {
+ khui_cfg_set_flags(d->node,
+ 0,
+ KHUI_CNFLAG_MODIFIED);
+ }
+}
+
+static void
+write_params(notif_data * d) {
+ khm_handle csp_cw;
+ khm_int32 rv;
+
+ rv = khc_open_space(NULL, L"CredWindow", KHM_PERM_WRITE, &csp_cw);
+ assert(KHM_SUCCEEDED(rv));
+
+ rv = khc_write_int32(csp_cw, L"Monitor", d->monitor);
+ assert(KHM_SUCCEEDED(rv));
+
+ rv = khc_write_int32(csp_cw, L"AllowAutoRenew", d->renew);
+ assert(KHM_SUCCEEDED(rv));
+
+ rv = khc_write_int32(csp_cw, L"AllowWarn", d->warn1);
+ assert(KHM_SUCCEEDED(rv));
+
+ rv = khc_write_int32(csp_cw, L"AllowCritical", d->warn2);
+ assert(KHM_SUCCEEDED(rv));
+
+
+ rv = khc_write_int32(csp_cw, L"AutoRenewThreshold",
+ (khm_int32) d->tc_renew.current);
+ assert(KHM_SUCCEEDED(rv));
+
+ rv = khc_write_int32(csp_cw, L"WarnThreshold",
+ (khm_int32) d->tc_warn1.current);
+ assert(KHM_SUCCEEDED(rv));
+
+ rv = khc_write_int32(csp_cw, L"CriticalThreshold",
+ (khm_int32) d->tc_warn2.current);
+ assert(KHM_SUCCEEDED(rv));
+
+ khc_close_space(csp_cw);
+
+ khui_cfg_set_flags(d->node,
+ KHUI_CNFLAG_APPLIED,
+ KHUI_CNFLAG_APPLIED | KHUI_CNFLAG_MODIFIED);
+}
+
+static void
+refresh_view(HWND hwnd, notif_data * d) {
+ CheckDlgButton(hwnd, IDC_NOTIF_MONITOR,
+ (d->monitor?BST_CHECKED:BST_UNCHECKED));
+ CheckDlgButton(hwnd, IDC_NOTIF_RENEW,
+ (d->renew?BST_CHECKED:BST_UNCHECKED));
+ CheckDlgButton(hwnd, IDC_NOTIF_WARN1,
+ (d->warn1?BST_CHECKED:BST_UNCHECKED));
+ CheckDlgButton(hwnd, IDC_NOTIF_WARN2,
+ (d->warn2?BST_CHECKED:BST_UNCHECKED));
+ khui_tracker_refresh(&d->tc_renew);
+ khui_tracker_refresh(&d->tc_warn1);
+ khui_tracker_refresh(&d->tc_warn2);
+ if (!d->monitor) {
+ EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_RENEW), FALSE);
+ EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN1), FALSE);
+ EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN2), FALSE);
+ EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_RENEW_THR), FALSE);
+ EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN1_THR), FALSE);
+ EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN2_THR), FALSE);
+ } else {
+ EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_RENEW), TRUE);
+ EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN1), TRUE);
+ EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN2), TRUE);
+ EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_RENEW_THR), !!(d->renew));
+ EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN1_THR), !!(d->warn1));
+ EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN2_THR), !!(d->warn2));
+ }
+}
+
+static void
+refresh_data(HWND hwnd, notif_data * d) {
+ d->monitor = (IsDlgButtonChecked(hwnd, IDC_NOTIF_MONITOR)
+ == BST_CHECKED);
+ d->renew = (IsDlgButtonChecked(hwnd, IDC_NOTIF_RENEW)
+ == BST_CHECKED);
+ d->warn1 = (IsDlgButtonChecked(hwnd, IDC_NOTIF_WARN1)
+ == BST_CHECKED);
+ d->warn2 = (IsDlgButtonChecked(hwnd, IDC_NOTIF_WARN2)
+ == BST_CHECKED);
+
+ check_for_modification(d);
+}
+
+INT_PTR CALLBACK
+khm_cfg_notifications_proc(HWND hwnd,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam) {
+
+ notif_data * d;
+
+ switch(uMsg) {
+ case WM_INITDIALOG: {
+ HWND hw;
+
+ d = malloc(sizeof(*d));
+#ifdef DEBUG
+ assert(d != NULL);
+#endif
+
+#pragma warning(push)
+#pragma warning(disable: 4244)
+ SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d);
+#pragma warning(pop)
+
+ ZeroMemory(d, sizeof(*d));
+
+ d->node = (khui_config_node) lParam;
+
+ khui_tracker_initialize(&d->tc_renew);
+ khui_tracker_initialize(&d->tc_warn1);
+ khui_tracker_initialize(&d->tc_warn2);
+
+ read_params(d);
+
+ hw = GetDlgItem(hwnd, IDC_NOTIF_RENEW_THR);
+ khui_tracker_install(hw, &d->tc_renew);
+
+ hw = GetDlgItem(hwnd, IDC_NOTIF_WARN1_THR);
+ khui_tracker_install(hw, &d->tc_warn1);
+
+ hw = GetDlgItem(hwnd, IDC_NOTIF_WARN2_THR);
+ khui_tracker_install(hw, &d->tc_warn2);
+
+ refresh_view(hwnd, d);
+
+ /* normally we should return TRUE, but in this case we return
+ FALSE since we don't want to inadvertently steal the focus
+ from the treeview. */
+ return FALSE;
+ }
+
+ case WM_COMMAND: {
+ d = (notif_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER);
+
+ if (HIWORD(wParam) == BN_CLICKED) {
+ refresh_data(hwnd, d);
+ refresh_view(hwnd, d);
+
+ check_for_modification(d);
+ } else if (HIWORD(wParam) == EN_CHANGE) {
+ SetTimer(hwnd, 1, 500, NULL);
+ }
+
+ khm_set_dialog_result(hwnd, 0);
+
+ return TRUE;
+ }
+
+ case WM_TIMER: {
+ d = (notif_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER);
+ KillTimer(hwnd, 1);
+ check_for_modification(d);
+
+ khm_set_dialog_result(hwnd, 0);
+
+ return TRUE;
+ }
+
+ case WM_DESTROY: {
+ d = (notif_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER);
+
+ khui_tracker_kill_controls(&d->tc_renew);
+ khui_tracker_kill_controls(&d->tc_warn1);
+ khui_tracker_kill_controls(&d->tc_warn2);
+
+ free(d);
+
+ SetWindowLongPtr(hwnd, DWLP_USER, 0);
+
+ khm_set_dialog_result(hwnd, 0);
+
+ return TRUE;
+ }
+
+ case KHUI_WM_CFG_NOTIFY: {
+ d = (notif_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER);
+
+ if (HIWORD(wParam) == WMCFG_APPLY) {
+ write_params(d);
+ }
+
+ khm_set_dialog_result(hwnd, 0);
+
+ return TRUE;
+ }
+
+ }
+
+ return FALSE;
+}
|