msi: Handle the remote case directly in MsiGetSourcePathA().

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2018-05-17 10:48:18 -05:00 committed by Alexandre Julliard
parent ce3fc1af55
commit 43ce218a48
2 changed files with 42 additions and 14 deletions

View File

@ -421,22 +421,50 @@ static UINT MSI_GetSourcePath( MSIHANDLE hInstall, LPCWSTR szFolder,
/***********************************************************************
* MsiGetSourcePathA (MSI.@)
*/
UINT WINAPI MsiGetSourcePathA( MSIHANDLE hInstall, LPCSTR szFolder,
LPSTR szPathBuf, LPDWORD pcchPathBuf )
UINT WINAPI MsiGetSourcePathA(MSIHANDLE hinst, const char *folder, char *buf, DWORD *sz)
{
LPWSTR folder;
awstring str;
MSIPACKAGE *package;
const WCHAR *path;
WCHAR *folderW;
UINT r;
TRACE("%s %p %p\n", debugstr_a(szFolder), szPathBuf, pcchPathBuf);
TRACE("%s %p %p\n", debugstr_a(folder), buf, sz);
str.unicode = FALSE;
str.str.a = szPathBuf;
if (!folder)
return ERROR_INVALID_PARAMETER;
folder = strdupAtoW( szFolder );
r = MSI_GetSourcePath( hInstall, folder, &str, pcchPathBuf );
msi_free( folder );
if (!(folderW = strdupAtoW(folder)))
return ERROR_OUTOFMEMORY;
package = msihandle2msiinfo(hinst, MSIHANDLETYPE_PACKAGE);
if (!package)
{
WCHAR *path = NULL;
MSIHANDLE remote;
if (!(remote = msi_get_remote(hinst)))
{
heap_free(folderW);
return ERROR_INVALID_HANDLE;
}
r = remote_GetSourcePath(remote, folderW, &path);
if (!r)
r = msi_strncpyWtoA(path, -1, buf, sz, TRUE);
midl_user_free(path);
heap_free(folderW);
return r;
}
path = msi_resolve_source_folder(package, folderW, NULL);
if (path)
r = msi_strncpyWtoA(path, -1, buf, sz, FALSE);
else
r = ERROR_DIRECTORY;
heap_free(folderW);
msiobj_release(&package->hdr);
return r;
}

View File

@ -584,28 +584,28 @@ static void test_targetpath(MSIHANDLE hinst)
sz = 0;
r = MsiGetSourcePathA(hinst, "TARGETDIR", NULL, &sz);
ok(hinst, !r, "got %u\n", r);
todo_wine_ok(hinst, sz == srcsz * 2, "got size %u\n", sz);
ok(hinst, sz == srcsz * 2, "got size %u\n", sz);
sz = 0;
strcpy(buffer,"q");
r = MsiGetSourcePathA(hinst, "TARGETDIR", buffer, &sz);
ok(hinst, r == ERROR_MORE_DATA, "got %u\n", r);
ok(hinst, !strcmp(buffer, "q"), "got \"%s\"\n", buffer);
todo_wine_ok(hinst, sz == srcsz * 2, "got size %u\n", sz);
ok(hinst, sz == srcsz * 2, "got size %u\n", sz);
sz = 1;
strcpy(buffer,"x");
r = MsiGetSourcePathA(hinst, "TARGETDIR", buffer, &sz);
ok(hinst, r == ERROR_MORE_DATA, "got %u\n", r);
ok(hinst, !buffer[0], "got \"%s\"\n", buffer);
todo_wine_ok(hinst, sz == srcsz * 2, "got size %u\n", sz);
ok(hinst, sz == srcsz * 2, "got size %u\n", sz);
sz = srcsz;
strcpy(buffer,"x");
r = MsiGetSourcePathA(hinst, "TARGETDIR", buffer, &sz);
ok(hinst, r == ERROR_MORE_DATA, "got %u\n", r);
ok(hinst, strlen(buffer) == srcsz - 1, "wrong buffer length %d\n", strlen(buffer));
todo_wine_ok(hinst, sz == srcsz * 2, "got size %u\n", sz);
ok(hinst, sz == srcsz * 2, "got size %u\n", sz);
sz = srcsz + 1;
strcpy(buffer,"x");