UINT ACTION_FindRelatedProducts(MSIPACKAGE *package) { static const WCHAR query[] = { 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', '`','U','p','g','r','a','d','e','`',0}; MSIQUERY *view; UINT rc; if (msi_get_property_int(package->db, szInstalled, 0)) { TRACE("Skipping FindRelatedProducts action: product already installed\n"); return ERROR_SUCCESS; } if (msi_action_is_unique(package, szFindRelatedProducts)) { TRACE("Skipping FindRelatedProducts action: already done in UI sequence\n"); return ERROR_SUCCESS; } else msi_register_unique_action(package, szFindRelatedProducts); rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, ITERATE_FindRelatedProducts, package); msiobj_release(&view->hdr); return rc; }
static UINT msi_change_media( MSIPACKAGE *package, struct media_info *mi ) { LPSTR msg; LPWSTR error, error_dialog; LPWSTR source_dir; UINT r = ERROR_SUCCESS; static const WCHAR szUILevel[] = {'U','I','L','e','v','e','l',0}; static const WCHAR error_prop[] = {'E','r','r','o','r','D','i','a','l','o','g',0}; if ( (msi_get_property_int(package, szUILevel, 0) & INSTALLUILEVEL_MASK) == INSTALLUILEVEL_NONE && !gUIHandlerA ) return ERROR_SUCCESS; error = generate_error_string( package, 1302, 1, mi->disk_prompt ); error_dialog = msi_dup_property( package, error_prop ); source_dir = msi_dup_property( package, cszSourceDir ); PathStripToRootW(source_dir); while ( r == ERROR_SUCCESS && !source_matches_volume(mi, source_dir) ) { r = msi_spawn_error_dialog( package, error_dialog, error ); if (gUIHandlerA) { msg = strdupWtoA( error ); gUIHandlerA( gUIContext, MB_RETRYCANCEL | INSTALLMESSAGE_ERROR, msg ); msi_free(msg); } } msi_free( error ); msi_free( error_dialog ); msi_free( source_dir ); return r; }