summaryrefslogtreecommitdiff
path: root/solenv/bin/modules
diff options
context:
space:
mode:
authorAndras Timar <andras.timar@collabora.com>2013-10-25 06:38:06 -0700
committerAndras Timar <andras.timar@collabora.com>2013-10-25 07:32:52 -0700
commit7d97ec9a3eba9ceacbea631a56185e40b62fdec7 (patch)
tree765bb657349e4b15df04c61f517b9d5309dc42dc /solenv/bin/modules
parent1d3661cf91cf45d40373b0034c30eb57b475ec91 (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.pm2
-rw-r--r--solenv/bin/modules/installer/globals.pm2
-rw-r--r--solenv/bin/modules/installer/setupscript.pm31
-rw-r--r--solenv/bin/modules/installer/windows/component.pm7
-rw-r--r--solenv/bin/modules/installer/windows/file.pm24
-rw-r--r--solenv/bin/modules/installer/windows/property.pm3
-rw-r--r--solenv/bin/modules/installer/windows/registry.pm38
-rw-r--r--solenv/bin/modules/installer/windows/shortcut.pm69
-rw-r--r--solenv/bin/modules/installer/worker.pm28
-rw-r--r--solenv/bin/modules/t/installer-setupscript.t1
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