msi: Use a separate function to retrieve the target folder path.
This commit is contained in:
parent
0d0074d56b
commit
8fb5368d4e
|
@ -1424,8 +1424,7 @@ static BOOL ACTION_HandleCustomAction( MSIPACKAGE* package, LPCWSTR action,
|
||||||
static UINT ITERATE_CreateFolders(MSIRECORD *row, LPVOID param)
|
static UINT ITERATE_CreateFolders(MSIRECORD *row, LPVOID param)
|
||||||
{
|
{
|
||||||
MSIPACKAGE *package = param;
|
MSIPACKAGE *package = param;
|
||||||
LPCWSTR dir, component;
|
LPCWSTR dir, component, full_path;
|
||||||
LPWSTR full_path;
|
|
||||||
MSIRECORD *uirow;
|
MSIRECORD *uirow;
|
||||||
MSIFOLDER *folder;
|
MSIFOLDER *folder;
|
||||||
MSICOMPONENT *comp;
|
MSICOMPONENT *comp;
|
||||||
|
@ -1464,21 +1463,19 @@ static UINT ITERATE_CreateFolders(MSIRECORD *row, LPVOID param)
|
||||||
ui_actiondata(package, szCreateFolders, uirow);
|
ui_actiondata(package, szCreateFolders, uirow);
|
||||||
msiobj_release(&uirow->hdr);
|
msiobj_release(&uirow->hdr);
|
||||||
|
|
||||||
full_path = resolve_target_folder( package, dir, FALSE, TRUE, &folder );
|
full_path = msi_get_target_folder( package, dir );
|
||||||
if (!full_path)
|
if (!full_path)
|
||||||
{
|
{
|
||||||
ERR("Unable to resolve folder id %s\n",debugstr_w(dir));
|
ERR("Unable to retrieve folder %s\n", debugstr_w(dir));
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
TRACE("folder is %s\n", debugstr_w(full_path));
|
||||||
|
|
||||||
TRACE("Folder is %s\n",debugstr_w(full_path));
|
folder = get_loaded_folder( package, dir );
|
||||||
|
|
||||||
if (folder->State == 0)
|
if (folder->State == 0)
|
||||||
create_full_pathW(full_path);
|
create_full_pathW(full_path);
|
||||||
|
|
||||||
folder->State = 3;
|
folder->State = 3;
|
||||||
|
|
||||||
msi_free(full_path);
|
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1504,8 +1501,7 @@ static UINT ACTION_CreateFolders(MSIPACKAGE *package)
|
||||||
static UINT ITERATE_RemoveFolders( MSIRECORD *row, LPVOID param )
|
static UINT ITERATE_RemoveFolders( MSIRECORD *row, LPVOID param )
|
||||||
{
|
{
|
||||||
MSIPACKAGE *package = param;
|
MSIPACKAGE *package = param;
|
||||||
LPCWSTR dir, component;
|
LPCWSTR dir, component, full_path;
|
||||||
LPWSTR full_path;
|
|
||||||
MSIRECORD *uirow;
|
MSIRECORD *uirow;
|
||||||
MSIFOLDER *folder;
|
MSIFOLDER *folder;
|
||||||
MSICOMPONENT *comp;
|
MSICOMPONENT *comp;
|
||||||
|
@ -1539,13 +1535,12 @@ static UINT ITERATE_RemoveFolders( MSIRECORD *row, LPVOID param )
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
full_path = resolve_target_folder( package, dir, FALSE, TRUE, &folder );
|
full_path = msi_get_target_folder( package, dir );
|
||||||
if (!full_path)
|
if (!full_path)
|
||||||
{
|
{
|
||||||
ERR("Unable to resolve folder id %s\n", debugstr_w(dir));
|
ERR("Unable to resolve folder %s\n", debugstr_w(dir));
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("folder is %s\n", debugstr_w(full_path));
|
TRACE("folder is %s\n", debugstr_w(full_path));
|
||||||
|
|
||||||
uirow = MSI_CreateRecord( 1 );
|
uirow = MSI_CreateRecord( 1 );
|
||||||
|
@ -1554,9 +1549,8 @@ static UINT ITERATE_RemoveFolders( MSIRECORD *row, LPVOID param )
|
||||||
msiobj_release( &uirow->hdr );
|
msiobj_release( &uirow->hdr );
|
||||||
|
|
||||||
RemoveDirectoryW( full_path );
|
RemoveDirectoryW( full_path );
|
||||||
|
folder = get_loaded_folder( package, dir );
|
||||||
folder->State = 0;
|
folder->State = 0;
|
||||||
|
|
||||||
msi_free( full_path );
|
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2726,9 +2720,8 @@ static void set_target_path( MSIPACKAGE *package, MSIFILE *file )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WCHAR *dir = resolve_target_folder( package, file->Component->Directory, FALSE, TRUE, NULL );
|
const WCHAR *dir = msi_get_target_folder( package, file->Component->Directory );
|
||||||
file->TargetPath = build_directory_name( 2, dir, file->FileName );
|
file->TargetPath = build_directory_name( 2, dir, file->FileName );
|
||||||
msi_free( dir );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("resolves to %s\n", debugstr_w(file->TargetPath));
|
TRACE("resolves to %s\n", debugstr_w(file->TargetPath));
|
||||||
|
@ -3522,7 +3515,7 @@ static LPWSTR resolve_keypath( MSIPACKAGE* package, MSICOMPONENT *cmp )
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!cmp->KeyPath)
|
if (!cmp->KeyPath)
|
||||||
return resolve_target_folder( package, cmp->Directory, FALSE, TRUE, NULL );
|
return strdupW( msi_get_target_folder( package, cmp->Directory ) );
|
||||||
|
|
||||||
if (cmp->Attributes & msidbComponentAttributesRegistryKeyPath)
|
if (cmp->Attributes & msidbComponentAttributesRegistryKeyPath)
|
||||||
{
|
{
|
||||||
|
@ -3939,28 +3932,23 @@ static UINT ITERATE_RegisterTypeLibraries(MSIRECORD *row, LPVOID param)
|
||||||
|
|
||||||
if (tl_struct.path)
|
if (tl_struct.path)
|
||||||
{
|
{
|
||||||
LPWSTR help = NULL;
|
LPCWSTR helpid, help_path = NULL;
|
||||||
LPCWSTR helpid;
|
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
|
|
||||||
helpid = MSI_RecordGetString(row,6);
|
helpid = MSI_RecordGetString(row,6);
|
||||||
|
|
||||||
if (helpid) help = resolve_target_folder( package, helpid, FALSE, TRUE, NULL );
|
if (helpid) help_path = msi_get_target_folder( package, helpid );
|
||||||
res = RegisterTypeLib(tl_struct.ptLib,tl_struct.path,help);
|
res = RegisterTypeLib( tl_struct.ptLib, tl_struct.path, (OLECHAR *)help_path );
|
||||||
msi_free(help);
|
|
||||||
|
|
||||||
if (FAILED(res))
|
if (FAILED(res))
|
||||||
ERR("Failed to register type library %s\n",
|
ERR("Failed to register type library %s\n", debugstr_w(tl_struct.path));
|
||||||
debugstr_w(tl_struct.path));
|
|
||||||
else
|
else
|
||||||
TRACE("Registered %s\n", debugstr_w(tl_struct.path));
|
TRACE("Registered %s\n", debugstr_w(tl_struct.path));
|
||||||
|
|
||||||
ITypeLib_Release(tl_struct.ptLib);
|
ITypeLib_Release(tl_struct.ptLib);
|
||||||
msi_free(tl_struct.path);
|
msi_free(tl_struct.path);
|
||||||
}
|
}
|
||||||
else
|
else ERR("Failed to load type library %s\n", debugstr_w(tl_struct.source));
|
||||||
ERR("Failed to load type library %s\n",
|
|
||||||
debugstr_w(tl_struct.source));
|
|
||||||
|
|
||||||
FreeLibrary(module);
|
FreeLibrary(module);
|
||||||
msi_free(tl_struct.source);
|
msi_free(tl_struct.source);
|
||||||
|
@ -4075,11 +4063,11 @@ static UINT ACTION_UnregisterTypeLibraries( MSIPACKAGE *package )
|
||||||
static WCHAR *get_link_file( MSIPACKAGE *package, MSIRECORD *row )
|
static WCHAR *get_link_file( MSIPACKAGE *package, MSIRECORD *row )
|
||||||
{
|
{
|
||||||
static const WCHAR szlnk[] = {'.','l','n','k',0};
|
static const WCHAR szlnk[] = {'.','l','n','k',0};
|
||||||
LPCWSTR directory, extension;
|
LPCWSTR directory, extension, link_folder;
|
||||||
LPWSTR link_folder, link_file, filename;
|
LPWSTR link_file, filename;
|
||||||
|
|
||||||
directory = MSI_RecordGetString( row, 2 );
|
directory = MSI_RecordGetString( row, 2 );
|
||||||
link_folder = resolve_target_folder( package, directory, FALSE, TRUE, NULL );
|
link_folder = msi_get_target_folder( package, directory );
|
||||||
|
|
||||||
/* may be needed because of a bug somewhere else */
|
/* may be needed because of a bug somewhere else */
|
||||||
create_full_pathW( link_folder );
|
create_full_pathW( link_folder );
|
||||||
|
@ -4095,7 +4083,6 @@ static WCHAR *get_link_file( MSIPACKAGE *package, MSIRECORD *row )
|
||||||
memcpy( filename + len, szlnk, sizeof(szlnk) );
|
memcpy( filename + len, szlnk, sizeof(szlnk) );
|
||||||
}
|
}
|
||||||
link_file = build_directory_name( 2, link_folder, filename );
|
link_file = build_directory_name( 2, link_folder, filename );
|
||||||
msi_free( link_folder );
|
|
||||||
msi_free( filename );
|
msi_free( filename );
|
||||||
|
|
||||||
return link_file;
|
return link_file;
|
||||||
|
@ -4199,18 +4186,14 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param)
|
||||||
|
|
||||||
if (!MSI_RecordIsNull(row,12))
|
if (!MSI_RecordIsNull(row,12))
|
||||||
{
|
{
|
||||||
LPCWSTR wkdir = MSI_RecordGetString(row, 12);
|
LPCWSTR full_path, wkdir = MSI_RecordGetString( row, 12 );
|
||||||
path = resolve_target_folder( package, wkdir, FALSE, TRUE, NULL );
|
full_path = msi_get_target_folder( package, wkdir );
|
||||||
if (path)
|
if (full_path) IShellLinkW_SetWorkingDirectory( sl, full_path );
|
||||||
IShellLinkW_SetWorkingDirectory(sl, path);
|
|
||||||
msi_free(path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
link_file = get_link_file(package, row);
|
link_file = get_link_file(package, row);
|
||||||
|
|
||||||
TRACE("Writing shortcut to %s\n", debugstr_w(link_file));
|
TRACE("Writing shortcut to %s\n", debugstr_w(link_file));
|
||||||
IPersistFile_Save(pf, link_file, FALSE);
|
IPersistFile_Save(pf, link_file, FALSE);
|
||||||
|
|
||||||
msi_free(link_file);
|
msi_free(link_file);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
@ -4728,9 +4711,8 @@ static WCHAR *get_ini_file_name( MSIPACKAGE *package, MSIRECORD *row )
|
||||||
dirprop = MSI_RecordGetString( row, 3 );
|
dirprop = MSI_RecordGetString( row, 3 );
|
||||||
if (dirprop)
|
if (dirprop)
|
||||||
{
|
{
|
||||||
folder = resolve_target_folder( package, dirprop, FALSE, TRUE, NULL );
|
folder = strdupW( msi_get_target_folder( package, dirprop ) );
|
||||||
if (!folder)
|
if (!folder) folder = msi_dup_property( package->db, dirprop );
|
||||||
folder = msi_dup_property( package->db, dirprop );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
folder = msi_dup_property( package->db, szWindowsFolder );
|
folder = msi_dup_property( package->db, szWindowsFolder );
|
||||||
|
|
|
@ -1140,24 +1140,19 @@ static UINT HANDLE_CustomType50(MSIPACKAGE *package, LPCWSTR source,
|
||||||
static UINT HANDLE_CustomType34(MSIPACKAGE *package, LPCWSTR source,
|
static UINT HANDLE_CustomType34(MSIPACKAGE *package, LPCWSTR source,
|
||||||
LPCWSTR target, const INT type, LPCWSTR action)
|
LPCWSTR target, const INT type, LPCWSTR action)
|
||||||
{
|
{
|
||||||
LPWSTR workingdir, filename;
|
LPWSTR filename;
|
||||||
|
const WCHAR *workingdir;
|
||||||
STARTUPINFOW si;
|
STARTUPINFOW si;
|
||||||
PROCESS_INFORMATION info;
|
PROCESS_INFORMATION info;
|
||||||
BOOL rc;
|
BOOL rc;
|
||||||
|
|
||||||
memset(&si, 0, sizeof(STARTUPINFOW));
|
memset(&si, 0, sizeof(STARTUPINFOW));
|
||||||
|
|
||||||
workingdir = resolve_target_folder( package, source, FALSE, TRUE, NULL );
|
workingdir = msi_get_target_folder( package, source );
|
||||||
if (!workingdir)
|
if (!workingdir) return ERROR_FUNCTION_FAILED;
|
||||||
return ERROR_FUNCTION_FAILED;
|
|
||||||
|
|
||||||
deformat_string(package, target, &filename);
|
deformat_string(package, target, &filename);
|
||||||
|
if (!filename) return ERROR_FUNCTION_FAILED;
|
||||||
if (!filename)
|
|
||||||
{
|
|
||||||
msi_free(workingdir);
|
|
||||||
return ERROR_FUNCTION_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
TRACE("executing exe %s with working directory %s\n",
|
TRACE("executing exe %s with working directory %s\n",
|
||||||
debugstr_w(filename), debugstr_w(workingdir));
|
debugstr_w(filename), debugstr_w(workingdir));
|
||||||
|
@ -1170,13 +1165,9 @@ static UINT HANDLE_CustomType34(MSIPACKAGE *package, LPCWSTR source,
|
||||||
ERR("Unable to execute command %s with working directory %s\n",
|
ERR("Unable to execute command %s with working directory %s\n",
|
||||||
debugstr_w(filename), debugstr_w(workingdir));
|
debugstr_w(filename), debugstr_w(workingdir));
|
||||||
msi_free(filename);
|
msi_free(filename);
|
||||||
msi_free(workingdir);
|
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
msi_free(filename);
|
msi_free(filename);
|
||||||
msi_free(workingdir);
|
|
||||||
|
|
||||||
CloseHandle( info.hThread );
|
CloseHandle( info.hThread );
|
||||||
|
|
||||||
return wait_process_handle(package, type, info.hProcess, action);
|
return wait_process_handle(package, type, info.hProcess, action);
|
||||||
|
|
|
@ -232,18 +232,17 @@ static UINT copy_install_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR source)
|
||||||
static UINT msi_create_directory( MSIPACKAGE *package, const WCHAR *dir )
|
static UINT msi_create_directory( MSIPACKAGE *package, const WCHAR *dir )
|
||||||
{
|
{
|
||||||
MSIFOLDER *folder;
|
MSIFOLDER *folder;
|
||||||
WCHAR *install_path;
|
const WCHAR *install_path;
|
||||||
|
|
||||||
install_path = resolve_target_folder( package, dir, FALSE, TRUE, &folder );
|
install_path = msi_get_target_folder( package, dir );
|
||||||
if (!install_path)
|
if (!install_path) return ERROR_FUNCTION_FAILED;
|
||||||
return ERROR_FUNCTION_FAILED;
|
|
||||||
|
|
||||||
|
folder = get_loaded_folder( package, dir );
|
||||||
if (folder->State == 0)
|
if (folder->State == 0)
|
||||||
{
|
{
|
||||||
create_full_pathW( install_path );
|
create_full_pathW( install_path );
|
||||||
folder->State = 2;
|
folder->State = 2;
|
||||||
}
|
}
|
||||||
msi_free( install_path );
|
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -918,7 +917,7 @@ static WCHAR *get_duplicate_filename( MSIPACKAGE *package, MSIRECORD *row, const
|
||||||
{
|
{
|
||||||
const WCHAR *dst_key = MSI_RecordGetString( row, 5 );
|
const WCHAR *dst_key = MSI_RecordGetString( row, 5 );
|
||||||
|
|
||||||
dst_path = resolve_target_folder( package, dst_key, FALSE, TRUE, NULL );
|
dst_path = strdupW( msi_get_target_folder( package, dst_key ) );
|
||||||
if (!dst_path)
|
if (!dst_path)
|
||||||
{
|
{
|
||||||
/* try a property */
|
/* try a property */
|
||||||
|
|
|
@ -196,7 +196,7 @@ static LPWSTR deformat_component(FORMAT *format, FORMSTR *str)
|
||||||
if (comp->Action == INSTALLSTATE_SOURCE)
|
if (comp->Action == INSTALLSTATE_SOURCE)
|
||||||
ret = resolve_source_folder( format->package, comp->Directory, NULL );
|
ret = resolve_source_folder( format->package, comp->Directory, NULL );
|
||||||
else
|
else
|
||||||
ret = resolve_target_folder( format->package, comp->Directory, FALSE, TRUE, NULL );
|
ret = strdupW( msi_get_target_folder( format->package, comp->Directory ) );
|
||||||
|
|
||||||
done:
|
done:
|
||||||
msi_free(key);
|
msi_free(key);
|
||||||
|
|
|
@ -315,6 +315,13 @@ LPWSTR resolve_source_folder( MSIPACKAGE *package, LPCWSTR name, MSIFOLDER **fol
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const WCHAR *msi_get_target_folder( MSIPACKAGE *package, const WCHAR *name )
|
||||||
|
{
|
||||||
|
MSIFOLDER *folder = get_loaded_folder( package, name );
|
||||||
|
if (folder) return folder->ResolvedTarget;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
LPWSTR resolve_target_folder( MSIPACKAGE *package, LPCWSTR name, BOOL set_prop, BOOL load_prop,
|
LPWSTR resolve_target_folder( MSIPACKAGE *package, LPCWSTR name, BOOL set_prop, BOOL load_prop,
|
||||||
MSIFOLDER **folder )
|
MSIFOLDER **folder )
|
||||||
{
|
{
|
||||||
|
|
|
@ -971,6 +971,7 @@ extern int msi_get_property_int( MSIDATABASE *package, LPCWSTR prop, int def ) D
|
||||||
extern LPWSTR resolve_source_folder(MSIPACKAGE *package, LPCWSTR name, MSIFOLDER **folder) DECLSPEC_HIDDEN;
|
extern LPWSTR resolve_source_folder(MSIPACKAGE *package, LPCWSTR name, MSIFOLDER **folder) DECLSPEC_HIDDEN;
|
||||||
extern LPWSTR resolve_target_folder(MSIPACKAGE *package, LPCWSTR name, BOOL set_prop, BOOL load_prop, MSIFOLDER **folder) DECLSPEC_HIDDEN;
|
extern LPWSTR resolve_target_folder(MSIPACKAGE *package, LPCWSTR name, BOOL set_prop, BOOL load_prop, MSIFOLDER **folder) DECLSPEC_HIDDEN;
|
||||||
extern LPWSTR resolve_file_source(MSIPACKAGE *package, MSIFILE *file) DECLSPEC_HIDDEN;
|
extern LPWSTR resolve_file_source(MSIPACKAGE *package, MSIFILE *file) DECLSPEC_HIDDEN;
|
||||||
|
extern const WCHAR *msi_get_target_folder(MSIPACKAGE *package, const WCHAR *name) DECLSPEC_HIDDEN;
|
||||||
extern void msi_reset_folders( MSIPACKAGE *package, BOOL source ) DECLSPEC_HIDDEN;
|
extern void msi_reset_folders( MSIPACKAGE *package, BOOL source ) DECLSPEC_HIDDEN;
|
||||||
extern MSICOMPONENT *get_loaded_component( MSIPACKAGE* package, LPCWSTR Component ) DECLSPEC_HIDDEN;
|
extern MSICOMPONENT *get_loaded_component( MSIPACKAGE* package, LPCWSTR Component ) DECLSPEC_HIDDEN;
|
||||||
extern MSIFEATURE *get_loaded_feature( MSIPACKAGE* package, LPCWSTR Feature ) DECLSPEC_HIDDEN;
|
extern MSIFEATURE *get_loaded_feature( MSIPACKAGE* package, LPCWSTR Feature ) DECLSPEC_HIDDEN;
|
||||||
|
|
Loading…
Reference in New Issue