Module: wine Branch: master Commit: a248f4f001bab6c0885343259ef6861f6d6dcd7f URL: http://source.winehq.org/git/wine.git/?a=commit;h=a248f4f001bab6c0885343259e...
Author: Hans Leidekker hans@codeweavers.com Date: Mon Jan 21 16:24:11 2013 +0100
msi: Set the OriginalDatabase property after applying transforms, not before.
---
dlls/msi/action.c | 1 + dlls/msi/msipriv.h | 1 + dlls/msi/package.c | 39 ++++++++++++++++++++++++++++----------- dlls/msi/tests/package.c | 2 +- 4 files changed, 31 insertions(+), 12 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c index 22fa388..5abe040 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -7790,6 +7790,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
/* properties may have been added by a transform */ msi_clone_properties( package ); + msi_set_original_database_property( package->db, szPackagePath );
msi_parse_command_line( package, szCommandLine, FALSE ); msi_adjust_privilege_properties( package ); diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index a3e1e0d..f709bac 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -1041,6 +1041,7 @@ extern BOOL msi_init_assembly_caches(MSIPACKAGE *) DECLSPEC_HIDDEN; extern void msi_destroy_assembly_caches(MSIPACKAGE *) DECLSPEC_HIDDEN; extern WCHAR *msi_font_version_from_file(const WCHAR *) DECLSPEC_HIDDEN; extern WCHAR **msi_split_string(const WCHAR *, WCHAR) DECLSPEC_HIDDEN; +extern UINT msi_set_original_database_property(MSIDATABASE *, const WCHAR *) DECLSPEC_HIDDEN;
/* media */
diff --git a/dlls/msi/package.c b/dlls/msi/package.c index 3055175..f8f818d 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -1510,6 +1510,28 @@ static UINT get_local_package( const WCHAR *filename, WCHAR *localfile ) return r; }
+UINT msi_set_original_database_property( MSIDATABASE *db, const WCHAR *package ) +{ + UINT r; + + if (UrlIsW( package, URLIS_URL )) + r = msi_set_property( db, szOriginalDatabase, package, -1 ); + else if (package[0] == '#') + r = msi_set_property( db, szOriginalDatabase, db->path, -1 ); + else + { + DWORD len; + WCHAR *path; + + if (!(len = GetFullPathNameW( package, 0, NULL, NULL ))) return GetLastError(); + if (!(path = msi_alloc( len * sizeof(WCHAR) ))) return ERROR_OUTOFMEMORY; + len = GetFullPathNameW( package, len, path, NULL ); + r = msi_set_property( db, szOriginalDatabase, path, len ); + msi_free( path ); + } + return r; +} + UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) { static const WCHAR dotmsi[] = {'.','m','s','i',0}; @@ -1619,17 +1641,6 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) return r; } msi_set_property( package->db, szDatabase, db->path, -1 ); - - if( UrlIsW( szPackage, URLIS_URL ) ) - msi_set_property( package->db, szOriginalDatabase, szPackage, -1 ); - else if( szPackage[0] == '#' ) - msi_set_property( package->db, szOriginalDatabase, db->path, -1 ); - else - { - WCHAR fullpath[MAX_PATH]; - DWORD len = GetFullPathNameW( szPackage, MAX_PATH, fullpath, NULL ); - msi_set_property( package->db, szOriginalDatabase, fullpath, len ); - } msi_set_context( package );
while (1) @@ -1656,6 +1667,12 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) msi_clone_properties( package ); msi_adjust_privilege_properties( package ); } + r = msi_set_original_database_property( package->db, szPackage ); + if (r != ERROR_SUCCESS) + { + msiobj_release( &package->hdr ); + return r; + } if (gszLogFile) package->log_file = CreateFileW( gszLogFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c index 4bac512..13a07e6 100644 --- a/dlls/msi/tests/package.c +++ b/dlls/msi/tests/package.c @@ -2250,7 +2250,7 @@ static void test_property_table(void)
sprintf(package, "#%i", hdb); r = MsiOpenPackage(package, &hpkg); - todo_wine ok(r != ERROR_SUCCESS, "MsiOpenPackage succeeded\n"); + ok(r != ERROR_SUCCESS, "MsiOpenPackage succeeded\n"); if (r == ERROR_SUCCESS) MsiCloseHandle(hpkg);