You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by ms...@apache.org on 2025/02/07 12:58:06 UTC

(openoffice) branch AOO42X updated: Cleanup

This is an automated email from the ASF dual-hosted git repository.

mseidel pushed a commit to branch AOO42X
in repository https://gitbox.apache.org/repos/asf/openoffice.git


The following commit(s) were added to refs/heads/AOO42X by this push:
     new ee3d006ca2 Cleanup
ee3d006ca2 is described below

commit ee3d006ca2c68e3cea2f865d08f9a43bb72dd4c6
Author: mseidel <ms...@apache.org>
AuthorDate: Fri Feb 7 13:56:13 2025 +0100

    Cleanup
    
    (cherry picked from commit 8ac570c6d50c1ad9896c5c4a0f44668dbe040aef)
---
 .../bin/modules/installer/windows/msiglobal.pm     | 863 ++++++++++-----------
 main/solenv/bin/modules/installer/windows/sign.pm  | 330 ++++----
 2 files changed, 594 insertions(+), 599 deletions(-)

diff --git a/main/solenv/bin/modules/installer/windows/msiglobal.pm b/main/solenv/bin/modules/installer/windows/msiglobal.pm
index 654c672455..bce2ae7717 100644
--- a/main/solenv/bin/modules/installer/windows/msiglobal.pm
+++ b/main/solenv/bin/modules/installer/windows/msiglobal.pm
@@ -1,5 +1,5 @@
 #**************************************************************
-#  
+#
 #  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
@@ -7,20 +7,18 @@
 #  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::msiglobal;
 
 use Cwd;
@@ -50,9 +48,9 @@ use strict;
 sub write_ddf_file_header
 {
 	my ($ddffileref, $cabinetfile, $installdir) = @_;
-	
+
 	my $oneline;
-	
+
 	$oneline = ".Set CabinetName1=" . $cabinetfile . "\n";
 	push(@{$ddffileref} ,$oneline);
 	$oneline = ".Set ReservePerCabinetSize=128\n";	# This reserves space for a digital signature.
@@ -87,30 +85,30 @@ sub check_ddf_file
 	for ( my $i = 0; $i <= $#{$ddffile}; $i++ )
 	{
 		my $oneline = ${$ddffile}[$i];
-		
+
 		$linelength = length($oneline);
 		$linenumber = $i + 1;
-		
+
 		if ( $linelength > 256 )
 		{
 			installer::exiter::exit_program("ERROR \"$ddffilename\" line $linenumber: Lines in ddf files must not contain more than 256 characters!", "check_ddf_file");
 		}
-		
+
 		if ( $linelength > $maxlength )
 		{
 			$maxlength = $linelength;
 			$maxline = $linenumber;
 		}
 	}
-	
-	my $infoline = "Check of ddf file \"$ddffilename\": Maximum length \"$maxlength\" in line \"$maxline\" (allowed line length: 256 characters)\n"; 
+
+	my $infoline = "Check of ddf file \"$ddffilename\": Maximum length \"$maxlength\" in line \"$maxline\" (allowed line length: 256 characters)\n";
 	$installer::logger::Lang->print($infoline);
 }
 
 ##########################################################################
 # Lines in ddf files must not be longer than 256 characters.
 # Therefore it can be useful to use relative paths. Then it is
-# necessary to change into temp directory before calling 
+# necessary to change into temp directory before calling
 # makecab.exe.
 ##########################################################################
 
@@ -124,16 +122,16 @@ sub make_relative_ddf_path
 	{
 		$windowstemppath = $installer::globals::cyg_temppath;
 	}
-	
+
 	$sourcepath =~ s/\Q$windowstemppath\E//;
 	$sourcepath =~ s/^\\//;
-			
+
 	return $sourcepath;
 }
 
 
 ##########################################################################
-# Generation the list, in which the source of the files is connected
+# Generating the list, in which the source of the files is connected
 # with the cabinet destination file. Because more than one file needs
 # to be included into a cab file, this has to be done via ddf files.
 ##########################################################################
@@ -141,79 +139,79 @@ sub make_relative_ddf_path
 sub generate_cab_file_list ($$$$)
 {
 	my ($filesref, $installdir, $ddfdir, $allvariables) = @_;
-	
+
 	installer::logger::include_header_into_logfile("Generating ddf files");
 
 	if ( $^O =~ /cygwin/i )
-    {
-        installer::worker::generate_cygwin_pathes($filesref);
-    }
-
-    # Make sure that all files point to the same cabinet file.
-    # Multiple cabinet files are not supported anymore.
-    my $cabinetfile = $filesref->[0]->{'cabinet'};
-    foreach my $onefile (@$filesref)
-    {
-        if ($onefile->{'cabinet'} ne $cabinetfile)
-        {
-            installer::exiter::exit_program(
-                "ERROR: multiple cabinet files are not supported",
-                "generate_cab_file_list");
-        }
-    }
-
-    # Sort files on the sequence number.
-    my @sorted_files = sort {$a->{'sequencenumber'} <=> $b->{'sequencenumber'}} @$filesref;
-
-    my @ddffile = ();
-    write_ddf_file_header(\@ddffile, $cabinetfile, $installdir);
-    foreach my $onefile (@sorted_files)
-    {	
-        my $styles = $onefile->{'Styles'};
-        $styles = "" unless defined $styles;
-        if ($styles =~ /\bDONT_PACK\b/)
-        {
-            $installer::logger::Lang->printf("    excluding '%s' from ddf\n", $onefile->{'uniquename'});
-        }
-        
-        my $uniquename = $onefile->{'uniquename'};
-        my $sourcepath = $onefile->{'sourcepath'};
-        if ( $^O =~ /cygwin/i )
-        {
-            $sourcepath = $onefile->{'cyg_sourcepath'};
-        }
-
-        # to avoid lines with more than 256 characters, it can be useful to use relative paths
-        if ($allvariables->{'RELATIVE_PATHES_IN_DDF'})
-        {
-            $sourcepath = make_relative_ddf_path($sourcepath);
-        }
-
-        my $ddfline = "\"" . $sourcepath . "\"" . " " . $uniquename . "\n";
-        push(@ddffile, $ddfline);
-
-        $installer::logger::Lang->printf("    adding '%s' with sequence %d to ddf\n",
-            $onefile->{'uniquename'},
-            $onefile->{'sequencenumber'});
-    }
-    # creating the DDF file
-
-    my $ddffilename = $cabinetfile;
-    $ddffilename =~ s/.cab/.ddf/;
-    $ddfdir =~ s/\Q$installer::globals::separator\E\s*$//;
-    $ddffilename = $ddfdir . $installer::globals::separator . $ddffilename;
-    
-    installer::files::save_file($ddffilename ,\@ddffile);
-    $installer::logger::Lang->print("Created ddf file: %s\n", $ddffilename);
-
-    # lines in ddf files must not be longer than 256 characters
-    check_ddf_file(\@ddffile, $ddffilename);
-
-    # collecting all ddf files
-    push(@installer::globals::allddffiles, $ddffilename);
-
-    # Writing the makecab system call
-    # Return a list with all system calls for packaging process.
+	{
+		installer::worker::generate_cygwin_pathes($filesref);
+	}
+
+	# Make sure that all files point to the same cabinet file.
+	# Multiple cabinet files are not supported anymore.
+	my $cabinetfile = $filesref->[0]->{'cabinet'};
+	foreach my $onefile (@$filesref)
+	{
+		if ($onefile->{'cabinet'} ne $cabinetfile)
+		{
+			installer::exiter::exit_program(
+				"ERROR: multiple cabinet files are not supported",
+				"generate_cab_file_list");
+		}
+	}
+
+	# Sort files on the sequence number.
+	my @sorted_files = sort {$a->{'sequencenumber'} <=> $b->{'sequencenumber'}} @$filesref;
+
+	my @ddffile = ();
+	write_ddf_file_header(\@ddffile, $cabinetfile, $installdir);
+	foreach my $onefile (@sorted_files)
+	{
+		my $styles = $onefile->{'Styles'};
+		$styles = "" unless defined $styles;
+		if ($styles =~ /\bDONT_PACK\b/)
+		{
+			$installer::logger::Lang->printf("    excluding '%s' from ddf\n", $onefile->{'uniquename'});
+		}
+
+		my $uniquename = $onefile->{'uniquename'};
+		my $sourcepath = $onefile->{'sourcepath'};
+		if ( $^O =~ /cygwin/i )
+		{
+			$sourcepath = $onefile->{'cyg_sourcepath'};
+		}
+
+		# to avoid lines with more than 256 characters, it can be useful to use relative paths
+		if ($allvariables->{'RELATIVE_PATHES_IN_DDF'})
+		{
+			$sourcepath = make_relative_ddf_path($sourcepath);
+		}
+
+		my $ddfline = "\"" . $sourcepath . "\"" . " " . $uniquename . "\n";
+		push(@ddffile, $ddfline);
+
+		$installer::logger::Lang->printf("    adding '%s' with sequence %d to ddf\n",
+			$onefile->{'uniquename'},
+			$onefile->{'sequencenumber'});
+	}
+	# creating the DDF file
+
+	my $ddffilename = $cabinetfile;
+	$ddffilename =~ s/.cab/.ddf/;
+	$ddfdir =~ s/\Q$installer::globals::separator\E\s*$//;
+	$ddffilename = $ddfdir . $installer::globals::separator . $ddffilename;
+
+	installer::files::save_file($ddffilename ,\@ddffile);
+	$installer::logger::Lang->print("Created ddf file: %s\n", $ddffilename);
+
+	# lines in ddf files must not be longer than 256 characters
+	check_ddf_file(\@ddffile, $ddffilename);
+
+	# collecting all ddf files
+	push(@installer::globals::allddffiles, $ddffilename);
+
+	# Writing the makecab system call
+	# Return a list with all system calls for packaging process.
 	my @cabfilelist = ("makecab.exe /V3 /F " . $ddffilename . " 2\>\&1 |" . "\n");
 	return \@cabfilelist;
 }
@@ -227,7 +225,7 @@ sub generate_cab_file_list ($$$$)
 sub get_msidatabasename
 {
 	my ($allvariableshashref, $language) = @_;
-	
+
 	my $databasename = $allvariableshashref->{'PRODUCTNAME'} . $allvariableshashref->{'PRODUCTVERSION'};
 	$databasename = lc($databasename);
 	$databasename =~ s/\.//g;
@@ -239,7 +237,7 @@ sub get_msidatabasename
 	{
 		$databasename = $allvariableshashref->{'DATABASENAME'};
 	}
-	
+
 	if ( $language )
 	{
 		if (!($language eq ""))
@@ -247,9 +245,9 @@ sub get_msidatabasename
 			$databasename .= "_$language";
 		}
 	}
-	
+
 	$databasename .= ".msi";
-	
+
 	return $databasename;
 }
 
