James Hawkins : msi: Fix the INSTALLPROPERTY_LASTUSEDSOURCE case.
Alexandre Julliard
julliard at winehq.org
Mon Feb 25 06:51:18 CST 2008
Module: wine
Branch: master
Commit: 737dedfcbbb736549ba97d8487f7ef024f713240
URL: http://source.winehq.org/git/wine.git/?a=commit;h=737dedfcbbb736549ba97d8487f7ef024f713240
Author: James Hawkins <jhawkins at codeweavers.com>
Date: Sun Feb 24 20:05:04 2008 -0600
msi: Fix the INSTALLPROPERTY_LASTUSEDSOURCE case.
---
dlls/msi/source.c | 60 +++++++++++++++++++++-----------------
dlls/msi/tests/install.c | 9 ++----
dlls/msi/tests/source.c | 71 ++++++++++++++++++++++++++++++++++++++++++----
3 files changed, 101 insertions(+), 39 deletions(-)
diff --git a/dlls/msi/source.c b/dlls/msi/source.c
index 9ae4a65..16e247c 100644
--- a/dlls/msi/source.c
+++ b/dlls/msi/source.c
@@ -353,6 +353,8 @@ UINT WINAPI MsiSourceListGetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid,
{
WCHAR squished_pc[GUID_SIZE];
HKEY sourcekey, media;
+ LPWSTR source, ptr;
+ DWORD size;
UINT rc;
static const WCHAR mediapack[] = {
@@ -400,39 +402,43 @@ UINT WINAPI MsiSourceListGetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid,
RegQueryValueExW(media, szProperty, 0, 0, (LPBYTE)szValue, pcchValue);
RegCloseKey(media);
}
- else if (strcmpW(szProperty, INSTALLPROPERTY_LASTUSEDSOURCEW)==0)
+ else if (!lstrcmpW(szProperty, INSTALLPROPERTY_LASTUSEDSOURCEW))
{
- LPWSTR buffer;
- DWORD size = 0;
+ rc = RegQueryValueExW(sourcekey, INSTALLPROPERTY_LASTUSEDSOURCEW,
+ 0, 0, NULL, &size);
+ if (rc != ERROR_SUCCESS)
+ {
+ RegCloseKey(sourcekey);
+ return ERROR_SUCCESS;
+ }
- RegQueryValueExW(sourcekey, INSTALLPROPERTY_LASTUSEDSOURCEW, 0, 0,
- NULL, &size);
- if (size == 0)
- rc = ERROR_UNKNOWN_PROPERTY;
+ source = msi_alloc(size);
+ RegQueryValueExW(sourcekey, INSTALLPROPERTY_LASTUSEDSOURCEW,
+ 0, 0, (LPBYTE)source, &size);
+
+ if (!*source)
+ {
+ msi_free(source);
+ RegCloseKey(sourcekey);
+ return ERROR_SUCCESS;
+ }
+
+ ptr = strrchrW(source, ';');
+ if (!ptr)
+ ptr = source;
else
+ ptr++;
+
+ if (szValue)
{
- LPWSTR ptr;
- buffer = msi_alloc(size);
- rc = RegQueryValueExW(sourcekey, INSTALLPROPERTY_LASTUSEDSOURCEW,
- 0, 0, (LPBYTE)buffer,&size);
- ptr = strchrW(buffer,';');
- if (ptr) ptr = strchrW(ptr+1,';');
- if (!ptr)
- rc = ERROR_UNKNOWN_PROPERTY;
+ if (lstrlenW(ptr) < *pcchValue)
+ lstrcpyW(szValue, ptr);
else
- {
- ptr ++;
- lstrcpynW(szValue, ptr, *pcchValue);
- if (lstrlenW(ptr) > *pcchValue)
- {
- *pcchValue = lstrlenW(ptr)+1;
- rc = ERROR_MORE_DATA;
- }
- else
- rc = ERROR_SUCCESS;
- }
- msi_free(buffer);
+ rc = ERROR_MORE_DATA;
}
+
+ *pcchValue = lstrlenW(ptr);
+ msi_free(source);
}
else if (strcmpW(INSTALLPROPERTY_LASTUSEDTYPEW, szProperty)==0)
{
diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c
index 963d3d8..b62e625 100644
--- a/dlls/msi/tests/install.c
+++ b/dlls/msi/tests/install.c
@@ -3017,12 +3017,9 @@ static void test_publishsourcelist(void)
lstrcpyA(value, "aaa");
r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size);
- todo_wine
- {
- ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
- ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
- ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size);
- }
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+ ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value);
+ ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size);
size = MAX_PATH;
lstrcpyA(value, "aaa");
diff --git a/dlls/msi/tests/source.c b/dlls/msi/tests/source.c
index 00a869a..76720da 100644
--- a/dlls/msi/tests/source.c
+++ b/dlls/msi/tests/source.c
@@ -373,6 +373,20 @@ static void test_MsiSourceListGetInfo(void)
ok(!lstrcmpA(value, "prompt"), "Expected \"prompt\", got \"%s\"\n", value);
ok(size == 6, "Expected 6, got %d\n", size);
+ data = "";
+ res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ,
+ (const BYTE *)data, lstrlenA(data) + 1);
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+ /* INSTALLPROPERTY_LASTUSEDSOURCE, source is empty */
+ size = MAX_PATH;
+ r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
+ MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE,
+ value, &size);
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+ ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value);
+ ok(size == 0, "Expected 0, got %d\n", size);
+
data = "source";
res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ,
(const BYTE *)data, lstrlenA(data) + 1);
@@ -383,12 +397,57 @@ static void test_MsiSourceListGetInfo(void)
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE,
value, &size);
- todo_wine
- {
- ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
- ok(!lstrcmpA(value, "source"), "Expected \"source\", got \"%s\"\n", value);
- ok(size == 6, "Expected 6, got %d\n", size);
- }
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+ ok(!lstrcmpA(value, "source"), "Expected \"source\", got \"%s\"\n", value);
+ ok(size == 6, "Expected 6, got %d\n", size);
+
+ /* INSTALLPROPERTY_LASTUSEDSOURCE, size is too short */
+ size = 4;
+ lstrcpyA(value, "aaa");
+ r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
+ MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE,
+ value, &size);
+ ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
+ ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got \"%s\"\n", value);
+ ok(size == 6, "Expected 6, got %d\n", size);
+
+ /* INSTALLPROPERTY_LASTUSEDSOURCE, size is exactly 6 */
+ size = 6;
+ lstrcpyA(value, "aaa");
+ r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
+ MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE,
+ value, &size);
+ ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
+ ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got \"%s\"\n", value);
+ ok(size == 6, "Expected 6, got %d\n", size);
+
+ data = "a;source";
+ res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ,
+ (const BYTE *)data, lstrlenA(data) + 1);
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+ /* INSTALLPROPERTY_LASTUSEDSOURCE, one semi-colon */
+ size = MAX_PATH;
+ r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
+ MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE,
+ value, &size);
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+ ok(!lstrcmpA(value, "source"), "Expected \"source\", got \"%s\"\n", value);
+ ok(size == 6, "Expected 6, got %d\n", size);
+
+ data = "a:source";
+ res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ,
+ (const BYTE *)data, lstrlenA(data) + 1);
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+ /* INSTALLPROPERTY_LASTUSEDSOURCE, one colon */
+ size = MAX_PATH;
+ r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
+ MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE,
+ value, &size);
+ ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+ ok(!lstrcmpA(value, "a:source"), "Expected \"a:source\", got \"%s\"\n", value);
+ ok(size == 8, "Expected 8, got %d\n", size);
/* INSTALLPROPERTY_LASTUSEDTYPE, invalid source format */
size = MAX_PATH;
More information about the wine-cvs
mailing list