[1/2] msi: Split up resolve_folder.
Hans Leidekker
hans at codeweavers.com
Mon Feb 7 02:40:13 CST 2011
---
dlls/msi/action.c | 24 +++++-----
dlls/msi/custom.c | 3 +-
dlls/msi/files.c | 4 +-
dlls/msi/format.c | 7 ++-
dlls/msi/helpers.c | 125 +++++++++++++++++++++++++++++-----------------------
dlls/msi/install.c | 16 +++---
dlls/msi/msipriv.h | 4 +-
7 files changed, 98 insertions(+), 85 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 061d2f3..f5ef26f 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -1189,7 +1189,7 @@ static UINT ITERATE_CreateFolders(MSIRECORD *row, LPVOID param)
ui_actiondata(package, szCreateFolders, uirow);
msiobj_release(&uirow->hdr);
- full_path = resolve_folder(package,dir,FALSE,FALSE,TRUE,&folder);
+ full_path = resolve_target_folder( package, dir, FALSE, TRUE, &folder );
if (!full_path)
{
ERR("Unable to resolve folder id %s\n",debugstr_w(dir));
@@ -1264,7 +1264,7 @@ static UINT ITERATE_RemoveFolders( MSIRECORD *row, LPVOID param )
return ERROR_SUCCESS;
}
- full_path = resolve_folder( package, dir, FALSE, FALSE, TRUE, &folder );
+ full_path = resolve_target_folder( package, dir, FALSE, TRUE, &folder );
if (!full_path)
{
ERR("Unable to resolve folder id %s\n", debugstr_w(dir));
@@ -2151,10 +2151,9 @@ static UINT ITERATE_CostFinalizeDirectories(MSIRECORD *row, LPVOID param)
msi_free(f->ResolvedTarget);
f->ResolvedTarget = NULL;
- /* This helper function now does ALL the work */
- TRACE("Dir %s ...\n",debugstr_w(name));
- path = resolve_folder(package,name,FALSE,TRUE,TRUE,NULL);
- TRACE("resolves to %s\n",debugstr_w(path));
+ TRACE("directory %s ...\n", debugstr_w(name));
+ path = resolve_target_folder( package, name, TRUE, TRUE, NULL );
+ TRACE("resolves to %s\n", debugstr_w(path));
msi_free(path);
return ERROR_SUCCESS;
@@ -2302,7 +2301,7 @@ static void set_target_path( MSIPACKAGE *package, MSIFILE *file )
}
else
{
- WCHAR *dir = resolve_folder( package, file->Component->Directory, FALSE, FALSE, TRUE, NULL );
+ WCHAR *dir = resolve_target_folder( package, file->Component->Directory, FALSE, TRUE, NULL );
file->TargetPath = build_directory_name( 2, dir, file->FileName );
msi_free( dir );
}
@@ -3133,7 +3132,7 @@ static LPWSTR resolve_keypath( MSIPACKAGE* package, MSICOMPONENT *cmp )
{
if (!cmp->KeyPath)
- return resolve_folder(package,cmp->Directory,FALSE,FALSE,TRUE,NULL);
+ return resolve_target_folder( package, cmp->Directory, FALSE, TRUE, NULL );
if (cmp->Attributes & msidbComponentAttributesRegistryKeyPath)
{
@@ -3551,8 +3550,7 @@ static UINT ITERATE_RegisterTypeLibraries(MSIRECORD *row, LPVOID param)
helpid = MSI_RecordGetString(row,6);
- if (helpid)
- help = resolve_folder(package,helpid,FALSE,FALSE,TRUE,NULL);
+ if (helpid) help = resolve_target_folder( package, helpid, FALSE, TRUE, NULL );
res = RegisterTypeLib(tl_struct.ptLib,tl_struct.path,help);
msi_free(help);
@@ -3686,7 +3684,7 @@ static WCHAR *get_link_file( MSIPACKAGE *package, MSIRECORD *row )
LPWSTR link_folder, link_file, filename;
directory = MSI_RecordGetString( row, 2 );
- link_folder = resolve_folder( package, directory, FALSE, FALSE, TRUE, NULL );
+ link_folder = resolve_target_folder( package, directory, FALSE, TRUE, NULL );
/* may be needed because of a bug somewhere else */
create_full_pathW( link_folder );
@@ -3807,7 +3805,7 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param)
if (!MSI_RecordIsNull(row,12))
{
LPCWSTR wkdir = MSI_RecordGetString(row, 12);
- path = resolve_folder(package, wkdir, FALSE, FALSE, TRUE, NULL);
+ path = resolve_target_folder( package, wkdir, FALSE, TRUE, NULL );
if (path)
IShellLinkW_SetWorkingDirectory(sl, path);
msi_free(path);
@@ -4340,7 +4338,7 @@ static WCHAR *get_ini_file_name( MSIPACKAGE *package, MSIRECORD *row )
dirprop = MSI_RecordGetString( row, 3 );
if (dirprop)
{
- folder = resolve_folder( package, dirprop, FALSE, FALSE, TRUE, NULL );
+ folder = resolve_target_folder( package, dirprop, FALSE, TRUE, NULL );
if (!folder)
folder = msi_dup_property( package->db, dirprop );
}
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c
index 80e1938..cb7a48c 100644
--- a/dlls/msi/custom.c
+++ b/dlls/msi/custom.c
@@ -1150,8 +1150,7 @@ static UINT HANDLE_CustomType34(MSIPACKAGE *package, LPCWSTR source,
memset(&si, 0, sizeof(STARTUPINFOW));
- workingdir = resolve_folder(package, source, FALSE, FALSE, TRUE, NULL);
-
+ workingdir = resolve_target_folder( package, source, FALSE, TRUE, NULL );
if (!workingdir)
return ERROR_FUNCTION_FAILED;
diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index 2ad7874..93304e3 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -163,7 +163,7 @@ static UINT msi_create_directory( MSIPACKAGE *package, const WCHAR *dir )
MSIFOLDER *folder;
WCHAR *install_path;
- install_path = resolve_folder( package, dir, FALSE, FALSE, TRUE, &folder );
+ install_path = resolve_target_folder( package, dir, FALSE, TRUE, &folder );
if (!install_path)
return ERROR_FUNCTION_FAILED;
@@ -690,7 +690,7 @@ static WCHAR *get_duplicate_filename( MSIPACKAGE *package, MSIRECORD *row, const
{
const WCHAR *dst_key = MSI_RecordGetString( row, 5 );
- dst_path = resolve_folder( package, dst_key, FALSE, FALSE, TRUE, NULL );
+ dst_path = resolve_target_folder( package, dst_key, FALSE, TRUE, NULL );
if (!dst_path)
{
/* try a property */
diff --git a/dlls/msi/format.c b/dlls/msi/format.c
index c4ff30f..b970dc1 100644
--- a/dlls/msi/format.c
+++ b/dlls/msi/format.c
@@ -185,7 +185,6 @@ static LPWSTR deformat_component(FORMAT *format, FORMSTR *str)
{
LPWSTR key, ret = NULL;
MSICOMPONENT *comp;
- BOOL source;
key = msi_alloc((str->len + 1) * sizeof(WCHAR));
lstrcpynW(key, get_formstr_data(format, str), str->len + 1);
@@ -194,8 +193,10 @@ static LPWSTR deformat_component(FORMAT *format, FORMSTR *str)
if (!comp)
goto done;
- source = (comp->Action == INSTALLSTATE_SOURCE) ? TRUE : FALSE;
- ret = resolve_folder(format->package, comp->Directory, source, FALSE, TRUE, NULL);
+ if (comp->Action == INSTALLSTATE_SOURCE)
+ ret = resolve_source_folder( format->package, comp->Directory, NULL );
+ else
+ ret = resolve_target_folder( format->package, comp->Directory, FALSE, TRUE, NULL );
done:
msi_free(key);
diff --git a/dlls/msi/helpers.c b/dlls/msi/helpers.c
index df5d448..499c811 100644
--- a/dlls/msi/helpers.c
+++ b/dlls/msi/helpers.c
@@ -232,8 +232,7 @@ LPWSTR resolve_file_source(MSIPACKAGE *package, MSIFILE *file)
if (file->IsCompressed)
return NULL;
- p = resolve_folder(package, file->Component->Directory,
- TRUE, FALSE, TRUE, NULL);
+ p = resolve_source_folder( package, file->Component->Directory, NULL );
path = build_directory_name(2, p, file->ShortName);
if (file->LongName &&
@@ -245,22 +244,16 @@ LPWSTR resolve_file_source(MSIPACKAGE *package, MSIFILE *file)
msi_free(p);
- TRACE("file %s source resolves to %s\n", debugstr_w(file->File),
- debugstr_w(path));
-
+ TRACE("file %s source resolves to %s\n", debugstr_w(file->File), debugstr_w(path));
return path;
}
-LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
- BOOL set_prop, BOOL load_prop, MSIFOLDER **folder)
+LPWSTR resolve_source_folder( MSIPACKAGE *package, LPCWSTR name, MSIFOLDER **folder )
{
MSIFOLDER *f;
LPWSTR p, path = NULL, parent;
- TRACE("Working to resolve %s\n",debugstr_w(name));
-
- if (!name)
- return NULL;
+ TRACE("working to resolve %s\n", debugstr_w(name));
if (!strcmpW( name, cszSourceDir ))
name = cszTargetDir;
@@ -272,6 +265,57 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
/* special resolving for Target and Source root dir */
if (!strcmpW( name, cszTargetDir ))
{
+ if (!f->ResolvedSource)
+ f->ResolvedSource = get_source_root( package );
+ }
+
+ if (folder)
+ *folder = f;
+
+ if (f->ResolvedSource)
+ {
+ path = strdupW( f->ResolvedSource );
+ TRACE(" already resolved to %s\n", debugstr_w(path));
+ return path;
+ }
+
+ if (!f->Parent)
+ return path;
+
+ parent = f->Parent;
+ TRACE(" ! parent is %s\n", debugstr_w(parent));
+
+ p = resolve_source_folder( package, parent, NULL );
+
+ if (package->WordCount & msidbSumInfoSourceTypeCompressed)
+ path = get_source_root( package );
+ else if (package->WordCount & msidbSumInfoSourceTypeSFN)
+ path = build_directory_name( 3, p, f->SourceShortPath, NULL );
+ else
+ path = build_directory_name( 3, p, f->SourceLongPath, NULL );
+
+ TRACE("-> %s\n", debugstr_w(path));
+ f->ResolvedSource = strdupW( path );
+ msi_free( p );
+
+ return path;
+}
+
+LPWSTR resolve_target_folder( MSIPACKAGE *package, LPCWSTR name, BOOL set_prop, BOOL load_prop,
+ MSIFOLDER **folder )
+{
+ MSIFOLDER *f;
+ LPWSTR p, path = NULL, parent;
+
+ TRACE("working to resolve %s\n", debugstr_w(name));
+
+ f = get_loaded_folder( package, name );
+ if (!f)
+ return NULL;
+
+ /* special resolving for Target and Source root dir */
+ if (!strcmpW( name, cszTargetDir ))
+ {
if (!f->ResolvedTarget && !f->Property)
{
LPWSTR check_path;
@@ -292,39 +336,27 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
f->ResolvedTarget = path;
}
-
- if (!f->ResolvedSource)
- f->ResolvedSource = get_source_root( package );
}
if (folder)
*folder = f;
- if (!source && f->ResolvedTarget)
+ if (f->ResolvedTarget)
{
path = strdupW( f->ResolvedTarget );
- TRACE(" already resolved to %s\n",debugstr_w(path));
- return path;
- }
-
- if (source && f->ResolvedSource)
- {
- path = strdupW( f->ResolvedSource );
- TRACE(" (source)already resolved to %s\n",debugstr_w(path));
+ TRACE(" already resolved to %s\n", debugstr_w(path));
return path;
}
- if (!source && f->Property)
+ if (f->Property)
{
path = build_directory_name( 2, f->Property, NULL );
-
- TRACE(" internally set to %s\n",debugstr_w(path));
- if (set_prop)
- msi_set_property( package->db, name, path );
+ TRACE(" internally set to %s\n", debugstr_w(path));
+ if (set_prop) msi_set_property( package->db, name, path );
return path;
}
- if (!source && load_prop && (path = msi_dup_property( package->db, name )))
+ if (load_prop && (path = msi_dup_property( package->db, name )))
{
f->ResolvedTarget = strdupW( path );
TRACE(" property set to %s\n", debugstr_w(path));
@@ -336,35 +368,18 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
parent = f->Parent;
- TRACE(" ! Parent is %s\n", debugstr_w(parent));
-
- p = resolve_folder(package, parent, source, set_prop, load_prop, NULL);
- if (!source)
- {
- TRACE(" TargetDefault = %s\n", debugstr_w(f->TargetDefault));
+ TRACE(" ! parent is %s\n", debugstr_w(parent));
- path = build_directory_name( 3, p, f->TargetDefault, NULL );
- clean_spaces_from_path( path );
- f->ResolvedTarget = strdupW( path );
- TRACE("target -> %s\n", debugstr_w(path));
- if (set_prop)
- msi_set_property( package->db, name, path );
- }
- else
- {
- path = NULL;
+ p = resolve_target_folder( package, parent, set_prop, load_prop, NULL );
- if (package->WordCount & msidbSumInfoSourceTypeCompressed)
- path = get_source_root( package );
- else if (package->WordCount & msidbSumInfoSourceTypeSFN)
- path = build_directory_name( 3, p, f->SourceShortPath, NULL );
- else
- path = build_directory_name( 3, p, f->SourceLongPath, NULL );
+ TRACE(" TargetDefault = %s\n", debugstr_w(f->TargetDefault));
+ path = build_directory_name( 3, p, f->TargetDefault, NULL );
+ clean_spaces_from_path( path );
+ f->ResolvedTarget = strdupW( path );
- TRACE("source -> %s\n", debugstr_w(path));
- f->ResolvedSource = strdupW( path );
- }
- msi_free(p);
+ TRACE("-> %s\n", debugstr_w(path));
+ if (set_prop) msi_set_property( package->db, name, path );
+ msi_free( p );
return path;
}
diff --git a/dlls/msi/install.c b/dlls/msi/install.c
index 338ef0a..eaafeae 100644
--- a/dlls/msi/install.c
+++ b/dlls/msi/install.c
@@ -282,7 +282,7 @@ done:
return r;
}
- path = resolve_folder( package, szFolder, FALSE, FALSE, TRUE, NULL );
+ path = resolve_target_folder( package, szFolder, FALSE, TRUE, NULL );
msiobj_release( &package->hdr );
if (!path)
@@ -336,7 +336,7 @@ UINT WINAPI MsiGetTargetPathW( MSIHANDLE hInstall, LPCWSTR szFolder,
}
/***********************************************************************
- * MsiGetSourcePath (internal)
+ * MSI_GetSourcePath (internal)
*/
static UINT MSI_GetSourcePath( MSIHANDLE hInstall, LPCWSTR szFolder,
awstring *szPathBuf, LPDWORD pcchPathBuf )
@@ -413,10 +413,10 @@ done:
return ERROR_INVALID_PARAMETER;
}
- path = resolve_folder(package, szFolder, TRUE, FALSE, TRUE, NULL);
+ path = resolve_source_folder( package, szFolder, NULL );
msiobj_release( &package->hdr );
- TRACE("path = %s\n",debugstr_w(path));
+ TRACE("path = %s\n", debugstr_w(path));
if (!path)
return ERROR_DIRECTORY;
@@ -512,7 +512,7 @@ UINT MSI_SetTargetPathW(MSIPACKAGE *package, LPCWSTR szFolder,
attrib & FILE_ATTRIBUTE_READONLY))
return ERROR_FUNCTION_FAILED;
- path = resolve_folder(package,szFolder,FALSE,FALSE,FALSE,&folder);
+ path = resolve_target_folder( package, szFolder, FALSE, FALSE, &folder );
if (!path)
return ERROR_DIRECTORY;
@@ -527,7 +527,7 @@ UINT MSI_SetTargetPathW(MSIPACKAGE *package, LPCWSTR szFolder,
*/
msi_free(folder->ResolvedTarget);
folder->ResolvedTarget = NULL;
- path2 = resolve_folder(package,szFolder,FALSE,TRUE,FALSE,NULL);
+ path2 = resolve_target_folder( package, szFolder, TRUE, FALSE, NULL );
msi_free(path2);
}
else
@@ -542,7 +542,7 @@ UINT MSI_SetTargetPathW(MSIPACKAGE *package, LPCWSTR szFolder,
LIST_FOR_EACH_ENTRY( f, &package->folders, MSIFOLDER, entry )
{
- path2 = resolve_folder(package, f->Directory, FALSE, TRUE, FALSE, NULL);
+ path2 = resolve_target_folder( package, f->Directory, TRUE, FALSE, NULL );
msi_free(path2);
}
@@ -554,7 +554,7 @@ UINT MSI_SetTargetPathW(MSIPACKAGE *package, LPCWSTR szFolder,
if (!comp->Enabled || (comp->assembly && !comp->assembly->application))
continue;
- dir = resolve_folder(package, comp->Directory, FALSE, FALSE, FALSE, NULL);
+ dir = resolve_target_folder( package, comp->Directory, FALSE, FALSE, NULL );
msi_free(file->TargetPath);
file->TargetPath = build_directory_name(2, dir, file->FileName);
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index 0f5a33c..0868728 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -931,8 +931,8 @@ extern LPWSTR msi_dup_property( MSIDATABASE *db, LPCWSTR prop );
extern UINT msi_set_property( MSIDATABASE *, LPCWSTR, LPCWSTR );
extern UINT msi_get_property( MSIDATABASE *, LPCWSTR, LPWSTR, LPDWORD );
extern int msi_get_property_int( MSIDATABASE *package, LPCWSTR prop, int def );
-extern LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
- BOOL set_prop, BOOL load_prop, MSIFOLDER **folder);
+extern LPWSTR resolve_source_folder(MSIPACKAGE *package, LPCWSTR name, MSIFOLDER **folder);
+extern LPWSTR resolve_target_folder(MSIPACKAGE *package, LPCWSTR name, BOOL set_prop, BOOL load_prop, MSIFOLDER **folder);
extern LPWSTR resolve_file_source(MSIPACKAGE *package, MSIFILE *file);
extern void msi_reset_folders( MSIPACKAGE *package, BOOL source );
extern MSICOMPONENT *get_loaded_component( MSIPACKAGE* package, LPCWSTR Component );
--
1.7.1
More information about the wine-patches
mailing list