@@ -260,7 +258,7 @@ sub get_msidatabasename
 
 sub create_msi_database
 {
-	my ($idtdirbase ,$msifilename) = @_;			
+	my ($idtdirbase ,$msifilename) = @_;
 
 	# -f : path containing the idt files
 	# -d : msi database, including path
@@ -288,7 +286,7 @@ sub create_msi_database
 
 	my $infoline = "Systemcall: $systemcall\n";
 	$installer::logger::Lang->print($infoline);
-		
+
 	if ($returnvalue)
 	{
 		$infoline = "ERROR: Could not execute $msidb!\n";
@@ -308,11 +306,11 @@ sub create_msi_database
 sub get_value_from_sis_lng
 {
 	my ($language, $languagefile, $searchstring) = @_;
-	
+
 	my $language_block = installer::windows::idtglobal::get_language_block_from_language_file($searchstring, $languagefile);
 	my $newstring = installer::windows::idtglobal::get_language_string_from_language_block($language_block, $language, $searchstring);
 	$newstring = "\"" . $newstring . "\"";
-	
+
 	return $newstring;
 }
 
@@ -323,7 +321,7 @@ sub get_value_from_sis_lng
 sub get_msiversion_for_sis
 {
 	my $msiversion = "200";
-	return $msiversion;	
+	return $msiversion;
 }
 
 #################################################################
@@ -333,7 +331,7 @@ sub get_msiversion_for_sis
 sub get_wordcount_for_sis
 {
 	my $wordcount = "0";
-	return $wordcount;	
+	return $wordcount;
 }
 
 #################################################################
@@ -351,7 +349,7 @@ sub get_codepage_for_sis
 
 	# my $codepage = "1252";	# determine dynamically in a function
 	# my $codepage = "65001";		# UTF-8
-	return $codepage;	
+	return $codepage;
 }
 
 #################################################################
@@ -361,19 +359,19 @@ sub get_codepage_for_sis
 sub get_template_for_sis
 {
 	my ( $language, $allvariables ) = @_;
-	
-	my $windowslanguage = installer::windows::language::get_windows_language($language); 
-	
+
+	my $windowslanguage = installer::windows::language::get_windows_language($language);
+
 	my $architecture = "Intel";
 
 	# Adding 256, if this is a 64 bit installation set.
 	if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) { $architecture = "x64"; }
 
 	my $value = "\"" . $architecture . ";" . $windowslanguage;	# adding the Windows language
-	
+
 	$value = $value . "\"";						# adding ending '"'
-	
-	return $value ;	
+
+	return $value ;
 }
 
 #################################################################
@@ -389,7 +387,7 @@ sub get_packagecode_for_sis
 	my $infoline = "PackageCode: $guid\n";
 	$installer::logger::Lang->print($infoline);
 
-	return $guid;	
+	return $guid;
 }
 
 #################################################################
@@ -425,7 +423,7 @@ sub get_author_for_sis
 sub get_subject_for_sis
 {
 	my ( $allvariableshashref ) = @_;
-	
+
 	my $subject = $allvariableshashref->{'PRODUCTNAME'} . " " . $allvariableshashref->{'PRODUCTVERSION'};
 
 	$subject = "\"" . $subject . "\"";
@@ -491,16 +489,16 @@ sub write_summary_into_msi_database
 {
 	my ($msifilename, $language, $languagefile, $allvariableshashref) = @_;
 
-	# -g : requrired msi version
+	# -g : required msi version
 	# -c : codepage
 	# -p : template
 
 	installer::logger::include_header_into_logfile("Writing summary information stream");
 
 	my $msiinfo = "msiinfo.exe";	# Has to be in the path
-	
-	my $sislanguage = "en-US";	# title, comment, keyword and appname alway in english
-		
+
+	my $sislanguage = "en-US";	# title, comment, keyword and appname always in English
+
 	my $msiversion = get_msiversion_for_sis();
 	my $codepage = get_codepage_for_sis($language);
 	my $template = get_template_for_sis($language, $allvariableshashref);
@@ -513,10 +511,10 @@ sub write_summary_into_msi_database
 	my $appname = get_appname_for_sis($sislanguage,$languagefile, "OOO_SIS_APPNAME");
 	my $security = get_security_for_sis();
 	my $wordcount = get_wordcount_for_sis();
-	
+
 	$msifilename = installer::converter::make_path_conform($msifilename);
-	
-	my $systemcall = $msiinfo . " " . $msifilename . " -g " . $msiversion . " -c " . $codepage 
+
+	my $systemcall = $msiinfo . " " . $msifilename . " -g " . $msiversion . " -c " . $codepage
 					. " -p " . $template . " -v " . $guid . " -t " . $title . " -a " . $author
 					. " -j " . $subject . " -o " . $comment . " -k " . $keywords . " -n " . $appname
 					. " -u " . $security . " -w " . $wordcount;
@@ -525,7 +523,7 @@ sub write_summary_into_msi_database
 
 	my $infoline = "Systemcall: $systemcall\n";
 	$installer::logger::Lang->print($infoline);
-		
+
 	if ($returnvalue)
 	{
 		$infoline = "ERROR: Could not execute $msiinfo!\n";
@@ -535,7 +533,7 @@ sub write_summary_into_msi_database
 	{
 		$infoline = "Success: Executed $msiinfo successfully!\n";
 		$installer::logger::Lang->print($infoline);
-	}	
+	}
 }
 
 #########################################################################
@@ -545,48 +543,48 @@ sub write_summary_into_msi_database
 
 sub create_transforms
 {
-	my ($languagesarray, $defaultlanguage, $installdir, $allvariableshashref) = @_;	
+	my ($languagesarray, $defaultlanguage, $installdir, $allvariableshashref) = @_;
 
 	installer::logger::include_header_into_logfile("Creating Transforms");
 
 	my $msitran = "msitran.exe";	# Has to be in the path
-	
+
 	$installdir = installer::converter::make_path_conform($installdir);
-	
+
 	# Syntax for creating a transformation
 	# msitran.exe -g <baseDB> <referenceDB> <transformfile> [<errorhandling>}
-	
-	my $basedbname = get_msidatabasename($allvariableshashref, $defaultlanguage);	
+
+	my $basedbname = get_msidatabasename($allvariableshashref, $defaultlanguage);
 	$basedbname = $installdir . $installer::globals::separator . $basedbname;
 
 	my $errorhandling = "f";	# Suppress "change codepage" error
 
 	# Iterating over all files
-	
+
 	foreach ( @{$languagesarray} )
 	{
 		my $onelanguage = $_;
-	
+
 		if ( $onelanguage eq $defaultlanguage ) { next; }
-	
-		my $referencedbname = get_msidatabasename($allvariableshashref, $onelanguage);	
+
+		my $referencedbname = get_msidatabasename($allvariableshashref, $onelanguage);
 		$referencedbname = $installdir . $installer::globals::separator . $referencedbname;
-		
+
 		my $transformfile = $installdir . $installer::globals::separator . "trans_" . $onelanguage . ".mst";
 
-		my $systemcall = $msitran . " " . " -g " . $basedbname . " " . $referencedbname . " " . $transformfile . " " . $errorhandling; 
+		my $systemcall = $msitran . " " . " -g " . $basedbname . " " . $referencedbname . " " . $transformfile . " " . $errorhandling;
 
 		my $returnvalue = system($systemcall);
 
 		my $infoline = "Systemcall: $systemcall\n";
 		$installer::logger::Lang->print($infoline);
-		
+
 		# Problem: msitran.exe in version 4.0 always returns "1", even if no failure occurred.
 		# Therefore it has to be checked, if this is version 4.0. If yes, if the mst file
 		# exists and if it is larger than 0 bytes. If this is true, then no error occurred.
 		# File Version of msitran.exe: 4.0.6000.16384 has checksum: "b66190a70145a57773ec769e16777b29".
 		# Same for msitran.exe from wntmsci12: "aa25d3445b94ffde8ef0c1efb77a56b8"
-		
+
 		if ($returnvalue)
 		{
 			$infoline = "WARNING: Returnvalue of $msitran is not 0. Checking version of $msitran!\n";
@@ -594,12 +592,12 @@ sub create_transforms
 
 			open(FILE, "<$installer::globals::msitranpath") or die "ERROR: Can't open $installer::globals::msitranpath for creating file hash";
 			binmode(FILE);
-			my $digest = Digest::MD5->new->addfile(*FILE)->hexdigest;			
+			my $digest = Digest::MD5->new->addfile(*FILE)->hexdigest;
 			close(FILE);
 
 			my @problemchecksums = ("b66190a70145a57773ec769e16777b29", "aa25d3445b94ffde8ef0c1efb77a56b8");
 			my $isproblemchecksum = 0;
-			
+
 			foreach my $problemchecksum ( @problemchecksums )
 			{
 				$infoline = "Checksum of problematic MsiTran.exe: $problemchecksum\n";
@@ -624,7 +622,7 @@ sub create_transforms
 					{
 						$infoline = "Info: Returnvalue $returnvalue of $msitran is no problem :-) .\n";
 						$installer::logger::Lang->print($infoline);
-						$returnvalue = 0; # reset the error	
+						$returnvalue = 0; # reset the error
 					}
 					else
 					{
@@ -635,32 +633,32 @@ sub create_transforms
 				else
 				{
 					$infoline = "File $transformfile does not exist -> An error occurred.\n";
-					$installer::logger::Lang->print($infoline);					
+					$installer::logger::Lang->print($infoline);
 				}
 			}
 			else
 			{
 				$infoline = "This is not a problematic version of msitran.exe. Therefore the error is not caused by problematic msitran.exe.\n";
-				$installer::logger::Lang->print($infoline);				
+				$installer::logger::Lang->print($infoline);
 			}
-		}		
-		
+		}
+
 		if ($returnvalue)
 		{
 			$infoline = "ERROR: Could not execute $msitran!\n";
 			$installer::logger::Lang->print($infoline);
 		}
-		else	
+		else
 		{
 			$infoline = "Success: Executed $msitran successfully!\n";
 			$installer::logger::Lang->print($infoline);
-		}	
+		}
 
 		# The reference database can be deleted
-		
-		my $result = unlink($referencedbname);		
+
+		my $result = unlink($referencedbname);
 		# $result contains the number of deleted files
-		
+
 		if ( $result == 0 )
 		{
 			$infoline = "ERROR: Could not remove file $$referencedbname !\n";
@@ -678,21 +676,21 @@ sub create_transforms
 
 sub rename_msi_database_in_installset
 {
-	my ($defaultlanguage, $installdir, $allvariableshashref) = @_;	
+	my ($defaultlanguage, $installdir, $allvariableshashref) = @_;
 
 	installer::logger::include_header_into_logfile("Renaming msi database");
 
-	my $olddatabasename = get_msidatabasename($allvariableshashref, $defaultlanguage);	
+	my $olddatabasename = get_msidatabasename($allvariableshashref, $defaultlanguage);
 	$olddatabasename = $installdir . $installer::globals::separator . $olddatabasename;
 
-	my $newdatabasename = get_msidatabasename($allvariableshashref);	
+	my $newdatabasename = get_msidatabasename($allvariableshashref);
 
 	$installer::globals::shortmsidatabasename = $newdatabasename;
 
 	$newdatabasename = $installdir . $installer::globals::separator . $newdatabasename;
 
 	installer::systemactions::rename_one_file($olddatabasename, $newdatabasename);
-	
+
 	$installer::globals::msidatabasename = $newdatabasename;
 }
 
@@ -706,17 +704,17 @@ sub add_language_to_msi_database
 	my ($defaultlanguage, $installdir, $allvariables) = @_;
 
 	my $languagestring = $defaultlanguage;
-	if ( $allvariables->{'USELANGUAGECODE'} ) { $languagestring = installer::windows::language::get_windows_language($defaultlanguage); } 
+	if ( $allvariables->{'USELANGUAGECODE'} ) { $languagestring = installer::windows::language::get_windows_language($defaultlanguage); }
 	my $newdatabasename = $installer::globals::shortmsidatabasename;
 	$newdatabasename =~ s/\.msi\s*$/_$languagestring\.msi/;
 	$installer::globals::shortmsidatabasename = $newdatabasename;
 	$newdatabasename = $installdir . $installer::globals::separator . $newdatabasename;
 
 	my $olddatabasename = $installer::globals::msidatabasename;
-	
+
 	installer::systemactions::rename_one_file($olddatabasename, $newdatabasename);
-	
-	$installer::globals::msidatabasename = $newdatabasename;	
+
+	$installer::globals::msidatabasename = $newdatabasename;
 }
 
 ##########################################################################
@@ -726,10 +724,10 @@ sub add_language_to_msi_database
 sub put_databasename_into_setupini
 {
 	my ($setupinifile, $allvariableshashref) = @_;
-	
+
 	my $databasename = get_msidatabasename($allvariableshashref);
 	my $line = "database=" . $databasename . "\n";
-	
+
 	push(@{$setupinifile}, $line);
 }
 
@@ -740,10 +738,10 @@ sub put_databasename_into_setupini
 sub put_msiversion_into_setupini
 {
 	my ($setupinifile) = @_;
-	
-	my $msiversion = "2.0";	
+
+	my $msiversion = "2.0";
 	my $line = "msiversion=" . $msiversion . "\n";
-	
+
 	push(@{$setupinifile}, $line);
 }
 
@@ -754,10 +752,10 @@ sub put_msiversion_into_setupini
 sub put_productname_into_setupini
 {
 	my ($setupinifile, $allvariableshashref) = @_;
-	
-	my $productname = $allvariableshashref->{'PRODUCTNAME'};	
+
+	my $productname = $allvariableshashref->{'PRODUCTNAME'};
 	my $line = "productname=" . $productname . "\n";
-	
+
 	push(@{$setupinifile}, $line);
 }
 
@@ -768,10 +766,10 @@ sub put_productname_into_setupini
 sub put_productcode_into_setupini
 {
 	my ($setupinifile) = @_;
-	
-	my $productcode = $installer::globals::productcode;	
+
+	my $productcode = $installer::globals::productcode;
 	my $line = "productcode=" . $productcode . "\n";
-	
+
 	push(@{$setupinifile}, $line);
 }
 
@@ -782,8 +780,8 @@ sub put_productcode_into_setupini
 sub put_productversion_into_setupini
 {
 	my ($setupinifile) = @_;
-	
-	my $line = "productversion=" . $installer::globals::msiproductversion . "\n";	
+
+	my $line = "productversion=" . $installer::globals::msiproductversion . "\n";
 	push(@{$setupinifile}, $line);
 }
 
@@ -794,10 +792,10 @@ sub put_productversion_into_setupini
 sub put_upgradekey_into_setupini
 {
 	my ($setupinifile) = @_;
-	
+
 	if ( $installer::globals::minorupgradekey ne "" )
 	{
-		my $line = "upgradekey=" . $installer::globals::minorupgradekey . "\n";	
+		my $line = "upgradekey=" . $installer::globals::minorupgradekey . "\n";
 		push(@{$setupinifile}, $line);
 	}
 }
@@ -809,10 +807,10 @@ sub put_upgradekey_into_setupini
 sub put_languagecount_into_setupini
 {
 	my ($setupinifile, $languagesarray) = @_;
-	
+
 	my $languagecount = $#{$languagesarray} + 1;
 	my $line = "count=" . $languagecount . "\n";
-	
+
 	push(@{$setupinifile}, $line);
 }
 
@@ -823,9 +821,9 @@ sub put_languagecount_into_setupini
 sub put_defaultlanguage_into_setupini
 {
 	my ($setupinifile, $defaultlanguage) = @_;
-	
+
 	my $windowslanguage = installer::windows::language::get_windows_language($defaultlanguage);
-	my $line = "default=" . $windowslanguage . "\n";	
+	my $line = "default=" . $windowslanguage . "\n";
 	push(@{$setupinifile}, $line);
 }
 
@@ -836,12 +834,12 @@ sub put_defaultlanguage_into_setupini
 sub put_transforms_into_setupini
 {
 	my ($setupinifile, $onelanguage, $counter) = @_;
-		
+
 	my $windowslanguage = installer::windows::language::get_windows_language($onelanguage);
 	my $transformfilename = "trans_" . $onelanguage . ".mst";
-	
+
 	my $line = "lang" . $counter . "=" . $windowslanguage . "," . $transformfilename . "\n";
-		
+
 	push(@{$setupinifile}, $line);
 }
 
@@ -861,20 +859,20 @@ sub include_windows_lineends
 }
 
 ##########################################################################
-# Generation the file setup.ini, that is used by the loader setup.exe.
+# Generating the file setup.ini, that is used by the loader setup.exe.
 ##########################################################################
 
 sub create_setup_ini
 {
-	my ($languagesarray, $defaultlanguage, $installdir, $allvariableshashref) = @_;	
+	my ($languagesarray, $defaultlanguage, $installdir, $allvariableshashref) = @_;
 
 	installer::logger::include_header_into_logfile("Creating setup.ini");
 
 	my $setupinifilename = $installdir . $installer::globals::separator . "setup.ini";
-	
+
 	my @setupinifile = ();
 	my $setupinifile = \@setupinifile;
-	
+
 	my $line = "\[setup\]\n";
 	push(@setupinifile, $line);
 
@@ -884,7 +882,7 @@ sub create_setup_ini
 	put_productcode_into_setupini($setupinifile);
 	put_productversion_into_setupini($setupinifile);
 	put_upgradekey_into_setupini($setupinifile);
-	
+
 	$line = "\[languages\]\n";
 	push(@setupinifile, $line);
 
@@ -901,7 +899,7 @@ sub create_setup_ini
 
 			put_transforms_into_setupini($setupinifile, ${$languagesarray}[$i], $counter);
 			$counter++;
-		}	
+		}
 	}
 
 	if ( $installer::globals::iswin && $installer::globals::plat =~ /cygwin/i)		# Windows line ends only for Cygwin
