return ERROR_SUCCESS;
}
-static UINT msi_get_local_package_name( LPWSTR path )
-{
- static const WCHAR szInstaller[] = {
- '\\','I','n','s','t','a','l','l','e','r','\\',0};
- static const WCHAR fmt[] = { '%','x','.','m','s','i',0};
- DWORD time, len, i;
- HANDLE handle;
-
- time = GetTickCount();
- GetWindowsDirectoryW( path, MAX_PATH );
- lstrcatW( path, szInstaller );
- CreateDirectoryW( path, NULL );
-
- len = lstrlenW(path);
- for (i=0; i<0x10000; i++)
- {
- snprintfW( &path[len], MAX_PATH - len, fmt, (time+i)&0xffff );
- handle = CreateFileW( path, GENERIC_WRITE, 0, NULL,
- CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0 );
- if (handle != INVALID_HANDLE_VALUE)
- {
- CloseHandle(handle);
- break;
- }
- if (GetLastError() != ERROR_FILE_EXISTS &&
- GetLastError() != ERROR_SHARING_VIOLATION)
- return ERROR_FUNCTION_FAILED;
- }
-
- return ERROR_SUCCESS;
-}
-
-static UINT msi_make_package_local( MSIPACKAGE *package, HKEY hkey )
-{
- WCHAR packagefile[MAX_PATH];
- UINT r;
-
- r = msi_get_local_package_name( packagefile );
- if (r != ERROR_SUCCESS)
- return r;
-
- TRACE("Copying to local package %s\n",debugstr_w(packagefile));
-
- r = CopyFileW( package->db->path, packagefile, FALSE);
-
- if (!r)
- {
- ERR("Unable to copy package (%s -> %s) (error %d)\n",
- debugstr_w(package->db->path), debugstr_w(packagefile), GetLastError());
- return ERROR_FUNCTION_FAILED;
- }
-
- msi_reg_set_val_str( hkey, INSTALLPROPERTY_LOCALPACKAGEW, packagefile );
-
- return ERROR_SUCCESS;
-}
-
static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey)
{
LPWSTR prop, val, key;
if (rc != ERROR_SUCCESS)
goto done;
- msi_make_package_local(package, props);
+ msi_reg_set_val_str( props, INSTALLPROPERTY_LOCALPACKAGEW, package->db->localfile );
+ msi_free( package->db->localfile );
+ package->db->localfile = NULL;
rc = msi_publish_install_properties(package, hkey);
if (rc != ERROR_SUCCESS)
DeleteFileW( db->deletefile );
msi_free( db->deletefile );
}
+ if (db->localfile)
+ {
+ DeleteFileW( db->localfile );
+ msi_free( db->localfile );
+ }
}
UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
UINT bytes_per_strref;
LPWSTR path;
LPWSTR deletefile;
+ LPWSTR localfile;
LPCWSTR mode;
struct list tables;
struct list transforms;
return filename;
}
+static UINT msi_get_local_package_name( LPWSTR path )
+{
+ static const WCHAR szInstaller[] = {
+ '\\','I','n','s','t','a','l','l','e','r','\\',0};
+ static const WCHAR fmt[] = { '%','x','.','m','s','i',0};
+ DWORD time, len, i;
+ HANDLE handle;
+
+ time = GetTickCount();
+ GetWindowsDirectoryW( path, MAX_PATH );
+ strcatW( path, szInstaller );
+ CreateDirectoryW( path, NULL );
+
+ len = strlenW(path);
+ for (i = 0; i < 0x10000; i++)
+ {
+ snprintfW( &path[len], MAX_PATH - len, fmt, (time + i)&0xffff );
+ handle = CreateFileW( path, GENERIC_WRITE, 0, NULL,
+ CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0 );
+ if (handle != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(handle);
+ break;
+ }
+ if (GetLastError() != ERROR_FILE_EXISTS &&
+ GetLastError() != ERROR_SHARING_VIOLATION)
+ return ERROR_FUNCTION_FAILED;
+ }
+
+ return ERROR_SUCCESS;
+}
+
UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
{
static const WCHAR OriginalDatabase[] =
MSIHANDLE handle;
LPWSTR ptr, base_url = NULL;
UINT r;
- WCHAR temppath[MAX_PATH];
+ WCHAR temppath[MAX_PATH], localfile[MAX_PATH];
LPCWSTR file = szPackage;
TRACE("%s %p\n", debugstr_w(szPackage), pPackage);
else
file = copy_package_to_temp( szPackage, temppath );
+ r = msi_get_local_package_name( localfile );
+ if (r != ERROR_SUCCESS)
+ return r;
+
+ TRACE("Copying to local package %s\n", debugstr_w(localfile));
+
+ if (!CopyFileW( file, localfile, FALSE ))
+ {
+ ERR("Unable to copy package (%s -> %s) (error %u)\n",
+ debugstr_w(file), debugstr_w(localfile), GetLastError());
+ return GetLastError();
+ }
+
r = MSI_OpenDatabaseW( file, MSIDBOPEN_READONLY, &db );
if( r != ERROR_SUCCESS )
{
return r;
}
+
+ db->localfile = strdupW( localfile );
}
package = MSI_CreatePackage( db, base_url );