Hans Leidekker : msi: Set or override a user environment string when there is no prefix.
Alexandre Julliard
julliard at winehq.org
Wed Sep 16 15:59:35 CDT 2009
Module: wine
Branch: master
Commit: 659768e2035d9b721e9c2233b8fc3f862904a7ab
URL: http://source.winehq.org/git/wine.git/?a=commit;h=659768e2035d9b721e9c2233b8fc3f862904a7ab
Author: Hans Leidekker <hans at codeweavers.com>
Date: Tue Sep 15 20:52:39 2009 +0200
msi: Set or override a user environment string when there is no prefix.
---
dlls/msi/action.c | 8 +++-
dlls/msi/tests/install.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 98 insertions(+), 2 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 6bff87a..8f004b3 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -5313,8 +5313,7 @@ static LONG env_set_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags )
}
}
- if (!*flags ||
- check_flag_combo(*flags, ENV_ACT_SETALWAYS | ENV_ACT_SETABSENT) ||
+ if (check_flag_combo(*flags, ENV_ACT_SETALWAYS | ENV_ACT_SETABSENT) ||
check_flag_combo(*flags, ENV_ACT_REMOVEMATCH | ENV_ACT_SETABSENT) ||
check_flag_combo(*flags, ENV_ACT_REMOVEMATCH | ENV_ACT_SETALWAYS) ||
check_flag_combo(*flags, ENV_ACT_SETABSENT | ENV_MOD_MASK))
@@ -5323,6 +5322,9 @@ static LONG env_set_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags )
return ERROR_FUNCTION_FAILED;
}
+ if (!*flags)
+ *flags = ENV_ACT_SETALWAYS | ENV_ACT_REMOVE;
+
return ERROR_SUCCESS;
}
@@ -5350,6 +5352,8 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param )
name = MSI_RecordGetString(rec, 2);
value = MSI_RecordGetString(rec, 3);
+ TRACE("name %s value %s\n", debugstr_w(name), debugstr_w(value));
+
res = env_set_flags(&name, &value, &flags);
if (res != ERROR_SUCCESS)
goto done;
diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c
index b78e3dc..1e55c81 100644
--- a/dlls/msi/tests/install.c
+++ b/dlls/msi/tests/install.c
@@ -124,6 +124,7 @@ static const CHAR install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
"MoveFiles\t\t1700\n"
"InstallFiles\t\t4000\n"
"DuplicateFiles\t\t4500\n"
+ "WriteEnvironmentStrings\t\t4550\n"
"CreateShortcuts\t\t4600\n"
"InstallServices\t\t5000\n"
"InstallFinalize\t\t6600\n"
@@ -165,6 +166,15 @@ static const CHAR shortcut_dat[] = "Shortcut\tDirectory_\tName\tComponent_\tTarg
"Shortcut\tShortcut\n"
"Shortcut\tMSITESTDIR\tShortcut\tcomponent\tShortcut\t\tShortcut\t\t\t\t\t\n";
+static const CHAR environment_dat[] = "Environment\tName\tValue\tComponent_\n"
+ "s72\tl255\tL255\ts72\n"
+ "Environment\tEnvironment\n"
+ "Var1\t=-MSITESTVAR1\t1\tOne\n"
+ "Var2\tMSITESTVAR2\t1\tOne\n"
+ "Var3\t=-MSITESTVAR3\t1\tOne\n"
+ "Var4\tMSITESTVAR4\t1\tOne\n";
+
+
static const CHAR up_property_dat[] = "Property\tValue\n"
"s72\tl0\n"
"Property\tProperty\n"
@@ -904,6 +914,19 @@ static const msi_table sc_tables[] =
ADD_TABLE(shortcut)
};
+static const msi_table env_tables[] =
+{
+ ADD_TABLE(component),
+ ADD_TABLE(directory),
+ ADD_TABLE(feature),
+ ADD_TABLE(feature_comp),
+ ADD_TABLE(file),
+ ADD_TABLE(install_exec_seq),
+ ADD_TABLE(media),
+ ADD_TABLE(property),
+ ADD_TABLE(environment)
+};
+
static const msi_table up_tables[] =
{
ADD_TABLE(component),
@@ -6240,6 +6263,74 @@ static void test_shortcut(void)
delete_test_files();
}
+static void test_envvar(void)
+{
+ UINT r;
+ HKEY env;
+ LONG res;
+ DWORD type, size;
+ char buffer[16];
+
+ create_test_files();
+ create_database(msifile, env_tables, sizeof(env_tables) / sizeof(msi_table));
+
+ res = RegCreateKeyExA(HKEY_CURRENT_USER, "Environment", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &env, NULL);
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+ res = RegSetValueExA(env, "MSITESTVAR1", 0, REG_SZ, (const BYTE *)"0", 2);
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+ res = RegSetValueExA(env, "MSITESTVAR2", 0, REG_SZ, (const BYTE *)"0", 2);
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+ r = MsiInstallProductA(msifile, NULL);
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+
+ type = REG_NONE;
+ size = sizeof(buffer);
+ buffer[0] = 0;
+ res = RegQueryValueExA(env, "MSITESTVAR1", NULL, &type, (LPBYTE)buffer, &size);
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+ ok(type == REG_SZ, "Expected REG_SZ, got %u\n", type);
+ ok(!lstrcmp(buffer, "1"), "Expected \"1\", got %s\n", buffer);
+
+ res = RegDeleteValueA(env, "MSITESTVAR1");
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+ type = REG_NONE;
+ size = sizeof(buffer);
+ buffer[0] = 0;
+ res = RegQueryValueExA(env, "MSITESTVAR2", NULL, &type, (LPBYTE)buffer, &size);
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+ ok(type == REG_SZ, "Expected REG_SZ, got %u\n", type);
+ ok(!lstrcmp(buffer, "1"), "Expected \"1\", got %s\n", buffer);
+
+ res = RegDeleteValueA(env, "MSITESTVAR2");
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+ res = RegDeleteValueA(env, "MSITESTVAR3");
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+ res = RegDeleteValueA(env, "MSITESTVAR4");
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+ RegCloseKey(env);
+
+ delete_pf("msitest\\cabout\\new\\five.txt", TRUE);
+ delete_pf("msitest\\cabout\\new", FALSE);
+ delete_pf("msitest\\cabout\\four.txt", TRUE);
+ delete_pf("msitest\\cabout", FALSE);
+ delete_pf("msitest\\changed\\three.txt", TRUE);
+ delete_pf("msitest\\changed", FALSE);
+ delete_pf("msitest\\first\\two.txt", TRUE);
+ delete_pf("msitest\\first", FALSE);
+ delete_pf("msitest\\filename", TRUE);
+ delete_pf("msitest\\one.txt", TRUE);
+ delete_pf("msitest\\service.exe", TRUE);
+ delete_pf("msitest", FALSE);
+ delete_test_files();
+}
+
START_TEST(install)
{
DWORD len;
@@ -6322,6 +6413,7 @@ START_TEST(install)
test_propcase();
test_int_widths();
test_shortcut();
+ test_envvar();
DeleteFileA(log_file);
More information about the wine-cvs
mailing list