From 1f94d72310c2f47a04a27205cb5db675f838568d Mon Sep 17 00:00:00 2001 From: Hugh McMaster Date: Mon, 15 Jul 2013 11:32:08 +1000 Subject: Add yes-no dialog --- programs/reg/reg.c | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/programs/reg/reg.c b/programs/reg/reg.c index 1b46661..e0cc613 100644 --- a/programs/reg/reg.c +++ b/programs/reg/reg.c @@ -67,6 +67,28 @@ static int reg_message(int msg) return reg_printfW(formatW, msg_buffer); } +static BOOL ask_yes_no(UINT msg_id) +{ + WCHAR Ybuffer[16]; + WCHAR Nbuffer[16]; + HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE); + WCHAR answer[16] = {'\0'}; + LPDWORD nCharsRead = 0; + + LoadStringW(GetModuleHandleW(NULL), STRING_YES, Ybuffer, sizeof(Ybuffer)/sizeof(WCHAR)); + LoadStringW(GetModuleHandleW(NULL), STRING_NO, Nbuffer, sizeof(Nbuffer)/sizeof(WCHAR)); + + while (TRUE) + { + reg_message(msg_id); + reg_message(STRING_YESNO); + ReadConsoleW(hStdIn, answer, 15, nCharsRead, NULL); + answer[0] = toupperW(answer[0]); + if (answer[0] == Ybuffer[0]) return TRUE; + if (answer[0] == Nbuffer[0]) return FALSE; + } +} + static HKEY get_rootkey(LPWSTR key) { static const WCHAR szHKLM[] = {'H','K','L','M',0}; @@ -170,6 +192,7 @@ static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, ' ','%','s',' ','%','d',' ','%','s',' ','%','s',' ','%','d','\n',0}; LPWSTR p; HKEY root,subkey; + BOOL overwrite = TRUE; reg_printfW(stubW, key_name, value_name, value_empty, type, data, force); @@ -210,7 +233,13 @@ static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, { if (RegQueryValueW(subkey,value_name,NULL,NULL)==ERROR_SUCCESS) { - /* FIXME: Prompt for overwrite */ + overwrite = ask_yes_no(STRING_OVERWRITE_PROMPT); + if (!overwrite) + { + RegCloseKey(subkey); + reg_message(STRING_NO_REG_CHANGE); + return 1; + } } } @@ -240,6 +269,7 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, { LPWSTR p; HKEY root,subkey; + BOOL delete = TRUE; static const WCHAR stubW[] = {'D','E','L','E','T','E', ' ','-',' ','%','s',' ','%','s',' ','%','d',' ','%','d',' ','%','d','\n' @@ -281,7 +311,12 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, if (!force) { - /* FIXME: Prompt for delete */ + delete = ask_yes_no(STRING_DELETE_PROMPT); + if (!delete) + { + reg_message(STRING_NO_REG_CHANGE); + return 1; + } } /* Delete subtree only if no /v* option is given */ @@ -313,7 +348,7 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, &maxValue, NULL, NULL, NULL); if (rc != ERROR_SUCCESS) { - /* FIXME: failure */ + reg_message(STRING_CANNOT_FIND); RegCloseKey(subkey); return 1; } @@ -334,7 +369,9 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, } if (rc != ERROR_SUCCESS) { - /* FIXME delete failed */ + RegCloseKey(subkey); + reg_message(STRING_DELETE_FAILED); + return 1; } } else if (value_name) -- 1.7.10.4