diff options
author | Andras Timar <andras.timar@collabora.com> | 2013-10-25 06:38:06 -0700 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2013-10-25 07:32:52 -0700 |
commit | 7d97ec9a3eba9ceacbea631a56185e40b62fdec7 (patch) | |
tree | 765bb657349e4b15df04c61f517b9d5309dc42dc /solenv/bin/modules | |
parent | 1d3661cf91cf45d40373b0034c30eb57b475ec91 (diff) |
fdo#65102 respect user's choice not to install desktop icon
Using advertised shortcuts -- inspired by Intel AppUp Centre's
requirement -- was not a good idea after all. I revert this,
and I also revert the commit that actually disabled it in
default Windows builds.
This reverts commit aa2450cb51cfc3805c7a596b6b89d70bb133821e.
This reverts commit b40012bd6d0b5387005253f1d3f03929ce4d1ac6.
Diffstat (limited to 'solenv/bin/modules')
-rw-r--r-- | solenv/bin/modules/installer.pm | 2 | ||||
-rw-r--r-- | solenv/bin/modules/installer/globals.pm | 2 | ||||
-rw-r--r-- | solenv/bin/modules/installer/setupscript.pm | 31 | ||||
-rw-r--r-- | solenv/bin/modules/installer/windows/component.pm | 7 | ||||
-rw-r--r-- | solenv/bin/modules/installer/windows/file.pm | 24 | ||||
-rw-r--r-- | solenv/bin/modules/installer/windows/property.pm | 3 | ||||
-rw-r--r-- | solenv/bin/modules/installer/windows/registry.pm | 38 | ||||
-rw-r--r-- | solenv/bin/modules/installer/windows/shortcut.pm | 69 | ||||
-rw-r--r-- | solenv/bin/modules/installer/worker.pm | 28 | ||||
-rw-r--r-- | solenv/bin/modules/t/installer-setupscript.t | 1 |
10 files changed, 201 insertions, 4 deletions
diff --git a/solenv/bin/modules/installer.pm b/solenv/bin/modules/installer.pm index 0b5e845e1731..3d36acfb56ce 100644 --- a/solenv/bin/modules/installer.pm +++ b/solenv/bin/modules/installer.pm @@ -373,6 +373,8 @@ sub run { $folderitempropertiesinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "FolderItemProperty"); + installer::setupscript::prepare_non_advertised_files($folderitemsinproductarrayref, $filesinproductarrayref); + installer::logger::print_message( "... analyzing registryitems ... \n" ); $registryitemsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "RegistryItem"); diff --git a/solenv/bin/modules/installer/globals.pm b/solenv/bin/modules/installer/globals.pm index 3cc3aeff9ea0..29ca75d63afd 100644 --- a/solenv/bin/modules/installer/globals.pm +++ b/solenv/bin/modules/installer/globals.pm @@ -186,6 +186,8 @@ BEGIN $refresh_includepaths = 0; $include_paths_read = 0; @patchfilecollector = (); + @userregistrycollector = (); + $addeduserregitrykeys = 0; $desktoplinkexists = 0; $analyze_spellcheckerlanguage = 0; %spellcheckerlanguagehash = (); diff --git a/solenv/bin/modules/installer/setupscript.pm b/solenv/bin/modules/installer/setupscript.pm index cc78f9a2f828..e47f0bd8336a 100644 --- a/solenv/bin/modules/installer/setupscript.pm +++ b/solenv/bin/modules/installer/setupscript.pm @@ -33,6 +33,7 @@ our @EXPORT_OK = qw( add_predefined_folder get_all_items_from_script get_all_scriptvariables_from_installation_object + prepare_non_advertised_files replace_all_setupscriptvariables_in_script replace_preset_properties resolve_lowercase_productname_setupscriptvariable @@ -395,6 +396,36 @@ sub add_predefined_folder } ##################################################################################### +# If folderitems are non-advertised, the component needs to have a registry key +# below HKCU as key path. Therefore it is required, to mark the file belonging +# to a non-advertised shortcut, that a special userreg_xxx registry key can be +# created during packing process. +##################################################################################### + +sub prepare_non_advertised_files +{ + my ( $folderitemref, $filesref ) = @_; + + for ( my $i = 0; $i <= $#{$folderitemref}; $i++ ) + { + my $folderitem = ${$folderitemref}[$i]; + my $styles = ""; + if ( $folderitem->{'Styles'} ) { $styles = $folderitem->{'Styles'}; } + + if ( $styles =~ /\bNON_ADVERTISED\b/ ) + { + my $fileid = $folderitem->{'FileID'}; + if ( $folderitem->{'ComponentIDFile'} ) { $fileid = $folderitem->{'ComponentIDFile'}; } + my $onefile = installer::worker::find_file_by_id($filesref, $fileid); + + # Attention: If $onefile with "FileID" is not found, this is not always an error. + # FileID can also contain an executable file, for example msiexec.exe. + if ( $onefile ne "" ) { $onefile->{'needs_user_registry_key'} = 1; } + } + } +} + +##################################################################################### # Adding all variables defined in the installation object into the hash # of all variables from the zip list file. # This is needed if variables are defined in the installation object, diff --git a/solenv/bin/modules/installer/windows/component.pm b/solenv/bin/modules/installer/windows/component.pm index 8f48941e19c6..65d79b84b816 100644 --- a/solenv/bin/modules/installer/windows/component.pm +++ b/solenv/bin/modules/installer/windows/component.pm @@ -218,6 +218,11 @@ sub get_file_component_attributes $attributes = 0; # Assembly files cannot run from source } + if ( $onefile->{'needs_user_registry_key'} ) + { + $attributes = 4; # Files in non advertised startmenu entries must have user registry key as KeyPath + } + # Setting msidbComponentAttributes64bit, if this is a 64 bit installation set. if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) { $attributes |= 256; } @@ -351,6 +356,8 @@ sub get_component_keypath } } + if ( $oneitem->{'userregkeypath'} ) { $keypath = $oneitem->{'userregkeypath'}; } + # saving it in the file and registry collection $oneitem->{'keypath'} = $keypath; diff --git a/solenv/bin/modules/installer/windows/file.pm b/solenv/bin/modules/installer/windows/file.pm index a1026db48581..ce345927d999 100644 --- a/solenv/bin/modules/installer/windows/file.pm +++ b/solenv/bin/modules/installer/windows/file.pm @@ -662,6 +662,22 @@ sub get_language_for_file } #################################################################### +# Creating a new KeyPath for components in TemplatesFolder. +#################################################################### + +sub generate_registry_keypath +{ + my ($onefile) = @_; + + my $keypath = $onefile->{'Name'}; + $keypath =~ s/\.//g; + $keypath = lc($keypath); + $keypath = "userreg_" . $keypath; + + return $keypath; +} + +#################################################################### # Check, if in an update process files are missing. No removal # of files allowed for Windows Patch creation. # Also logging all new files, that have to be included in extra @@ -942,6 +958,14 @@ sub create_files_table my $destdir = ""; if ( $onefile->{'Dir'} ) { $destdir = $onefile->{'Dir'}; } + + if ( $onefile->{'needs_user_registry_key'} ) + { + my $keypath = generate_registry_keypath($onefile); + $onefile->{'userregkeypath'} = $keypath; + push(@installer::globals::userregistrycollector, $onefile); + $installer::globals::addeduserregitrykeys = 1; + } } # putting content from %allfilecomponents to $allfilecomponentsref for later usage diff --git a/solenv/bin/modules/installer/windows/property.pm b/solenv/bin/modules/installer/windows/property.pm index 5bd250833774..0742ebd3c23b 100644 --- a/solenv/bin/modules/installer/windows/property.pm +++ b/solenv/bin/modules/installer/windows/property.pm @@ -270,9 +270,6 @@ sub set_important_properties $onepropertyline = "DONTOPTIMIZELIBS" . "\t" . "0" . "\n"; push(@{$propertyfile}, $onepropertyline); - $onepropertyline = "DISABLEADVTSHORTCUTS" . "\t" . "1" . "\n"; - push(@{$propertyfile}, $onepropertyline); - if ( $installer::globals::officedirhostname ) { my $onepropertyline = "OFFICEDIRHOSTNAME" . "\t" . $installer::globals::officedirhostname . "\n"; diff --git a/solenv/bin/modules/installer/windows/registry.pm b/solenv/bin/modules/installer/windows/registry.pm index d0605afe2ab1..81c4f9a3b268 100644 --- a/solenv/bin/modules/installer/windows/registry.pm +++ b/solenv/bin/modules/installer/windows/registry.pm @@ -289,6 +289,38 @@ sub get_registry_component } ###################################################### +# Adding the content of +# @installer::globals::userregistrycollector +# to the registry table. The content was collected +# in create_files_table() in file.pm. +###################################################### + +sub add_userregs_to_registry_table +{ + my ( $registrytable, $allvariables ) = @_; + + for ( my $i = 0; $i <= $#installer::globals::userregistrycollector; $i++ ) + { + my $onefile = $installer::globals::userregistrycollector[$i]; + + my %registry = (); + + $registry{'Registry'} = $onefile->{'userregkeypath'}; + $registry{'Root'} = "1"; # always HKCU + $registry{'Key'} = "Software\\$allvariables->{'MANUFACTURER'}\\$allvariables->{'PRODUCTNAME'} $allvariables->{'PRODUCTVERSION'}\\"; + if ( $onefile->{'needs_user_registry_key'} ) { $registry{'Key'} = $registry{'Key'} . "StartMenu"; } + $registry{'Name'} = $onefile->{'Name'}; + $registry{'Value'} = "1"; + $registry{'Component_'} = $onefile->{'componentname'}; + + my $oneline = $registry{'Registry'} . "\t" . $registry{'Root'} . "\t" . $registry{'Key'} . "\t" + . $registry{'Name'} . "\t" . $registry{'Value'} . "\t" . $registry{'Component_'} . "\n"; + + push(@{$registrytable}, $oneline); + } +} + +###################################################### # Creating the file Registry.idt dynamically # Content: # Registry Root Key Name Value Component_ @@ -360,6 +392,12 @@ sub create_registry_table push(@registrytable, $oneline); } + # If there are added user registry keys for files collected in + # @installer::globals::userregistrycollector (file.pm), then + # this registry keys have to be added now. + + if ( $installer::globals::addeduserregitrykeys ) { add_userregs_to_registry_table(\@registrytable, $allvariableshashref); } + # Saving the file my $registrytablename = $basedir . $installer::globals::separator . "Registry.idt" . "." . $onelanguage; diff --git a/solenv/bin/modules/installer/windows/shortcut.pm b/solenv/bin/modules/installer/windows/shortcut.pm index b32c772b6471..421a649fb56e 100644 --- a/solenv/bin/modules/installer/windows/shortcut.pm +++ b/solenv/bin/modules/installer/windows/shortcut.pm @@ -112,6 +112,14 @@ sub get_shortcut_component my $found = 0; my $shortcut_fileid = $shortcut->{'FileID'}; + my $absolute_filename = 0; + if ( $shortcut->{'Styles'} ) { $styles = $shortcut->{'Styles'}; } + if ( $styles =~ /\bABSOLUTE_FILENAME\b/ ) { $absolute_filename = 1; } # FileID contains an absolute filename + if ( $styles =~ /\bUSE_HELPER_FILENAME\b/ ) { $absolute_filename = 1; } # ComponentIDFile contains id of a helper file + + # if the FileID contains an absolute filename, therefore the entry for "ComponentIDFile" has to be used. + if ( $absolute_filename ) { $shortcut_fileid = $shortcut->{'ComponentIDFile'}; } + for ( my $i = 0; $i <= $#{$filesref}; $i++ ) { $onefile = ${$filesref}[$i]; @@ -342,18 +350,71 @@ sub get_folderitem_directory ######################################################################## # Returning the target (feature) for a folderitem for shortcut table. +# For non-advertised shortcuts this is a formatted string. ######################################################################## sub get_folderitem_target { my ($shortcut, $filesref) = @_; - my $target = $shortcut->{'ModuleID'}; + my $onefile; + my $target = ""; + my $found = 0; + my $shortcut_fileid = $shortcut->{'FileID'}; + + my $styles = ""; + my $nonadvertised = 0; + my $absolute_filename = 0; + if ( $shortcut->{'Styles'} ) { $styles = $shortcut->{'Styles'}; } + if ( $styles =~ /\bNON_ADVERTISED\b/ ) { $nonadvertised = 1; } # this is a non-advertised shortcut + if ( $styles =~ /\bABSOLUTE_FILENAME\b/ ) { $absolute_filename = 1; } # FileID contains an absolute filename + + # if the FileID contains an absolute filename this can simply be returned as target for the shortcut table. + if ( $absolute_filename ) + { + $shortcut->{'target'} = $shortcut_fileid; + return $shortcut_fileid; + } + + for ( my $i = 0; $i <= $#{$filesref}; $i++ ) + { + $onefile = ${$filesref}[$i]; + my $filegid = $onefile->{'gid'}; + + if ( $filegid eq $shortcut_fileid ) + { + $found = 1; + last; + } + } + + if (!($found)) + { + installer::exiter::exit_program("ERROR: Did not find FileID $shortcut_fileid in file collection for folderitem", "get_folderitem_target"); + } + + # Non advertised shortcuts do not return the feature, but the path to the file + if ( $nonadvertised ) + { + $target = "\[" . $onefile->{'uniquedirname'} . "\]" . "\\" . $onefile->{'Name'}; + $shortcut->{'target'} = $target; + return $target; + } + + # the rest only for advertised shortcuts, which contain the feature in the shortcut table. + + if ( $onefile->{'modules'} ) { $target = $onefile->{'modules'}; } + + # If modules contains a list of modules, only taking the first one. + # But this should never be needed + + if ( $target =~ /^\s*(.*?)\,/ ) { $target = $1; } # Attention: Maximum feature length is 38! installer::windows::idtglobal::shorten_feature_gid(\$target); # and finally saving the target in the folderitems collector + $shortcut->{'target'} = $target; return $target; @@ -385,6 +446,7 @@ sub get_folderitem_icon my $styles = ""; if ( $shortcut->{'Styles'} ) { $styles = $shortcut->{'Styles'}; } + if ( $styles =~ /\bNON_ADVERTISED\b/ ) { return ""; } # no icon for non-advertised shortcuts my $iconfilegid = ""; @@ -432,6 +494,11 @@ sub get_folderitem_icon sub get_folderitem_iconindex { my ($shortcut) = @_; + + my $styles = ""; + if ( $shortcut->{'Styles'} ) { $styles = $shortcut->{'Styles'}; } + if ( $styles =~ /\bNON_ADVERTISED\b/ ) { return ""; } # no iconindex for non-advertised shortcuts + my $iconid = 0; if ( $shortcut->{'IconID'} ) { $iconid = $shortcut->{'IconID'}; } diff --git a/solenv/bin/modules/installer/worker.pm b/solenv/bin/modules/installer/worker.pm index 4022907c0151..662069532fe0 100644 --- a/solenv/bin/modules/installer/worker.pm +++ b/solenv/bin/modules/installer/worker.pm @@ -627,6 +627,34 @@ sub collect_all_files_from_includepaths push( @installer::globals::globallogfileinfo, "\n"); } +############################################## +# Searching for a file with the gid +############################################## + +sub find_file_by_id +{ + my ( $filesref, $gid ) = @_; + + my $foundfile = 0; + my $onefile; + + for ( my $i = 0; $i <= $#{$filesref}; $i++ ) + { + $onefile = ${$filesref}[$i]; + my $filegid = $onefile->{'gid'}; + + if ( $filegid eq $gid ) + { + $foundfile = 1; + last; + } + } + + if (! $foundfile ) { $onefile = ""; } + + return $onefile; +} + ################################################# # Generating paths for cygwin (second version) # This function generates smaller files for diff --git a/solenv/bin/modules/t/installer-setupscript.t b/solenv/bin/modules/t/installer-setupscript.t index 5bed7d1bbd5e..2994288e2a39 100644 --- a/solenv/bin/modules/t/installer-setupscript.t +++ b/solenv/bin/modules/t/installer-setupscript.t @@ -20,6 +20,7 @@ BEGIN { add_predefined_folder get_all_items_from_script get_all_scriptvariables_from_installation_object + prepare_non_advertised_files replace_all_setupscriptvariables_in_script replace_preset_properties resolve_lowercase_productname_setupscriptvariable |