@@ -909,44 +907,44 @@ sub create_setup_ini
 		include_windows_lineends($setupinifile);
 	}
 
-	installer::files::save_file($setupinifilename, $setupinifile);	
+	installer::files::save_file($setupinifilename, $setupinifile);
 
 	$installer::logger::Lang->printf("Generated file %s\n", $setupinifilename);
 }
 
 #################################################################
-# Copying the files defined as ScpActions into the 
+# Copying the files defined as ScpActions into the
 # installation set.
 #################################################################
 
 sub copy_scpactions_into_installset
 {
-	my ($defaultlanguage, $installdir, $allscpactions) = @_;	
+	my ($defaultlanguage, $installdir, $allscpactions) = @_;
 
 	installer::logger::include_header_into_logfile("Copying ScpAction files into installation set");
 
 	for ( my $i = 0; $i <= $#{$allscpactions}; $i++ )
 	{
 		my $onescpaction = ${$allscpactions}[$i];
-		
+
 		if ( $onescpaction->{'Name'} eq "loader.exe" ) { next; }	# do not copy this ScpAction loader
-		
+
 		# only copying language independent files or files with the correct language (the defaultlanguage)
-		
+
 		my $filelanguage = $onescpaction->{'specificlanguage'};
-		
+
 		if ( ($filelanguage eq $defaultlanguage) || ($filelanguage eq "") )
-		{ 
+		{
 			my $sourcefile = $onescpaction->{'sourcepath'};
 			my $destfile = $installdir . $installer::globals::separator . $onescpaction->{'DestinationName'};
 
 			installer::systemactions::copy_one_file($sourcefile, $destfile);
-		}	
+		}
 	}
 }
 
 #################################################################
-# Copying the files for the Windows installer into the 
+# Copying the files for the Windows installer into the
 # installation set (setup.exe).
 #################################################################
 
@@ -954,18 +952,18 @@ sub copy_windows_installer_files_into_installset
 {
 	my ($installdir, $includepatharrayref, $allvariables) = @_;
 
-    installer::logger::include_header_into_logfile("Copying Windows installer files into installation set");
-	
+	installer::logger::include_header_into_logfile("Copying Windows installer files into installation set");
+
 	my @copyfile = ();
 	push(@copyfile, "loader2.exe");
-	
+
 	if ( $allvariables->{'NOLOADERREQUIRED'} ) { @copyfile = (); }
-	
+
 	for ( my $i = 0; $i <= $#copyfile; $i++ )
 	{
 		my $filename = $copyfile[$i];
 		my $sourcefileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$filename, $includepatharrayref, 1);
-	
+
 		if ( ! -f $$sourcefileref ) { installer::exiter::exit_program("ERROR: msi file not found: $$sourcefileref !", "copy_windows_installer_files_into_installset"); }
 
 		my $destfile;
@@ -974,12 +972,12 @@ sub copy_windows_installer_files_into_installset
 
 		$destfile = $installdir . $installer::globals::separator . $destfile;
 
-		installer::systemactions::copy_one_file($$sourcefileref, $destfile);		
+		installer::systemactions::copy_one_file($$sourcefileref, $destfile);
 	}
 }
 
 #################################################################
-# Copying the child projects into the 
+# Copying the child projects into the
 # installation set
 #################################################################
 
@@ -1013,14 +1011,14 @@ sub copy_child_projects_into_installset
 
 =head2 create_guid ()
 
-    Create a single UUID aka GUID via calling the external executable 'uuidgen'.
-    There are Perl modules for that, but do they exist on the build bots?
-    
+	Create a single UUID aka GUID via calling the external executable 'uuidgen'.
+	There are Perl modules for that, but do they exist on the build bots?
+
 =cut
 sub create_guid ()
 {
 	my $uuid = qx("uuidgen");
-    $uuid =~ s/\s*$//;
+	$uuid =~ s/\s*$//;
 	return uc($uuid);
 }
 
@@ -1031,21 +1029,21 @@ sub create_guid ()
 sub calculate_guid
 {
 	my ( $string ) = @_;
-	
+
 	my $guid = "";
-	
-    my $md5 = Digest::MD5->new;
-    $md5->add($string);
-    my $digest = $md5->hexdigest;
-    $digest = uc($digest);
+
+	my $md5 = Digest::MD5->new;
+	$md5->add($string);
+	my $digest = $md5->hexdigest;
+	$digest = uc($digest);
 
 	# my $id = pack("A32", $digest);
 	my ($first, $second, $third, $fourth, $fifth) = unpack ('A8 A4 A4 A4 A12', $digest);
 	$guid = "$first-$second-$third-$fourth-$fifth";
 
-    $installer::logger::Lang->printf("guid for '%s' is %s\n",
-        $string, $guid);
-	
+	$installer::logger::Lang->printf("guid for '%s' is %s\n",
+		$string, $guid);
+
 	return $guid;
 }
 
@@ -1056,19 +1054,19 @@ sub calculate_guid
 sub calculate_id
 {
 	my ( $string, $length ) = @_;
-	
+
 	my $id = "";
-	
-    my $md5 = Digest::MD5->new;
-    $md5->add($string);
-    my $digest = lc($md5->hexdigest);
+
+	my $md5 = Digest::MD5->new;
+	$md5->add($string);
+	my $digest = lc($md5->hexdigest);
 	$id = substr($digest, 0, $length);
-	
+
 	return $id;
 }
 
 #################################################################
-# Filling the component hash with the values of the 
+# Filling the component hash with the values of the
 # component file.
 #################################################################
 
@@ -1081,16 +1079,16 @@ sub fill_component_hash
 	for ( my $i = 0; $i <= $#{$componentfile}; $i++ )
 	{
 		my $line = ${$componentfile}[$i];
-		
+
 		if ( $line =~ /^\s*(.*?)\t(.*?)\s*$/ )
 		{
 			my $key = $1;
 			my $value = $2;
-		
+
 			$components{$key} = $value;
 		}
 	}
-	
+
 	return \%components;
 }
 
@@ -1103,9 +1101,9 @@ sub create_new_component_file
 	my ($componenthash) = @_;
 
 	my @componentfile = ();
-	
+
 	my $key;
-	
+
 	foreach $key (keys %{$componenthash})
 	{
 		my $value = $componenthash->{$key};
@@ -1124,19 +1122,19 @@ sub create_new_component_file
 sub __set_uuid_into_component_table
 {
 	my ($idtdirbase, $allvariables) = @_;
-	
-	my $componenttablename  = $idtdirbase . $installer::globals::separator . "Componen.idt";
-	
+
+	my $componenttablename = $idtdirbase . $installer::globals::separator . "Componen.idt";
+
 	my $componenttable = installer::files::read_file($componenttablename);
-	
+
 	# For update and patch reasons (small update) the GUID of an existing component must not change!
 	# The collection of component GUIDs is saved in the directory $installer::globals::idttemplatepath in the file "components.txt"
-	
+
 	my $infoline = "";
 	my $counter = 0;
 	# my $componentfile = installer::files::read_file($installer::globals::componentfilename);
 	# my $componenthash = fill_component_hash($componentfile);
-	
+
 	for ( my $i = 3; $i <= $#{$componenttable}; $i++ )	# ignoring the first three lines
 	{
 		my $oneline = ${$componenttable}[$i];
@@ -1154,26 +1152,26 @@ sub __set_uuid_into_component_table
 
 			if ( exists($installer::globals::calculated_component_guids{$componentname}))
 			{
-				$uuid = $installer::globals::calculated_component_guids{$componentname};				
+				$uuid = $installer::globals::calculated_component_guids{$componentname};
 			}
 			else
 			{
 				# Calculating new GUID with the help of the component name.
 				my $useooobaseversion = 1;
 				if ( exists($installer::globals::base_independent_components{$componentname}))
-                {
-                    $useooobaseversion = 0;
-                }
+				{
+					$useooobaseversion = 0;
+				}
 				my $sourcestring = $componentname;
 
 				if ( $useooobaseversion )
 				{
 					if ( ! exists($allvariables->{'OOOBASEVERSION'}) )
-                    {
-                        installer::exiter::exit_program(
-                            "ERROR: Could not find variable \"OOOBASEVERSION\" (required value for GUID creation)!",
-                            "set_uuid_into_component_table");
-                    }
+					{
+						installer::exiter::exit_program(
+							"ERROR: Could not find variable \"OOOBASEVERSION\" (required value for GUID creation)!",
+							"set_uuid_into_component_table");
+					}
 					$sourcestring = $sourcestring . "_" . $allvariables->{'OOOBASEVERSION'};
 				}
 				$uuid = calculate_guid($sourcestring);
@@ -1181,27 +1179,27 @@ sub __set_uuid_into_component_table
 
 				# checking, if there is a conflict with an already created guid
 				if ( exists($installer::globals::allcalculated_guids{$uuid}) )
-                {
-                    installer::exiter::exit_program(
-                        "ERROR: \"$uuid\" was already created before!",
-                        "set_uuid_into_component_table");
-                }
+				{
+					installer::exiter::exit_program(
+						"ERROR: \"$uuid\" was already created before!",
+						"set_uuid_into_component_table");
+				}
 				$installer::globals::allcalculated_guids{$uuid} = 1;
 				$installer::globals::calculated_component_guids{$componentname} = $uuid;
 
 				# Setting new uuid
 				# $componenthash->{$componentname} = $uuid;
 
-				# Setting flag			
+				# Setting flag
 				# $installer::globals::created_new_component_guid = 1;	# this is very important!
 			}
 	#	}
 
 		${$componenttable}[$i] =~ s/COMPONENTGUID/$uuid/;
 	}
-	
+
 	installer::files::save_file($componenttablename, $componenttable);
-	
+
 #	if ( $installer::globals::created_new_component_guid )
 #	{
 #		# create new component file!
@@ -1212,7 +1210,7 @@ sub __set_uuid_into_component_table
 #		# All important data have to be saved in the directory: $installer::globals::infodirectory
 #		my $localcomponentfilename = $installer::globals::componentfilename;
 #		installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$localcomponentfilename);
-#		$localcomponentfilename = $installer::globals::infodirectory . $installer::globals::separator . $localcomponentfilename;		
+#		$localcomponentfilename = $installer::globals::infodirectory . $installer::globals::separator . $localcomponentfilename;
 #		installer::files::save_file($localcomponentfilename, $componentfile);
 #
 #		# installer::files::save_file($installer::globals::componentfilename, $componentfile);	# version using new file in solver
@@ -1233,35 +1231,35 @@ sub __set_uuid_into_component_table
 # RegLocator : +16 in type column to search in 64 bit registry.
 # All conditions: "VersionNT" -> "VersionNT64" (several tables).
 # Already done: "+256" in Attributes column of table "Component".
-# Still following: Setting "x64" instead of "Intel" in Summary 
-# Information Stream of msi database in "get_template_for_sis". 
+# Still following: Setting "x64" instead of "Intel" in Summary
+# Information Stream of msi database in "get_template_for_sis".
 #########################################################################
 
 sub prepare_64bit_database
 {
 	my ($basedir, $allvariables) = @_;
-	
+
 	my $infoline = "";
 
 	if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 ))
-	{ 
+	{
 		# 1. Beginning with table "RegLocat.idt". Adding "16" to the type.
 
 		my $reglocatfile = "";
 		my $reglocatfilename = $basedir . $installer::globals::separator . "RegLocat.idt";
-	
+
 		if ( -f $reglocatfilename )
 		{
 			my $saving_required = 0;
 			$reglocatfile = installer::files::read_file($reglocatfilename);
 
 			for ( my $i = 3; $i <= $#{$reglocatfile}; $i++ ) 	# ignoring the first three lines
-			{		
+			{
 				my $oneline = ${$reglocatfile}[$i];
 
 				if ( $oneline =~ /^\s*\#/ ) { next; }	# this is a comment line
 				if ( $oneline =~ /^\s*$/ ) { next; }
-				
+
 				if ( $oneline =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(\d+)\s*$/ )
 				{
 					# Syntax: Signature_ Root Key Name Type
@@ -1270,55 +1268,55 @@ sub prepare_64bit_database
 					my $key = $3;
 					my $name = $4;
 					my $type = $5;
-					
+
 					$type = $type + 16;
-					
+
 					my $newline = $sig . "\t" . $root . "\t" . $key . "\t" . $name . "\t" . $type . "\n";
 					${$reglocatfile}[$i] = $newline;
-					
+
 					$saving_required = 1;
 				}
 			}
-			
+
 			if ( $saving_required )
 			{
 				# Saving the files
 				installer::files::save_file($reglocatfilename ,$reglocatfile);
-				$infoline = "Making idt file 64 bit conform: $reglocatfilename\n"; 
+				$infoline = "Making idt file 64 bit conform: $reglocatfilename\n";
 				$installer::logger::Lang->print($infoline);
 			}
 		}
-		
+
 		# 2. Replacing all occurrences of "VersionNT" by "VersionNT64"
-		
+
 		my @versionnt_files = ("Componen.idt", "InstallE.idt", "InstallU.idt", "LaunchCo.idt");
-		
+
 		foreach my $onefile ( @versionnt_files )
 		{
 			my $fullfilename = $basedir . $installer::globals::separator . $onefile;
-			
+
 			if ( -f $fullfilename )
 			{
 				my $saving_required = 0;
-				my $filecontent = installer::files::read_file($fullfilename);		
+				my $filecontent = installer::files::read_file($fullfilename);
 
 				for ( my $i = 3; $i <= $#{$filecontent}; $i++ ) 	# ignoring the first three lines
 				{
 					my $oneline = ${$filecontent}[$i];
-					
+
 					if ( $oneline =~ /\bVersionNT\b/ )
 					{
 						${$filecontent}[$i] =~ s/\bVersionNT\b/VersionNT64/g;
 						$saving_required = 1;
-					}			
+					}
 				}
-			
+
 				if ( $saving_required )
 				{
 					# Saving the files
 					installer::files::save_file($fullfilename ,$filecontent);
-					$infoline = "Making idt file 64 bit conform: $fullfilename\n"; 
-					$installer::logger::Lang->print($infoline);			
+					$infoline = "Making idt file 64 bit conform: $fullfilename\n";
+					$installer::logger::Lang->print($infoline);
 				}
 			}
 		}
@@ -1366,7 +1364,7 @@ sub include_cabs_into_msi
 
 		$infoline = "Systemcall: $systemcall\n";
 		$installer::logger::Lang->print($infoline);
-		
+
 		if ($returnvalue)
 		{
 			$infoline = "ERROR: Could not execute $systemcall !\n";
@@ -1377,13 +1375,13 @@ sub include_cabs_into_msi
 			$infoline = "Success: Executed $systemcall successfully!\n";
 			$installer::logger::Lang->print($infoline);
 		}
-		
+
 		# deleting the cab file
 
 		unlink(${$allcabfiles}[$i]);
 
 		$infoline = "Deleted cab file: ${$allcabfiles}[$i]\n";
-		$installer::logger::Lang->print($infoline);		
+		$installer::logger::Lang->print($infoline);
 	}
 
 	$infoline = "Changing back into directory: $from";
@@ -1411,7 +1409,7 @@ sub execute_packaging
 
 	chdir($to);
 	$infoline = "chdir: $to \n";
-	$installer::logger::Lang->print($infoline);	
+	$installer::logger::Lang->print($infoline);
 
 	# if the ddf file contains relative paths, it is necessary to change into the temp directory
 	if ( $allvariables->{'RELATIVE_PATHES_IN_DDF'} )
@@ -1419,7 +1417,7 @@ sub execute_packaging
 		$to = $installer::globals::temppath;
 		chdir($to);
 		$infoline = "chdir: $to \n";
-		$installer::logger::Lang->print($infoline);	
+		$installer::logger::Lang->print($infoline);
 	}
 
 	# changing the tmp directory, because makecab.exe generates temporary cab files
@@ -1431,9 +1429,9 @@ sub execute_packaging
 	my $allmakecabcalls = $#{$localpackjobref} + 1;
 
 	for ( my $i = 0; $i <= $#{$localpackjobref}; $i++ )
-	{	
+	{
 		my $systemcall = ${$localpackjobref}[$i];
-		
+
 		my $callscounter = $i + 1;
 
 		$installer::logger::Info->printf("... makecab.exe (%s/%s) ... \n", $callscounter, $allmakecabcalls);
@@ -1441,7 +1439,7 @@ sub execute_packaging
 		# my $returnvalue = system($systemcall);
 
 		for ( my $n = 1; $n <= $maxmakecabcalls; $n++ )
-		{			
+		{
 			my @ddfoutput = ();
 
 			$infoline = "Systemcall: $systemcall";
@@ -1457,13 +1455,13 @@ sub execute_packaging
 			{
 				if ( $n < $maxmakecabcalls )
 				{
-                    $installer::logger::Info->printf("makecab_error (Try %s): Trying again\n", $n);
-                    $installer::logger::Lang->printf("makecab_error (Try %s): Trying again\n", $n);
+					$installer::logger::Info->printf("makecab_error (Try %s): Trying again\n", $n);
+					$installer::logger::Lang->printf("makecab_error (Try %s): Trying again\n", $n);
 				}
 				else
 				{
-                    $installer::logger::Info->printf("ERROR (Try %s): Abort packing \n", $n);
-                    $installer::logger::Lang->printf("ERROR (Try %s): Abort packing \n", $n);
+					$installer::logger::Info->printf("ERROR (Try %s): Abort packing \n", $n);
+					$installer::logger::Lang->printf("ERROR (Try %s): Abort packing \n", $n);
 				}
 
 				for ( my $m = 0; $m <= $#ddfoutput; $m++ )
@@ -1472,14 +1470,14 @@ sub execute_packaging
 					{
 						$infoline = $1 . "\n";
 						if ( $n < $maxmakecabcalls )
-                        {
-                            $infoline =~ s/ERROR\:/makecab_error\:/i;
-                        }
+						{
+							$infoline =~ s/ERROR\:/makecab_error\:/i;
+						}
 						$installer::logger::Info->print($infoline);
 						$installer::logger::Lang->print($infoline);
 					}
 				}
-				
+
 				if ( $n == $maxmakecabcalls ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "execute_packaging"); }
 			}
 			else
@@ -1498,66 +1496,66 @@ sub execute_packaging
 
 	chdir($from);
 	$infoline = "chdir: $from \n";
-	$installer::logger::Lang->print($infoline);	
+	$installer::logger::Lang->print($infoline);
 }
 
 
 =head2 get_source_codes($languagesref)
 
-    Return product code and upgrade code from the source version.
-    When no source version is defined then return undef for both.
-    
+	Return product code and upgrade code from the source version.
+	When no source version is defined then return undef for both.
+
 =cut
 sub get_source_codes ($)
 {
-    my ($languagesref) = @_;
-    
-    if ( ! $installer::globals::is_release)
-    {
-        return (undef, undef);
-    }
-    elsif ( ! defined $installer::globals::source_version)
-    {
-        $installer::logger::Lang->printf("no source version defined\n");
-        return (undef, undef);
-    }
-
-    my $onelanguage = installer::languages::get_key_language($languagesref);
-
-    my $release_data = installer::patch::ReleasesList::Instance()
-        ->{$installer::globals::source_version}
-        ->{$installer::globals::packageformat};
-    if (defined $release_data)
-    {
-        my $normalized_language = installer::languages::get_normalized_language($languagesref);
-        my $language_data = $release_data->{$normalized_language};
-        if (defined $language_data)
-        {
-            $installer::logger::Lang->printf("source product code is %s\n", $language_data->{'product-code'});
-            $installer::logger::Lang->printf("source upgrade code is %s\n", $release_data->{'upgrade-code'});
-
-            return (
-                $language_data->{'product-code'},
-                $release_data->{'upgrade-code'}
-                );
-        }
-        else
-        {
-            $installer::logger::Info->printf(
-                "Warning: can not access information about previous version %s and language %s/%s/%s\n",
-                $installer::globals::source_version,
-                $onelanguage,
-                join(", ",@$languagesref),
-                $normalized_language);
-            return (undef,undef);
-        }
-    }
-    else
-    {
-        $installer::logger::Info->printf("Warning: can not access information about previous version %s\n",
-            $installer::globals::source_version);
-        return (undef,undef);
-    }
+	my ($languagesref) = @_;
+
+	if ( ! $installer::globals::is_release)
+	{
+		return (undef, undef);
+	}
+	elsif ( ! defined $installer::globals::source_version)
+	{
+		$installer::logger::Lang->printf("no source version defined\n");
+		return (undef, undef);
+	}
+
+	my $onelanguage = installer::languages::get_key_language($languagesref);
+
+	my $release_data = installer::patch::ReleasesList::Instance()
+		->{$installer::globals::source_version}
+		->{$installer::globals::packageformat};
+	if (defined $release_data)
+	{
+		my $normalized_language = installer::languages::get_normalized_language($languagesref);
+		my $language_data = $release_data->{$normalized_language};
+		if (defined $language_data)
+		{
+			$installer::logger::Lang->printf("source product code is %s\n", $language_data->{'product-code'});
+			$installer::logger::Lang->printf("source upgrade code is %s\n", $release_data->{'upgrade-code'});
+
+			return (
+				$language_data->{'product-code'},
+				$release_data->{'upgrade-code'}
+				);
+		}
+		else
+		{
+			$installer::logger::Info->printf(
+				"Warning: can not access information about previous version %s and language %s/%s/%s\n",
+				$installer::globals::source_version,
+				$onelanguage,
+				join(", ",@$languagesref),
+				$normalized_language);
+			return (undef,undef);
+		}
+	}
+	else
+	{
+		$installer::logger::Info->printf("Warning: can not access information about previous version %s\n",
+			$installer::globals::source_version);
+		return (undef,undef);
+	}
 }
 
 
@@ -1565,99 +1563,99 @@ sub get_source_codes ($)
 
 =head2 set_global_code_variables ($languagesref, $allvariableshashref)
 
-    Determine values for the product code and upgrade code of the target version.
+	Determine values for the product code and upgrade code of the target version.
 
-    As preparation for building a Windows patch, certain conditions have to be fulfilled.
-     - The upgrade code remains the same
-     - The product code remains the same
-       [this is still to be determined.  For patches to work we need the same product codes but
-        the install sets install only when the product codes differ.]
-    In order to enforce that we have to access information about the source version.
+	As preparation for building a Windows patch, certain conditions have to be fulfilled.
+	- The upgrade code remains the same
+	- The product code remains the same
+		[this is still to be determined. For patches to work we need the same product codes but
+		the install sets install only when the product codes differ.]
+	In order to enforce that we have to access information about the source version.
 
-    The resulting values are stored as global variables
-        $installer::globals::productcode
-        $installer::globals::upgradecode
-    and as variables in the given hash
-    	$allvariableshashref->{'PRODUCTCODE'}
-        $allvariableshashref->{'UPGRADECODE'}
+	The resulting values are stored as global variables
+		$installer::globals::productcode
+		$installer::globals::upgradecode
+	and as variables in the given hash
+		$allvariableshashref->{'PRODUCTCODE'}
+		$allvariableshashref->{'UPGRADECODE'}
 
 =cut
 sub set_global_code_variables ($$)
 {
 	my ($languagesref, $allvariableshashref) = @_;
 
-    my ($source_product_code, $source_upgrade_code) = get_source_codes($languagesref);
-    my ($target_product_code, $target_upgrade_code) = (undef, undef);
-    
-    if (defined $source_product_code && defined $source_upgrade_code)
-    {
-        if ($installer::globals::is_major_release)
-        {
-            # For a major release we have to change the product code.
-            $target_product_code = "{" . create_guid() . "}";
-            $installer::logger::Lang->printf("building a major release, created new product code %s\n",
-                $target_product_code);
-            
-            # Let's do a paranoia check that the new and the old guids are
-            # different.  In reality the new guid really has to be
-            # different from all other guids used for * codes, components,
-            # etc.
-            if ($target_product_code eq $source_product_code)
-            {
-                installer::logger::PrintError(
-                    "new GUID for product code is the same as the old product code but should be different.");
-            }
-        }
-        else
-        {
-            # For minor or micro releases we have to keeep the old product code.
-            $target_product_code = "{" . $source_product_code . "}";
-            $installer::logger::Lang->printf("building a minor or micro release, reusing product code %s\n",
-                $target_product_code);
-        }
-
-        $target_upgrade_code = "{" . create_guid() . "}";
-        # Again, just one test for paranoia.
-        if ($target_upgrade_code eq $source_upgrade_code)
-        {
-            installer::logger::PrintError(
-                "new GUID for upgrade code is the same as the old upgrade code but should be different.");
-        }
-    }
-    else
-    {
-        # There is no previous version with which to compare the product code.
-        # Just create two new uuids.
-        $target_product_code = "{" . create_guid() . "}";
-        $target_upgrade_code = "{" . create_guid() . "}";
-        $installer::logger::Lang->printf("there is no source version => created new guids\n");
-    }
-
-    # Keep the upgrade code constant between versions.  Read it from the codes.txt file.
-    # Note that this handles regular installation sets and language packs.
-    my $onelanguage = ${$languagesref}[0];
-    $installer::logger::Lang->printf("reading upgrade code for language %s from %s\n",
-        $onelanguage,
-        $installer::globals::codefilename);
-    if (defined $installer::globals::codefilename)
-    {
-        my $code_filename = $installer::globals::codefilename;
-        installer::files::check_file($code_filename);
-        my $codefile = installer::files::read_file($code_filename);
-        my $searchstring = "UPGRADECODE";
-        my $codeblock = installer::windows::idtglobal::get_language_block_from_language_file(
-            $searchstring,
-            $codefile);
-        $target_upgrade_code = installer::windows::idtglobal::get_language_string_from_language_block(
-            $codeblock,
-            $onelanguage,
-            "");
-    }
-    # else use the previously generated upgrade code.
-
-    $installer::globals::productcode = $target_product_code;
-    $installer::globals::upgradecode = $target_upgrade_code;
-    $allvariableshashref->{'PRODUCTCODE'} = $target_product_code;
+	my ($source_product_code, $source_upgrade_code) = get_source_codes($languagesref);
+	my ($target_product_code, $target_upgrade_code) = (undef, undef);
+
+	if (defined $source_product_code && defined $source_upgrade_code)
+	{
+		if ($installer::globals::is_major_release)
+		{
+			# For a major release we have to change the product code.
+			$target_product_code = "{" . create_guid() . "}";
+			$installer::logger::Lang->printf("building a major release, created new product code %s\n",
+				$target_product_code);
+
+			# Let's do a paranoia check that the new and the old guids are
+			# different. In reality the new guid really has to be
+			# different from all other guids used for * codes, components,
+			# etc.
+			if ($target_product_code eq $source_product_code)
+			{
+				installer::logger::PrintError(
+					"new GUID for product code is the same as the old product code but should be different.");
+			}
+		}
+		else
+		{
+			# For minor or micro releases we have to keep the old product code.
+			$target_product_code = "{" . $source_product_code . "}";
+			$installer::logger::Lang->printf("building a minor or micro release, reusing product code %s\n",
+				$target_product_code);
+		}
+
+		$target_upgrade_code = "{" . create_guid() . "}";
+		# Again, just one test for paranoia.
+		if ($target_upgrade_code eq $source_upgrade_code)
+		{
+			installer::logger::PrintError(
+				"new GUID for upgrade code is the same as the old upgrade code but should be different.");
+		}
+	}
+	else
+	{
+		# There is no previous version with which to compare the product code.
+		# Just create two new uuids.
+		$target_product_code = "{" . create_guid() . "}";
+		$target_upgrade_code = "{" . create_guid() . "}";
+		$installer::logger::Lang->printf("there is no source version => created new guids\n");
+	}
+
+	# Keep the upgrade code constant between versions. Read it from the codes.txt file.
+	# Note that this handles regular installation sets and language packs.
+	my $onelanguage = ${$languagesref}[0];
+	$installer::logger::Lang->printf("reading upgrade code for language %s from %s\n",
+		$onelanguage,
+		$installer::globals::codefilename);
+	if (defined $installer::globals::codefilename)
+	{
+		my $code_filename = $installer::globals::codefilename;
+		installer::files::check_file($code_filename);
+		my $codefile = installer::files::read_file($code_filename);
+		my $searchstring = "UPGRADECODE";
+		my $codeblock = installer::windows::idtglobal::get_language_block_from_language_file(
+			$searchstring,
+			$codefile);
+		$target_upgrade_code = installer::windows::idtglobal::get_language_string_from_language_block(
+			$codeblock,
+			$onelanguage,
+			"");
+	}
+	# else use the previously generated upgrade code.
+
+	$installer::globals::productcode = $target_product_code;
+	$installer::globals::upgradecode = $target_upgrade_code;
+	$allvariableshashref->{'PRODUCTCODE'} = $target_product_code;
 	$allvariableshashref->{'UPGRADECODE'} = $target_upgrade_code;
 
 	$installer::logger::Lang->printf("target product code is %s\n", $target_product_code);
@@ -1690,7 +1688,7 @@ sub set_msiproductversion
 		$productmicro = "0" . $productmicro while ( length ( $productminor . $productmicro ) < 3 );
 		$productminor .= $productmicro;
 	}
-	elsif  ( $productversion =~ /^\s*(\d+)\.(\d+)\s*$/ )
+	elsif ( $productversion =~ /^\s*(\d+)\.(\d+)\s*$/ )
 	{
 		$productmajor = $1;
 		$productminor = $2;
@@ -1701,16 +1699,16 @@ sub set_msiproductversion
 		{
 			if ( $allvariables->{'PACKAGEVERSION'} =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ ) { $productminor = $2; }
 		}
-				
+
 		$productmajor = $productversion;
 	}
 	$productminor .= "0" while ( length( $productminor ) < 3);
 	$productversion = $productmajor . "\." . $productminor . "\." . $installer::globals::buildid;
-	
+
 	$installer::globals::msiproductversion = $productversion;
-	
+
 	# Setting $installer::globals::msimajorproductversion, to differ between old version in upgrade table
-	
+
 	if ( $installer::globals::msiproductversion =~ /^\s*(\d+)\./ )
 	{
 		my $major = $1;
@@ -1748,7 +1746,7 @@ sub put_msiproductversion_into_bootstrapfile
 
 ####################################################################################
 # Updating the file Property.idt dynamically
-# Content: 
+# Content:
 # Property Value
 ####################################################################################
 
@@ -1757,13 +1755,13 @@ sub update_reglocat_table
 	my ($basedir, $allvariables) = @_;
 
 	my $reglocatfilename = $basedir . $installer::globals::separator . "RegLocat.idt";
-	
+
 	# Only do something, if this file exists
-	
+
 	if ( -f $reglocatfilename )
 	{
 		my $reglocatfile = installer::files::read_file($reglocatfilename);
-		
+
 		my $layername = "";
 		if ( $allvariables->{'REGISTRYLAYERNAME'} )
 		{
@@ -1778,11 +1776,11 @@ sub update_reglocat_table
 					installer::exiter::exit_program("ERROR: Variable \"REGISTRYLAYERNAME\" has to be defined", "update_reglocat_table");
 				}
 			}
-		} 
+		}
 
 		if ( $layername ne "" )
 		{
-			# Updating the layername in 
+			# Updating the layername in
 
 			for ( my $i = 0; $i <= $#{$reglocatfile}; $i++ )
 			{
@@ -1791,7 +1789,7 @@ sub update_reglocat_table
 
 			# Saving the file
 			installer::files::save_file($reglocatfilename ,$reglocatfile);
-			my $infoline = "Updated idt file: $reglocatfilename\n"; 
+			my $infoline = "Updated idt file: $reglocatfilename\n";
 			$installer::logger::Lang->print($infoline);
 		}
 	}
@@ -1809,9 +1807,9 @@ sub update_removere_table
 	my ($basedir) = @_;
 
 	my $removeregistryfilename = $basedir . $installer::globals::separator . "RemoveRe.idt";
-	
+
 	# Only do something, if this file exists
-	
+
 	if ( -f $removeregistryfilename )
 	{
 		my $removeregistryfile = installer::files::read_file($removeregistryfilename);
@@ -1826,10 +1824,9 @@ sub update_removere_table
 
 		# Saving the file
 		installer::files::save_file($removeregistryfilename ,$removeregistryfile);
-		my $infoline = "Updated idt file: $removeregistryfilename \n"; 
+		my $infoline = "Updated idt file: $removeregistryfilename \n";
 		$installer::logger::Lang->print($infoline);
 	}
 }
 
-
 1;
diff --git a/main/solenv/bin/modules/installer/windows/sign.pm b/main/solenv/bin/modules/installer/windows/sign.pm
index 664ab66aaf..8a4934a2ce 100644
--- a/main/solenv/bin/modules/installer/windows/sign.pm
+++ b/main/solenv/bin/modules/installer/windows/sign.pm
@@ -1,5 +1,5 @@
 #**************************************************************
-#  
+#
 #  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
@@ -7,20 +7,18 @@
 #  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::sign;
 
 use Cwd;
@@ -54,11 +52,11 @@ sub copy_install_set
 
 	if ( $dirname =~ /\./ ) { $dirname =~ s/\./_signed_inprogress./; }
 	else { $dirname = $dirname . "_signed_inprogress"; }
-	
+
 	my $newpath = $path . $installer::globals::separator . $dirname;
 	my $removepath = $newpath;
 	$removepath =~ s/_inprogress/_witherror/;
-	
+
 	if ( -d $newpath ) { installer::systemactions::remove_complete_directory($newpath, 1); }
 	if ( -d $removepath ) { installer::systemactions::remove_complete_directory($removepath, 1); }
 
@@ -92,11 +90,11 @@ sub rename_install_set
 
 	if ( $dirname =~ /\./ ) { $dirname =~ s/\./_inprogress./; }
 	else { $dirname = $dirname . "_inprogress"; }
-	
+
 	my $newpath = $path . $installer::globals::separator . $dirname;
 	my $removepath = $newpath;
 	$removepath =~ s/_inprogress/_witherror/;
-	
+
 	if ( -d $newpath ) { installer::systemactions::remove_complete_directory($newpath, 1); }
 	if ( -d $removepath ) { installer::systemactions::remove_complete_directory($removepath, 1); }
 
@@ -123,26 +121,26 @@ sub check_system_path
 		push(@needed_files_in_path, "makecab.exe");
 	}
 
-	my $onefile;	
+	my $onefile;
 	my $error = 0;
 	my $pathvariable = $ENV{'PATH'};
 	my $local_pathseparator = $installer::globals::pathseparator;
-	
+
 	if( $^O =~ /cygwin/i )
-	{	# When using cygwin's perl the PATH variable is POSIX style and ...
+	{	# When using Cygwin's perl the PATH variable is POSIX style and ...
 		$pathvariable = qx{cygpath -mp "$pathvariable"} ;
 		# has to be converted to DOS style for further use.
 		$local_pathseparator = ';';
 	}
-	
+
 	my $patharrayref = installer::converter::convert_stringlist_into_array(\$pathvariable, $local_pathseparator);
-	
+
 	$installer::globals::patharray = $patharrayref;
-		
+
 	foreach my $onefile ( @needed_files_in_path )
 	{
 
-        $installer::logger::Info->printf("...... searching %s ...\n", $onefile);
+		$installer::logger::Info->printf("...... searching %s ...\n", $onefile);
 
 		my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$onefile, $patharrayref , 0);
 
@@ -153,8 +151,8 @@ sub check_system_path
 		}
 		else
 		{
-            $installer::logger::Info->printf("\tFound: %s\n", $$fileref);
-		}		
+			$installer::logger::Info->printf("\tFound: %s\n", $$fileref);
+		}
 	}
 
 	$installer::globals::signfiles_checked = 1;
@@ -170,7 +168,7 @@ sub make_systemcall
 {
 	my ($systemcall, $displaysystemcall) = @_;
 
-    $installer::logger::Info->printf("... %s ...\n", $displaysystemcall);
+	$installer::logger::Info->printf("... %s ...\n", $displaysystemcall);
 
 	my $success = 1;
 	my $returnvalue = system($systemcall);
@@ -189,9 +187,9 @@ sub make_systemcall
 		$infoline = "Success: Executed \"$displaysystemcall\" successfully!\n";
 		$installer::logger::Lang->print($infoline);
 	}
-	
+
 	return $success;
-}	
+}
 
 ######################################################
 # Making systemcall with warning
@@ -201,7 +199,7 @@ sub make_systemcall_with_warning
 {
 	my ($systemcall, $displaysystemcall) = @_;
 
-    $installer::logger::Info->printf("... %s ...\n", $displaysystemcall);
+	$installer::logger::Info->printf("... %s ...\n", $displaysystemcall);
 
 	my $success = 1;
 	my $returnvalue = system($systemcall);
@@ -220,9 +218,9 @@ sub make_systemcall_with_warning
 		$infoline = "Success: Executed \"$displaysystemcall\" successfully!\n";
 		$installer::logger::Lang->print($infoline);
 	}
-	
+
 	return $success;
-}	
+}
 
 ######################################################
 # Making systemcall with more return data
@@ -276,14 +274,14 @@ sub execute_open_system_call
 sub get_pw
 {
 	my ( $file ) = @_;
-	
+
 	my $filecontent = installer::files::read_file($file);
 
 	my $pw = ${$filecontent}[0];
-	$pw =~ s/^\s*//;	
+	$pw =~ s/^\s*//;
 	$pw =~ s/\s*$//;
-	
-	return $pw;	
+
+	return $pw;
 }
 
 ########################################################
@@ -293,16 +291,16 @@ sub get_pw
 sub get_hash_count
 {
 	my ($hashref) = @_;
-	
+
 	my $counter = 0;
-	
+
 	foreach my $key ( keys %{$hashref} ) { $counter++; }
-	
+
 	return $counter;
 }
 
 ############################################################
-# Collect all last files in a cabinet file. This is 
+# Collect all last files in a cabinet file. This is
 # necessary to control, if the cabinet file was damaged
 # by calling signtool.exe.
 ############################################################
@@ -336,7 +334,7 @@ sub analyze_file_file
 sub analyze_media_file
 {
 	my ($filecontent) = @_;
-	
+
 	my %diskidhash = ();
 	my %lastsequencehash = ();
 
@@ -365,7 +363,7 @@ sub analyze_media_file
 sub collect_diskid_from_media_table
 {
 	my ($msidatabase, $languagestring) = @_;
-	
+
 	# creating working directory
 	my $workdir = installer::systemactions::create_directories("media", \$languagestring);
 	installer::windows::admin::extract_tables_from_pcpfile($msidatabase, $workdir, "Media File");
@@ -393,13 +391,13 @@ sub collect_diskid_from_media_table
 sub check_for_internal_cabfiles
 {
 	my ($cabfilehash) = @_;
-	
+
 	my $contains_internal_cabfiles = 0;
 	my %allcabfileshash = ();
-	
+
 	foreach my $filename ( keys %{$cabfilehash} )
 	{
-		if ( $filename =~ /^\s*\#/ )	 # starting with a hash
+		if ( $filename =~ /^\s*\#/ ) # starting with a hash
 		{
 			$contains_internal_cabfiles = 1;
 			# setting real filename without hash as key and name with hash as value
@@ -408,7 +406,7 @@ sub check_for_internal_cabfiles
 			$allcabfileshash{$realfilename} = $filename;
 		}
 	}
-	
+
 	return ( $contains_internal_cabfiles, \%allcabfileshash );
 }
 
@@ -450,11 +448,11 @@ sub analyze_installset_content
 			$allfileshash{$sourcefiles[$j]} = 1;
 		}
 	}
-		
+
 	# Is there at least one cab file in the installation set?
 	my $cabcounter = get_hash_count(\%allcabfileshash);
 	if ( $cabcounter > 0 ) { $contains_external_cabfiles = 1; }
-	
+
 	# How about a cab file without a msi database?
 	if (( $cabcounter > 0 ) && ( $msidatabase eq "" )) { installer::exiter::exit_program("ERROR: There is no msi database in the installation set, but an external cabinet file. Path: $installsetpath !", "collect_installset_content"); }
 
@@ -477,22 +475,22 @@ sub msicert_database
 	foreach my $cabfile ( keys %{$allcabfiles} )
 	{
 		my $origfilesize = -s $cabfile;
-		
+
 		my $mediacabfilename = $cabfile;
 		if ( $internalcabfile ) { $mediacabfilename = "\#" . $mediacabfilename; }
 		if ( ! exists($cabfilehash->{$mediacabfilename}) ) { installer::exiter::exit_program("ERROR: Could not determine DiskId from media table for cabinet file \"$cabfile\" !", "msicert_database"); }
 		my $diskid = $cabfilehash->{$mediacabfilename};
 
 		my $systemcall = "msicert.exe -d $msidatabase -m $diskid -c $cabfile -h";
- 		$success = make_systemcall($systemcall, $systemcall);
+		$success = make_systemcall($systemcall, $systemcall);
 		if ( ! $success ) { $fullsuccess = 0; }
 
-		# size of cabinet file must not change		
+		# size of cabinet file must not change
 		my $finalfilesize = -s $cabfile;
-		
+
 		if ( $origfilesize != $finalfilesize ) { installer::exiter::exit_program("ERROR: msicert.exe changed size of cabinet file !", "msicert_database"); }
 	}
-	
+
 	return $fullsuccess;
 }
 
@@ -503,8 +501,8 @@ sub msicert_database
 sub cabinet_cosistency_check
 {
 	my ( $onefile, $followmeinfohash, $filenamehash, $lastsequencehash, $temppath ) = @_;
-	
-	my $infoline = "Making consistency check of $onefile\n"; 
+
+	my $infoline = "Making consistency check of $onefile\n";
 	$installer::logger::Lang->print($infoline);
 	my $expandfile = "expand.exe";	# Has to be in the path
 
@@ -513,63 +511,63 @@ sub cabinet_cosistency_check
 		$expandfile = qx(cygpath -u "$ENV{WINDIR}"/System32/expand.exe);
 		chomp $expandfile;
 	}
-	 		
+
 	if ( $filenamehash == 0 )
 	{
 		$infoline = "Warning: Stopping consistency check: Important hash of filenames is empty!\n";
 		$installer::logger::Lang->print($infoline);
 	}
-	elsif  ( $lastsequencehash == 0 )
+	elsif ( $lastsequencehash == 0 )
 	{
 		$infoline = "Warning: Stopping consistency check; Important hash of last sequences is empty!\n";
-		$installer::logger::Lang->print($infoline);	 			
+		$installer::logger::Lang->print($infoline);
 	}
 	else # both hashes are available
 	{
 		# $onefile contains only the name of the cabinet file without path
-	 	my $sequence = $lastsequencehash->{$onefile};
-	 	my $lastfile = $filenamehash->{$sequence};
+		my $sequence = $lastsequencehash->{$onefile};
+		my $lastfile = $filenamehash->{$sequence};
 		$infoline = "Check of $onefile: Sequence: $sequence is file: $lastfile\n";
 		$installer::logger::Lang->print($infoline);
-	 			
-	 	# Therefore the file $lastfile need to be binary compared.
-	 	# It has to be expanded from the cabinet file
-	 	# of the original installation set and from the
-	 	# newly signed cabinet file.
-	 	
+
+		# Therefore the file $lastfile need to be binary compared.
+		# It has to be expanded from the cabinet file
+		# of the original installation set and from the
+		# newly signed cabinet file.
+
 		# How about cabinet files extracted from msi database?
 		my $finalinstalldir = $followmeinfohash->{'finalinstalldir'};
-		
+
 		$finalinstalldir =~ s/\\\s*$//;
 		$finalinstalldir =~ s/\/\s*$//;
 		my $sourcecabfile = $finalinstalldir . $installer::globals::separator . $onefile;
 		my $currentpath = cwd();
 		my $destcabfile = $currentpath . $installer::globals::separator . $onefile;
 		# my $destcabfile = $onefile;
-		
+
 		if ( $^O =~ /cygwin/i )
 		{
 			chomp( $destcabfile = qx{cygpath -w "$destcabfile"} );
 			$destcabfile =~ s/\\/\//g;
 		}
 
-		if ( ! -f $sourcecabfile ) 
+		if ( ! -f $sourcecabfile )
 		{
 			$infoline = "WARNING: Check of cab file cannot happen, because source cabinet file was not found: $sourcecabfile\n";
-			$installer::logger::Lang->print($infoline);	
+			$installer::logger::Lang->print($infoline);
 		}
-		elsif ( ! -f $destcabfile ) 
+		elsif ( ! -f $destcabfile )
 		{
 			$infoline = "WARNING: Check of cab file cannot happen, because destination cabinet file was not found: $sourcecabfile\n";
-			$installer::logger::Lang->print($infoline);				
+			$installer::logger::Lang->print($infoline);
 		}
 		else # everything is okay for the check
 		{
 			my $diffpath = get_diff_path($temppath);
-		
+
 			my $origdiffpath = $diffpath . $installer::globals::separator . "orig";
 			my $newdiffpath = $diffpath . $installer::globals::separator . "new";
-		
+
 			if ( ! -d $origdiffpath ) { mkdir($origdiffpath); }
 			if ( ! -d $newdiffpath ) { mkdir($newdiffpath); }
 
@@ -579,26 +577,26 @@ sub cabinet_cosistency_check
 
 			my $success = make_systemcall($systemcall, $systemcall);
 			if ( ! $success ) { installer::exiter::exit_program("ERROR: Could not successfully execute: $systemcall !", "cabinet_cosistency_check"); }
-				
+
 			$systemcall = "$expandfile $destcabfile $newdiffpath -f:$lastfile ";
 			$infoline = $systemcall . "\n";
 			$installer::logger::Lang->print($infoline);
-		
+
 			$success = make_systemcall($systemcall, $systemcall);
 			if ( ! $success ) { installer::exiter::exit_program("ERROR: Could not successfully execute: $systemcall !", "cabinet_cosistency_check"); }
 
 			# and finally the two files can be diffed.
-			my $origfile = $origdiffpath . $installer::globals::separator . $lastfile; 
+			my $origfile = $origdiffpath . $installer::globals::separator . $lastfile;
 			my $newfile = $newdiffpath . $installer::globals::separator . $lastfile;
-		
+
 			if ( ! -f $origfile ) { installer::exiter::exit_program("ERROR: Unpacked original file not found: $origfile !", "cabinet_cosistency_check"); }
 			if ( ! -f $newfile ) { installer::exiter::exit_program("ERROR: Unpacked new file not found: $newfile !", "cabinet_cosistency_check"); }
-		
+
 			my $origsize = -s $origfile;
 			my $newsize = -s $newfile;
-		
+
 			if ( $origsize != $newsize ) # This shows an error!
-			{			
+			{
 				$infoline = "ERROR: Different filesize after signtool.exe was used. Original: $origsize Bytes, new: $newsize. File: $lastfile\n";
 				$installer::logger::Lang->print($infoline);
 				installer::exiter::exit_program("ERROR: The cabinet file $destcabfile is broken after signtool.exe signed this file !", "cabinet_cosistency_check");
@@ -610,8 +608,8 @@ sub cabinet_cosistency_check
 
 				# Also making a binary diff?
 
-				my $difffile = "diff.exe";  # has to be in the path
-				# $systemcall = "$difffile $sourcecabfile $destcabfile";  # Test for differences
+				my $difffile = "diff.exe"; # has to be in the path
+				# $systemcall = "$difffile $sourcecabfile $destcabfile"; # Test for differences
 				$systemcall = "$difffile $origfile $newfile";
 				$infoline = $systemcall . "\n";
 				$returnvalue = make_systemcall($systemcall, $systemcall);
@@ -626,18 +624,18 @@ sub cabinet_cosistency_check
 				elsif ( $success == 1 )
 				{
 					$infoline = "ERROR: Last files are different after signing cabinet file (File: $lastfile)\n";
-					$installer::logger::Lang->print($infoline);				
+					$installer::logger::Lang->print($infoline);
 					installer::exiter::exit_program("ERROR: Last files are different after signing cabinet file (File: $lastfile)!", "cabinet_cosistency_check");
-				}		
+				}
 				else
 				{
 					$infoline = "ERROR: Problem occurred calling diff.exe (File: $lastfile)\n";
-					$installer::logger::Lang->print($infoline);								
+					$installer::logger::Lang->print($infoline);
 					installer::exiter::exit_program("ERROR: Problem occurred calling diff.exe (File: $lastfile) !", "cabinet_cosistency_check");
 				}
 			}
-		}		
-	}	
+		}
+	}
 
 }
 
