reg: Delete registry keys via the state machine.

Signed-off-by: Hugh McMaster <hugh.mcmaster@outlook.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Hugh McMaster 2017-08-18 09:31:17 +00:00 committed by Alexandre Julliard
parent d90f2a55bf
commit 56e58e47af
2 changed files with 43 additions and 20 deletions

View File

@ -66,6 +66,7 @@ enum parser_state
PARSE_WIN31_LINE, /* parsing a Windows 3.1 registry line */
LINE_START, /* at the beginning of a registry line */
KEY_NAME, /* parsing a key name */
DELETE_KEY, /* deleting a registry key */
DEFAULT_VALUE_NAME, /* parsing a default value name */
QUOTED_VALUE_NAME, /* parsing a double-quoted value name */
DATA_START, /* preparing for data parsing operations */
@ -105,6 +106,7 @@ static WCHAR *header_state(struct parser *parser, WCHAR *pos);
static WCHAR *parse_win31_line_state(struct parser *parser, WCHAR *pos);
static WCHAR *line_start_state(struct parser *parser, WCHAR *pos);
static WCHAR *key_name_state(struct parser *parser, WCHAR *pos);
static WCHAR *delete_key_state(struct parser *parser, WCHAR *pos);
static WCHAR *default_value_name_state(struct parser *parser, WCHAR *pos);
static WCHAR *quoted_value_name_state(struct parser *parser, WCHAR *pos);
static WCHAR *data_start_state(struct parser *parser, WCHAR *pos);
@ -124,6 +126,7 @@ static const parser_state_func parser_funcs[NB_PARSER_STATES] =
parse_win31_line_state, /* PARSE_WIN31_LINE */
line_start_state, /* LINE_START */
key_name_state, /* KEY_NAME */
delete_key_state, /* DELETE_KEY */
default_value_name_state, /* DEFAULT_VALUE_NAME */
quoted_value_name_state, /* QUOTED_VALUE_NAME */
data_start_state, /* DATA_START */
@ -581,8 +584,8 @@ static WCHAR *key_name_state(struct parser *parser, WCHAR *pos)
if (*p == '-')
{
FIXME("key deletion not yet implemented\n");
goto done;
set_state(parser, DELETE_KEY);
return p + 1;
}
else if (open_key(parser, p) != ERROR_SUCCESS)
output_message(STRING_OPEN_KEY_FAILED, p);
@ -592,6 +595,26 @@ done:
return p;
}
/* handler for parser DELETE_KEY state */
static WCHAR *delete_key_state(struct parser *parser, WCHAR *pos)
{
WCHAR *p = pos;
if (*p == 'H' || *p == 'h')
{
HKEY root;
WCHAR *path;
root = parse_key_name(p, &path);
if (root && path && *path)
RegDeleteTreeW(root, path);
}
set_state(parser, LINE_START);
return p;
}
/* handler for parser DEFAULT_VALUE_NAME state */
static WCHAR *default_value_name_state(struct parser *parser, WCHAR *pos)
{

View File

@ -1713,8 +1713,8 @@ static void test_import(void)
"[-HKEY_CURRENT_USER\\" KEY_BASE "\\Subkey2a]\n\n"
"[-HKEY_CURRENT_USER\\" KEY_BASE "\\Subkey2b]\n\n", &r);
todo_wine ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
todo_wine verify_key_nonexist(hkey, "Subkey2a");
todo_wine verify_key_nonexist(hkey, "Subkey2b");
verify_key_nonexist(hkey, "Subkey2a");
verify_key_nonexist(hkey, "Subkey2b");
/* Test case sensitivity when creating and deleting registry keys. */
test_import_str("REGEDIT4\n\n"
@ -1728,8 +1728,8 @@ static void test_import(void)
"[-HKEY_current_USER\\" KEY_BASE "\\sUBKEY3A]\n\n"
"[-hKeY_cUrReNt_UsEr\\" KEY_BASE "\\sUbKeY3B]\n\n", &r);
todo_wine ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
todo_wine verify_key_nonexist(hkey, "Subkey3a");
todo_wine verify_key_nonexist(hkey, "Subkey3b");
verify_key_nonexist(hkey, "Subkey3a");
verify_key_nonexist(hkey, "Subkey3b");
/* Test value deletion. We start by creating some registry values. */
test_import_str("REGEDIT4\n\n"
@ -2278,7 +2278,7 @@ static void test_import(void)
ok(err == ERROR_SUCCESS, "got %d, expected 0\n", err);
err = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
todo_wine ok(err == ERROR_SUCCESS, "got %d, expected 0\n", err);
ok(err == ERROR_SUCCESS, "got %d, expected 0\n", err);
}
static void test_unicode_import(void)
@ -2330,39 +2330,39 @@ static void test_unicode_import(void)
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Test1\"=\"Value\"\n", &r);
ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
todo_wine verify_reg_nonexist(hkey, "Test1");
verify_reg_nonexist(hkey, "Test1");
test_import_wstr("\xef\xbb\xbfregedit4\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Test2\"=\"Value\"\n", &r);
ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS) /* WinXP */,
"got exit code %d, expected 1\n", r);
todo_wine verify_reg_nonexist(hkey, "Test2");
verify_reg_nonexist(hkey, "Test2");
test_import_wstr("\xef\xbb\xbfRegedit4\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Test3\"=\"Value\"\n", &r);
ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS) /* WinXP */,
"got exit code %d, expected 1\n", r);
todo_wine verify_reg_nonexist(hkey, "Test3");
verify_reg_nonexist(hkey, "Test3");
test_import_wstr("\xef\xbb\xbfREGEDIT 4\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Test4\"=\"Value\"\n", &r);
ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
todo_wine verify_reg_nonexist(hkey, "Test4");
verify_reg_nonexist(hkey, "Test4");
test_import_wstr("\xef\xbb\xbfREGEDIT4FOO\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Test5\"=\"Value\"\n", &r);
ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
todo_wine verify_reg_nonexist(hkey, "Test5");
verify_reg_nonexist(hkey, "Test5");
test_import_wstr("\xef\xbb\xbfREGEDIT4 FOO\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Test6\"=\"Value\"\n", &r);
ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
todo_wine verify_reg_nonexist(hkey, "Test6");
verify_reg_nonexist(hkey, "Test6");
test_import_wstr("\xef\xbb\xbfREGEDIT5\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
@ -3169,8 +3169,8 @@ static void test_unicode_import(void)
"[-HKEY_CURRENT_USER\\" KEY_BASE "\\Subkey2a]\n\n"
"[-HKEY_CURRENT_USER\\" KEY_BASE "\\Subkey2b]\n\n", &r);
todo_wine ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
todo_wine verify_key_nonexist(hkey, "Subkey2a");
todo_wine verify_key_nonexist(hkey, "Subkey2b");
verify_key_nonexist(hkey, "Subkey2a");
verify_key_nonexist(hkey, "Subkey2b");
/* Test case sensitivity when creating and deleting registry keys. */
test_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
@ -3184,8 +3184,8 @@ static void test_unicode_import(void)
"[-HKEY_current_USER\\" KEY_BASE "\\sUBKEY3A]\n\n"
"[-hKeY_cUrReNt_UsEr\\" KEY_BASE "\\sUbKeY3B]\n\n", &r);
todo_wine ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
todo_wine verify_key_nonexist(hkey, "Subkey3a");
todo_wine verify_key_nonexist(hkey, "Subkey3b");
verify_key_nonexist(hkey, "Subkey3a");
verify_key_nonexist(hkey, "Subkey3b");
/* Test value deletion. We start by creating some registry values. */
test_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
@ -3744,7 +3744,7 @@ static void test_unicode_import(void)
ok(err == ERROR_SUCCESS, "got %d, expected 0\n", err);
err = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
todo_wine ok(err == ERROR_SUCCESS, "got %d, expected 0\n", err);
ok(err == ERROR_SUCCESS, "got %d, expected 0\n", err);
}
static void test_import_with_whitespace(void)
@ -3891,7 +3891,7 @@ static void test_import_with_whitespace(void)
ok(err == ERROR_SUCCESS, "RegCloseKey failed: got %d, expected 0\n", err);
err = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
todo_wine ok(err == ERROR_SUCCESS, "RegDeleteKeyA failed: got %d, expected 0\n", err);
ok(err == ERROR_SUCCESS, "RegDeleteKeyA failed: got %d, expected 0\n", err);
}
static void test_unicode_import_with_whitespace(void)
@ -4038,7 +4038,7 @@ static void test_unicode_import_with_whitespace(void)
ok(err == ERROR_SUCCESS, "RegCloseKey failed: got %d, expected 0\n", err);
err = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
todo_wine ok(err == ERROR_SUCCESS, "RegDeleteKeyA failed: got %d, expected 0\n", err);
ok(err == ERROR_SUCCESS, "RegDeleteKeyA failed: got %d, expected 0\n", err);
}
static void test_import_31(void)