Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/msi/install.c | 45 +++++++++++++++++++++++++++++++++------------ dlls/msi/tests/custom.c | 8 ++++---- 2 files changed, 37 insertions(+), 16 deletions(-)
diff --git a/dlls/msi/install.c b/dlls/msi/install.c index b54daff..9677be5 100644 --- a/dlls/msi/install.c +++ b/dlls/msi/install.c @@ -271,26 +271,47 @@ static UINT MSI_GetTargetPath( MSIHANDLE hInstall, LPCWSTR szFolder, /*********************************************************************** * MsiGetTargetPathA (MSI.@) */ -UINT WINAPI MsiGetTargetPathA( MSIHANDLE hInstall, LPCSTR szFolder, - LPSTR szPathBuf, LPDWORD pcchPathBuf ) +UINT WINAPI MsiGetTargetPathA(MSIHANDLE hinst, const char *folder, char *buf, DWORD *sz) { - LPWSTR szwFolder; - awstring path; + 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);
- szwFolder = strdupAtoW(szFolder); - if (szFolder && !szwFolder) - return ERROR_FUNCTION_FAILED; + if (!folder) + return ERROR_INVALID_PARAMETER;
- path.unicode = FALSE; - path.str.a = szPathBuf; + if (!(folderW = strdupAtoW(folder))) + return ERROR_OUTOFMEMORY;
- r = MSI_GetTargetPath( hInstall, szwFolder, &path, pcchPathBuf ); + package = msihandle2msiinfo(hinst, MSIHANDLETYPE_PACKAGE); + if (!package) + { + WCHAR *path = NULL; + MSIHANDLE remote;
- msi_free( szwFolder ); + if (!(remote = msi_get_remote(hinst))) + return ERROR_INVALID_HANDLE;
+ r = remote_GetTargetPath(remote, folderW, &path); + if (!r) + r = msi_strncpyWtoA(path, -1, buf, sz, TRUE); + + midl_user_free(path); + heap_free(folderW); + return r; + } + + path = msi_get_target_folder(package, folderW); + if (path) + r = msi_strncpyWtoA(path, -1, buf, sz, FALSE); + else + r = ERROR_DIRECTORY; + + heap_free(folderW); + msiobj_release(&package->hdr); return r; }
diff --git a/dlls/msi/tests/custom.c b/dlls/msi/tests/custom.c index d240964..4e42eed 100644 --- a/dlls/msi/tests/custom.c +++ b/dlls/msi/tests/custom.c @@ -485,28 +485,28 @@ static void test_targetpath(MSIHANDLE hinst) sz = 0; r = MsiGetTargetPathA(hinst, "TARGETDIR", NULL, &sz); ok(hinst, !r, "got %u\n", r); - todo_wine_ok(hinst, sz == 6, "got size %u\n", sz); + ok(hinst, sz == 6, "got size %u\n", sz);
sz = 0; strcpy(buffer,"q"); r = MsiGetTargetPathA(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 == 6, "got size %u\n", sz); + ok(hinst, sz == 6, "got size %u\n", sz);
sz = 1; strcpy(buffer,"x"); r = MsiGetTargetPathA(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 == 6, "got size %u\n", sz); + ok(hinst, sz == 6, "got size %u\n", sz);
sz = 3; strcpy(buffer,"x"); r = MsiGetTargetPathA(hinst, "TARGETDIR", buffer, &sz); ok(hinst, r == ERROR_MORE_DATA, "got %u\n", r); ok(hinst, !strcmp(buffer, "C:"), "got "%s"\n", buffer); - todo_wine_ok(hinst, sz == 6, "got size %u\n", sz); + ok(hinst, sz == 6, "got size %u\n", sz);
sz = 4; strcpy(buffer,"x");