diff --git a/dlls/msi/action.c b/dlls/msi/action.c index 86924a35ad3..15bea7ae39b 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -277,9 +277,13 @@ UINT msi_parse_command_line( MSIPACKAGE *package, LPCWSTR szCommandLine, if (lstrlenW(prop) > 0) { + UINT r = MSI_SetPropertyW( package->db, prop, val ); + TRACE("Found commandline property (%s) = (%s)\n", debugstr_w(prop), debugstr_w(val)); - MSI_SetPropertyW(package,prop,val); + + if (r == ERROR_SUCCESS && !strcmpW( prop, cszSourceDir )) + msi_reset_folders( package, TRUE ); } msi_free(val); msi_free(prop); @@ -477,7 +481,7 @@ static UINT msi_set_media_source_prop(MSIPACKAGE *package) { prop = MSI_RecordGetString(rec, 1); patch = msi_dup_property(package->db, szPatch); - MSI_SetPropertyW(package, prop, patch); + MSI_SetPropertyW(package->db, prop, patch); msi_free(patch); } @@ -668,13 +672,16 @@ static UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace) check = msi_dup_property( package->db, cszSourceDir ); if (!check || replace) - MSI_SetPropertyW( package, cszSourceDir, source ); - + { + UINT r = MSI_SetPropertyW( package->db, cszSourceDir, source ); + if (r == ERROR_SUCCESS) + msi_reset_folders( package, TRUE ); + } msi_free( check ); check = msi_dup_property( package->db, cszSOURCEDIR ); if (!check || replace) - MSI_SetPropertyW( package, cszSOURCEDIR, source ); + MSI_SetPropertyW( package->db, cszSOURCEDIR, source ); msi_free( check ); msi_free( source ); @@ -1513,8 +1520,8 @@ static UINT ACTION_CostInitialize(MSIPACKAGE *package) static const WCHAR szCosting[] = {'C','o','s','t','i','n','g','C','o','m','p','l','e','t','e',0 }; - MSI_SetPropertyW(package, szCosting, szZero); - MSI_SetPropertyW(package, cszRootDrive, c_colon); + MSI_SetPropertyW( package->db, szCosting, szZero ); + MSI_SetPropertyW( package->db, cszRootDrive, c_colon ); load_all_folders( package ); load_all_components( package ); @@ -1684,7 +1691,7 @@ static BOOL process_overrides( MSIPACKAGE *package, int level ) ret |= process_state_property( package, level, szAdvertise, INSTALLSTATE_ADVERTISED ); if (ret) - MSI_SetPropertyW( package, szPreselected, szOne ); + MSI_SetPropertyW( package->db, szPreselected, szOne ); return ret; } @@ -2077,15 +2084,15 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package) } } - MSI_SetPropertyW(package,szCosting,szOne); + MSI_SetPropertyW( package->db, szCosting, szOne ); /* set default run level if not set */ level = msi_dup_property( package->db, szlevel ); if (!level) - MSI_SetPropertyW(package,szlevel, szOne); + MSI_SetPropertyW( package->db, szlevel, szOne ); msi_free(level); /* FIXME: check volume disk space */ - MSI_SetPropertyW(package, szOutOfDiskSpace, szZero); + MSI_SetPropertyW( package->db, szOutOfDiskSpace, szZero ); return MSI_SetFeatureStates(package); } @@ -6795,7 +6802,7 @@ static UINT ACTION_ValidateProductID( MSIPACKAGE *package ) if (key && template) { FIXME( "partial stub: template %s key %s\n", debugstr_w(template), debugstr_w(key) ); - r = MSI_SetPropertyW( package, szProductID, key ); + r = MSI_SetPropertyW( package->db, szProductID, key ); } msi_free( template ); msi_free( key ); @@ -7209,7 +7216,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath, static const WCHAR szAction[] = {'A','C','T','I','O','N',0}; static const WCHAR szInstall[] = {'I','N','S','T','A','L','L',0}; - MSI_SetPropertyW(package, szAction, szInstall); + MSI_SetPropertyW( package->db, szAction, szInstall ); package->script->InWhatSequence = SEQUENCE_INSTALL; @@ -7257,7 +7264,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath, if (!szCommandLine && msi_get_property_int( package->db, szInstalled, 0 )) { TRACE("setting reinstall property\n"); - MSI_SetPropertyW( package, szReinstall, szAll ); + MSI_SetPropertyW( package->db, szReinstall, szAll ); } /* properties may have been added by a transform */ diff --git a/dlls/msi/appsearch.c b/dlls/msi/appsearch.c index 6f00b14a5fc..42f16782cfd 100644 --- a/dlls/msi/appsearch.c +++ b/dlls/msi/appsearch.c @@ -1041,7 +1041,10 @@ static UINT iterate_appsearch(MSIRECORD *row, LPVOID param) r = ACTION_AppSearchSigName(package, sigName, &sig, &value); if (value) { - MSI_SetPropertyW(package, propName, value); + r = MSI_SetPropertyW( package->db, propName, value ); + if (r == ERROR_SUCCESS && !strcmpW( propName, cszSourceDir )) + msi_reset_folders( package, TRUE ); + msi_free(value); } ACTION_FreeSignature(&sig); @@ -1100,7 +1103,7 @@ static UINT ITERATE_CCPSearch(MSIRECORD *row, LPVOID param) if (value) { TRACE("Found signature %s\n", debugstr_w(signature)); - MSI_SetPropertyW(package, success, szOne); + MSI_SetPropertyW(package->db, success, szOne); msi_free(value); r = ERROR_NO_MORE_ITEMS; } diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c index 4c75578fbd9..771e3d3243c 100644 --- a/dlls/msi/custom.c +++ b/dlls/msi/custom.c @@ -163,17 +163,17 @@ static void set_deferred_action_props(MSIPACKAGE *package, LPWSTR deferred_data) end = strstrW(beg, sep); *end = '\0'; - MSI_SetPropertyW(package, szCustomActionData, beg); + MSI_SetPropertyW(package->db, szCustomActionData, beg); beg = end + 3; end = strstrW(beg, sep); *end = '\0'; - MSI_SetPropertyW(package, szUserSID, beg); + MSI_SetPropertyW(package->db, szUserSID, beg); beg = end + 3; end = strchrW(beg, ']'); *end = '\0'; - MSI_SetPropertyW(package, szProductCode, beg); + MSI_SetPropertyW(package->db, szProductCode, beg); } UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL execute) @@ -276,9 +276,9 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL if (deferred_data) set_deferred_action_props(package, deferred_data); else if (actiondata) - MSI_SetPropertyW(package, szCustomActionData, actiondata); + MSI_SetPropertyW(package->db, szCustomActionData, actiondata); else - MSI_SetPropertyW(package, szCustomActionData, szEmpty); + MSI_SetPropertyW(package->db, szCustomActionData, szEmpty); msi_free(actiondata); } @@ -327,7 +327,9 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL break; deformat_string(package,target,&deformated); - rc = MSI_SetPropertyW(package,source,deformated); + rc = MSI_SetPropertyW( package->db, source, deformated ); + if (rc == ERROR_SUCCESS && !strcmpW( source, cszSourceDir )) + msi_reset_folders( package, TRUE ); msi_free(deformated); break; case 37: /* JScript/VBScript text stored in target column. */ diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c index b436910f994..a6a01b92237 100644 --- a/dlls/msi/dialog.c +++ b/dlls/msi/dialog.c @@ -583,6 +583,13 @@ static void msi_dialog_update_controls( msi_dialog *dialog, LPCWSTR property ) } } +static void msi_dialog_set_property( MSIPACKAGE *package, LPCWSTR property, LPCWSTR value ) +{ + UINT r = MSI_SetPropertyW( package->db, property, value ); + if (r == ERROR_SUCCESS && !strcmpW( property, cszSourceDir )) + msi_reset_folders( package, TRUE ); +} + /* called from the Control Event subscription code */ void msi_dialog_handle_event( msi_dialog* dialog, LPCWSTR control, LPCWSTR attribute, MSIRECORD *rec ) @@ -636,7 +643,7 @@ void msi_dialog_handle_event( msi_dialog* dialog, LPCWSTR control, else if ( !lstrcmpW(attribute, szProperty) ) { MSIFEATURE *feature = msi_seltree_get_selected_feature( ctrl ); - MSI_SetPropertyW( dialog->package, ctrl->property, feature->Directory ); + msi_dialog_set_property( dialog->package, ctrl->property, feature->Directory ); } else if ( !lstrcmpW(attribute, szSelectionPath) ) { @@ -1330,8 +1337,7 @@ static UINT msi_dialog_combobox_handler( msi_dialog *dialog, else value = (LPWSTR) SendMessageW( control->hwnd, CB_GETITEMDATA, index, 0 ); - MSI_SetPropertyW( info->dialog->package, - control->property, value ); + msi_dialog_set_property( info->dialog->package, control->property, value ); msi_dialog_evaluate_control_conditions( info->dialog ); if (index == CB_ERR) @@ -1538,10 +1544,9 @@ static void msi_mask_control_change( struct msi_maskedit_info *info ) if( i == info->num_groups ) { - TRACE("Set property %s to %s\n", - debugstr_w(info->prop), debugstr_w(val) ); + TRACE("Set property %s to %s\n", debugstr_w(info->prop), debugstr_w(val)); CharUpperBuffW( val, info->num_chars ); - MSI_SetPropertyW( info->dialog->package, info->prop, val ); + msi_dialog_set_property( info->dialog->package, info->prop, val ); msi_dialog_evaluate_control_conditions( info->dialog ); } msi_free( val ); @@ -1891,7 +1896,7 @@ static BOOL msi_dialog_onkillfocus( msi_dialog *dialog, msi_control *control ) else { valid = TRUE; - MSI_SetPropertyW( dialog->package, prop, buf ); + msi_dialog_set_property( dialog->package, prop, buf ); } msi_dialog_update_pathedit( dialog, control ); @@ -2543,8 +2548,7 @@ static UINT msi_dialog_listbox_handler( msi_dialog *dialog, index = SendMessageW( control->hwnd, LB_GETCURSEL, 0, 0 ); value = (LPCWSTR) SendMessageW( control->hwnd, LB_GETITEMDATA, index, 0 ); - MSI_SetPropertyW( info->dialog->package, - control->property, value ); + msi_dialog_set_property( info->dialog->package, control->property, value ); msi_dialog_evaluate_control_conditions( info->dialog ); return ERROR_SUCCESS; @@ -2707,7 +2711,7 @@ UINT msi_dialog_directorylist_up( msi_dialog *dialog ) if (ptr != path) *(ptr - 1) = '\0'; PathAddBackslashW( path ); - MSI_SetPropertyW( dialog->package, prop, path ); + msi_dialog_set_property( dialog->package, prop, path ); msi_dialog_update_directory_list( dialog, NULL ); msi_dialog_update_directory_combo( dialog, NULL ); @@ -2753,7 +2757,7 @@ static UINT msi_dialog_dirlist_handler( msi_dialog *dialog, lstrcatW( new_path, text ); lstrcatW( new_path, szBackSlash ); - MSI_SetPropertyW( dialog->package, prop, new_path ); + msi_dialog_set_property( dialog->package, prop, new_path ); msi_dialog_update_directory_list( dialog, NULL ); msi_dialog_update_directory_combo( dialog, NULL ); @@ -2996,7 +3000,7 @@ static UINT msi_dialog_volsel_handler( msi_dialog *dialog, indirect = control->attributes & msidbControlAttributesIndirect; prop = msi_dialog_dup_property( dialog, control->property, indirect ); - MSI_SetPropertyW( dialog->package, prop, text ); + msi_dialog_set_property( dialog->package, prop, text ); msi_free( prop ); return ERROR_SUCCESS; @@ -3399,7 +3403,7 @@ static UINT msi_dialog_send_event( msi_dialog *dialog, LPCWSTR event, LPCWSTR ar return ERROR_SUCCESS; } -static UINT msi_dialog_set_property( msi_dialog *dialog, LPCWSTR event, LPCWSTR arg ) +static UINT msi_dialog_set_property_event( msi_dialog *dialog, LPCWSTR event, LPCWSTR arg ) { static const WCHAR szNullArg[] = { '{','}',0 }; LPWSTR p, prop, arg_fmt = NULL; @@ -3414,7 +3418,7 @@ static UINT msi_dialog_set_property( msi_dialog *dialog, LPCWSTR event, LPCWSTR *p = 0; if( strcmpW( szNullArg, arg ) ) deformat_string( dialog->package, arg, &arg_fmt ); - MSI_SetPropertyW( dialog->package, prop, arg_fmt ); + msi_dialog_set_property( dialog->package, prop, arg_fmt ); msi_dialog_update_controls( dialog, prop ); msi_free( arg_fmt ); } @@ -3437,7 +3441,7 @@ static UINT msi_dialog_control_event( MSIRECORD *rec, LPVOID param ) event = MSI_RecordGetString( rec, 3 ); arg = MSI_RecordGetString( rec, 4 ); if( event[0] == '[' ) - msi_dialog_set_property( dialog, event, arg ); + msi_dialog_set_property_event( dialog, event, arg ); else msi_dialog_send_event( dialog, event, arg ); } @@ -3565,7 +3569,7 @@ static void msi_dialog_set_checkbox_state( msi_dialog *dialog, /* if uncheck then the property is set to NULL */ if (!state) { - MSI_SetPropertyW( dialog->package, control->property, NULL ); + msi_dialog_set_property( dialog->package, control->property, NULL ); return; } @@ -3575,7 +3579,7 @@ static void msi_dialog_set_checkbox_state( msi_dialog *dialog, else val = szState; - MSI_SetPropertyW( dialog->package, control->property, val ); + msi_dialog_set_property( dialog->package, control->property, val ); } static void msi_dialog_checkbox_sync_state( msi_dialog *dialog, @@ -3619,8 +3623,7 @@ static UINT msi_dialog_edit_handler( msi_dialog *dialog, debugstr_w(control->property)); buf = msi_get_window_text( control->hwnd ); - MSI_SetPropertyW( dialog->package, control->property, buf ); - + msi_dialog_set_property( dialog->package, control->property, buf ); msi_free( buf ); return ERROR_SUCCESS; @@ -3635,7 +3638,7 @@ static UINT msi_dialog_radiogroup_handler( msi_dialog *dialog, TRACE("clicked radio button %s, set %s\n", debugstr_w(control->name), debugstr_w(control->property)); - MSI_SetPropertyW( dialog->package, control->property, control->name ); + msi_dialog_set_property( dialog->package, control->property, control->name ); return msi_dialog_button_handler( dialog, control, param ); } @@ -4021,7 +4024,7 @@ static UINT error_dialog_handler(MSIPACKAGE *package, LPCWSTR event, if ( !lstrcmpW( argument, error_abort ) || !lstrcmpW( argument, error_cancel ) || !lstrcmpW( argument, error_no ) ) { - MSI_SetPropertyW( package, result_prop, error_abort ); + MSI_SetPropertyW( package->db, result_prop, error_abort ); } ControlEvent_CleanupSubscriptions(package); diff --git a/dlls/msi/events.c b/dlls/msi/events.c index 331c05a58df..5e35f13f406 100644 --- a/dlls/msi/events.c +++ b/dlls/msi/events.c @@ -380,7 +380,7 @@ static UINT ControlEvent_DirectoryListUp(MSIPACKAGE *package, LPCWSTR argument, static UINT ControlEvent_ReinstallMode(MSIPACKAGE *package, LPCWSTR argument, msi_dialog *dialog) { - return MSI_SetPropertyW( package, szReinstallMode, argument ); + return MSI_SetPropertyW( package->db, szReinstallMode, argument ); } static UINT ControlEvent_Reinstall( MSIPACKAGE *package, LPCWSTR argument, @@ -413,7 +413,7 @@ static UINT ControlEvent_ValidateProductID(MSIPACKAGE *package, LPCWSTR argument if (key && template) { FIXME( "partial stub: template %s key %s\n", debugstr_w(template), debugstr_w(key) ); - ret = MSI_SetPropertyW( package, szProductID, key ); + ret = MSI_SetPropertyW( package->db, szProductID, key ); } msi_free( template ); msi_free( key ); diff --git a/dlls/msi/helpers.c b/dlls/msi/helpers.c index 09ce2cafcdc..7f6081d37f9 100644 --- a/dlls/msi/helpers.c +++ b/dlls/msi/helpers.c @@ -270,14 +270,14 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source, { check_path = msi_dup_property( package->db, cszRootDrive ); if (set_prop) - MSI_SetPropertyW(package,cszTargetDir,check_path); + MSI_SetPropertyW( package->db, cszTargetDir, check_path ); } /* correct misbuilt target dir */ path = build_directory_name(2, check_path, NULL); clean_spaces_from_path( path ); if (strcmpiW(path,check_path)!=0) - MSI_SetPropertyW(package,cszTargetDir,path); + MSI_SetPropertyW( package->db, cszTargetDir, path ); msi_free(check_path); f->ResolvedTarget = path; @@ -310,7 +310,7 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source, TRACE(" internally set to %s\n",debugstr_w(path)); if (set_prop) - MSI_SetPropertyW( package, name, path ); + MSI_SetPropertyW( package->db, name, path ); return path; } @@ -338,7 +338,7 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source, f->ResolvedTarget = strdupW( path ); TRACE("target -> %s\n", debugstr_w(path)); if (set_prop) - MSI_SetPropertyW(package,name,path); + MSI_SetPropertyW( package->db, name, path ); } else { diff --git a/dlls/msi/install.c b/dlls/msi/install.c index 74742945b49..e05bf54da4b 100644 --- a/dlls/msi/install.c +++ b/dlls/msi/install.c @@ -1284,7 +1284,7 @@ UINT MSI_SetInstallLevel( MSIPACKAGE *package, int iInstallLevel ) return MSI_SetFeatureStates( package ); sprintfW( level, fmt, iInstallLevel ); - r = MSI_SetPropertyW( package, szInstallLevel, level ); + r = MSI_SetPropertyW( package->db, szInstallLevel, level ); if ( r == ERROR_SUCCESS ) r = MSI_SetFeatureStates( package ); diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c index c6b22055f60..2606b94604e 100644 --- a/dlls/msi/msi.c +++ b/dlls/msi/msi.c @@ -3535,10 +3535,10 @@ UINT WINAPI MsiReinstallFeatureW( LPCWSTR szProduct, LPCWSTR szFeature, if (r != ERROR_SUCCESS) return r; - MSI_SetPropertyW( package, szReinstallMode, reinstallmode ); - MSI_SetPropertyW( package, szInstalled, szOne ); - MSI_SetPropertyW( package, szLogVerbose, szOne ); - MSI_SetPropertyW( package, szReinstall, szFeature ); + MSI_SetPropertyW( package->db, szReinstallMode, reinstallmode ); + MSI_SetPropertyW( package->db, szInstalled, szOne ); + MSI_SetPropertyW( package->db, szLogVerbose, szOne ); + MSI_SetPropertyW( package->db, szReinstall, szFeature ); r = MSI_InstallPackage( package, sourcepath, NULL ); diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index 562a014cec6..ccf1037f379 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -746,7 +746,7 @@ extern UINT MSI_SetInstallLevel( MSIPACKAGE *package, int iInstallLevel ); extern MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *, LPCWSTR ); extern UINT MSI_OpenPackageW( LPCWSTR szPackage, MSIPACKAGE **pPackage ); extern UINT MSI_SetTargetPathW( MSIPACKAGE *, LPCWSTR, LPCWSTR ); -extern UINT MSI_SetPropertyW( MSIPACKAGE *, LPCWSTR, LPCWSTR ); +extern UINT MSI_SetPropertyW( MSIDATABASE *, LPCWSTR, LPCWSTR ); extern INT MSI_ProcessMessage( MSIPACKAGE *, INSTALLMESSAGE, MSIRECORD * ); extern UINT MSI_GetPropertyW( MSIDATABASE *, LPCWSTR, LPWSTR, LPDWORD ); extern MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *, LPCWSTR ); @@ -974,6 +974,7 @@ 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_file_source(MSIPACKAGE *package, MSIFILE *file); +extern void msi_reset_folders( MSIPACKAGE *package, BOOL source ); extern MSICOMPONENT *get_loaded_component( MSIPACKAGE* package, LPCWSTR Component ); extern MSIFEATURE *get_loaded_feature( MSIPACKAGE* package, LPCWSTR Feature ); extern MSIFILE *get_loaded_file( MSIPACKAGE* package, LPCWSTR file ); diff --git a/dlls/msi/package.c b/dlls/msi/package.c index c859a423f41..66b7ac5a1c1 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -388,7 +388,7 @@ static UINT set_installed_prop( MSIPACKAGE *package ) if (r == ERROR_SUCCESS) { RegCloseKey( hkey ); - MSI_SetPropertyW( package, szInstalled, szOne ); + MSI_SetPropertyW( package->db, szInstalled, szOne ); } return r; @@ -431,7 +431,7 @@ static UINT set_user_sid_prop( MSIPACKAGE *package ) if (!ConvertSidToStringSidW( psid, &sid_str )) goto done; - r = MSI_SetPropertyW( package, szUserSID, sid_str ); + r = MSI_SetPropertyW( package->db, szUserSID, sid_str ); done: LocalFree( sid_str ); @@ -563,7 +563,7 @@ static void set_msi_assembly_prop(MSIPACKAGE *package) if (!val_len || !verstr) goto done; - MSI_SetPropertyW(package, netasm, verstr); + MSI_SetPropertyW(package->db, netasm, verstr); done: msi_free(fusion); @@ -689,96 +689,96 @@ static VOID set_installer_properties(MSIPACKAGE *package) SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES_COMMON,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, CFF, pth); + MSI_SetPropertyW(package->db, CFF, pth); SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, PFF, pth); + MSI_SetPropertyW(package->db, PFF, pth); SHGetFolderPathW(NULL,CSIDL_COMMON_APPDATA,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, CADF, pth); + MSI_SetPropertyW(package->db, CADF, pth); SHGetFolderPathW(NULL,CSIDL_FAVORITES,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, FaF, pth); + MSI_SetPropertyW(package->db, FaF, pth); SHGetFolderPathW(NULL,CSIDL_FONTS,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, FoF, pth); + MSI_SetPropertyW(package->db, FoF, pth); SHGetFolderPathW(NULL,CSIDL_SENDTO,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, SendTF, pth); + MSI_SetPropertyW(package->db, SendTF, pth); SHGetFolderPathW(NULL,CSIDL_STARTMENU,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, SMF, pth); + MSI_SetPropertyW(package->db, SMF, pth); SHGetFolderPathW(NULL,CSIDL_STARTUP,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, StF, pth); + MSI_SetPropertyW(package->db, StF, pth); SHGetFolderPathW(NULL,CSIDL_TEMPLATES,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, TemplF, pth); + MSI_SetPropertyW(package->db, TemplF, pth); SHGetFolderPathW(NULL,CSIDL_DESKTOP,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, DF, pth); + MSI_SetPropertyW(package->db, DF, pth); SHGetFolderPathW(NULL,CSIDL_PROGRAMS,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, PMF, pth); + MSI_SetPropertyW(package->db, PMF, pth); SHGetFolderPathW(NULL,CSIDL_ADMINTOOLS,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, ATF, pth); + MSI_SetPropertyW(package->db, ATF, pth); SHGetFolderPathW(NULL,CSIDL_APPDATA,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, ADF, pth); + MSI_SetPropertyW(package->db, ADF, pth); SHGetFolderPathW(NULL,CSIDL_SYSTEM,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, SF, pth); - MSI_SetPropertyW(package, SF16, pth); + MSI_SetPropertyW(package->db, SF, pth); + MSI_SetPropertyW(package->db, SF16, pth); SHGetFolderPathW(NULL,CSIDL_LOCAL_APPDATA,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, LADF, pth); + MSI_SetPropertyW(package->db, LADF, pth); SHGetFolderPathW(NULL,CSIDL_MYPICTURES,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, MPF, pth); + MSI_SetPropertyW(package->db, MPF, pth); SHGetFolderPathW(NULL,CSIDL_PERSONAL,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, PF, pth); + MSI_SetPropertyW(package->db, PF, pth); SHGetFolderPathW(NULL,CSIDL_WINDOWS,NULL,0,pth); strcatW(pth, szBackSlash); - MSI_SetPropertyW(package, WF, pth); + MSI_SetPropertyW(package->db, WF, pth); /* Physical Memory is specified in MB. Using total amount. */ msex.dwLength = sizeof(msex); GlobalMemoryStatusEx( &msex ); sprintfW( bufstr, szIntFormat, (int)(msex.ullTotalPhys/1024/1024)); - MSI_SetPropertyW(package, szPhysicalMemory, bufstr); + MSI_SetPropertyW(package->db, szPhysicalMemory, bufstr); SHGetFolderPathW(NULL,CSIDL_WINDOWS,NULL,0,pth); ptr = strchrW(pth,'\\'); if (ptr) *(ptr+1) = 0; - MSI_SetPropertyW(package, WV, pth); + MSI_SetPropertyW(package->db, WV, pth); GetTempPathW(MAX_PATH,pth); - MSI_SetPropertyW(package, TF, pth); + MSI_SetPropertyW(package->db, TF, pth); /* in a wine environment the user is always admin and privileged */ - MSI_SetPropertyW(package,szAdminUser,szOne); - MSI_SetPropertyW(package,szPriv,szOne); + MSI_SetPropertyW(package->db, szAdminUser, szOne); + MSI_SetPropertyW(package->db, szPriv, szOne); /* set the os things */ OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW); @@ -788,39 +788,39 @@ static VOID set_installer_properties(MSIPACKAGE *package) switch (OSVersion.dwPlatformId) { case VER_PLATFORM_WIN32_WINDOWS: - MSI_SetPropertyW(package,v9x,verstr); + MSI_SetPropertyW(package->db, v9x, verstr); break; case VER_PLATFORM_WIN32_NT: - MSI_SetPropertyW(package,vNT,verstr); + MSI_SetPropertyW(package->db, vNT, verstr); sprintfW(verstr,szFormat,OSVersion.wProductType); - MSI_SetPropertyW(package,szMsiNTProductType,verstr); + MSI_SetPropertyW(package->db, szMsiNTProductType, verstr); break; } sprintfW(verstr,szFormat,OSVersion.dwBuildNumber); - MSI_SetPropertyW(package,szWinBuild,verstr); + MSI_SetPropertyW(package->db, szWinBuild, verstr); /* just fudge this */ - MSI_SetPropertyW(package,szSPL,szSix); + MSI_SetPropertyW(package->db, szSPL, szSix); sprintfW( bufstr, szFormat2, MSI_MAJORVERSION, MSI_MINORVERSION); - MSI_SetPropertyW( package, szVersionMsi, bufstr ); + MSI_SetPropertyW( package->db, szVersionMsi, bufstr ); sprintfW( bufstr, szFormat, MSI_MAJORVERSION * 100); - MSI_SetPropertyW( package, szVersionDatabase, bufstr ); + MSI_SetPropertyW( package->db, szVersionDatabase, bufstr ); GetSystemInfo( &sys_info ); if (sys_info.u.s.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) { sprintfW( bufstr, szIntFormat, sys_info.wProcessorLevel ); - MSI_SetPropertyW( package, szIntel, bufstr ); + MSI_SetPropertyW( package->db, szIntel, bufstr ); } /* Screen properties. */ dc = GetDC(0); sprintfW( bufstr, szIntFormat, GetDeviceCaps( dc, HORZRES ) ); - MSI_SetPropertyW( package, szScreenX, bufstr ); + MSI_SetPropertyW( package->db, szScreenX, bufstr ); sprintfW( bufstr, szIntFormat, GetDeviceCaps( dc, VERTRES )); - MSI_SetPropertyW( package, szScreenY, bufstr ); + MSI_SetPropertyW( package->db, szScreenY, bufstr ); sprintfW( bufstr, szIntFormat, GetDeviceCaps( dc, BITSPIXEL )); - MSI_SetPropertyW( package, szColorBits, bufstr ); + MSI_SetPropertyW( package->db, szColorBits, bufstr ); ReleaseDC(0, dc); /* USERNAME and COMPANYNAME */ @@ -832,10 +832,10 @@ static VOID set_installer_properties(MSIPACKAGE *package) { if (!username && (username = msi_reg_get_val_str( hkey, szDefName ))) - MSI_SetPropertyW( package, szUSERNAME, username ); + MSI_SetPropertyW( package->db, szUSERNAME, username ); if (!companyname && (companyname = msi_reg_get_val_str( hkey, szDefCompany ))) - MSI_SetPropertyW( package, szCOMPANYNAME, companyname ); + MSI_SetPropertyW( package->db, szCOMPANYNAME, companyname ); CloseHandle( hkey ); } if ((!username || !companyname) && @@ -843,10 +843,10 @@ static VOID set_installer_properties(MSIPACKAGE *package) { if (!username && (username = msi_reg_get_val_str( hkey, szRegisteredUser ))) - MSI_SetPropertyW( package, szUSERNAME, username ); + MSI_SetPropertyW( package->db, szUSERNAME, username ); if (!companyname && (companyname = msi_reg_get_val_str( hkey, szRegisteredOrg ))) - MSI_SetPropertyW( package, szCOMPANYNAME, companyname ); + MSI_SetPropertyW( package->db, szCOMPANYNAME, companyname ); CloseHandle( hkey ); } msi_free( username ); @@ -859,7 +859,7 @@ static VOID set_installer_properties(MSIPACKAGE *package) GetSystemTime( &systemtime ); if (GetDateFormatW( LOCALE_USER_DEFAULT, DATE_SHORTDATE, &systemtime, NULL, bufstr, sizeof(bufstr)/sizeof(bufstr[0]) )) - MSI_SetPropertyW( package, szDate, bufstr ); + MSI_SetPropertyW( package->db, szDate, bufstr ); else ERR("Couldn't set Date property: GetDateFormat failed with error %d\n", GetLastError()); @@ -867,7 +867,7 @@ static VOID set_installer_properties(MSIPACKAGE *package) TIME_FORCE24HOURFORMAT | TIME_NOTIMEMARKER, &systemtime, NULL, bufstr, sizeof(bufstr)/sizeof(bufstr[0]) )) - MSI_SetPropertyW( package, szTime, bufstr ); + MSI_SetPropertyW( package->db, szTime, bufstr ); else ERR("Couldn't set Time property: GetTimeFormat failed with error %d\n", GetLastError()); @@ -875,16 +875,14 @@ static VOID set_installer_properties(MSIPACKAGE *package) langid = GetUserDefaultLangID(); sprintfW(bufstr, szIntFormat, langid); - - MSI_SetPropertyW( package, szUserLangID, bufstr ); + MSI_SetPropertyW( package->db, szUserLangID, bufstr ); langid = GetSystemDefaultLangID(); sprintfW(bufstr, szIntFormat, langid); - - MSI_SetPropertyW( package, szSystemLangID, bufstr ); + MSI_SetPropertyW( package->db, szSystemLangID, bufstr ); sprintfW(bufstr, szIntFormat, MsiQueryProductStateW(package->ProductCode)); - MSI_SetPropertyW( package, szProductState, bufstr ); + MSI_SetPropertyW( package->db, szProductState, bufstr ); len = 0; if (!GetUserNameW( NULL, &len ) && GetLastError() == ERROR_MORE_DATA) @@ -893,7 +891,7 @@ static VOID set_installer_properties(MSIPACKAGE *package) if ((username = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) { if (GetUserNameW( username, &len )) - MSI_SetPropertyW( package, szLogonUser, username ); + MSI_SetPropertyW( package->db, szLogonUser, username ); HeapFree( GetProcessHeap(), 0, username ); } } @@ -952,7 +950,7 @@ static UINT msi_load_summary_properties( MSIPACKAGE *package ) goto done; } - MSI_SetPropertyW( package, szPackageCode, package_code ); + MSI_SetPropertyW( package->db, szPackageCode, package_code ); msi_free( package_code ); /* load package attributes */ @@ -1016,7 +1014,7 @@ static void adjust_allusers_property( MSIPACKAGE *package ) if (msi_get_property_int( package->db, szAllUsers, 0 ) == 2) { TRACE("resetting ALLUSERS property from 2 to 1\n"); - MSI_SetPropertyW( package, szAllUsers, szOne ); + MSI_SetPropertyW( package->db, szAllUsers, szOne ); } } @@ -1048,7 +1046,7 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url ) set_installer_properties( package ); sprintfW(uilevel,szpi,gUILevel); - MSI_SetPropertyW(package, szLevel, uilevel); + MSI_SetPropertyW(package->db, szLevel, uilevel); r = msi_load_summary_properties( package ); if (r != ERROR_SUCCESS) @@ -1273,18 +1271,18 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) if( file != szPackage ) track_tempfile( package, file ); - MSI_SetPropertyW( package, Database, db->path ); + MSI_SetPropertyW( package->db, Database, db->path ); if( UrlIsW( szPackage, URLIS_URL ) ) - MSI_SetPropertyW( package, OriginalDatabase, szPackage ); + MSI_SetPropertyW( package->db, OriginalDatabase, szPackage ); else if( szPackage[0] == '#' ) - MSI_SetPropertyW( package, OriginalDatabase, db->path ); + MSI_SetPropertyW( package->db, OriginalDatabase, db->path ); else { WCHAR fullpath[MAX_PATH]; GetFullPathNameW( szPackage, MAX_PATH, fullpath, NULL ); - MSI_SetPropertyW( package, OriginalDatabase, fullpath ); + MSI_SetPropertyW( package->db, OriginalDatabase, fullpath ); } package->script = msi_alloc_zero( sizeof(MSISCRIPT) ); @@ -1631,7 +1629,7 @@ end: return r; } -static void msi_reset_folders( MSIPACKAGE *package, BOOL source ) +void msi_reset_folders( MSIPACKAGE *package, BOOL source ) { MSIFOLDER *folder; @@ -1650,7 +1648,7 @@ static void msi_reset_folders( MSIPACKAGE *package, BOOL source ) } } -UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue) +UINT MSI_SetPropertyW( MSIDATABASE *db, LPCWSTR szName, LPCWSTR szValue ) { MSIQUERY *view; MSIRECORD *row = NULL; @@ -1674,7 +1672,7 @@ UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue) '`','_','P','r','o','p','e','r','t','y','`',' ','W','H','E','R','E',' ', '`','_','P','r','o','p','e','r','t','y','`',' ','=',' ','\'','%','s','\'',0}; - TRACE("%p %s %s\n", package, debugstr_w(szName), debugstr_w(szValue)); + TRACE("%p %s %s\n", db, debugstr_w(szName), debugstr_w(szValue)); if (!szName) return ERROR_INVALID_PARAMETER; @@ -1683,7 +1681,7 @@ UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue) if (!szName[0]) return szValue ? ERROR_FUNCTION_FAILED : ERROR_SUCCESS; - rc = MSI_GetPropertyW(package->db, szName, 0, &sz); + rc = MSI_GetPropertyW(db, szName, 0, &sz); if (!szValue || !*szValue) { sprintfW(Query, Delete, szName); @@ -1704,7 +1702,7 @@ UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue) MSI_RecordSetStringW(row, 2, szValue); } - rc = MSI_DatabaseOpenViewW(package->db, Query, &view); + rc = MSI_DatabaseOpenViewW(db, Query, &view); if (rc == ERROR_SUCCESS) { rc = MSI_ViewExecute(view, row); @@ -1715,9 +1713,6 @@ UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue) if (row) msiobj_release(&row->hdr); - if (rc == ERROR_SUCCESS && (!lstrcmpW(szName, cszSourceDir))) - msi_reset_folders(package, TRUE); - return rc; } @@ -1764,7 +1759,10 @@ UINT WINAPI MsiSetPropertyW( MSIHANDLE hInstall, LPCWSTR szName, LPCWSTR szValue return ERROR_SUCCESS; } - ret = MSI_SetPropertyW( package, szName, szValue); + ret = MSI_SetPropertyW( package->db, szName, szValue ); + if (ret == ERROR_SUCCESS && !strcmpW( szName, cszSourceDir )) + msi_reset_folders( package, TRUE ); + msiobj_release( &package->hdr ); return ret; } diff --git a/dlls/msi/upgrade.c b/dlls/msi/upgrade.c index 5fb39bbe200..4e088a74638 100644 --- a/dlls/msi/upgrade.c +++ b/dlls/msi/upgrade.c @@ -61,6 +61,7 @@ static void append_productcode(MSIPACKAGE* package, LPCWSTR action_property, LPWSTR prop; LPWSTR newprop; DWORD len; + UINT r; prop = msi_dup_property(package->db, action_property ); if (prop) @@ -87,9 +88,13 @@ static void append_productcode(MSIPACKAGE* package, LPCWSTR action_property, newprop[0] = 0; strcatW(newprop,productid); - MSI_SetPropertyW(package, action_property, newprop); - TRACE("Found Related Product... %s now %s\n",debugstr_w(action_property), - debugstr_w(newprop)); + r = MSI_SetPropertyW( package->db, action_property, newprop ); + if (r == ERROR_SUCCESS && !strcmpW( action_property, cszSourceDir )) + msi_reset_folders( package, TRUE ); + + TRACE("Found Related Product... %s now %s\n", + debugstr_w(action_property), debugstr_w(newprop)); + msi_free( prop ); msi_free( newprop ); }