@@ -648,25 +646,25 @@ sub cabinet_cosistency_check
 sub sign_files
 {
 	my ( $followmeinfohash, $allfiles, $pw, $cabinternal, $filenamehash, $lastsequencehash, $temppath ) = @_;
-	
+
 	my $infoline = "";
 	my $fullsuccess = 1;
 	my $maxcounter = 3;
-	
+
 	my $productname = "";
 	if ( $followmeinfohash->{'allvariableshash'}->{'PRODUCTNAME'} ) { $productname = "/d " . "\"$followmeinfohash->{'allvariableshash'}->{'PRODUCTNAME'}\""; }
 	my $url = "/du " . "\"http://www.openoffice.org\"";
 	my $timestampurl = "http://timestamp.verisign.com/scripts/timestamp.dll";
-	
+
 	my $pfxfilepath = $installer::globals::pfxfile;
-	
+
 	if( $^O =~ /cygwin/i )
 	{
 		$pfxfilepath = qx{cygpath -w "$pfxfilepath"};
 		$pfxfilepath =~ s/\\/\\\\/g;
 		$pfxfilepath =~ s/\s*$//g;
 	}
-	
+
 	foreach my $onefile ( reverse sort keys %{$allfiles} )
 	{
 		if ( already_certified($onefile) )
@@ -675,41 +673,41 @@ sub sign_files
 			$installer::logger::Lang->print($infoline);
 			next;
 		}
-		
+
 		my $counter = 1;
 		my $success = 0;
-		
+
 		while (( $counter <= $maxcounter ) && ( ! $success ))
 		{
 			if ( $counter > 1 )
-            {
-                $installer::logger::Info->printf("\n");
-                $installer::logger::Info->printf("\n");
-                $installer::logger::Info->printf("... repeating file %s ...\n", $onefile);
-            }
+			{
+				$installer::logger::Info->printf("\n");
+				$installer::logger::Info->printf("\n");
+				$installer::logger::Info->printf("... repeating file %s ...\n", $onefile);
+			}
 			if ( $cabinternal )
-            {
-                $installer::logger::Info->printf("    Signing: %s\n", $onefile);
-            }
+			{
+				$installer::logger::Info->printf("    Signing: %s\n", $onefile);
+			}
 			my $systemcall = "signtool.exe sign /f \"$pfxfilepath\" /p $pw $productname $url /t \"$timestampurl\" \"$onefile\"";
 			my $displaysystemcall = "signtool.exe sign /f \"$pfxfilepath\" /p ***** $productname $url /t \"$timestampurl\" \"$onefile\"";
-	 		$success = make_systemcall_with_warning($systemcall, $displaysystemcall);
-	 		$counter++;
-	 	}
-	 	
-	 	# Special check for cabinet files, that sometimes get damaged by signtool.exe
-	 	if (( $success ) && ( $onefile =~ /\.cab\s*$/ ) && ( ! $cabinternal ))
-	 	{
-	 		cabinet_cosistency_check($onefile, $followmeinfohash, $filenamehash, $lastsequencehash, $temppath);
+			$success = make_systemcall_with_warning($systemcall, $displaysystemcall);
+			$counter++;
+		}
+
+		# Special check for cabinet files, that sometimes get damaged by signtool.exe
+		if (( $success ) && ( $onefile =~ /\.cab\s*$/ ) && ( ! $cabinternal ))
+		{
+			cabinet_cosistency_check($onefile, $followmeinfohash, $filenamehash, $lastsequencehash, $temppath);
 		}
 
- 		if ( ! $success )
- 		{
- 			$fullsuccess = 0;
+		if ( ! $success )
+		{
+			$fullsuccess = 0;
 			installer::exiter::exit_program("ERROR: Could not sign file: $onefile!", "sign_files");
 		}
 	}
-	
+
 	return $fullsuccess;
 }
 
