From b96e5d21c6b59413813dca1d1385ffe24b4a6f9f Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Mon, 7 Feb 2011 09:40:13 +0100 Subject: [PATCH] msi: Split up resolve_folder. --- 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 061d2f397e5..f5ef26f726d 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 80e193852e0..cb7a48c82e5 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 2ad78743692..93304e38abc 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 c4ff30f4111..b970dc1479f 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 df5d44892a1..499c8117ae3 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,26 +244,71 @@ 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; + f = get_loaded_folder( package, name ); + if (!f) + return NULL; + + /* 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; @@ -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)); + 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)); - 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)); + 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)); + p = resolve_target_folder( package, parent, set_prop, load_prop, NULL ); - 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; + 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 ); - 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("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 338ef0a00c9..eaafeae5b8f 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 0f5a33cbcdc..086872850be 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 );