Move the MessageBox-with-help function out into winutils.c, although it's
authorjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Tue, 1 Mar 2005 00:00:09 +0000 (00:00 +0000)
committerjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Tue, 1 Mar 2005 00:00:09 +0000 (00:00 +0000)
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
windows/winhelp.h
windows/winpgen.c
windows/winpgnt.c
windows/winstuff.h
windows/winutils.c

index 5aa20d2..50d9cc6 100644 (file)
@@ -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;
     }
index e2876da..34cfd93 100644 (file)
@@ -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)
 
 #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"
index 1e2075d..eac66de 100644 (file)
@@ -21,8 +21,6 @@
 
 #define DEFAULT_KEYSIZE 1024
 
-static int requested_help;
-
 static char *cmdline_keyfile = NULL;
 
 /*
index 0786f7a..e37043e 100644 (file)
@@ -8,6 +8,8 @@
 #include <assert.h>
 #include <tchar.h>
 
+#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. */
index f6fae66..28dd08d 100644 (file)
@@ -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 ***);
 
 /*
index 2e91d8b..5bead7b 100644 (file)
@@ -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,