@@ -729,23 +727,23 @@ sub check_ddf_file
 	for ( my $i = 0; $i <= $#{$ddffile}; $i++ )
 	{
 		my $oneline = ${$ddffile}[$i];
-		
+
 		$linelength = length($oneline);
 		$linenumber = $i + 1;
-		
+
 		if ( $linelength > 256 )
 		{
 			installer::exiter::exit_program("ERROR \"$ddffilename\" line $linenumber: Lines in ddf files must not contain more than 256 characters!", "check_ddf_file");
 		}
-		
+
 		if ( $linelength > $maxlength )
 		{
 			$maxlength = $linelength;
 			$maxline = $linenumber;
 		}
 	}
-	
-	my $infoline = "Check of ddf file \"$ddffilename\": Maximum length \"$maxlength\" in line \"$maxline\" (allowed line length: 256 characters)\n"; 
+
+	my $infoline = "Check of ddf file \"$ddffilename\": Maximum length \"$maxlength\" in line \"$maxline\" (allowed line length: 256 characters)\n";
 	$installer::logger::Lang->print($infoline);
 }
 
@@ -761,7 +759,7 @@ sub get_cab_path
 	$cabpath = $temppath . $installer::globals::separator . $cabpath;
 	if ( ! -d $cabpath ) { installer::systemactions::create_directory($cabpath); }
 
