From 690695e0356273fb6aa1c851713831f14254590d Mon Sep 17 00:00:00 2001 From: jacob Date: Tue, 1 Mar 2005 00:00:09 +0000 Subject: [PATCH] Move the MessageBox-with-help function out into winutils.c, although it's still only used for the host key popups. Side-effects: - requested_help is a winstuff.h global - Pageant now defines winstuff.h globals (Also, my previous fix to my improved host-key dialogs only got the "changed" case, not the "unknown" case. Some days I shouldn't be let near a keyboard.) git-svn-id: svn://svn.tartarus.org/sgt/putty@5415 cda61777-01e9-0310-a592-d414129be87e --- windows/windlg.c | 78 +++++++++++++----------------------------------------- windows/winhelp.h | 3 +++ windows/winpgen.c | 2 -- windows/winpgnt.c | 4 +-- windows/winstuff.h | 2 ++ windows/winutils.c | 51 +++++++++++++++++++++++++++++++++++ 6 files changed, 76 insertions(+), 64 deletions(-) diff --git a/windows/windlg.c b/windows/windlg.c index 5aa20d2c..50d9cc69 100644 --- a/windows/windlg.c +++ b/windows/windlg.c @@ -40,8 +40,6 @@ static struct dlgparam dp; static char **events = NULL; static int nevents = 0, negsize = 0; -static int requested_help; - extern Config cfg; /* defined in window.c */ struct sesslist sesslist; /* exported to window.c */ @@ -752,28 +750,6 @@ void showabout(HWND hwnd) DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc); } -/* Helper function for verify_ssh_host_key(). */ -static VOID CALLBACK verify_ssh_host_key_help(LPHELPINFO lpHelpInfo) -{ - if (help_path) { - char *context = NULL; -#define CHECK_CTX(name) \ - do { \ - if (lpHelpInfo->dwContextId == WINHELP_CTXID_ ## name) \ - context = WINHELP_CTX_ ## name; \ - } while (0) - CHECK_CTX(errors_hostkey_absent); - CHECK_CTX(errors_hostkey_changed); -#undef CHECK_CTX - if (context) { - char *cmd = dupprintf("JI(`',`%s')", context); - WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); - sfree(cmd); - requested_help = TRUE; - } - } -} - int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint, void (*callback)(void *ctx, int result), void *ctx) @@ -812,23 +788,6 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, static const char mbtitle[] = "%s Security Alert"; - UINT help_button = 0; - MSGBOXPARAMS mbox; - - /* - * We use MessageBoxIndirect() because it allows us to specify a - * callback function for the Help button. - */ - mbox.cbSize = sizeof(mbox); - mbox.hInstance = hinst; - mbox.hwndOwner = hwnd; - mbox.lpfnMsgBoxCallback = &verify_ssh_host_key_help; - mbox.dwLanguageId = LANG_NEUTRAL; - - /* Do we have a help file? */ - if (help_path) - help_button = MB_HELP; - /* * Verify the key against the registry. */ @@ -838,16 +797,15 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, return 1; if (ret == 2) { /* key was different */ int mbret; - mbox.lpszText = dupprintf(wrongmsg, appname, keytype, fingerprint, - appname); - mbox.lpszCaption = dupprintf(mbtitle, appname); - mbox.dwContextHelpId = HELPCTXID(errors_hostkey_changed); - mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 | - help_button; - mbret = MessageBoxIndirect(&mbox); + char *text = dupprintf(wrongmsg, appname, keytype, fingerprint, + appname); + char *caption = dupprintf(mbtitle, appname); + mbret = message_box(text, caption, + MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3, + HELPCTXID(errors_hostkey_changed)); assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL); - sfree((void *)mbox.lpszText); - sfree((void *)mbox.lpszCaption); + sfree(text); + sfree(caption); if (mbret == IDYES) { store_host_key(host, port, keytype, keystr); return 1; @@ -857,18 +815,18 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, } if (ret == 1) { /* key was absent */ int mbret; - mbox.lpszText = dupprintf(absentmsg, keytype, fingerprint, appname); - mbox.lpszCaption = dupprintf(mbtitle, appname); - mbox.dwContextHelpId = HELPCTXID(errors_hostkey_absent); - mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 | - help_button; - mbret = MessageBoxIndirect(&mbox); + char *text = dupprintf(absentmsg, keytype, fingerprint, appname); + char *caption = dupprintf(mbtitle, appname); + mbret = message_box(text, caption, + MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3, + HELPCTXID(errors_hostkey_absent)); assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL); - sfree((void *)mbox.lpszText); - sfree((void *)mbox.lpszCaption); - if (mbret == IDYES) + sfree(text); + sfree(caption); + if (mbret == IDYES) { store_host_key(host, port, keytype, keystr); - if (mbret == IDNO) + return 1; + } else if (mbret == IDNO) return 1; return 0; } diff --git a/windows/winhelp.h b/windows/winhelp.h index e2876da6..34cfd93f 100644 --- a/windows/winhelp.h +++ b/windows/winhelp.h @@ -3,6 +3,8 @@ * the \cfg{winhelp-topic} directives in the Halibut source. */ +#define WINHELP_CTX_MAXLEN 80 + /* These are used in the cross-platform configuration dialog code. */ #define HELPCTX(x) P(WINHELP_CTX_ ## x) @@ -130,6 +132,7 @@ #define HELPCTXID(x) WINHELP_CTXID_ ## x +#define WINHELP_CTXID_no_help 0 #define WINHELP_CTX_errors_hostkey_absent "errors.hostkey.absent" #define WINHELP_CTXID_errors_hostkey_absent 1 #define WINHELP_CTX_errors_hostkey_changed "errors.hostkey.changed" diff --git a/windows/winpgen.c b/windows/winpgen.c index 1e2075de..eac66dec 100644 --- a/windows/winpgen.c +++ b/windows/winpgen.c @@ -21,8 +21,6 @@ #define DEFAULT_KEYSIZE 1024 -static int requested_help; - static char *cmdline_keyfile = NULL; /* diff --git a/windows/winpgnt.c b/windows/winpgnt.c index 0786f7a6..e37043e9 100644 --- a/windows/winpgnt.c +++ b/windows/winpgnt.c @@ -8,6 +8,8 @@ #include #include +#define PUTTY_DO_GLOBALS + #include "putty.h" #include "ssh.h" #include "misc.h" @@ -54,9 +56,7 @@ static HWND keylist; static HWND aboutbox; static HMENU systray_menu, session_menu; static int already_running; -static int requested_help; -char *help_path; static char *putty_path; /* CWD for "add key" file requester. */ diff --git a/windows/winstuff.h b/windows/winstuff.h index f6fae661..28dd08db 100644 --- a/windows/winstuff.h +++ b/windows/winstuff.h @@ -85,6 +85,7 @@ GLOBAL HINSTANCE hinst; */ GLOBAL char *help_path; GLOBAL int help_has_contents; +GLOBAL int requested_help; /* * The terminal and logging context are notionally local to the @@ -177,6 +178,7 @@ typedef struct filereq_tag filereq; /* cwd for file requester */ BOOL request_file(filereq *state, OPENFILENAME *of, int preserve, int save); filereq *filereq_new(void); void filereq_free(filereq *state); +int message_box(LPCTSTR text, LPCTSTR caption, DWORD style, DWORD helpctxid); void split_into_argv(char *, int *, char ***, char ***); /* diff --git a/windows/winutils.c b/windows/winutils.c index 2e91d8bb..5bead7b2 100644 --- a/windows/winutils.c +++ b/windows/winutils.c @@ -89,6 +89,57 @@ void filereq_free(filereq *state) } /* + * Message box with optional context help. + */ + +/* Callback function to launch context help. */ +static VOID CALLBACK message_box_help_callback(LPHELPINFO lpHelpInfo) +{ + if (help_path) { + char *context = NULL; +#define CHECK_CTX(name) \ + do { \ + if (lpHelpInfo->dwContextId == WINHELP_CTXID_ ## name) \ + context = WINHELP_CTX_ ## name; \ + } while (0) + CHECK_CTX(errors_hostkey_absent); + CHECK_CTX(errors_hostkey_changed); +#undef CHECK_CTX + if (context) { + /* We avoid using malloc, in case we're in a situation where + * it would be awkward to do so. */ + char cmd[WINHELP_CTX_MAXLEN+10]; + sprintf(cmd, "JI(`',`%.*s')", WINHELP_CTX_MAXLEN, context); + WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); + requested_help = TRUE; + } + } +} + +int message_box(LPCTSTR text, LPCTSTR caption, DWORD style, DWORD helpctxid) +{ + MSGBOXPARAMS mbox; + + /* + * We use MessageBoxIndirect() because it allows us to specify a + * callback function for the Help button. + */ + mbox.cbSize = sizeof(mbox); + /* FIXME: assumes global hwnd and hinst are always the Right Thing; + * are they? */ + mbox.hInstance = hinst; + mbox.hwndOwner = hwnd; + mbox.lpfnMsgBoxCallback = &message_box_help_callback; + mbox.dwLanguageId = LANG_NEUTRAL; + mbox.lpszText = text; + mbox.lpszCaption = caption; + mbox.dwContextHelpId = helpctxid; + mbox.dwStyle = style; + if (helpctxid != 0 && help_path) mbox.dwStyle |= MB_HELP; + return MessageBoxIndirect(&mbox); +} + +/* * Split a complete command line into argc/argv, attempting to do * it exactly the same way Windows itself would do it (so that * console utilities, which receive argc and argv from Windows, -- 2.11.0