X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/1e5eefb6f2677a50fdb158e25e59f075ec034d23..b61f81bc4c102d06f13fd68e4a73ab8fdfdb3cf5:/windows/winpgen.c diff --git a/windows/winpgen.c b/windows/winpgen.c index e35a8c16..1e391051 100644 --- a/windows/winpgen.c +++ b/windows/winpgen.c @@ -17,7 +17,7 @@ #define ICON_BIG 1 #endif -#define WM_DONEKEY (WM_XUSER + 1) +#define WM_DONEKEY (WM_APP + 1) #define DEFAULT_KEYSIZE 1024 @@ -615,7 +615,7 @@ void ui_set_state(HWND hwnd, struct MainDlgState *state, int status) } void load_key_file(HWND hwnd, struct MainDlgState *state, - Filename filename, int was_import_cmd) + Filename *filename, int was_import_cmd) { char passphrase[PASSPHRASE_MAXLEN]; int needs_pass; @@ -627,7 +627,7 @@ void load_key_file(HWND hwnd, struct MainDlgState *state, struct RSAKey newkey1; struct ssh2_userkey *newkey2 = NULL; - type = realtype = key_type(&filename); + type = realtype = key_type(filename); if (type != SSH_KEYTYPE_SSH1 && type != SSH_KEYTYPE_SSH2 && !import_possible(type)) { @@ -647,13 +647,11 @@ void load_key_file(HWND hwnd, struct MainDlgState *state, comment = NULL; if (realtype == SSH_KEYTYPE_SSH1) - needs_pass = rsakey_encrypted(&filename, &comment); + needs_pass = rsakey_encrypted(filename, &comment); else if (realtype == SSH_KEYTYPE_SSH2) - needs_pass = - ssh2_userkey_encrypted(&filename, &comment); + needs_pass = ssh2_userkey_encrypted(filename, &comment); else - needs_pass = import_encrypted(&filename, realtype, - &comment); + needs_pass = import_encrypted(filename, realtype, &comment); pps.passphrase = passphrase; pps.comment = comment; do { @@ -671,18 +669,15 @@ void load_key_file(HWND hwnd, struct MainDlgState *state, *passphrase = '\0'; if (type == SSH_KEYTYPE_SSH1) { if (realtype == type) - ret = loadrsakey(&filename, &newkey1, - passphrase, &errmsg); + ret = loadrsakey(filename, &newkey1, passphrase, &errmsg); else - ret = import_ssh1(&filename, realtype, - &newkey1, passphrase, &errmsg); + ret = import_ssh1(filename, realtype, &newkey1, + passphrase, &errmsg); } else { if (realtype == type) - newkey2 = ssh2_load_userkey(&filename, - passphrase, &errmsg); + newkey2 = ssh2_load_userkey(filename, passphrase, &errmsg); else - newkey2 = import_ssh2(&filename, realtype, - passphrase, &errmsg); + newkey2 = import_ssh2(filename, realtype, passphrase, &errmsg); if (newkey2 == SSH2_WRONG_PASSPHRASE) ret = -1; else if (!newkey2) @@ -800,7 +795,7 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, switch (msg) { case WM_INITDIALOG: - if (help_path) + if (has_help()) SetWindowLongPtr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd, GWL_EXSTYLE) | WS_EX_CONTEXTHELP); @@ -810,7 +805,6 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, * if the help file isn't present. */ } - requested_help = FALSE; SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(200))); @@ -856,7 +850,7 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, menu1 = CreateMenu(); AppendMenu(menu1, MF_ENABLED, IDC_ABOUT, "&About"); - if (help_path) + if (has_help()) AppendMenu(menu1, MF_ENABLED, IDC_GIVEHELP, "&Help"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&Help"); @@ -1036,11 +1030,7 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, case IDC_GIVEHELP: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { - if (help_path) { - WinHelp(hwnd, help_path, HELP_COMMAND, - (DWORD)"JI(`',`puttygen.general')"); - requested_help = TRUE; - } + launch_help(hwnd, WINHELP_CTX_puttygen_general); } return 0; case IDC_GENERATE: @@ -1171,22 +1161,24 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, } if (state->ssh2) { - Filename fn = filename_from_str(filename); + Filename *fn = filename_from_str(filename); if (type != realtype) - ret = export_ssh2(&fn, type, &state->ssh2key, + ret = export_ssh2(fn, type, &state->ssh2key, *passphrase ? passphrase : NULL); else - ret = ssh2_save_userkey(&fn, &state->ssh2key, + ret = ssh2_save_userkey(fn, &state->ssh2key, *passphrase ? passphrase : NULL); + filename_free(fn); } else { - Filename fn = filename_from_str(filename); + Filename *fn = filename_from_str(filename); if (type != realtype) - ret = export_ssh1(&fn, type, &state->key, + ret = export_ssh1(fn, type, &state->key, *passphrase ? passphrase : NULL); else - ret = saversakey(&fn, &state->key, + ret = saversakey(fn, &state->key, *passphrase ? passphrase : NULL); + filename_free(fn); } if (ret <= 0) { MessageBox(hwnd, "Unable to save key file", @@ -1331,7 +1323,7 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, ui_set_state(hwnd, state, 2); break; case WM_HELP: - if (help_path) { + { int id = ((LPHELPINFO)lParam)->iCtrlId; char *topic = NULL; switch (id) { @@ -1339,47 +1331,44 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, case IDC_PROGRESS: case IDC_GENSTATIC: case IDC_GENERATE: - topic = "puttygen.generate"; break; + topic = WINHELP_CTX_puttygen_generate; break; case IDC_PKSTATIC: case IDC_KEYDISPLAY: - topic = "puttygen.pastekey"; break; + topic = WINHELP_CTX_puttygen_pastekey; break; case IDC_FPSTATIC: case IDC_FINGERPRINT: - topic = "puttygen.fingerprint"; break; + topic = WINHELP_CTX_puttygen_fingerprint; break; case IDC_COMMENTSTATIC: case IDC_COMMENTEDIT: - topic = "puttygen.comment"; break; + topic = WINHELP_CTX_puttygen_comment; break; case IDC_PASSPHRASE1STATIC: case IDC_PASSPHRASE1EDIT: case IDC_PASSPHRASE2STATIC: case IDC_PASSPHRASE2EDIT: - topic = "puttygen.passphrase"; break; + topic = WINHELP_CTX_puttygen_passphrase; break; case IDC_LOADSTATIC: case IDC_LOAD: - topic = "puttygen.load"; break; + topic = WINHELP_CTX_puttygen_load; break; case IDC_SAVESTATIC: case IDC_SAVE: - topic = "puttygen.savepriv"; break; + topic = WINHELP_CTX_puttygen_savepriv; break; case IDC_SAVEPUB: - topic = "puttygen.savepub"; break; + topic = WINHELP_CTX_puttygen_savepub; break; case IDC_TYPESTATIC: case IDC_KEYSSH1: case IDC_KEYSSH2RSA: case IDC_KEYSSH2DSA: - topic = "puttygen.keytype"; break; + topic = WINHELP_CTX_puttygen_keytype; break; case IDC_BITSSTATIC: case IDC_BITS: - topic = "puttygen.bits"; break; + topic = WINHELP_CTX_puttygen_bits; break; case IDC_IMPORT: case IDC_EXPORT_OPENSSH: case IDC_EXPORT_SSHCOM: - topic = "puttygen.conversions"; break; + topic = WINHELP_CTX_puttygen_conversions; break; } if (topic) { - char *cmd = dupprintf("JI(`',`%s')", topic); - WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); - sfree(cmd); - requested_help = TRUE; + launch_help(hwnd, topic); } else { MessageBeep(0); } @@ -1388,22 +1377,24 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, case WM_CLOSE: state = (struct MainDlgState *) GetWindowLongPtr(hwnd, GWLP_USERDATA); sfree(state); - if (requested_help) { - WinHelp(hwnd, help_path, HELP_QUIT, 0); - requested_help = FALSE; - } + quit_help(hwnd); EndDialog(hwnd, 1); return 0; } return 0; } -void cleanup_exit(int code) { exit(code); } +void cleanup_exit(int code) +{ + shutdown_help(); + exit(code); +} int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { int argc; char **argv; + int ret; InitCommonControls(); hinst = inst; @@ -1412,22 +1403,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) /* * See if we can find our Help file. */ - { - char b[2048], *p, *q, *r; - FILE *fp; - GetModuleFileName(NULL, b, sizeof(b) - 1); - r = b; - p = strrchr(b, '\\'); - if (p && p >= r) r = p+1; - q = strrchr(b, ':'); - if (q && q >= r) r = q+1; - strcpy(r, PUTTY_HELP_FILE); - if ( (fp = fopen(b, "r")) != NULL) { - help_path = dupstr(b); - fclose(fp); - } else - help_path = NULL; - } + init_help(); split_into_argv(cmdline, &argc, &argv, NULL); @@ -1445,6 +1421,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) } random_ref(); - return DialogBox(hinst, MAKEINTRESOURCE(201), NULL, - MainDlgProc) != IDOK; + ret = DialogBox(hinst, MAKEINTRESOURCE(201), NULL, MainDlgProc) != IDOK; + + cleanup_exit(ret); + return ret; /* just in case optimiser complains */ }