-	return $cabpath;	
+	return $cabpath;
 }
 
 #################################################################
@@ -776,7 +774,7 @@ sub get_diff_path
 	$diffpath = $temppath . $installer::globals::separator . $diffpath;
 	if ( ! -d $diffpath ) { installer::systemactions::create_directory($diffpath); }
 
-	return $diffpath;	
+	return $diffpath;
 }
 
 #################################################################
@@ -799,15 +797,15 @@ sub extract_cabs_from_database
 	foreach my $onefile ( keys %{$allcabfiles} )
 	{
 		my $systemcall = $msidb . " -d " . $msidatabase . " -x " . $onefile;
- 		my $success = make_systemcall($systemcall, $systemcall);
+		my $success = make_systemcall($systemcall, $systemcall);
 		if ( ! $success ) { $fullsuccess = 0; }
-		
+
 		# and removing the stream from the database
 		$systemcall = $msidb . " -d " . $msidatabase . " -k " . $onefile;
- 		$success = make_systemcall($systemcall, $systemcall);
+		$success = make_systemcall($systemcall, $systemcall);
 		if ( ! $success ) { $fullsuccess = 0; }
 	}
-	
+
 	return $fullsuccess;
 }
 
@@ -831,10 +829,10 @@ sub include_cabs_into_database
 	foreach my $onefile ( keys %{$allcabfiles} )
 	{
 		my $systemcall = $msidb . " -d " . $msidatabase . " -a " . $onefile;
- 		my $success = make_systemcall($systemcall, $systemcall);
+		my $success = make_systemcall($systemcall, $systemcall);
 		if ( ! $success ) { $fullsuccess = 0; }
 	}
