blob: 303ffcd5d5db42bf65a95956e49ddb0eb93dbf14 [file] [log] [blame]
#**************************************************************
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
#**************************************************************
package installer::windows::shortcut;
use installer::existence;
use installer::exiter;
use installer::files;
use installer::globals;
use installer::windows::idtglobal;
##############################################################
# Returning the file object for the msiassembly table.
##############################################################
sub get_file_by_name
{
my ( $filesref, $filename ) = @_;
my $foundfile = 0;
my $onefile;
for ( my $i = 0; $i <= $#{$filesref}; $i++ )
{
$onefile = ${$filesref}[$i];
my $name = $onefile->{'Name'};
if ( $name eq $filename )
{
$foundfile = 1;
last;
}
}
if (! $foundfile ) { $onefile = ""; }
return $onefile;
}
##############################################################
# Returning identifier for shortcut table.
##############################################################
sub get_shortcut_identifier
{
my ($shortcut) = @_;
my $identifier = $shortcut->{'gid'};
return $identifier;
}
##############################################################
# Returning directory for shortcut table.
##############################################################
sub get_shortcut_directory
{
my ($shortcut, $dirref) = @_;
# For shortcuts it is easy to convert the gid_Dir_Abc into the unique name in
# the directory table, for instance help_en_simpressidx.
# For files (components) this is not so easy, because files can be included
# in zip files with subdirectories that are not defined in scp.
my $onedir;
my $shortcutdirectory = $shortcut->{'Dir'};
my $directory = "";
my $found = 0;
for ( my $i = 0; $i <= $#{$dirref}; $i++ )
{
$onedir = ${$dirref}[$i];
my $directorygid = $onedir->{'Dir'};
if ( $directorygid eq $shortcutdirectory )
{
$found = 1;
last;
}
}
if (!($found))
{
installer::exiter::exit_program("ERROR: Did not find DirectoryID $shortcutdirectory in directory collection for shortcut", "get_shortcut_directory");
}
$directory = $onedir->{'uniquename'};
if ($directory eq "") { $directory = "INSTALLLOCATION"; } # Shortcuts in the root directory
return $directory;
}
##############################################################
# Returning name for shortcut table.
##############################################################
sub get_shortcut_name
{
my ($shortcut, $shortnamesref, $onelanguage) = @_;
my $returnstring;
my $name = $shortcut->{'Name'};
my $shortstring = installer::windows::idtglobal::make_eight_three_conform($name, "shortcut", $shortnamesref);
$shortstring =~ s/\s/\_/g; # replacing white spaces with underline
if ( $shortstring eq $name ) { $returnstring = $name; } # nothing changed
else {$returnstring = $shortstring . "\|" . $name; }
return $returnstring;
}
##############################################################
# Returning component for shortcut table.
##############################################################
sub get_shortcut_component
{
my ($shortcut, $filesref) = @_;
my $onefile;
my $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];
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 shortcut", "get_shortcut_component");
}
$component = $onefile->{'componentname'};
# finally saving the componentname in the folderitem collector
$shortcut->{'component'} = $component;
return $component;
}
##############################################################
# Returning target for shortcut table.
##############################################################
sub get_shortcut_target
{
my ($shortcut, $filesref) = @_;
my $target = "";
my $found = 0;
my $shortcut_fileid = $shortcut->{'FileID'};
my $onefile;
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 shortcut", "get_shortcut_target");
}
if ( $onefile->{'Name'} )
{
$target = $onefile->{'Name'};
}
$target = "\[\#" . $target . "\]"; # format for Non-Advertised shortcuts
return $target;
}
##############################################################
# Returning arguments for shortcut table.
##############################################################
sub get_shortcut_arguments
{
my ($shortcut) = @_;
return "";
}
##############################################################
# Returning the localized description for shortcut table.
##############################################################
sub get_shortcut_description
{
my ($shortcut, $onelanguage) = @_;
my $description = "";
if ( $shortcut->{'Tooltip'} ) { $description = $shortcut->{'Tooltip'}; }
return $description;
}
##############################################################
# Returning hotkey for shortcut table.
##############################################################
sub get_shortcut_hotkey
{
my ($shortcut) = @_;
return "";
}
##############################################################
# Returning icon for shortcut table.
##############################################################
sub get_shortcut_icon
{
my ($shortcut) = @_;
return "";
}
##############################################################
# Returning iconindex for shortcut table.
##############################################################
sub get_shortcut_iconindex
{
my ($shortcut) = @_;
return "";
}
##############################################################
# Returning show command for shortcut table.
##############################################################
sub get_shortcut_showcmd
{
my ($shortcut) = @_;
return "";
}
##############################################################
# Returning working directory for shortcut table.
##############################################################
sub get_shortcut_wkdir
{
my ($shortcut) = @_;
return "";
}
####################################################################
# Returning working directory for shortcut table for FolderItems.
####################################################################
sub get_folderitem_wkdir
{
my ($onelink, $dirref) = @_;
# For shortcuts it is easy to convert the gid_Dir_Abc into the unique name in
# the directory table, for instance help_en_simpressidx.
my $onedir;
my $workingdirectory = "";
if ( $onelink->{'WkDir'} ) { $workingdirectory = $onelink->{'WkDir'}; }
my $directory = "";
if ( $workingdirectory )
{
my $found = 0;
for ( my $i = 0; $i <= $#{$dirref}; $i++ )
{
$onedir = ${$dirref}[$i];
my $directorygid = $onedir->{'Dir'};
if ( $directorygid eq $workingdirectory )
{
$found = 1;
last;
}
}
if (!($found))
{
installer::exiter::exit_program("ERROR: Did not find DirectoryID $workingdirectory in directory collection for FolderItem", "get_folderitem_wkdir");
}
$directory = $onedir->{'uniquename'};
if ($directory eq "") { $directory = "INSTALLLOCATION"; }
}
return $directory;
}
###################################################################
# Returning the directory for a folderitem for shortcut table.
###################################################################
sub get_folderitem_directory
{
my ($shortcut) = @_;
# my $directory = "$installer::globals::programmenufolder"; # default
my $directory = "$installer::globals::officemenufolder"; # default
# The value $installer::globals::programmenufolder is not correct for the
# PREDEFINED folders, like PREDEFINED_AUTOSTART
if ( $shortcut->{'FolderID'} eq "PREDEFINED_AUTOSTART" )
{
$directory = $installer::globals::startupfolder;
}
if ( $shortcut->{'FolderID'} eq "PREDEFINED_DESKTOP" )
{
$directory = $installer::globals::desktopfolder;
$installer::globals::desktoplinkexists = 1;
}
if ( $shortcut->{'FolderID'} eq "PREDEFINED_STARTMENU" )
{
$directory = $installer::globals::startmenufolder;
}
# saving the directory in the folderitems collector
$shortcut->{'directory'} = $directory;
return $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 $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;
}
########################################################################
# Returning the arguments for a folderitem for shortcut table.
########################################################################
sub get_folderitem_arguments
{
my ($shortcut) = @_;
my $parameter = "";
if ( $shortcut->{'Parameter'} ) { $parameter = $shortcut->{'Parameter'}; }
return $parameter;
}
########################################################################
# Returning the icon for a folderitem for shortcut table.
# The returned value has to be defined in the icon table.
########################################################################
sub get_folderitem_icon
{
my ($shortcut, $filesref, $iconfilecollector) = @_;
my $styles = "";
if ( $shortcut->{'Styles'} ) { $styles = $shortcut->{'Styles'}; }
if ( $styles =~ /\bNON_ADVERTISED\b/ ) { return ""; } # no icon for non-advertised shortcuts
my $iconfilegid = "";
if ( $shortcut->{'IconFile'} ) { $iconfilegid = $shortcut->{'IconFile'}; }
else { $iconfilegid = $shortcut->{'FileID'}; }
my $onefile;
my $found = 0;
for ( my $i = 0; $i <= $#{$filesref}; $i++ )
{
$onefile = ${$filesref}[$i];
my $filegid = $onefile->{'gid'};
if ( $filegid eq $iconfilegid )
{
$found = 1;
last;
}
}
if (!($found))
{
installer::exiter::exit_program("ERROR: Did not find FileID $iconfilegid in file collection", "get_folderitem_icon");
}
$iconfile = $onefile->{'Name'};
# collecting all icon files to copy them into the icon directory
my $sourcepath = $onefile->{'sourcepath'};
if (! installer::existence::exists_in_array($sourcepath, $iconfilecollector))
{
push(@{$iconfilecollector}, $sourcepath);
}
return $iconfile;
}
########################################################################
# Returning the iconindex for a folderitem for shortcut table.
########################################################################
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'}; }
return $iconid;
}
########################################################################
# Returning the show command for a folderitem for shortcut table.
########################################################################
sub get_folderitem_showcmd
{
my ($shortcut) = @_;
return "1";
}
###########################################################################################################
# Creating the file Shortcut.idt dynamically
# Content:
# Shortcut Directory_ Name Component_ Target Arguments Description Hotkey Icon_ IconIndex ShowCmd WkDir
###########################################################################################################
sub create_shortcut_table
{
my ($filesref, $linksref, $folderref, $folderitemsref, $dirref, $basedir, $languagesarrayref, $includepatharrayref, $iconfilecollector) = @_;
for ( my $m = 0; $m <= $#{$languagesarrayref}; $m++ )
{
my $onelanguage = ${$languagesarrayref}[$m];
my @shortcuttable = ();
my @shortnames = (); # to collect all short names
installer::windows::idtglobal::write_idt_header(\@shortcuttable, "shortcut");
# First the links, defined in scp as ShortCut
for ( my $i = 0; $i <= $#{$linksref}; $i++ )
{
my $onelink = ${$linksref}[$i];
# Controlling the language!
# Only language independent folderitems or folderitems with the correct language
# will be included into the table
if (! (!(( $onelink->{'ismultilingual'} )) || ( $onelink->{'specificlanguage'} eq $onelanguage )) ) { next; }
my %shortcut = ();
$shortcut{'Shortcut'} = get_shortcut_identifier($onelink);
$shortcut{'Directory_'} = get_shortcut_directory($onelink, $dirref);
$shortcut{'Name'} = get_shortcut_name($onelink, \@shortnames, $onelanguage); # localized name
$shortcut{'Component_'} = get_shortcut_component($onelink, $filesref);
$shortcut{'Target'} = get_shortcut_target($onelink, $filesref);
$shortcut{'Arguments'} = get_shortcut_arguments($onelink);
$shortcut{'Description'} = get_shortcut_description($onelink, $onelanguage); # localized description
$shortcut{'Hotkey'} = get_shortcut_hotkey($onelink);
$shortcut{'Icon_'} = get_shortcut_icon($onelink);
$shortcut{'IconIndex'} = get_shortcut_iconindex($onelink);
$shortcut{'ShowCmd'} = get_shortcut_showcmd($onelink);
$shortcut{'WkDir'} = get_shortcut_wkdir($onelink);
my $oneline = $shortcut{'Shortcut'} . "\t" . $shortcut{'Directory_'} . "\t" . $shortcut{'Name'} . "\t"
. $shortcut{'Component_'} . "\t" . $shortcut{'Target'} . "\t" . $shortcut{'Arguments'} . "\t"
. $shortcut{'Description'} . "\t" . $shortcut{'Hotkey'} . "\t" . $shortcut{'Icon_'} . "\t"
. $shortcut{'IconIndex'} . "\t" . $shortcut{'ShowCmd'} . "\t" . $shortcut{'WkDir'} . "\n";
push(@shortcuttable, $oneline);
}
# Second the entries into the start menu, defined in scp as Folder and Folderitem
# These shortcuts will fill the icons table.
for ( my $i = 0; $i <= $#{$folderref}; $i++ )
{
my $foldergid = ${$folderref}[$i]->{'gid'};
# iterating over all folderitems for this folder
for ( my $j = 0; $j <= $#{$folderitemsref}; $j++ )
{
my $onelink = ${$folderitemsref}[$j];
# Controlling the language!
# Only language independent folderitems or folderitems with the correct language
# will be included into the table
if (! (!(( $onelink->{'ismultilingual'} )) || ( $onelink->{'specificlanguage'} eq $onelanguage )) ) { next; }
# controlling the folder
my $localused = 0;
if ( $onelink->{'used'} ) { $localused = $onelink->{'used'}; }
if (!($localused == 1)) { $onelink->{'used'} = "0"; } # no resetting
if (!( $onelink->{'FolderID'} eq $foldergid )) { next; }
$onelink->{'used'} = "1";
my %shortcut = ();
$shortcut{'Shortcut'} = get_shortcut_identifier($onelink);
$shortcut{'Directory_'} = get_folderitem_directory($onelink);
$shortcut{'Name'} = get_shortcut_name($onelink, \@shortnames, $onelanguage); # localized name
$shortcut{'Component_'} = get_shortcut_component($onelink, $filesref);
$shortcut{'Target'} = get_folderitem_target($onelink, $filesref);
$shortcut{'Arguments'} = get_folderitem_arguments($onelink);
$shortcut{'Description'} = get_shortcut_description($onelink, $onelanguage); # localized description
$shortcut{'Hotkey'} = get_shortcut_hotkey($onelink);
$shortcut{'Icon_'} = get_folderitem_icon($onelink, $filesref, $iconfilecollector);
$shortcut{'IconIndex'} = get_folderitem_iconindex($onelink);
$shortcut{'ShowCmd'} = get_folderitem_showcmd($onelink);
$shortcut{'WkDir'} = get_folderitem_wkdir($onelink, $dirref);
my $oneline = $shortcut{'Shortcut'} . "\t" . $shortcut{'Directory_'} . "\t" . $shortcut{'Name'} . "\t"
. $shortcut{'Component_'} . "\t" . $shortcut{'Target'} . "\t" . $shortcut{'Arguments'} . "\t"
. $shortcut{'Description'} . "\t" . $shortcut{'Hotkey'} . "\t" . $shortcut{'Icon_'} . "\t"
. $shortcut{'IconIndex'} . "\t" . $shortcut{'ShowCmd'} . "\t" . $shortcut{'WkDir'} . "\n";
push(@shortcuttable, $oneline);
}
}
# The soffice.ico has to be included into the icon table
# as icon for the ARP applet
my $onefile = "";
my $sofficefile = "soffice.ico";
my $sourcepathref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$sofficefile, $includepatharrayref, 0);
if ($$sourcepathref eq "") { installer::exiter::exit_program("ERROR: Could not find $sofficefile as icon!", "create_shortcut_table"); }
if (! installer::existence::exists_in_array($$sourcepathref, $iconfilecollector))
{
unshift(@{$iconfilecollector}, $$sourcepathref);
$installer::globals::sofficeiconadded = 1;
}
$installer::logger::Lang->printf(
"Added icon file %s for language pack into icon file collector.\n", $$sourcepathref);
# Saving the file
my $shortcuttablename = $basedir . $installer::globals::separator . "Shortcut.idt" . "." . $onelanguage;
installer::files::save_file($shortcuttablename ,\@shortcuttable);
$installer::logger::Lang->printf("Created idt file: %s\n", $shortcuttablename);
}
}
1;