-	
+
 	return $fullsuccess;
 }
 
@@ -847,18 +845,18 @@ sub read_cab_file
 {
 	my ($cabfilename) = @_;
 
-    $installer::logger::Info->printf("\n");
-    $installer::logger::Info->printf("... reading cabinet file %s ...\n", $cabfilename);
+	$installer::logger::Info->printf("\n");
+	$installer::logger::Info->printf("... reading cabinet file %s ...\n", $cabfilename);
 	my $infoline = "Reading cabinet file $cabfilename\n";
 	$installer::logger::Lang->print($infoline);
 
 	my $systemcall = "cabarc.exe" . " L " . $cabfilename;
 	push(@logfile, "$systemcall\n");
-	
+
 	my ($success, $fileorder) = execute_open_system_call($systemcall);
 
 	my @allfiles = ();
-	
+
 	for ( my $i = 0; $i <= $#{$fileorder}; $i++ )
 	{
 		my $line = ${$fileorder}[$i];
@@ -868,7 +866,7 @@ sub read_cab_file
 			push(@allfiles, $filename);
 		}
 	}
-		
+
 	return \@allfiles;
 }
 
@@ -880,14 +878,14 @@ sub unpack_cab_file
 {
 	my ($cabfilename, $temppath) = @_;
 
-    $installer::logger::Info->printf("\n");
-    $installer::logger::Info->printf("... unpacking cabinet file %s ...\n", $cabfilename);
+	$installer::logger::Info->printf("\n");
+	$installer::logger::Info->printf("... unpacking cabinet file %s ...\n", $cabfilename);
 	my $infoline = "Unpacking cabinet file $cabfilename\n";
 	$installer::logger::Lang->print($infoline);
-	
+
 	my $dirname = $cabfilename;
 	$dirname =~ s/\.cab\s*$//;
-	my $workingpath = $temppath . $installer::globals::separator . "unpack_". $dirname . "_" . $$;	
+	my $workingpath = $temppath . $installer::globals::separator . "unpack_". $dirname . "_" . $$;
 	if ( ! -d $workingpath ) { installer::systemactions::create_directory($workingpath); }
 
 	# changing into unpack directory
@@ -920,7 +918,7 @@ sub unpack_cab_file
 sub get_ddf_file_header
 {
 	my ($ddffileref, $cabinetfile, $installdir) = @_;
-	
+
 	my $oneline;
 	my $compressionlevel = 2;
 
@@ -929,7 +927,7 @@ sub get_ddf_file_header
 		$installdir = qx{cygpath -w "$installdir"};
 		$installdir =~ s/\s*$//g;
 	}
-	
+
 	$oneline = ".Set CabinetName1=" . $cabinetfile . "\n";
 	push(@{$ddffileref} ,$oneline);
 	$oneline = ".Set ReservePerCabinetSize=128\n";	# This reserves space for a digital signature.
@@ -976,8 +974,8 @@ sub do_pack_cab_file
 {
 	my ($cabfilename, $allfiles, $workingpath, $temppath) = @_;
 
-    $installer::logger::Info->print("\n");
-    $installer::logger::Info->printf("... packing cabinet file %s ...\n", $cabfilename);
+	$installer::logger::Info->print("\n");
+	$installer::logger::Info->printf("... packing cabinet file %s ...\n", $cabfilename);
 	my $infoline = "Packing cabinet file $cabfilename\n";
 	$installer::logger::Lang->print($infoline);
 
@@ -989,12 +987,12 @@ sub do_pack_cab_file
 
 	my $dirname = $cabfilename;
 	$dirname =~ s/\.cab\s*$//;
-	my $ddfpath = $temppath . $installer::globals::separator . "ddf_". $dirname . "_" . $$;	
+	my $ddfpath = $temppath . $installer::globals::separator . "ddf_". $dirname . "_" . $$;
 
 	my $ddffilename = $cabfilename;
 	$ddffilename =~ s/.cab/.ddf/;
 	$ddffilename = $ddfpath . $installer::globals::separator . $ddffilename;
-		
+
 	if ( ! -d $ddfpath ) { installer::systemactions::create_directory($ddfpath); }
 
 	my $from = cwd();
@@ -1005,7 +1003,7 @@ sub do_pack_cab_file
 	put_all_files_into_ddffile(\@ddffile, $allfiles, $workingpath);
 	# lines in ddf files must not be longer than 256 characters
 	check_ddf_file(\@ddffile, $ddffilename);
-	
+
 	installer::files::save_file($ddffilename, \@ddffile);
 
 	if( $^O =~ /cygwin/i )
@@ -1021,7 +1019,7 @@ sub do_pack_cab_file
 
 	chdir($from);
 
-	return ($success);	
+	return ($success);
 }
 
 ########################################################
@@ -1031,12 +1029,12 @@ sub do_pack_cab_file
 sub get_extension
 {
 	my ( $file ) = @_;
-	
+
 	my $extension = "";
-	
+
 	if ( $file =~ /^\s*(.*)\.(\w+?)\s*$/ ) { $extension = $2; }
-	
-	return $extension;	
+
+	return $extension;
 }
 
 ########################################################
@@ -1047,21 +1045,21 @@ sub get_extension
 sub already_certified
 {
 	my ( $filename ) = @_;
-	
-	my $success = 1;	
+
+	my $success = 1;
 	my $is_certified = 0;
-	
+
 	my $systemcall = "signtool.exe verify /q /pa \"$filename\"";
 	my $returnvalue = system($systemcall);
-	
+
 	if ( $returnvalue ) { $success = 0; }
 
 	# my $success = make_systemcall($systemcall, $systemcall);
 
- 	if ( $success )
- 	{
- 		$is_certified = 1;
-        $installer::logger::Info->printf("... already certified -> skipping %s ...\n", $filename);
+	if ( $success )
+	{
+		$is_certified = 1;
+		$installer::logger::Info->printf("... already certified -> skipping %s ...\n", $filename);
 	}
 
 	return $is_certified;
@@ -1082,7 +1080,7 @@ sub sign_files_in_cabinet_files
 	foreach my $cabfilename ( keys %{$allcabfiles} )
 	{
 		my $success = 1;
-		
+
 		# saving order of files in cab file
 		my $fileorder = read_cab_file($cabfilename);
 
@@ -1101,15 +1099,15 @@ sub sign_files_in_cabinet_files
 				$allfileshash{$onefile} = 1;
 			}
 		}
- 		$success = sign_files($followmeinfohash, \%allfileshash, $pw, 1, 0, 0, $temppath);
+		$success = sign_files($followmeinfohash, \%allfileshash, $pw, 1, 0, 0, $temppath);
 		if ( ! $success ) { $complete_success = 0; }
 
 		chdir($from);
-		
+
 		# pack into new directory
 		do_pack_cab_file($cabfilename, $fileorder, $workingpath, $temppath);
 	}
-	
+
 	return $complete_success;
 }
 
@@ -1121,7 +1119,7 @@ sub sign_files_in_cabinet_files
 sub compare_directories
 {
 	my ( $dir1, $dir2, $files ) = @_;
-	
+
 	$dir1 =~ s/\\\s*//;
 	$dir2 =~ s/\\\s*//;
 	$dir1 =~ s/\/\s*//;
@@ -1129,12 +1127,12 @@ sub compare_directories
 
 	my $infoline = "Comparing directories: $dir1 and $dir2\n";
 	$installer::logger::Lang->print($infoline);
-	
+
 	foreach my $onefile ( @{$files} )
 	{
 		my $file1 = $dir1 . $installer::globals::separator . $onefile;
 		my $file2 = $dir2 . $installer::globals::separator . $onefile;
-		
+
 		if ( ! -f $file1 ) { installer::exiter::exit_program("ERROR: Missing file : $file1!", "compare_directories"); }
 		if ( ! -f $file2 ) { installer::exiter::exit_program("ERROR: Missing file : $file2!", "compare_directories"); }
 
@@ -1143,7 +1141,7 @@ sub compare_directories
 
 		$infoline = "Comparing files: $file1 ($size1) and $file2 ($size2)\n";
 		$installer::logger::Lang->print($infoline);
-		
+
 		if ( $size1 != $size2 )
 		{
 			installer::exiter::exit_program("ERROR: File defect after copy (different size) $file1 ($size1 bytes) and $file2 ($size2 bytes)!", "compare_directories");
@@ -1165,21 +1163,21 @@ sub sign_install_set
 
 	my $complete_success = 1;
 	my $success = 1;
-	
+
 	my $infoline = "Signing installation set in $installsetpath\n";
 	$installer::logger::Lang->print($infoline);
 
 	# check required files.
 	if ( ! $installer::globals::signfiles_checked ) { check_system_path(); }
-	
-	# get cerficate information
+
+	# get certificate information
 	my $pw = get_pw($installer::globals::pwfile);
 
 	# making a copy of the installation set, if required
 	if ( $make_copy ) { $installsetpath = copy_install_set($installsetpath); }
 	else { $installsetpath = rename_install_set($installsetpath); }
-	
-	# collecting all files in the installation set 
+
+	# collecting all files in the installation set
 	my ($allcabfiles, $allfiles, $msidatabase, $contains_external_cabfiles, $contains_msidatabase, $sourcefiles) = analyze_installset_content($installsetpath);
 
 	if ( $make_copy ) { compare_directories($installsetpath, $followmeinfohash->{'finalinstalldir'}, $sourcefiles); }
@@ -1202,7 +1200,7 @@ sub sign_install_set
 		# exclude media table from msi database and get all diskids.
 		my ( $cabfilehash, $filenamehash, $lastsequencehash ) = collect_diskid_from_media_table($msidatabase, $followmeinfohash->{'languagestring'});
 
-		# Check, if there are internal cab files 
+		# Check, if there are internal cab files
 		my ( $contains_internal_cabfiles, $all_internal_cab_files) = check_for_internal_cabfiles($cabfilehash);
 
 		if ( $contains_internal_cabfiles )
@@ -1243,12 +1241,12 @@ sub sign_install_set
 	# finally all other files can be signed
 	$success = sign_files($followmeinfohash, $allfiles, $pw, 0, 0, 0, $temppath);
 	if ( ! $success ) { $complete_success = 0; }
-	
+
 	# and changing back
 	chdir($from);
 
 	installer::logger::include_header_into_logfile("End: Signing installation set $installsetpath");
-	
+
 	return ($installsetpath);
 }