19780544fSAndrew Rist#**************************************************************
29780544fSAndrew Rist#
39780544fSAndrew Rist#  Licensed to the Apache Software Foundation (ASF) under one
49780544fSAndrew Rist#  or more contributor license agreements.  See the NOTICE file
59780544fSAndrew Rist#  distributed with this work for additional information
69780544fSAndrew Rist#  regarding copyright ownership.  The ASF licenses this file
79780544fSAndrew Rist#  to you under the Apache License, Version 2.0 (the
89780544fSAndrew Rist#  "License"); you may not use this file except in compliance
99780544fSAndrew Rist#  with the License.  You may obtain a copy of the License at
109780544fSAndrew Rist#
119780544fSAndrew Rist#    http://www.apache.org/licenses/LICENSE-2.0
129780544fSAndrew Rist#
139780544fSAndrew Rist#  Unless required by applicable law or agreed to in writing,
149780544fSAndrew Rist#  software distributed under the License is distributed on an
159780544fSAndrew Rist#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169780544fSAndrew Rist#  KIND, either express or implied.  See the License for the
179780544fSAndrew Rist#  specific language governing permissions and limitations
189780544fSAndrew Rist#  under the License.
199780544fSAndrew Rist#
209780544fSAndrew Rist#**************************************************************
219780544fSAndrew Rist
229780544fSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweirpackage installer::windows::msiglobal;
25cdf0e10cSrcweir
26cdf0e10cSrcweiruse Cwd;
27cdf0e10cSrcweiruse Digest::MD5;
28cdf0e10cSrcweiruse installer::converter;
29cdf0e10cSrcweiruse installer::exiter;
30cdf0e10cSrcweiruse installer::files;
31cdf0e10cSrcweiruse installer::globals;
32cdf0e10cSrcweiruse installer::logger;
33cdf0e10cSrcweiruse installer::pathanalyzer;
34cdf0e10cSrcweiruse installer::remover;
35cdf0e10cSrcweiruse installer::scriptitems;
36cdf0e10cSrcweiruse installer::systemactions;
37cdf0e10cSrcweiruse installer::worker;
38cdf0e10cSrcweiruse installer::windows::idtglobal;
39cdf0e10cSrcweiruse installer::windows::language;
409f91b7e3SAndre Fischeruse installer::patch::ReleasesList;
419f91b7e3SAndre Fischer
421ba1fd99SAndre Fischeruse strict;
43cdf0e10cSrcweir
44cdf0e10cSrcweir###########################################################################
45cdf0e10cSrcweir# Generating the header of the ddf file.
46cdf0e10cSrcweir# The usage of ddf files is needed, because makecab.exe can only include
47cdf0e10cSrcweir# one sourcefile into a cab file
48cdf0e10cSrcweir###########################################################################
49cdf0e10cSrcweir
50cdf0e10cSrcweirsub write_ddf_file_header
51cdf0e10cSrcweir{
52cdf0e10cSrcweir	my ($ddffileref, $cabinetfile, $installdir) = @_;
53cdf0e10cSrcweir
54cdf0e10cSrcweir	my $oneline;
55cdf0e10cSrcweir
56cdf0e10cSrcweir	$oneline = ".Set CabinetName1=" . $cabinetfile . "\n";
57cdf0e10cSrcweir	push(@{$ddffileref} ,$oneline);
58cdf0e10cSrcweir	$oneline = ".Set ReservePerCabinetSize=128\n";	# This reserves space for a digital signature.
59cdf0e10cSrcweir	push(@{$ddffileref} ,$oneline);
60cdf0e10cSrcweir	$oneline = ".Set MaxDiskSize=2147483648\n";		# This allows the .cab file to get a size of 2 GB.
61cdf0e10cSrcweir	push(@{$ddffileref} ,$oneline);
62cdf0e10cSrcweir	$oneline = ".Set CompressionType=LZX\n";
63cdf0e10cSrcweir	push(@{$ddffileref} ,$oneline);
64cdf0e10cSrcweir	$oneline = ".Set Compress=ON\n";
65cdf0e10cSrcweir	push(@{$ddffileref} ,$oneline);
66cdf0e10cSrcweir	$oneline = ".Set CompressionLevel=$installer::globals::cabfilecompressionlevel\n";
67cdf0e10cSrcweir	push(@{$ddffileref} ,$oneline);
68cdf0e10cSrcweir	$oneline = ".Set Cabinet=ON\n";
69cdf0e10cSrcweir	push(@{$ddffileref} ,$oneline);
70cdf0e10cSrcweir	$oneline = ".Set DiskDirectoryTemplate=" . $installdir . "\n";
71cdf0e10cSrcweir	push(@{$ddffileref} ,$oneline);
72cdf0e10cSrcweir}
73cdf0e10cSrcweir
74cdf0e10cSrcweir##########################################################################
75cdf0e10cSrcweir# Lines in ddf files must not contain more than 256 characters
76cdf0e10cSrcweir##########################################################################
77cdf0e10cSrcweir
78cdf0e10cSrcweirsub check_ddf_file
79cdf0e10cSrcweir{
80cdf0e10cSrcweir	my ( $ddffile, $ddffilename ) = @_;
81cdf0e10cSrcweir
82cdf0e10cSrcweir	my $maxlength = 0;
83cdf0e10cSrcweir	my $maxline = 0;
84cdf0e10cSrcweir	my $linelength = 0;
85cdf0e10cSrcweir	my $linenumber = 0;
86cdf0e10cSrcweir
87cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$ddffile}; $i++ )
88cdf0e10cSrcweir	{
89cdf0e10cSrcweir		my $oneline = ${$ddffile}[$i];
90cdf0e10cSrcweir
91cdf0e10cSrcweir		$linelength = length($oneline);
92cdf0e10cSrcweir		$linenumber = $i + 1;
93cdf0e10cSrcweir
94cdf0e10cSrcweir		if ( $linelength > 256 )
95cdf0e10cSrcweir		{
96cdf0e10cSrcweir			installer::exiter::exit_program("ERROR \"$ddffilename\" line $linenumber: Lines in ddf files must not contain more than 256 characters!", "check_ddf_file");
97cdf0e10cSrcweir		}
98cdf0e10cSrcweir
99cdf0e10cSrcweir		if ( $linelength > $maxlength )
100cdf0e10cSrcweir		{
101cdf0e10cSrcweir			$maxlength = $linelength;
102cdf0e10cSrcweir			$maxline = $linenumber;
103cdf0e10cSrcweir		}
104cdf0e10cSrcweir	}
105cdf0e10cSrcweir
106cdf0e10cSrcweir	my $infoline = "Check of ddf file \"$ddffilename\": Maximum length \"$maxlength\" in line \"$maxline\" (allowed line length: 256 characters)\n";
107b274bc22SAndre Fischer	$installer::logger::Lang->print($infoline);
108cdf0e10cSrcweir}
109cdf0e10cSrcweir
110cdf0e10cSrcweir##########################################################################
111cdf0e10cSrcweir# Lines in ddf files must not be longer than 256 characters.
112cdf0e10cSrcweir# Therefore it can be useful to use relative pathes. Then it is
113cdf0e10cSrcweir# necessary to change into temp directory before calling
114cdf0e10cSrcweir# makecab.exe.
115cdf0e10cSrcweir##########################################################################
116cdf0e10cSrcweir
117cdf0e10cSrcweirsub make_relative_ddf_path
118cdf0e10cSrcweir{
119cdf0e10cSrcweir	my ( $sourcepath ) = @_;
120cdf0e10cSrcweir
121cdf0e10cSrcweir	my $windowstemppath = $installer::globals::temppath;
122cdf0e10cSrcweir
123cdf0e10cSrcweir	if ( $^O =~ /cygwin/i )
124cdf0e10cSrcweir	{
125cdf0e10cSrcweir		$windowstemppath = $installer::globals::cyg_temppath;
126cdf0e10cSrcweir	}
127cdf0e10cSrcweir
128cdf0e10cSrcweir	$sourcepath =~ s/\Q$windowstemppath\E//;
129cdf0e10cSrcweir	$sourcepath =~ s/^\\//;
130cdf0e10cSrcweir
131cdf0e10cSrcweir	return $sourcepath;
132cdf0e10cSrcweir}
133cdf0e10cSrcweir
134cdf0e10cSrcweir
135cdf0e10cSrcweir##########################################################################
136cdf0e10cSrcweir# Generation the list, in which the source of the files is connected
137cdf0e10cSrcweir# with the cabinet destination file. Because more than one file needs
138cdf0e10cSrcweir# to be included into a cab file, this has to be done via ddf files.
139cdf0e10cSrcweir##########################################################################
140cdf0e10cSrcweir
141*677600b0SAndre Fischersub generate_cab_file_list ($$$$)
142cdf0e10cSrcweir{
143cdf0e10cSrcweir	my ($filesref, $installdir, $ddfdir, $allvariables) = @_;
144cdf0e10cSrcweir
145cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Generating ddf files");
146cdf0e10cSrcweir
147*677600b0SAndre Fischer	if ( $^O =~ /cygwin/i )
148*677600b0SAndre Fischer    {
149*677600b0SAndre Fischer        installer::worker::generate_cygwin_pathes($filesref);
150*677600b0SAndre Fischer    }
151*677600b0SAndre Fischer
152*677600b0SAndre Fischer    # Make sure that all files point to the same cabinet file.
153*677600b0SAndre Fischer    # Multiple cabinet files are not supported anymore.
154*677600b0SAndre Fischer    my $cabinetfile = $filesref->[0]->{'cabinet'};
155*677600b0SAndre Fischer    foreach my $onefile (@$filesref)
156*677600b0SAndre Fischer    {
157*677600b0SAndre Fischer        if ($onefile->{'cabinet'} ne $cabinetfile)
158*677600b0SAndre Fischer        {
159*677600b0SAndre Fischer            installer::exiter::exit_program(
160*677600b0SAndre Fischer                "ERROR: multiple cabinet files are not supported",
161*677600b0SAndre Fischer                "generate_cab_file_list");
162*677600b0SAndre Fischer        }
163*677600b0SAndre Fischer    }
164*677600b0SAndre Fischer
165*677600b0SAndre Fischer    # Sort files on the sequence number.
166*677600b0SAndre Fischer    my @sorted_files = sort {$a->{'sequencenumber'} <=> $b->{'sequencenumber'}} @$filesref;
167*677600b0SAndre Fischer
168*677600b0SAndre Fischer    my @ddffile = ();
169*677600b0SAndre Fischer    write_ddf_file_header(\@ddffile, $cabinetfile, $installdir);
170*677600b0SAndre Fischer    foreach my $onefile (@sorted_files)
171*677600b0SAndre Fischer    {
172*677600b0SAndre Fischer        my $styles = $onefile->{'Styles'} // "";
173*677600b0SAndre Fischer        if ($styles =~ /\bDONT_PACK\b/)
174*677600b0SAndre Fischer        {
175*677600b0SAndre Fischer            $installer::logger::Lang->printf("    excluding '%s' from ddf\n", $onefile->{'uniquename'});
176*677600b0SAndre Fischer        }
177*677600b0SAndre Fischer
178*677600b0SAndre Fischer        my $uniquename = $onefile->{'uniquename'};
179*677600b0SAndre Fischer        my $sourcepath = $onefile->{'sourcepath'};
180*677600b0SAndre Fischer        if ( $^O =~ /cygwin/i )
181*677600b0SAndre Fischer        {
182*677600b0SAndre Fischer            $sourcepath = $onefile->{'cyg_sourcepath'};
183*677600b0SAndre Fischer        }
184*677600b0SAndre Fischer
185*677600b0SAndre Fischer        # to avoid lines with more than 256 characters, it can be useful to use relative pathes
186*677600b0SAndre Fischer        if ($allvariables->{'RELATIVE_PATHES_IN_DDF'})
187*677600b0SAndre Fischer        {
188*677600b0SAndre Fischer            $sourcepath = make_relative_ddf_path($sourcepath);
189*677600b0SAndre Fischer        }
190*677600b0SAndre Fischer
191*677600b0SAndre Fischer        my $ddfline = "\"" . $sourcepath . "\"" . " " . $uniquename . "\n";
192*677600b0SAndre Fischer        push(@ddffile, $ddfline);
193*677600b0SAndre Fischer
194*677600b0SAndre Fischer        $installer::logger::Lang->printf("    adding '%s' with sequence %d to ddf\n",
195*677600b0SAndre Fischer            $onefile->{'uniquename'},
196*677600b0SAndre Fischer            $onefile->{'sequencenumber'});
197*677600b0SAndre Fischer    }
198*677600b0SAndre Fischer    # creating the DDF file
199*677600b0SAndre Fischer
200*677600b0SAndre Fischer    my $ddffilename = $cabinetfile;
201*677600b0SAndre Fischer    $ddffilename =~ s/.cab/.ddf/;
202*677600b0SAndre Fischer    $ddfdir =~ s/\Q$installer::globals::separator\E\s*$//;
203*677600b0SAndre Fischer    $ddffilename = $ddfdir . $installer::globals::separator . $ddffilename;
204*677600b0SAndre Fischer
205*677600b0SAndre Fischer    installer::files::save_file($ddffilename ,\@ddffile);
206*677600b0SAndre Fischer    $installer::logger::Lang->print("Created ddf file: %s\n", $ddffilename);
207*677600b0SAndre Fischer
208*677600b0SAndre Fischer    # lines in ddf files must not be longer than 256 characters
209*677600b0SAndre Fischer    check_ddf_file(\@ddffile, $ddffilename);
210*677600b0SAndre Fischer
211*677600b0SAndre Fischer    # collecting all ddf files
212*677600b0SAndre Fischer    push(@installer::globals::allddffiles, $ddffilename);
213*677600b0SAndre Fischer
214*677600b0SAndre Fischer    # Writing the makecab system call
215*677600b0SAndre Fischer    # Return a list with all system calls for packaging process.
216*677600b0SAndre Fischer	my @cabfilelist = ("makecab.exe /V3 /F " . $ddffilename . " 2\>\&1 |" . "\n");
217*677600b0SAndre Fischer	return \@cabfilelist;
218cdf0e10cSrcweir}
219cdf0e10cSrcweir
220cdf0e10cSrcweir
221cdf0e10cSrcweir
222cdf0e10cSrcweir#################################################################
223cdf0e10cSrcweir# Returning the name of the msi database
224cdf0e10cSrcweir#################################################################
225cdf0e10cSrcweir
226cdf0e10cSrcweirsub get_msidatabasename
227cdf0e10cSrcweir{
228cdf0e10cSrcweir	my ($allvariableshashref, $language) = @_;
229cdf0e10cSrcweir
230cdf0e10cSrcweir	my $databasename = $allvariableshashref->{'PRODUCTNAME'} . $allvariableshashref->{'PRODUCTVERSION'};
231cdf0e10cSrcweir	$databasename = lc($databasename);
232cdf0e10cSrcweir	$databasename =~ s/\.//g;
233cdf0e10cSrcweir	$databasename =~ s/\-//g;
234cdf0e10cSrcweir	$databasename =~ s/\s//g;
235cdf0e10cSrcweir
236cdf0e10cSrcweir	# possibility to overwrite the name with variable DATABASENAME
237cdf0e10cSrcweir	if ( $allvariableshashref->{'DATABASENAME'} )
238cdf0e10cSrcweir	{
239cdf0e10cSrcweir		$databasename = $allvariableshashref->{'DATABASENAME'};
240cdf0e10cSrcweir	}
241cdf0e10cSrcweir
242cdf0e10cSrcweir	if ( $language )
243cdf0e10cSrcweir	{
244cdf0e10cSrcweir		if (!($language eq ""))
245cdf0e10cSrcweir		{
246cdf0e10cSrcweir			$databasename .= "_$language";
247cdf0e10cSrcweir		}
248cdf0e10cSrcweir	}
249cdf0e10cSrcweir
250cdf0e10cSrcweir	$databasename .= ".msi";
251cdf0e10cSrcweir
252cdf0e10cSrcweir	return $databasename;
253cdf0e10cSrcweir}
254cdf0e10cSrcweir
255cdf0e10cSrcweir#################################################################
256cdf0e10cSrcweir# Creating the msi database
257cdf0e10cSrcweir# This works only on Windows
258cdf0e10cSrcweir#################################################################
259cdf0e10cSrcweir
260cdf0e10cSrcweirsub create_msi_database
261cdf0e10cSrcweir{
262cdf0e10cSrcweir	my ($idtdirbase ,$msifilename) = @_;
263cdf0e10cSrcweir
264cdf0e10cSrcweir	# -f : path containing the idt files
265cdf0e10cSrcweir	# -d : msi database, including path
266cdf0e10cSrcweir	# -c : create database
267cdf0e10cSrcweir	# -i : include the following tables ("*" includes all available tables)
268cdf0e10cSrcweir
269cdf0e10cSrcweir	my $msidb = "msidb.exe";	# Has to be in the path
270cdf0e10cSrcweir	my $extraslash = "";		# Has to be set for non-ActiveState perl
271cdf0e10cSrcweir
272cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Creating msi database");
273cdf0e10cSrcweir
274cdf0e10cSrcweir	$idtdirbase = installer::converter::make_path_conform($idtdirbase);
275cdf0e10cSrcweir
276cdf0e10cSrcweir	$msifilename = installer::converter::make_path_conform($msifilename);
277cdf0e10cSrcweir
278cdf0e10cSrcweir	if ( $^O =~ /cygwin/i ) {
279cdf0e10cSrcweir		# msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
280cdf0e10cSrcweir		$idtdirbase =~ s/\//\\\\/g;
281cdf0e10cSrcweir		$msifilename =~ s/\//\\\\/g;
282cdf0e10cSrcweir		$extraslash = "\\";
283cdf0e10cSrcweir	}
284cdf0e10cSrcweir	my $systemcall = $msidb . " -f " . $idtdirbase . " -d " . $msifilename . " -c " . "-i " . $extraslash . "*";
285cdf0e10cSrcweir
286cdf0e10cSrcweir	my $returnvalue = system($systemcall);
287cdf0e10cSrcweir
288cdf0e10cSrcweir	my $infoline = "Systemcall: $systemcall\n";
289b274bc22SAndre Fischer	$installer::logger::Lang->print($infoline);
290cdf0e10cSrcweir
291cdf0e10cSrcweir	if ($returnvalue)
292cdf0e10cSrcweir	{
293cdf0e10cSrcweir		$infoline = "ERROR: Could not execute $msidb!\n";
294b274bc22SAndre Fischer		$installer::logger::Lang->print($infoline);
295cdf0e10cSrcweir	}
296cdf0e10cSrcweir	else
297cdf0e10cSrcweir	{
298cdf0e10cSrcweir		$infoline = "Success: Executed $msidb successfully!\n";
299b274bc22SAndre Fischer		$installer::logger::Lang->print($infoline);
300cdf0e10cSrcweir	}
301cdf0e10cSrcweir}
302cdf0e10cSrcweir
303cdf0e10cSrcweir#####################################################################
304cdf0e10cSrcweir# Returning the value from sis.mlf for Summary Information Stream
305cdf0e10cSrcweir#####################################################################
306cdf0e10cSrcweir
307cdf0e10cSrcweirsub get_value_from_sis_lng
308cdf0e10cSrcweir{
309cdf0e10cSrcweir	my ($language, $languagefile, $searchstring) = @_;
310cdf0e10cSrcweir
311cdf0e10cSrcweir	my $language_block = installer::windows::idtglobal::get_language_block_from_language_file($searchstring, $languagefile);
312cdf0e10cSrcweir	my $newstring = installer::windows::idtglobal::get_language_string_from_language_block($language_block, $language, $searchstring);
313cdf0e10cSrcweir	$newstring = "\"" . $newstring . "\"";
314cdf0e10cSrcweir
315cdf0e10cSrcweir	return $newstring;
316cdf0e10cSrcweir}
317cdf0e10cSrcweir
318cdf0e10cSrcweir#################################################################
319cdf0e10cSrcweir# Returning the msi version for the Summary Information Stream
320cdf0e10cSrcweir#################################################################
321cdf0e10cSrcweir
322cdf0e10cSrcweirsub get_msiversion_for_sis
323cdf0e10cSrcweir{
324cdf0e10cSrcweir	my $msiversion = "200";
325cdf0e10cSrcweir	return $msiversion;
326cdf0e10cSrcweir}
327cdf0e10cSrcweir
328cdf0e10cSrcweir#################################################################
329cdf0e10cSrcweir# Returning the word count for the Summary Information Stream
330cdf0e10cSrcweir#################################################################
331cdf0e10cSrcweir
332cdf0e10cSrcweirsub get_wordcount_for_sis
333cdf0e10cSrcweir{
334cdf0e10cSrcweir	my $wordcount = "0";
335cdf0e10cSrcweir	return $wordcount;
336cdf0e10cSrcweir}
337cdf0e10cSrcweir
338cdf0e10cSrcweir#################################################################
339cdf0e10cSrcweir# Returning the codepage for the Summary Information Stream
340cdf0e10cSrcweir#################################################################
341cdf0e10cSrcweir
342cdf0e10cSrcweirsub get_codepage_for_sis
343cdf0e10cSrcweir{
344cdf0e10cSrcweir	my ( $language ) = @_;
345cdf0e10cSrcweir
346cdf0e10cSrcweir	my $codepage = installer::windows::language::get_windows_encoding($language);
347cdf0e10cSrcweir
348cdf0e10cSrcweir	# Codepage 65001 does not work in Summary Information Stream
349cdf0e10cSrcweir	if ( $codepage == 65001 ) { $codepage = 0; }
350cdf0e10cSrcweir
351cdf0e10cSrcweir	# my $codepage = "1252";	# determine dynamically in a function
352cdf0e10cSrcweir	# my $codepage = "65001";		# UTF-8
353cdf0e10cSrcweir	return $codepage;
354cdf0e10cSrcweir}
355cdf0e10cSrcweir
356cdf0e10cSrcweir#################################################################
357cdf0e10cSrcweir# Returning the template for the Summary Information Stream
358cdf0e10cSrcweir#################################################################
359cdf0e10cSrcweir
360cdf0e10cSrcweirsub get_template_for_sis
361cdf0e10cSrcweir{
362cdf0e10cSrcweir	my ( $language, $allvariables ) = @_;
363cdf0e10cSrcweir
364cdf0e10cSrcweir	my $windowslanguage = installer::windows::language::get_windows_language($language);
365cdf0e10cSrcweir
366cdf0e10cSrcweir	my $architecture = "Intel";
367cdf0e10cSrcweir
368cdf0e10cSrcweir	# Adding 256, if this is a 64 bit installation set.
369cdf0e10cSrcweir	if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) { $architecture = "x64"; }
370cdf0e10cSrcweir
371cdf0e10cSrcweir	my $value = "\"" . $architecture . ";" . $windowslanguage;	# adding the Windows language
372cdf0e10cSrcweir
373cdf0e10cSrcweir	$value = $value . "\"";						# adding ending '"'
374cdf0e10cSrcweir
375cdf0e10cSrcweir	return $value ;
376cdf0e10cSrcweir}
377cdf0e10cSrcweir
378cdf0e10cSrcweir#################################################################
379cdf0e10cSrcweir# Returning the PackageCode for the Summary Information Stream
380cdf0e10cSrcweir#################################################################
381cdf0e10cSrcweir
382cdf0e10cSrcweirsub get_packagecode_for_sis
383cdf0e10cSrcweir{
384cdf0e10cSrcweir	# always generating a new package code for each package
385cdf0e10cSrcweir
3869f91b7e3SAndre Fischer	my $guid = "\{" . create_guid() . "\}";
387cdf0e10cSrcweir
388cdf0e10cSrcweir	my $infoline = "PackageCode: $guid\n";
389b274bc22SAndre Fischer	$installer::logger::Lang->print($infoline);
390cdf0e10cSrcweir
391cdf0e10cSrcweir	return $guid;
392cdf0e10cSrcweir}
393cdf0e10cSrcweir
394cdf0e10cSrcweir#################################################################
395cdf0e10cSrcweir# Returning the title for the Summary Information Stream
396cdf0e10cSrcweir#################################################################
397cdf0e10cSrcweir
398cdf0e10cSrcweirsub get_title_for_sis
399cdf0e10cSrcweir{
400cdf0e10cSrcweir	my ( $language, $languagefile, $searchstring ) = @_;
401cdf0e10cSrcweir
402cdf0e10cSrcweir	my $title = get_value_from_sis_lng($language, $languagefile, $searchstring );
403cdf0e10cSrcweir
404cdf0e10cSrcweir	return $title;
405cdf0e10cSrcweir}
406cdf0e10cSrcweir
407cdf0e10cSrcweir#################################################################
408cdf0e10cSrcweir# Returning the author for the Summary Information Stream
409cdf0e10cSrcweir#################################################################
410cdf0e10cSrcweir
411cdf0e10cSrcweirsub get_author_for_sis
412cdf0e10cSrcweir{
413cdf0e10cSrcweir	my $author = $installer::globals::longmanufacturer;
414cdf0e10cSrcweir
415cdf0e10cSrcweir	$author = "\"" . $author . "\"";
416cdf0e10cSrcweir
417cdf0e10cSrcweir	return $author;
418cdf0e10cSrcweir}
419cdf0e10cSrcweir
420cdf0e10cSrcweir#################################################################
421cdf0e10cSrcweir# Returning the subject for the Summary Information Stream
422cdf0e10cSrcweir#################################################################
423cdf0e10cSrcweir
424cdf0e10cSrcweirsub get_subject_for_sis
425cdf0e10cSrcweir{
426cdf0e10cSrcweir	my ( $allvariableshashref ) = @_;
427cdf0e10cSrcweir
428cdf0e10cSrcweir	my $subject = $allvariableshashref->{'PRODUCTNAME'} . " " . $allvariableshashref->{'PRODUCTVERSION'};
429cdf0e10cSrcweir
430cdf0e10cSrcweir	$subject = "\"" . $subject . "\"";
431cdf0e10cSrcweir
432cdf0e10cSrcweir	return $subject;
433cdf0e10cSrcweir}
434cdf0e10cSrcweir
435cdf0e10cSrcweir#################################################################
436cdf0e10cSrcweir# Returning the comment for the Summary Information Stream
437cdf0e10cSrcweir#################################################################
438cdf0e10cSrcweir
439cdf0e10cSrcweirsub get_comment_for_sis
440cdf0e10cSrcweir{
441cdf0e10cSrcweir	my ( $language, $languagefile, $searchstring ) = @_;
442cdf0e10cSrcweir
443cdf0e10cSrcweir	my $comment = get_value_from_sis_lng($language, $languagefile, $searchstring );
444cdf0e10cSrcweir
445cdf0e10cSrcweir	return $comment;
446cdf0e10cSrcweir}
447cdf0e10cSrcweir
448cdf0e10cSrcweir#################################################################
449cdf0e10cSrcweir# Returning the keywords for the Summary Information Stream
450cdf0e10cSrcweir#################################################################
451cdf0e10cSrcweir
452cdf0e10cSrcweirsub get_keywords_for_sis
453cdf0e10cSrcweir{
454cdf0e10cSrcweir	my ( $language, $languagefile, $searchstring ) = @_;
455cdf0e10cSrcweir
456cdf0e10cSrcweir	my $keywords = get_value_from_sis_lng($language, $languagefile, $searchstring );
457cdf0e10cSrcweir
458cdf0e10cSrcweir	return $keywords;
459cdf0e10cSrcweir}
460cdf0e10cSrcweir
461cdf0e10cSrcweir######################################################################
462cdf0e10cSrcweir# Returning the application name for the Summary Information Stream
463cdf0e10cSrcweir######################################################################
464cdf0e10cSrcweir
465cdf0e10cSrcweirsub get_appname_for_sis
466cdf0e10cSrcweir{
467cdf0e10cSrcweir	my ( $language, $languagefile, $searchstring ) = @_;
468cdf0e10cSrcweir
469cdf0e10cSrcweir	my $appname = get_value_from_sis_lng($language, $languagefile, $searchstring );
470cdf0e10cSrcweir
471cdf0e10cSrcweir	return $appname;
472cdf0e10cSrcweir}
473cdf0e10cSrcweir
474cdf0e10cSrcweir######################################################################
475cdf0e10cSrcweir# Returning the security for the Summary Information Stream
476cdf0e10cSrcweir######################################################################
477cdf0e10cSrcweir
478cdf0e10cSrcweirsub get_security_for_sis
479cdf0e10cSrcweir{
480cdf0e10cSrcweir	my $security = "0";
481cdf0e10cSrcweir	return $security;
482cdf0e10cSrcweir}
483cdf0e10cSrcweir
484cdf0e10cSrcweir#################################################################
485cdf0e10cSrcweir# Writing the Summary information stream into the msi database
486cdf0e10cSrcweir# This works only on Windows
487cdf0e10cSrcweir#################################################################
488cdf0e10cSrcweir
489cdf0e10cSrcweirsub write_summary_into_msi_database
490cdf0e10cSrcweir{
491cdf0e10cSrcweir	my ($msifilename, $language, $languagefile, $allvariableshashref) = @_;
492cdf0e10cSrcweir
493cdf0e10cSrcweir	# -g : requrired msi version
494cdf0e10cSrcweir	# -c : codepage
495cdf0e10cSrcweir	# -p : template
496cdf0e10cSrcweir
497cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Writing summary information stream");
498cdf0e10cSrcweir
499cdf0e10cSrcweir	my $msiinfo = "msiinfo.exe";	# Has to be in the path
500cdf0e10cSrcweir
501cdf0e10cSrcweir	my $sislanguage = "en-US";	# title, comment, keyword and appname alway in english
502cdf0e10cSrcweir
503cdf0e10cSrcweir	my $msiversion = get_msiversion_for_sis();
504cdf0e10cSrcweir	my $codepage = get_codepage_for_sis($language);
505cdf0e10cSrcweir	my $template = get_template_for_sis($language, $allvariableshashref);
506cdf0e10cSrcweir	my $guid = get_packagecode_for_sis();
507cdf0e10cSrcweir	my $title = get_title_for_sis($sislanguage,$languagefile, "OOO_SIS_TITLE");
508cdf0e10cSrcweir	my $author = get_author_for_sis();
509cdf0e10cSrcweir	my $subject = get_subject_for_sis($allvariableshashref);
510cdf0e10cSrcweir	my $comment = get_comment_for_sis($sislanguage,$languagefile, "OOO_SIS_COMMENT");
511cdf0e10cSrcweir	my $keywords = get_keywords_for_sis($sislanguage,$languagefile, "OOO_SIS_KEYWORDS");
512cdf0e10cSrcweir	my $appname = get_appname_for_sis($sislanguage,$languagefile, "OOO_SIS_APPNAME");
513cdf0e10cSrcweir	my $security = get_security_for_sis();
514cdf0e10cSrcweir	my $wordcount = get_wordcount_for_sis();
515cdf0e10cSrcweir
516cdf0e10cSrcweir	$msifilename = installer::converter::make_path_conform($msifilename);
517cdf0e10cSrcweir
518cdf0e10cSrcweir	my $systemcall = $msiinfo . " " . $msifilename . " -g " . $msiversion . " -c " . $codepage
519cdf0e10cSrcweir					. " -p " . $template . " -v " . $guid . " -t " . $title . " -a " . $author
520cdf0e10cSrcweir					. " -j " . $subject . " -o " . $comment . " -k " . $keywords . " -n " . $appname
521cdf0e10cSrcweir					. " -u " . $security . " -w " . $wordcount;
522cdf0e10cSrcweir
523cdf0e10cSrcweir	my $returnvalue = system($systemcall);
524cdf0e10cSrcweir
525cdf0e10cSrcweir	my $infoline = "Systemcall: $systemcall\n";
526b274bc22SAndre Fischer	$installer::logger::Lang->print($infoline);
527cdf0e10cSrcweir
528cdf0e10cSrcweir	if ($returnvalue)
529cdf0e10cSrcweir	{
530cdf0e10cSrcweir		$infoline = "ERROR: Could not execute $msiinfo!\n";
531b274bc22SAndre Fischer		$installer::logger::Lang->print($infoline);
532cdf0e10cSrcweir	}
533cdf0e10cSrcweir	else
534cdf0e10cSrcweir	{
535cdf0e10cSrcweir		$infoline = "Success: Executed $msiinfo successfully!\n";
536b274bc22SAndre Fischer		$installer::logger::Lang->print($infoline);
537cdf0e10cSrcweir	}
538cdf0e10cSrcweir}
539cdf0e10cSrcweir
540cdf0e10cSrcweir#########################################################################
541cdf0e10cSrcweir# For more than one language in the installation set:
542cdf0e10cSrcweir# Use one database and create Transformations for all other languages
543cdf0e10cSrcweir#########################################################################
544cdf0e10cSrcweir
545cdf0e10cSrcweirsub create_transforms
546cdf0e10cSrcweir{
547cdf0e10cSrcweir	my ($languagesarray, $defaultlanguage, $installdir, $allvariableshashref) = @_;
548cdf0e10cSrcweir
549cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Creating Transforms");
550cdf0e10cSrcweir
551cdf0e10cSrcweir	my $msitran = "msitran.exe";	# Has to be in the path
552cdf0e10cSrcweir
553cdf0e10cSrcweir	$installdir = installer::converter::make_path_conform($installdir);
554cdf0e10cSrcweir
555cdf0e10cSrcweir	# Syntax for creating a transformation
556cdf0e10cSrcweir	# msitran.exe -g <baseDB> <referenceDB> <transformfile> [<errorhandling>}
557cdf0e10cSrcweir
558cdf0e10cSrcweir	my $basedbname = get_msidatabasename($allvariableshashref, $defaultlanguage);
559cdf0e10cSrcweir	$basedbname = $installdir . $installer::globals::separator . $basedbname;
560cdf0e10cSrcweir
561cdf0e10cSrcweir	my $errorhandling = "f";	# Suppress "change codepage" error
562cdf0e10cSrcweir
563cdf0e10cSrcweir	# Iterating over all files
564cdf0e10cSrcweir
565cdf0e10cSrcweir	foreach ( @{$languagesarray} )
566cdf0e10cSrcweir	{
567cdf0e10cSrcweir		my $onelanguage = $_;
568cdf0e10cSrcweir
569cdf0e10cSrcweir		if ( $onelanguage eq $defaultlanguage ) { next; }
570cdf0e10cSrcweir
571cdf0e10cSrcweir		my $referencedbname = get_msidatabasename($allvariableshashref, $onelanguage);
572cdf0e10cSrcweir		$referencedbname = $installdir . $installer::globals::separator . $referencedbname;
573cdf0e10cSrcweir
574cdf0e10cSrcweir		my $transformfile = $installdir . $installer::globals::separator . "trans_" . $onelanguage . ".mst";
575cdf0e10cSrcweir
576cdf0e10cSrcweir		my $systemcall = $msitran . " " . " -g " . $basedbname . " " . $referencedbname . " " . $transformfile . " " . $errorhandling;
577cdf0e10cSrcweir
578cdf0e10cSrcweir		my $returnvalue = system($systemcall);
579cdf0e10cSrcweir
580cdf0e10cSrcweir		my $infoline = "Systemcall: $systemcall\n";
581b274bc22SAndre Fischer		$installer::logger::Lang->print($infoline);
582cdf0e10cSrcweir
583cdf0e10cSrcweir		# Problem: msitran.exe in version 4.0 always returns "1", even if no failure occured.
584cdf0e10cSrcweir		# Therefore it has to be checked, if this is version 4.0. If yes, if the mst file
585cdf0e10cSrcweir		# exists and if it is larger than 0 bytes. If this is true, then no error occured.
586cdf0e10cSrcweir		# File Version of msitran.exe: 4.0.6000.16384 has checksum: "b66190a70145a57773ec769e16777b29".
587cdf0e10cSrcweir		# Same for msitran.exe from wntmsci12: "aa25d3445b94ffde8ef0c1efb77a56b8"
588cdf0e10cSrcweir
589cdf0e10cSrcweir		if ($returnvalue)
590cdf0e10cSrcweir		{
591cdf0e10cSrcweir			$infoline = "WARNING: Returnvalue of $msitran is not 0. Checking version of $msitran!\n";
592b274bc22SAndre Fischer			$installer::logger::Lang->print($infoline);
593cdf0e10cSrcweir
594cdf0e10cSrcweir			open(FILE, "<$installer::globals::msitranpath") or die "ERROR: Can't open $installer::globals::msitranpath for creating file hash";
595cdf0e10cSrcweir			binmode(FILE);
596cdf0e10cSrcweir			my $digest = Digest::MD5->new->addfile(*FILE)->hexdigest;
597cdf0e10cSrcweir			close(FILE);
598cdf0e10cSrcweir
599cdf0e10cSrcweir			my @problemchecksums = ("b66190a70145a57773ec769e16777b29", "aa25d3445b94ffde8ef0c1efb77a56b8");
600cdf0e10cSrcweir			my $isproblemchecksum = 0;
601cdf0e10cSrcweir
602cdf0e10cSrcweir			foreach my $problemchecksum ( @problemchecksums )
603cdf0e10cSrcweir			{
604cdf0e10cSrcweir				$infoline = "Checksum of problematic MsiTran.exe: $problemchecksum\n";
605b274bc22SAndre Fischer				$installer::logger::Lang->print($infoline);
606cdf0e10cSrcweir				$infoline = "Checksum of used MsiTran.exe: $digest\n";
607b274bc22SAndre Fischer				$installer::logger::Lang->print($infoline);
608cdf0e10cSrcweir				if ( $digest eq $problemchecksum ) { $isproblemchecksum = 1; }
609cdf0e10cSrcweir			}
610cdf0e10cSrcweir
611cdf0e10cSrcweir			if ( $isproblemchecksum )
612cdf0e10cSrcweir			{
613cdf0e10cSrcweir				# Check existence of mst
614cdf0e10cSrcweir				if ( -f $transformfile )
615cdf0e10cSrcweir				{
616cdf0e10cSrcweir					$infoline = "File $transformfile exists.\n";
617b274bc22SAndre Fischer					$installer::logger::Lang->print($infoline);
618cdf0e10cSrcweir					my $filesize = ( -s $transformfile );
619cdf0e10cSrcweir					$infoline = "Size of $transformfile: $filesize\n";
620b274bc22SAndre Fischer					$installer::logger::Lang->print($infoline);
621cdf0e10cSrcweir
622cdf0e10cSrcweir					if ( $filesize > 0 )
623cdf0e10cSrcweir					{
624cdf0e10cSrcweir						$infoline = "Info: Returnvalue $returnvalue of $msitran is no problem :-) .\n";
625b274bc22SAndre Fischer						$installer::logger::Lang->print($infoline);
626cdf0e10cSrcweir						$returnvalue = 0; # reset the error
627cdf0e10cSrcweir					}
628cdf0e10cSrcweir					else
629cdf0e10cSrcweir					{
630cdf0e10cSrcweir						$infoline = "Filesize indicates that an error occured.\n";
631b274bc22SAndre Fischer						$installer::logger::Lang->print($infoline);
632cdf0e10cSrcweir					}
633cdf0e10cSrcweir				}
634cdf0e10cSrcweir				else
635cdf0e10cSrcweir				{
636cdf0e10cSrcweir					$infoline = "File $transformfile does not exist -> An error occured.\n";
637b274bc22SAndre Fischer					$installer::logger::Lang->print($infoline);
638cdf0e10cSrcweir				}
639cdf0e10cSrcweir			}
640cdf0e10cSrcweir			else
641cdf0e10cSrcweir			{
642cdf0e10cSrcweir				$infoline = "This is not a problematic version of msitran.exe. Therefore the error is not caused by problematic msitran.exe.\n";
643b274bc22SAndre Fischer				$installer::logger::Lang->print($infoline);
644cdf0e10cSrcweir			}
645cdf0e10cSrcweir		}
646cdf0e10cSrcweir
647cdf0e10cSrcweir		if ($returnvalue)
648cdf0e10cSrcweir		{
649cdf0e10cSrcweir			$infoline = "ERROR: Could not execute $msitran!\n";
650b274bc22SAndre Fischer			$installer::logger::Lang->print($infoline);
651cdf0e10cSrcweir		}
652cdf0e10cSrcweir		else
653cdf0e10cSrcweir		{
654cdf0e10cSrcweir			$infoline = "Success: Executed $msitran successfully!\n";
655b274bc22SAndre Fischer			$installer::logger::Lang->print($infoline);
656cdf0e10cSrcweir		}
657cdf0e10cSrcweir
658cdf0e10cSrcweir		# The reference database can be deleted
659cdf0e10cSrcweir
660cdf0e10cSrcweir		my $result = unlink($referencedbname);
661cdf0e10cSrcweir		# $result contains the number of deleted files
662cdf0e10cSrcweir
663cdf0e10cSrcweir		if ( $result == 0 )
664cdf0e10cSrcweir		{
665cdf0e10cSrcweir			$infoline = "ERROR: Could not remove file $$referencedbname !\n";
666b274bc22SAndre Fischer			$installer::logger::Lang->print($infoline);
667cdf0e10cSrcweir			installer::exiter::exit_program($infoline, "create_transforms");
668cdf0e10cSrcweir		}
669cdf0e10cSrcweir	}
670cdf0e10cSrcweir}
671cdf0e10cSrcweir
672cdf0e10cSrcweir#########################################################################
673cdf0e10cSrcweir# The default language msi database does not need to contain
674cdf0e10cSrcweir# the language in the database name. Therefore the file
675cdf0e10cSrcweir# is renamed. Example: "openofficeorg20_01.msi" to "openofficeorg20.msi"
676cdf0e10cSrcweir#########################################################################
677cdf0e10cSrcweir
678cdf0e10cSrcweirsub rename_msi_database_in_installset
679cdf0e10cSrcweir{
680cdf0e10cSrcweir	my ($defaultlanguage, $installdir, $allvariableshashref) = @_;
681cdf0e10cSrcweir
682cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Renaming msi database");
683cdf0e10cSrcweir
684cdf0e10cSrcweir	my $olddatabasename = get_msidatabasename($allvariableshashref, $defaultlanguage);
685cdf0e10cSrcweir	$olddatabasename = $installdir . $installer::globals::separator . $olddatabasename;
686cdf0e10cSrcweir
687cdf0e10cSrcweir	my $newdatabasename = get_msidatabasename($allvariableshashref);
688cdf0e10cSrcweir
689cdf0e10cSrcweir	$installer::globals::shortmsidatabasename = $newdatabasename;
690cdf0e10cSrcweir
691cdf0e10cSrcweir	$newdatabasename = $installdir . $installer::globals::separator . $newdatabasename;
692cdf0e10cSrcweir
693cdf0e10cSrcweir	installer::systemactions::rename_one_file($olddatabasename, $newdatabasename);
694cdf0e10cSrcweir
695cdf0e10cSrcweir	$installer::globals::msidatabasename = $newdatabasename;
696cdf0e10cSrcweir}
697cdf0e10cSrcweir
698cdf0e10cSrcweir#########################################################################
699cdf0e10cSrcweir# Adding the language to the name of the msi databasename,
700cdf0e10cSrcweir# if this is required (ADDLANGUAGEINDATABASENAME)
701cdf0e10cSrcweir#########################################################################
702cdf0e10cSrcweir
703cdf0e10cSrcweirsub add_language_to_msi_database
704cdf0e10cSrcweir{
705cdf0e10cSrcweir	my ($defaultlanguage, $installdir, $allvariables) = @_;
706cdf0e10cSrcweir
707cdf0e10cSrcweir	my $languagestring = $defaultlanguage;
708cdf0e10cSrcweir	if ( $allvariables->{'USELANGUAGECODE'} ) { $languagestring = installer::windows::language::get_windows_language($defaultlanguage); }
709cdf0e10cSrcweir	my $newdatabasename = $installer::globals::shortmsidatabasename;
710cdf0e10cSrcweir	$newdatabasename =~ s/\.msi\s*$/_$languagestring\.msi/;
711cdf0e10cSrcweir	$installer::globals::shortmsidatabasename = $newdatabasename;
712cdf0e10cSrcweir	$newdatabasename = $installdir . $installer::globals::separator . $newdatabasename;
713cdf0e10cSrcweir
714cdf0e10cSrcweir	my $olddatabasename = $installer::globals::msidatabasename;
715cdf0e10cSrcweir
716cdf0e10cSrcweir	installer::systemactions::rename_one_file($olddatabasename, $newdatabasename);
717cdf0e10cSrcweir
718cdf0e10cSrcweir	$installer::globals::msidatabasename = $newdatabasename;
719cdf0e10cSrcweir}
720cdf0e10cSrcweir
721cdf0e10cSrcweir##########################################################################
722cdf0e10cSrcweir# Writing the databasename into the setup.ini.
723cdf0e10cSrcweir##########################################################################
724cdf0e10cSrcweir
725cdf0e10cSrcweirsub put_databasename_into_setupini
726cdf0e10cSrcweir{
727cdf0e10cSrcweir	my ($setupinifile, $allvariableshashref) = @_;
728cdf0e10cSrcweir
729cdf0e10cSrcweir	my $databasename = get_msidatabasename($allvariableshashref);
730cdf0e10cSrcweir	my $line = "database=" . $databasename . "\n";
731cdf0e10cSrcweir
732cdf0e10cSrcweir	push(@{$setupinifile}, $line);
733cdf0e10cSrcweir}
734cdf0e10cSrcweir
735cdf0e10cSrcweir##########################################################################
736cdf0e10cSrcweir# Writing the required msi version into setup.ini
737cdf0e10cSrcweir##########################################################################
738cdf0e10cSrcweir
739cdf0e10cSrcweirsub put_msiversion_into_setupini
740cdf0e10cSrcweir{
741cdf0e10cSrcweir	my ($setupinifile) = @_;
742cdf0e10cSrcweir
743cdf0e10cSrcweir	my $msiversion = "2.0";
744cdf0e10cSrcweir	my $line = "msiversion=" . $msiversion . "\n";
745cdf0e10cSrcweir
746cdf0e10cSrcweir	push(@{$setupinifile}, $line);
747cdf0e10cSrcweir}
748cdf0e10cSrcweir
749cdf0e10cSrcweir##########################################################################
750cdf0e10cSrcweir# Writing the productname into setup.ini
751cdf0e10cSrcweir##########################################################################
752cdf0e10cSrcweir
753cdf0e10cSrcweirsub put_productname_into_setupini
754cdf0e10cSrcweir{
755cdf0e10cSrcweir	my ($setupinifile, $allvariableshashref) = @_;
756cdf0e10cSrcweir
757cdf0e10cSrcweir	my $productname = $allvariableshashref->{'PRODUCTNAME'};
758cdf0e10cSrcweir	my $line = "productname=" . $productname . "\n";
759cdf0e10cSrcweir
760cdf0e10cSrcweir	push(@{$setupinifile}, $line);
761cdf0e10cSrcweir}
762cdf0e10cSrcweir
763cdf0e10cSrcweir##########################################################################
764cdf0e10cSrcweir# Writing the productcode into setup.ini
765cdf0e10cSrcweir##########################################################################
766cdf0e10cSrcweir
767cdf0e10cSrcweirsub put_productcode_into_setupini
768cdf0e10cSrcweir{
769cdf0e10cSrcweir	my ($setupinifile) = @_;
770cdf0e10cSrcweir
771cdf0e10cSrcweir	my $productcode = $installer::globals::productcode;
772cdf0e10cSrcweir	my $line = "productcode=" . $productcode . "\n";
773cdf0e10cSrcweir
774cdf0e10cSrcweir	push(@{$setupinifile}, $line);
775cdf0e10cSrcweir}
776cdf0e10cSrcweir
777cdf0e10cSrcweir##########################################################################
778cdf0e10cSrcweir# Writing the ProductVersion from Property table into setup.ini
779cdf0e10cSrcweir##########################################################################
780cdf0e10cSrcweir
781cdf0e10cSrcweirsub put_productversion_into_setupini
782cdf0e10cSrcweir{
783cdf0e10cSrcweir	my ($setupinifile) = @_;
784cdf0e10cSrcweir
785cdf0e10cSrcweir	my $line = "productversion=" . $installer::globals::msiproductversion . "\n";
786cdf0e10cSrcweir	push(@{$setupinifile}, $line);
787cdf0e10cSrcweir}
788cdf0e10cSrcweir
789cdf0e10cSrcweir##########################################################################
790cdf0e10cSrcweir# Writing the key for Minor Upgrades into setup.ini
791cdf0e10cSrcweir##########################################################################
792cdf0e10cSrcweir
793cdf0e10cSrcweirsub put_upgradekey_into_setupini
794cdf0e10cSrcweir{
795cdf0e10cSrcweir	my ($setupinifile) = @_;
796cdf0e10cSrcweir
797cdf0e10cSrcweir	if ( $installer::globals::minorupgradekey ne "" )
798cdf0e10cSrcweir	{
799cdf0e10cSrcweir		my $line = "upgradekey=" . $installer::globals::minorupgradekey . "\n";
800cdf0e10cSrcweir		push(@{$setupinifile}, $line);
801cdf0e10cSrcweir	}
802cdf0e10cSrcweir}
803cdf0e10cSrcweir
804cdf0e10cSrcweir##########################################################################
805cdf0e10cSrcweir# Writing the number of languages into setup.ini
806cdf0e10cSrcweir##########################################################################
807cdf0e10cSrcweir
808cdf0e10cSrcweirsub put_languagecount_into_setupini
809cdf0e10cSrcweir{
810cdf0e10cSrcweir	my ($setupinifile, $languagesarray) = @_;
811cdf0e10cSrcweir
812cdf0e10cSrcweir	my $languagecount = $#{$languagesarray} + 1;
813cdf0e10cSrcweir	my $line = "count=" . $languagecount . "\n";
814cdf0e10cSrcweir
815cdf0e10cSrcweir	push(@{$setupinifile}, $line);
816cdf0e10cSrcweir}
817cdf0e10cSrcweir
818cdf0e10cSrcweir##########################################################################
819cdf0e10cSrcweir# Writing the defaultlanguage into setup.ini
820cdf0e10cSrcweir##########################################################################
821cdf0e10cSrcweir
822cdf0e10cSrcweirsub put_defaultlanguage_into_setupini
823cdf0e10cSrcweir{
824cdf0e10cSrcweir	my ($setupinifile, $defaultlanguage) = @_;
825cdf0e10cSrcweir
826cdf0e10cSrcweir	my $windowslanguage = installer::windows::language::get_windows_language($defaultlanguage);
827cdf0e10cSrcweir	my $line = "default=" . $windowslanguage . "\n";
828cdf0e10cSrcweir	push(@{$setupinifile}, $line);
829cdf0e10cSrcweir}
830cdf0e10cSrcweir
831cdf0e10cSrcweir##########################################################################
832cdf0e10cSrcweir# Writing the information about transformations into setup.ini
833cdf0e10cSrcweir##########################################################################
834cdf0e10cSrcweir
835cdf0e10cSrcweirsub put_transforms_into_setupini
836cdf0e10cSrcweir{
837cdf0e10cSrcweir	my ($setupinifile, $onelanguage, $counter) = @_;
838cdf0e10cSrcweir
839cdf0e10cSrcweir	my $windowslanguage = installer::windows::language::get_windows_language($onelanguage);
840cdf0e10cSrcweir	my $transformfilename = "trans_" . $onelanguage . ".mst";
841cdf0e10cSrcweir
842cdf0e10cSrcweir	my $line = "lang" . $counter . "=" . $windowslanguage . "," . $transformfilename . "\n";
843cdf0e10cSrcweir
844cdf0e10cSrcweir	push(@{$setupinifile}, $line);
845cdf0e10cSrcweir}
846cdf0e10cSrcweir
847cdf0e10cSrcweir###################################################
848cdf0e10cSrcweir# Including Windows line ends in ini files
849cdf0e10cSrcweir# Profiles on Windows shall have \r\n line ends
850cdf0e10cSrcweir###################################################
851cdf0e10cSrcweir
852cdf0e10cSrcweirsub include_windows_lineends
853cdf0e10cSrcweir{
854cdf0e10cSrcweir	my ($onefile) = @_;
855cdf0e10cSrcweir
856cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$onefile}; $i++ )
857cdf0e10cSrcweir	{
858cdf0e10cSrcweir		${$onefile}[$i] =~ s/\r?\n$/\r\n/;
859cdf0e10cSrcweir	}
860cdf0e10cSrcweir}
861cdf0e10cSrcweir
862cdf0e10cSrcweir##########################################################################
863cdf0e10cSrcweir# Generation the file setup.ini, that is used by the loader setup.exe.
864cdf0e10cSrcweir##########################################################################
865cdf0e10cSrcweir
866cdf0e10cSrcweirsub create_setup_ini
867cdf0e10cSrcweir{
868cdf0e10cSrcweir	my ($languagesarray, $defaultlanguage, $installdir, $allvariableshashref) = @_;
869cdf0e10cSrcweir
870cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Creating setup.ini");
871cdf0e10cSrcweir
872cdf0e10cSrcweir	my $setupinifilename = $installdir . $installer::globals::separator . "setup.ini";
873cdf0e10cSrcweir
874cdf0e10cSrcweir	my @setupinifile = ();
875cdf0e10cSrcweir	my $setupinifile = \@setupinifile;
876cdf0e10cSrcweir
877cdf0e10cSrcweir	my $line = "\[setup\]\n";
878cdf0e10cSrcweir	push(@setupinifile, $line);
879cdf0e10cSrcweir
880cdf0e10cSrcweir	put_databasename_into_setupini($setupinifile, $allvariableshashref);
881cdf0e10cSrcweir	put_msiversion_into_setupini($setupinifile);
882cdf0e10cSrcweir	put_productname_into_setupini($setupinifile, $allvariableshashref);
883cdf0e10cSrcweir	put_productcode_into_setupini($setupinifile);
884cdf0e10cSrcweir	put_productversion_into_setupini($setupinifile);
885cdf0e10cSrcweir	put_upgradekey_into_setupini($setupinifile);
886cdf0e10cSrcweir
887cdf0e10cSrcweir	$line = "\[languages\]\n";
888cdf0e10cSrcweir	push(@setupinifile, $line);
889cdf0e10cSrcweir
890cdf0e10cSrcweir	put_languagecount_into_setupini($setupinifile, $languagesarray);
891cdf0e10cSrcweir	put_defaultlanguage_into_setupini($setupinifile, $defaultlanguage);
892cdf0e10cSrcweir
893cdf0e10cSrcweir	if ( $#{$languagesarray} > 0 )	# writing the transforms information
894cdf0e10cSrcweir	{
895cdf0e10cSrcweir		my $counter = 1;
896cdf0e10cSrcweir
897cdf0e10cSrcweir		for ( my $i = 0; $i <= $#{$languagesarray}; $i++ )
898cdf0e10cSrcweir		{
899cdf0e10cSrcweir			if ( ${$languagesarray}[$i] eq $defaultlanguage ) { next; }
900cdf0e10cSrcweir
901cdf0e10cSrcweir			put_transforms_into_setupini($setupinifile, ${$languagesarray}[$i], $counter);
902cdf0e10cSrcweir			$counter++;
903cdf0e10cSrcweir		}
904cdf0e10cSrcweir	}
905cdf0e10cSrcweir
906cdf0e10cSrcweir	if ( $installer::globals::iswin && $installer::globals::plat =~ /cygwin/i)		# Windows line ends only for Cygwin
907cdf0e10cSrcweir	{
908cdf0e10cSrcweir		include_windows_lineends($setupinifile);
909cdf0e10cSrcweir	}
910cdf0e10cSrcweir
911cdf0e10cSrcweir	installer::files::save_file($setupinifilename, $setupinifile);
912cdf0e10cSrcweir
9131ba1fd99SAndre Fischer	$installer::logger::Lang->printf("Generated file %s\n", $setupinifilename);
914cdf0e10cSrcweir}
915cdf0e10cSrcweir
916cdf0e10cSrcweir#################################################################
917cdf0e10cSrcweir# Copying the files defined as ScpActions into the
918cdf0e10cSrcweir# installation set.
919cdf0e10cSrcweir#################################################################
920cdf0e10cSrcweir
921cdf0e10cSrcweirsub copy_scpactions_into_installset
922cdf0e10cSrcweir{
923cdf0e10cSrcweir	my ($defaultlanguage, $installdir, $allscpactions) = @_;
924cdf0e10cSrcweir
925cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Copying ScpAction files into installation set");
926cdf0e10cSrcweir
927cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$allscpactions}; $i++ )
928cdf0e10cSrcweir	{
929cdf0e10cSrcweir		my $onescpaction = ${$allscpactions}[$i];
930cdf0e10cSrcweir
931cdf0e10cSrcweir		if ( $onescpaction->{'Name'} eq "loader.exe" ) { next; }	# do not copy this ScpAction loader
932cdf0e10cSrcweir
933cdf0e10cSrcweir		# only copying language independent files or files with the correct language (the defaultlanguage)
934cdf0e10cSrcweir
935cdf0e10cSrcweir		my $filelanguage = $onescpaction->{'specificlanguage'};
936cdf0e10cSrcweir
937cdf0e10cSrcweir		if ( ($filelanguage eq $defaultlanguage) || ($filelanguage eq "") )
938cdf0e10cSrcweir		{
939cdf0e10cSrcweir			my $sourcefile = $onescpaction->{'sourcepath'};
940cdf0e10cSrcweir			my $destfile = $installdir . $installer::globals::separator . $onescpaction->{'DestinationName'};
941cdf0e10cSrcweir
942cdf0e10cSrcweir			installer::systemactions::copy_one_file($sourcefile, $destfile);
943cdf0e10cSrcweir		}
944cdf0e10cSrcweir	}
945cdf0e10cSrcweir}
946cdf0e10cSrcweir
947cdf0e10cSrcweir#################################################################
948cdf0e10cSrcweir# Copying the files for the Windows installer into the
949cdf0e10cSrcweir# installation set (setup.exe).
950cdf0e10cSrcweir#################################################################
951cdf0e10cSrcweir
952cdf0e10cSrcweirsub copy_windows_installer_files_into_installset
953cdf0e10cSrcweir{
954cdf0e10cSrcweir	my ($installdir, $includepatharrayref, $allvariables) = @_;
955cdf0e10cSrcweir
956cdf0e10cSrcweir    installer::logger::include_header_into_logfile("Copying Windows installer files into installation set");
957cdf0e10cSrcweir
9581ba1fd99SAndre Fischer	my @copyfile = ();
959cdf0e10cSrcweir	push(@copyfile, "loader2.exe");
960cdf0e10cSrcweir
961cdf0e10cSrcweir	if ( $allvariables->{'NOLOADERREQUIRED'} ) { @copyfile = (); }
962cdf0e10cSrcweir
963cdf0e10cSrcweir	for ( my $i = 0; $i <= $#copyfile; $i++ )
964cdf0e10cSrcweir	{
965cdf0e10cSrcweir		my $filename = $copyfile[$i];
966cdf0e10cSrcweir		my $sourcefileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$filename, $includepatharrayref, 1);
967cdf0e10cSrcweir
968cdf0e10cSrcweir		if ( ! -f $$sourcefileref ) { installer::exiter::exit_program("ERROR: msi file not found: $$sourcefileref !", "copy_windows_installer_files_into_installset"); }
969cdf0e10cSrcweir
970cdf0e10cSrcweir		my $destfile;
971cdf0e10cSrcweir		if ( $copyfile[$i] eq "loader2.exe" ) { $destfile = "setup.exe"; }	# renaming the loader
972cdf0e10cSrcweir		else { $destfile = $copyfile[$i]; }
973cdf0e10cSrcweir
974cdf0e10cSrcweir		$destfile = $installdir . $installer::globals::separator . $destfile;
975cdf0e10cSrcweir
976cdf0e10cSrcweir		installer::systemactions::copy_one_file($$sourcefileref, $destfile);
977cdf0e10cSrcweir	}
978cdf0e10cSrcweir}
979cdf0e10cSrcweir
980cdf0e10cSrcweir#################################################################
981cdf0e10cSrcweir# Copying the child projects into the
982cdf0e10cSrcweir# installation set
983cdf0e10cSrcweir#################################################################
984cdf0e10cSrcweir
985cdf0e10cSrcweirsub copy_child_projects_into_installset
986cdf0e10cSrcweir{
987cdf0e10cSrcweir	my ($installdir, $allvariables) = @_;
988cdf0e10cSrcweir
989cdf0e10cSrcweir	my $sourcefile = "";
990cdf0e10cSrcweir	my $destdir = "";
991cdf0e10cSrcweir
992cdf0e10cSrcweir	# adding Java
993cdf0e10cSrcweir
994cdf0e10cSrcweir	if ( $allvariables->{'JAVAPRODUCT'} )
995cdf0e10cSrcweir	{
996cdf0e10cSrcweir		$sourcefile = $installer::globals::javafile->{'sourcepath'};
997cdf0e10cSrcweir		$destdir = $installdir . $installer::globals::separator . $installer::globals::javafile->{'Subdir'};
998cdf0e10cSrcweir		if ( ! -d $destdir) { installer::systemactions::create_directory($destdir); }
999cdf0e10cSrcweir		installer::systemactions::copy_one_file($sourcefile, $destdir);
1000cdf0e10cSrcweir	}
1001cdf0e10cSrcweir
1002cdf0e10cSrcweir	if ( $allvariables->{'UREPRODUCT'} )
1003cdf0e10cSrcweir	{
1004cdf0e10cSrcweir		$sourcefile = $installer::globals::urefile->{'sourcepath'};
1005cdf0e10cSrcweir		$destdir = $installdir . $installer::globals::separator . $installer::globals::urefile->{'Subdir'};
1006cdf0e10cSrcweir		if ( ! -d $destdir) { installer::systemactions::create_directory($destdir); }
1007cdf0e10cSrcweir		installer::systemactions::copy_one_file($sourcefile, $destdir);
1008cdf0e10cSrcweir	}
1009cdf0e10cSrcweir}
1010cdf0e10cSrcweir
1011cdf0e10cSrcweir
1012cdf0e10cSrcweir
10139f91b7e3SAndre Fischer=head2 create_guid ()
1014cdf0e10cSrcweir
10159f91b7e3SAndre Fischer    Create a single UUID aka GUID via calling the external executable 'uuidgen'.
10169f91b7e3SAndre Fischer    There are Perl modules for that, but do they exist on the build bots?
10179f91b7e3SAndre Fischer
10189f91b7e3SAndre Fischer=cut
10199f91b7e3SAndre Fischersub create_guid ()
10209f91b7e3SAndre Fischer{
10219f91b7e3SAndre Fischer	my $uuid = qx("uuidgen");
10229f91b7e3SAndre Fischer    $uuid =~ s/\s*$//;
10239f91b7e3SAndre Fischer	return uc($uuid);
1024cdf0e10cSrcweir}
1025cdf0e10cSrcweir
1026cdf0e10cSrcweir#################################################################
1027cdf0e10cSrcweir# Calculating a GUID with a string using md5.
1028cdf0e10cSrcweir#################################################################
1029cdf0e10cSrcweir
1030cdf0e10cSrcweirsub calculate_guid
1031cdf0e10cSrcweir{
1032cdf0e10cSrcweir	my ( $string ) = @_;
1033cdf0e10cSrcweir
1034cdf0e10cSrcweir	my $guid = "";
1035cdf0e10cSrcweir
1036cdf0e10cSrcweir    my $md5 = Digest::MD5->new;
1037cdf0e10cSrcweir    $md5->add($string);
1038cdf0e10cSrcweir    my $digest = $md5->hexdigest;
1039cdf0e10cSrcweir    $digest = uc($digest);
1040cdf0e10cSrcweir
1041cdf0e10cSrcweir	# my $id = pack("A32", $digest);
1042cdf0e10cSrcweir	my ($first, $second, $third, $fourth, $fifth) = unpack ('A8 A4 A4 A4 A12', $digest);
1043cdf0e10cSrcweir	$guid = "$first-$second-$third-$fourth-$fifth";
10449f91b7e3SAndre Fischer
10459f91b7e3SAndre Fischer    $installer::logger::Lang->printf("guid for '%s' is %s\n",
10469f91b7e3SAndre Fischer        $string, $guid);
1047cdf0e10cSrcweir
1048cdf0e10cSrcweir	return $guid;
1049cdf0e10cSrcweir}
1050cdf0e10cSrcweir
105119d58b3aSEike Rathke#################################################################
105219d58b3aSEike Rathke# Calculating a ID with a string using md5 (very fast).
105319d58b3aSEike Rathke#################################################################
105419d58b3aSEike Rathke
105519d58b3aSEike Rathkesub calculate_id
105619d58b3aSEike Rathke{
105719d58b3aSEike Rathke	my ( $string, $length ) = @_;
105819d58b3aSEike Rathke
105919d58b3aSEike Rathke	my $id = "";
106019d58b3aSEike Rathke
106119d58b3aSEike Rathke    my $md5 = Digest::MD5->new;
106219d58b3aSEike Rathke    $md5->add($string);
106319d58b3aSEike Rathke    my $digest = lc($md5->hexdigest);
106419d58b3aSEike Rathke	$id = substr($digest, 0, $length);
106519d58b3aSEike Rathke
106619d58b3aSEike Rathke	return $id;
106719d58b3aSEike Rathke}
106819d58b3aSEike Rathke
1069cdf0e10cSrcweir#################################################################
1070cdf0e10cSrcweir# Filling the component hash with the values of the
1071cdf0e10cSrcweir# component file.
1072cdf0e10cSrcweir#################################################################
1073cdf0e10cSrcweir
1074cdf0e10cSrcweirsub fill_component_hash
1075cdf0e10cSrcweir{
1076cdf0e10cSrcweir	my ($componentfile) = @_;
1077cdf0e10cSrcweir
1078cdf0e10cSrcweir	my %components = ();
1079cdf0e10cSrcweir
1080cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$componentfile}; $i++ )
1081cdf0e10cSrcweir	{
1082cdf0e10cSrcweir		my $line = ${$componentfile}[$i];
1083cdf0e10cSrcweir
1084cdf0e10cSrcweir		if ( $line =~ /^\s*(.*?)\t(.*?)\s*$/ )
1085cdf0e10cSrcweir		{
1086cdf0e10cSrcweir			my $key = $1;
1087cdf0e10cSrcweir			my $value = $2;
1088cdf0e10cSrcweir
1089cdf0e10cSrcweir			$components{$key} = $value;
1090cdf0e10cSrcweir		}
1091cdf0e10cSrcweir	}
1092cdf0e10cSrcweir
1093cdf0e10cSrcweir	return \%components;
1094cdf0e10cSrcweir}
1095cdf0e10cSrcweir
1096cdf0e10cSrcweir#################################################################
1097cdf0e10cSrcweir# Creating a new component file, if new guids were generated.
1098cdf0e10cSrcweir#################################################################
1099cdf0e10cSrcweir
1100cdf0e10cSrcweirsub create_new_component_file
1101cdf0e10cSrcweir{
1102cdf0e10cSrcweir	my ($componenthash) = @_;
1103cdf0e10cSrcweir
1104cdf0e10cSrcweir	my @componentfile = ();
1105cdf0e10cSrcweir
1106cdf0e10cSrcweir	my $key;
1107cdf0e10cSrcweir
1108cdf0e10cSrcweir	foreach $key (keys %{$componenthash})
1109cdf0e10cSrcweir	{
1110cdf0e10cSrcweir		my $value = $componenthash->{$key};
1111cdf0e10cSrcweir		my $input = "$key\t$value\n";
1112cdf0e10cSrcweir		push(@componentfile ,$input);
1113cdf0e10cSrcweir	}
1114cdf0e10cSrcweir
1115cdf0e10cSrcweir	return \@componentfile;
1116cdf0e10cSrcweir}
1117cdf0e10cSrcweir
1118cdf0e10cSrcweir#################################################################
1119cdf0e10cSrcweir# Filling real component GUID into the component table.
1120cdf0e10cSrcweir# This works only on Windows
1121cdf0e10cSrcweir#################################################################
1122cdf0e10cSrcweir
11239f91b7e3SAndre Fischersub __set_uuid_into_component_table
1124cdf0e10cSrcweir{
1125cdf0e10cSrcweir	my ($idtdirbase, $allvariables) = @_;
1126cdf0e10cSrcweir
1127cdf0e10cSrcweir	my $componenttablename  = $idtdirbase . $installer::globals::separator . "Componen.idt";
1128cdf0e10cSrcweir
1129cdf0e10cSrcweir	my $componenttable = installer::files::read_file($componenttablename);
1130cdf0e10cSrcweir
1131cdf0e10cSrcweir	# For update and patch reasons (small update) the GUID of an existing component must not change!
1132cdf0e10cSrcweir	# The collection of component GUIDs is saved in the directory $installer::globals::idttemplatepath in the file "components.txt"
1133cdf0e10cSrcweir
1134cdf0e10cSrcweir	my $infoline = "";
1135cdf0e10cSrcweir	my $counter = 0;
1136cdf0e10cSrcweir	# my $componentfile = installer::files::read_file($installer::globals::componentfilename);
1137cdf0e10cSrcweir	# my $componenthash = fill_component_hash($componentfile);
1138cdf0e10cSrcweir
1139cdf0e10cSrcweir	for ( my $i = 3; $i <= $#{$componenttable}; $i++ )	# ignoring the first three lines
1140cdf0e10cSrcweir	{
1141cdf0e10cSrcweir		my $oneline = ${$componenttable}[$i];
1142cdf0e10cSrcweir		my $componentname = "";
1143cdf0e10cSrcweir		if ( $oneline =~ /^\s*(\S+?)\t/ ) { $componentname = $1; }
1144cdf0e10cSrcweir
1145cdf0e10cSrcweir		my $uuid = "";
1146cdf0e10cSrcweir
1147cdf0e10cSrcweir	#	if ( $componenthash->{$componentname} )
1148cdf0e10cSrcweir	#	{
1149cdf0e10cSrcweir	#		$uuid = $componenthash->{$componentname};
1150cdf0e10cSrcweir	#	}
1151cdf0e10cSrcweir	#	else
1152cdf0e10cSrcweir	#	{
1153cdf0e10cSrcweir
1154cdf0e10cSrcweir			if ( exists($installer::globals::calculated_component_guids{$componentname}))
1155cdf0e10cSrcweir			{
1156cdf0e10cSrcweir				$uuid = $installer::globals::calculated_component_guids{$componentname};
1157cdf0e10cSrcweir			}
1158cdf0e10cSrcweir			else
1159cdf0e10cSrcweir			{
1160cdf0e10cSrcweir				# Calculating new GUID with the help of the component name.
1161cdf0e10cSrcweir				my $useooobaseversion = 1;
11629f91b7e3SAndre Fischer				if ( exists($installer::globals::base_independent_components{$componentname}))
11639f91b7e3SAndre Fischer                {
11649f91b7e3SAndre Fischer                    $useooobaseversion = 0;
11659f91b7e3SAndre Fischer                }
1166cdf0e10cSrcweir				my $sourcestring = $componentname;
1167cdf0e10cSrcweir
1168cdf0e10cSrcweir				if ( $useooobaseversion )
1169cdf0e10cSrcweir				{
11709f91b7e3SAndre Fischer					if ( ! exists($allvariables->{'OOOBASEVERSION'}) )
11719f91b7e3SAndre Fischer                    {
11729f91b7e3SAndre Fischer                        installer::exiter::exit_program(
11739f91b7e3SAndre Fischer                            "ERROR: Could not find variable \"OOOBASEVERSION\" (required value for GUID creation)!",
11749f91b7e3SAndre Fischer                            "set_uuid_into_component_table");
11759f91b7e3SAndre Fischer                    }
1176cdf0e10cSrcweir					$sourcestring = $sourcestring . "_" . $allvariables->{'OOOBASEVERSION'};
1177cdf0e10cSrcweir				}
1178cdf0e10cSrcweir				$uuid = calculate_guid($sourcestring);
1179cdf0e10cSrcweir				$counter++;
1180cdf0e10cSrcweir
1181cdf0e10cSrcweir				# checking, if there is a conflict with an already created guid
11829f91b7e3SAndre Fischer				if ( exists($installer::globals::allcalculated_guids{$uuid}) )
11839f91b7e3SAndre Fischer                {
11849f91b7e3SAndre Fischer                    installer::exiter::exit_program(
11859f91b7e3SAndre Fischer                        "ERROR: \"$uuid\" was already created before!",
11869f91b7e3SAndre Fischer                        "set_uuid_into_component_table");
11879f91b7e3SAndre Fischer                }
1188cdf0e10cSrcweir				$installer::globals::allcalculated_guids{$uuid} = 1;
1189cdf0e10cSrcweir				$installer::globals::calculated_component_guids{$componentname} = $uuid;
1190cdf0e10cSrcweir
1191cdf0e10cSrcweir				# Setting new uuid
1192cdf0e10cSrcweir				# $componenthash->{$componentname} = $uuid;
1193cdf0e10cSrcweir
1194cdf0e10cSrcweir				# Setting flag
1195cdf0e10cSrcweir				# $installer::globals::created_new_component_guid = 1;	# this is very important!
1196cdf0e10cSrcweir			}
1197cdf0e10cSrcweir	#	}
1198cdf0e10cSrcweir
1199cdf0e10cSrcweir		${$componenttable}[$i] =~ s/COMPONENTGUID/$uuid/;
1200cdf0e10cSrcweir	}
1201cdf0e10cSrcweir
1202cdf0e10cSrcweir	installer::files::save_file($componenttablename, $componenttable);
1203cdf0e10cSrcweir
1204cdf0e10cSrcweir#	if ( $installer::globals::created_new_component_guid )
1205cdf0e10cSrcweir#	{
1206cdf0e10cSrcweir#		# create new component file!
1207cdf0e10cSrcweir#		$componentfile = create_new_component_file($componenthash);
1208cdf0e10cSrcweir#		installer::worker::sort_array($componentfile);
1209cdf0e10cSrcweir#
1210cdf0e10cSrcweir#		# To avoid conflict the components file cannot be saved at the same place
1211cdf0e10cSrcweir#		# All important data have to be saved in the directory: $installer::globals::infodirectory
1212cdf0e10cSrcweir#		my $localcomponentfilename = $installer::globals::componentfilename;
1213cdf0e10cSrcweir#		installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$localcomponentfilename);
1214cdf0e10cSrcweir#		$localcomponentfilename = $installer::globals::infodirectory . $installer::globals::separator . $localcomponentfilename;
1215cdf0e10cSrcweir#		installer::files::save_file($localcomponentfilename, $componentfile);
1216cdf0e10cSrcweir#
1217cdf0e10cSrcweir#		# installer::files::save_file($installer::globals::componentfilename, $componentfile);	# version using new file in solver
1218cdf0e10cSrcweir#
1219cdf0e10cSrcweir#		$infoline = "COMPONENTCODES: Created $counter new GUIDs for components ! \n";
1220b274bc22SAndre Fischer#		$installer::logger::Lang->print($infoline);
1221cdf0e10cSrcweir#	}
1222cdf0e10cSrcweir#	else
1223cdf0e10cSrcweir#	{
1224cdf0e10cSrcweir#		$infoline = "SUCCESS COMPONENTCODES: All component codes exist! \n";
1225b274bc22SAndre Fischer#		$installer::logger::Lang->print($infoline);
1226cdf0e10cSrcweir#	}
1227cdf0e10cSrcweir
1228cdf0e10cSrcweir}
1229cdf0e10cSrcweir
1230cdf0e10cSrcweir#########################################################################
1231cdf0e10cSrcweir# Adding final 64 properties into msi database, if required.
1232cdf0e10cSrcweir# RegLocator : +16 in type column to search in 64 bit registry.
1233cdf0e10cSrcweir# All conditions: "VersionNT" -> "VersionNT64" (several tables).
1234cdf0e10cSrcweir# Already done: "+256" in Attributes column of table "Component".
1235cdf0e10cSrcweir# Still following: Setting "x64" instead of "Intel" in Summary
1236cdf0e10cSrcweir# Information Stream of msi database in "get_template_for_sis".
1237cdf0e10cSrcweir#########################################################################
1238cdf0e10cSrcweir
1239cdf0e10cSrcweirsub prepare_64bit_database
1240cdf0e10cSrcweir{
1241cdf0e10cSrcweir	my ($basedir, $allvariables) = @_;
1242cdf0e10cSrcweir
1243cdf0e10cSrcweir	my $infoline = "";
1244cdf0e10cSrcweir
1245cdf0e10cSrcweir	if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 ))
1246cdf0e10cSrcweir	{
1247cdf0e10cSrcweir		# 1. Beginning with table "RegLocat.idt". Adding "16" to the type.
1248cdf0e10cSrcweir
1249cdf0e10cSrcweir		my $reglocatfile = "";
1250cdf0e10cSrcweir		my $reglocatfilename = $basedir . $installer::globals::separator . "RegLocat.idt";
1251cdf0e10cSrcweir
1252cdf0e10cSrcweir		if ( -f $reglocatfilename )
1253cdf0e10cSrcweir		{
1254cdf0e10cSrcweir			my $saving_required = 0;
1255cdf0e10cSrcweir			$reglocatfile = installer::files::read_file($reglocatfilename);
1256cdf0e10cSrcweir
1257cdf0e10cSrcweir			for ( my $i = 3; $i <= $#{$reglocatfile}; $i++ ) 	# ignoring the first three lines
1258cdf0e10cSrcweir			{
1259cdf0e10cSrcweir				my $oneline = ${$reglocatfile}[$i];
1260cdf0e10cSrcweir
1261cdf0e10cSrcweir				if ( $oneline =~ /^\s*\#/ ) { next; }	# this is a comment line
1262cdf0e10cSrcweir				if ( $oneline =~ /^\s*$/ ) { next; }
1263cdf0e10cSrcweir
1264cdf0e10cSrcweir				if ( $oneline =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(\d+)\s*$/ )
1265cdf0e10cSrcweir				{
1266cdf0e10cSrcweir					# Syntax: Signature_ Root Key Name Type
1267cdf0e10cSrcweir					my $sig = $1;
1268cdf0e10cSrcweir					my $root = $2;
1269cdf0e10cSrcweir					my $key = $3;
1270cdf0e10cSrcweir					my $name = $4;
1271cdf0e10cSrcweir					my $type = $5;
1272cdf0e10cSrcweir
1273cdf0e10cSrcweir					$type = $type + 16;
1274cdf0e10cSrcweir
1275cdf0e10cSrcweir					my $newline = $sig . "\t" . $root . "\t" . $key . "\t" . $name . "\t" . $type . "\n";
1276cdf0e10cSrcweir					${$reglocatfile}[$i] = $newline;
1277cdf0e10cSrcweir
1278cdf0e10cSrcweir					$saving_required = 1;
1279cdf0e10cSrcweir				}
1280cdf0e10cSrcweir			}
1281cdf0e10cSrcweir
1282cdf0e10cSrcweir			if ( $saving_required )
1283cdf0e10cSrcweir			{
1284cdf0e10cSrcweir				# Saving the files
1285cdf0e10cSrcweir				installer::files::save_file($reglocatfilename ,$reglocatfile);
1286cdf0e10cSrcweir				$infoline = "Making idt file 64 bit conform: $reglocatfilename\n";
1287b274bc22SAndre Fischer				$installer::logger::Lang->print($infoline);
1288cdf0e10cSrcweir			}
1289cdf0e10cSrcweir		}
1290cdf0e10cSrcweir
1291cdf0e10cSrcweir		# 2. Replacing all occurences of "VersionNT" by "VersionNT64"
1292cdf0e10cSrcweir
1293cdf0e10cSrcweir		my @versionnt_files = ("Componen.idt", "InstallE.idt", "InstallU.idt", "LaunchCo.idt");
1294cdf0e10cSrcweir
1295cdf0e10cSrcweir		foreach my $onefile ( @versionnt_files )
1296cdf0e10cSrcweir		{
1297cdf0e10cSrcweir			my $fullfilename = $basedir . $installer::globals::separator . $onefile;
1298cdf0e10cSrcweir
1299cdf0e10cSrcweir			if ( -f $fullfilename )
1300cdf0e10cSrcweir			{
1301cdf0e10cSrcweir				my $saving_required = 0;
13021ba1fd99SAndre Fischer				my $filecontent = installer::files::read_file($fullfilename);
1303cdf0e10cSrcweir
1304cdf0e10cSrcweir				for ( my $i = 3; $i <= $#{$filecontent}; $i++ ) 	# ignoring the first three lines
1305cdf0e10cSrcweir				{
1306cdf0e10cSrcweir					my $oneline = ${$filecontent}[$i];
1307cdf0e10cSrcweir
1308cdf0e10cSrcweir					if ( $oneline =~ /\bVersionNT\b/ )
1309cdf0e10cSrcweir					{
1310cdf0e10cSrcweir						${$filecontent}[$i] =~ s/\bVersionNT\b/VersionNT64/g;
1311cdf0e10cSrcweir						$saving_required = 1;
1312cdf0e10cSrcweir					}
1313cdf0e10cSrcweir				}
1314cdf0e10cSrcweir
1315cdf0e10cSrcweir				if ( $saving_required )
1316cdf0e10cSrcweir				{
1317cdf0e10cSrcweir					# Saving the files
1318cdf0e10cSrcweir					installer::files::save_file($fullfilename ,$filecontent);
1319cdf0e10cSrcweir					$infoline = "Making idt file 64 bit conform: $fullfilename\n";
1320b274bc22SAndre Fischer					$installer::logger::Lang->print($infoline);
1321cdf0e10cSrcweir				}
1322cdf0e10cSrcweir			}
1323cdf0e10cSrcweir		}
1324cdf0e10cSrcweir	}
1325cdf0e10cSrcweir
1326cdf0e10cSrcweir}
1327cdf0e10cSrcweir
1328cdf0e10cSrcweir#################################################################
1329cdf0e10cSrcweir# Include all cab files into the msi database.
1330cdf0e10cSrcweir# This works only on Windows
1331cdf0e10cSrcweir#################################################################
1332cdf0e10cSrcweir
1333cdf0e10cSrcweirsub include_cabs_into_msi
1334cdf0e10cSrcweir{
1335cdf0e10cSrcweir	my ($installdir) = @_;
1336cdf0e10cSrcweir
1337cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Including cabs into msi database");
1338cdf0e10cSrcweir
1339cdf0e10cSrcweir	my $from = cwd();
1340cdf0e10cSrcweir	my $to = $installdir;
1341cdf0e10cSrcweir
1342cdf0e10cSrcweir	chdir($to);
1343cdf0e10cSrcweir
1344cdf0e10cSrcweir	my $infoline = "Changing into directory: $to";
1345b274bc22SAndre Fischer	$installer::logger::Lang->print($infoline);
1346cdf0e10cSrcweir
1347cdf0e10cSrcweir	my $msidb = "msidb.exe";	# Has to be in the path
1348cdf0e10cSrcweir	my $extraslash = "";		# Has to be set for non-ActiveState perl
1349cdf0e10cSrcweir
1350cdf0e10cSrcweir	my $msifilename = $installer::globals::msidatabasename;
1351cdf0e10cSrcweir
1352cdf0e10cSrcweir	$msifilename = installer::converter::make_path_conform($msifilename);
1353cdf0e10cSrcweir
1354cdf0e10cSrcweir	# msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
1355cdf0e10cSrcweir	$msifilename =~ s/\//\\\\/g;
1356cdf0e10cSrcweir	$extraslash = "\\";
1357cdf0e10cSrcweir
1358cdf0e10cSrcweir	my $allcabfiles = installer::systemactions::find_file_with_file_extension("cab", $installdir);
1359cdf0e10cSrcweir
1360cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$allcabfiles}; $i++ )
1361cdf0e10cSrcweir	{
1362cdf0e10cSrcweir		my $systemcall = $msidb . " -d " . $msifilename . " -a " . ${$allcabfiles}[$i];
1363cdf0e10cSrcweir
1364cdf0e10cSrcweir		my $returnvalue = system($systemcall);
1365cdf0e10cSrcweir
1366cdf0e10cSrcweir		$infoline = "Systemcall: $systemcall\n";
1367b274bc22SAndre Fischer		$installer::logger::Lang->print($infoline);
1368cdf0e10cSrcweir
1369cdf0e10cSrcweir		if ($returnvalue)
1370cdf0e10cSrcweir		{
1371cdf0e10cSrcweir			$infoline = "ERROR: Could not execute $systemcall !\n";
1372b274bc22SAndre Fischer			$installer::logger::Lang->print($infoline);
1373cdf0e10cSrcweir		}
1374cdf0e10cSrcweir		else
1375cdf0e10cSrcweir		{
1376cdf0e10cSrcweir			$infoline = "Success: Executed $systemcall successfully!\n";
1377b274bc22SAndre Fischer			$installer::logger::Lang->print($infoline);
1378cdf0e10cSrcweir		}
1379cdf0e10cSrcweir
1380cdf0e10cSrcweir		# deleting the cab file
1381cdf0e10cSrcweir
1382cdf0e10cSrcweir		unlink(${$allcabfiles}[$i]);
1383cdf0e10cSrcweir
1384cdf0e10cSrcweir		$infoline = "Deleted cab file: ${$allcabfiles}[$i]\n";
1385b274bc22SAndre Fischer		$installer::logger::Lang->print($infoline);
1386cdf0e10cSrcweir	}
1387cdf0e10cSrcweir
1388cdf0e10cSrcweir	$infoline = "Changing back into directory: $from";
1389b274bc22SAndre Fischer	$installer::logger::Lang->print($infoline);
1390cdf0e10cSrcweir
1391cdf0e10cSrcweir	chdir($from);
1392cdf0e10cSrcweir}
1393cdf0e10cSrcweir
1394cdf0e10cSrcweir#################################################################
1395cdf0e10cSrcweir# Executing the created batch file to pack all files.
1396cdf0e10cSrcweir# This works only on Windows
1397cdf0e10cSrcweir#################################################################
1398cdf0e10cSrcweir
1399cdf0e10cSrcweirsub execute_packaging
1400cdf0e10cSrcweir{
1401cdf0e10cSrcweir	my ($localpackjobref, $loggingdir, $allvariables) = @_;
1402cdf0e10cSrcweir
1403cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Packaging process");
1404cdf0e10cSrcweir
1405b274bc22SAndre Fischer	$installer::logger::Lang->add_timestamp("Performance Info: Execute packaging start");
1406cdf0e10cSrcweir
1407cdf0e10cSrcweir	my $infoline = "";
1408cdf0e10cSrcweir	my $from = cwd();
1409cdf0e10cSrcweir	my $to = $loggingdir;
1410cdf0e10cSrcweir
1411cdf0e10cSrcweir	chdir($to);
1412cdf0e10cSrcweir	$infoline = "chdir: $to \n";
1413b274bc22SAndre Fischer	$installer::logger::Lang->print($infoline);
1414cdf0e10cSrcweir
1415cdf0e10cSrcweir	# if the ddf file contains relative pathes, it is necessary to change into the temp directory
1416cdf0e10cSrcweir	if ( $allvariables->{'RELATIVE_PATHES_IN_DDF'} )
1417cdf0e10cSrcweir	{
1418cdf0e10cSrcweir		$to = $installer::globals::temppath;
1419cdf0e10cSrcweir		chdir($to);
1420cdf0e10cSrcweir		$infoline = "chdir: $to \n";
1421b274bc22SAndre Fischer		$installer::logger::Lang->print($infoline);
1422cdf0e10cSrcweir	}
1423cdf0e10cSrcweir
1424cdf0e10cSrcweir	# changing the tmp directory, because makecab.exe generates temporary cab files
1425cdf0e10cSrcweir	my $origtemppath = "";
1426cdf0e10cSrcweir	if ( $ENV{'TMP'} ) { $origtemppath = $ENV{'TMP'}; }
1427cdf0e10cSrcweir	$ENV{'TMP'} = $installer::globals::temppath;	# setting TMP to the new unique directory!
1428cdf0e10cSrcweir
1429cdf0e10cSrcweir	my $maxmakecabcalls = 3;
1430cdf0e10cSrcweir	my $allmakecabcalls = $#{$localpackjobref} + 1;
1431cdf0e10cSrcweir
1432cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$localpackjobref}; $i++ )
1433cdf0e10cSrcweir	{
1434cdf0e10cSrcweir		my $systemcall = ${$localpackjobref}[$i];
1435cdf0e10cSrcweir
1436cdf0e10cSrcweir		my $callscounter = $i + 1;
1437b274bc22SAndre Fischer
1438b274bc22SAndre Fischer		$installer::logger::Info->printf("... makecab.exe (%s/%s) ... \n", $callscounter, $allmakecabcalls);
1439cdf0e10cSrcweir
1440cdf0e10cSrcweir		# my $returnvalue = system($systemcall);
1441cdf0e10cSrcweir
1442cdf0e10cSrcweir		for ( my $n = 1; $n <= $maxmakecabcalls; $n++ )
1443cdf0e10cSrcweir		{
1444cdf0e10cSrcweir			my @ddfoutput = ();
1445cdf0e10cSrcweir
1446cdf0e10cSrcweir			$infoline = "Systemcall: $systemcall";
1447b274bc22SAndre Fischer			$installer::logger::Lang->print($infoline);
1448cdf0e10cSrcweir
1449cdf0e10cSrcweir			open (DDF, "$systemcall");
1450cdf0e10cSrcweir			while (<DDF>) {push(@ddfoutput, $_); }
1451cdf0e10cSrcweir			close (DDF);
1452cdf0e10cSrcweir
1453cdf0e10cSrcweir			my $returnvalue = $?;	# $? contains the return value of the systemcall
1454cdf0e10cSrcweir
1455cdf0e10cSrcweir			if ($returnvalue)
1456cdf0e10cSrcweir			{
1457cdf0e10cSrcweir				if ( $n < $maxmakecabcalls )
1458cdf0e10cSrcweir				{
1459b274bc22SAndre Fischer                    $installer::logger::Info->printf("makecab_error (Try %s): Trying again\n", $n);
1460b274bc22SAndre Fischer                    $installer::logger::Lang->printf("makecab_error (Try %s): Trying again\n", $n);
1461cdf0e10cSrcweir				}
1462cdf0e10cSrcweir				else
1463cdf0e10cSrcweir				{
1464b274bc22SAndre Fischer                    $installer::logger::Info->printf("ERROR (Try %s): Abort packing \n", $n);
1465b274bc22SAndre Fischer                    $installer::logger::Lang->printf("ERROR (Try %s): Abort packing \n", $n);
1466cdf0e10cSrcweir				}
1467cdf0e10cSrcweir
1468cdf0e10cSrcweir				for ( my $m = 0; $m <= $#ddfoutput; $m++ )
1469cdf0e10cSrcweir				{
1470cdf0e10cSrcweir					if ( $ddfoutput[$m] =~ /(ERROR\:.*?)\s*$/ )
1471cdf0e10cSrcweir					{
1472cdf0e10cSrcweir						$infoline = $1 . "\n";
1473b274bc22SAndre Fischer						if ( $n < $maxmakecabcalls )
1474b274bc22SAndre Fischer                        {
1475b274bc22SAndre Fischer                            $infoline =~ s/ERROR\:/makecab_error\:/i;
1476b274bc22SAndre Fischer                        }
1477b274bc22SAndre Fischer						$installer::logger::Info->print($infoline);
1478b274bc22SAndre Fischer						$installer::logger::Lang->print($infoline);
1479cdf0e10cSrcweir					}
1480cdf0e10cSrcweir				}
1481cdf0e10cSrcweir
1482cdf0e10cSrcweir				if ( $n == $maxmakecabcalls ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "execute_packaging"); }
1483cdf0e10cSrcweir			}
1484cdf0e10cSrcweir			else
1485cdf0e10cSrcweir			{
1486cdf0e10cSrcweir				$infoline = "Success (Try $n): $systemcall";
1487b274bc22SAndre Fischer				$installer::logger::Lang->print($infoline);
1488cdf0e10cSrcweir				last;
1489cdf0e10cSrcweir			}
1490cdf0e10cSrcweir		}
1491cdf0e10cSrcweir	}
1492cdf0e10cSrcweir
1493b274bc22SAndre Fischer	$installer::logger::Lang->add_timestamp("Performance Info: Execute packaging end");
1494cdf0e10cSrcweir
1495cdf0e10cSrcweir	# setting back to the original tmp directory
1496cdf0e10cSrcweir	$ENV{'TMP'} = $origtemppath;
1497cdf0e10cSrcweir
1498cdf0e10cSrcweir	chdir($from);
1499cdf0e10cSrcweir	$infoline = "chdir: $from \n";
1500b274bc22SAndre Fischer	$installer::logger::Lang->print($infoline);
1501cdf0e10cSrcweir}
1502cdf0e10cSrcweir
1503cdf0e10cSrcweir
15049f91b7e3SAndre Fischer=head2 get_source_codes($languagesref)
1505cdf0e10cSrcweir
15069f91b7e3SAndre Fischer    Return product code and upgrade code from the source version.
15079f91b7e3SAndre Fischer    When no source version is defined then return undef for both.
15089f91b7e3SAndre Fischer
15099f91b7e3SAndre Fischer=cut
15109f91b7e3SAndre Fischersub get_source_codes ($)
15119f91b7e3SAndre Fischer{
15129f91b7e3SAndre Fischer    my ($languagesref) = @_;
15139f91b7e3SAndre Fischer
15149f91b7e3SAndre Fischer    if ( ! defined $installer::globals::source_version)
15159f91b7e3SAndre Fischer    {
1516f5a0c083SAndre Fischer        $installer::logger::Lang->printf("no source version defined\n");
1517f5a0c083SAndre Fischer        return (undef, undef);
15189f91b7e3SAndre Fischer    }
15199f91b7e3SAndre Fischer
15209f91b7e3SAndre Fischer    my $onelanguage = installer::languages::get_key_language($languagesref);
15219f91b7e3SAndre Fischer
15229f91b7e3SAndre Fischer    my $release_data = installer::patch::ReleasesList::Instance()
15239f91b7e3SAndre Fischer        ->{$installer::globals::source_version}
15249f91b7e3SAndre Fischer        ->{$installer::globals::packageformat};
15259f91b7e3SAndre Fischer    if (defined $release_data)
15269f91b7e3SAndre Fischer    {
1527f5a0c083SAndre Fischer        my $normalized_language = installer::languages::get_normalized_language($languagesref);
1528f5a0c083SAndre Fischer        my $language_data = $release_data->{$normalized_language};
15299f91b7e3SAndre Fischer        if (defined $language_data)
15309f91b7e3SAndre Fischer        {
15319f91b7e3SAndre Fischer            $installer::logger::Lang->printf("source product code is %s\n", $language_data->{'product-code'});
15329f91b7e3SAndre Fischer            $installer::logger::Lang->printf("source upgrade code is %s\n", $release_data->{'upgrade-code'});
15339f91b7e3SAndre Fischer
15349f91b7e3SAndre Fischer            return (
15359f91b7e3SAndre Fischer                $language_data->{'product-code'},
15369f91b7e3SAndre Fischer                $release_data->{'upgrade-code'}
15379f91b7e3SAndre Fischer                );
15389f91b7e3SAndre Fischer        }
15399f91b7e3SAndre Fischer        else
15409f91b7e3SAndre Fischer        {
15419f91b7e3SAndre Fischer            $installer::logger::Info->printf(
1542f5a0c083SAndre Fischer                "Warning: can not access information about previous version %s and language %s/%s/%s\n",
15439f91b7e3SAndre Fischer                $installer::globals::source_version,
1544f5a0c083SAndre Fischer                $onelanguage,
1545f5a0c083SAndre Fischer                join(", ",@$languagesref),
1546f5a0c083SAndre Fischer                $normalized_language);
15479f91b7e3SAndre Fischer            return (undef,undef);
15489f91b7e3SAndre Fischer        }
15499f91b7e3SAndre Fischer    }
15509f91b7e3SAndre Fischer    else
15519f91b7e3SAndre Fischer    {
15529f91b7e3SAndre Fischer        $installer::logger::Info->printf("Warning: can not access information about previous version %s\n",
15539f91b7e3SAndre Fischer            $installer::globals::source_version);
15549f91b7e3SAndre Fischer        return (undef,undef);
15559f91b7e3SAndre Fischer    }
15569f91b7e3SAndre Fischer}
1557cdf0e10cSrcweir
1558cdf0e10cSrcweir
1559cdf0e10cSrcweir
1560cdf0e10cSrcweir
15619f91b7e3SAndre Fischer=head2 set_global_code_variables ($languagesref, $allvariableshashref)
1562cdf0e10cSrcweir
15639f91b7e3SAndre Fischer    Determine values for the product code and upgrade code of the target version.
1564cdf0e10cSrcweir
15659f91b7e3SAndre Fischer    As perparation for building a Windows patch, certain conditions have to be fullfilled.
15669f91b7e3SAndre Fischer     - The upgrade code changes from old to new version
15679f91b7e3SAndre Fischer     - The product code remains the same
15689f91b7e3SAndre Fischer     In order to inforce that we have to access information about the source version.
1569cdf0e10cSrcweir
15709f91b7e3SAndre Fischer    The resulting values are stored as global variables
15719f91b7e3SAndre Fischer        $installer::globals::productcode
15729f91b7e3SAndre Fischer        $installer::globals::upgradecode
15739f91b7e3SAndre Fischer    and as variables in the given hash
15749f91b7e3SAndre Fischer    	$allvariableshashref->{'PRODUCTCODE'}
15759f91b7e3SAndre Fischer        $allvariableshashref->{'UPGRADECODE'}
1576cdf0e10cSrcweir
15779f91b7e3SAndre Fischer=cut
15789f91b7e3SAndre Fischersub set_global_code_variables ($$)
15799f91b7e3SAndre Fischer{
15809f91b7e3SAndre Fischer	my ($languagesref, $allvariableshashref) = @_;
1581cdf0e10cSrcweir
15829f91b7e3SAndre Fischer    my ($source_product_code, $source_upgrade_code) = get_source_codes($languagesref);
15839f91b7e3SAndre Fischer    my ($target_product_code, $target_upgrade_code) = (undef, undef);
15849f91b7e3SAndre Fischer
15859f91b7e3SAndre Fischer    if (defined $source_product_code && defined $source_upgrade_code)
15869f91b7e3SAndre Fischer    {
15879f91b7e3SAndre Fischer        if ($installer::globals::is_major_release)
15889f91b7e3SAndre Fischer        {
15899f91b7e3SAndre Fischer            # For a major release we have to change the product code.
15909f91b7e3SAndre Fischer            $target_product_code = "{" . create_guid() . "}";
15919f91b7e3SAndre Fischer            $installer::logger::Lang->printf("building a major release, created new product code %s\n",
15929f91b7e3SAndre Fischer                $target_product_code);
15939f91b7e3SAndre Fischer
15949f91b7e3SAndre Fischer            # Let's do a paranoia check that the new and the old guids are
15959f91b7e3SAndre Fischer            # different.  In reality the new guid really has to be
15969f91b7e3SAndre Fischer            # different from all other guids used for * codes, components,
15979f91b7e3SAndre Fischer            # etc.
15989f91b7e3SAndre Fischer            if ($target_product_code eq $source_product_code)
15999f91b7e3SAndre Fischer            {
16009f91b7e3SAndre Fischer                installer::logger::PrintError(
16019f91b7e3SAndre Fischer                    "new GUID for product code is the same as the old product code but should be different.");
16029f91b7e3SAndre Fischer            }
16039f91b7e3SAndre Fischer        }
16049f91b7e3SAndre Fischer        else
16059f91b7e3SAndre Fischer        {
16069f91b7e3SAndre Fischer            # For minor or micro releases we have to keeep the old product code.
16079f91b7e3SAndre Fischer            $target_product_code = "{" . $source_product_code . "}";
16089f91b7e3SAndre Fischer            $installer::logger::Lang->printf("building a minor or micro release, reusing product code %s\n",
16099f91b7e3SAndre Fischer                $target_product_code);
16109f91b7e3SAndre Fischer        }
16119f91b7e3SAndre Fischer
16129f91b7e3SAndre Fischer        $target_upgrade_code = "{" . create_guid() . "}";
16139f91b7e3SAndre Fischer        # Again, just one test for paranoia.
16149f91b7e3SAndre Fischer        if ($target_upgrade_code eq $source_upgrade_code)
16159f91b7e3SAndre Fischer        {
16169f91b7e3SAndre Fischer            installer::logger::PrintError(
16179f91b7e3SAndre Fischer                "new GUID for upgrade code is the same as the old upgrade code but should be different.");
16189f91b7e3SAndre Fischer        }
16199f91b7e3SAndre Fischer    }
16209f91b7e3SAndre Fischer    else
16219f91b7e3SAndre Fischer    {
16229f91b7e3SAndre Fischer        # There is no previous version with which to compare the product code.
16239f91b7e3SAndre Fischer        # Just create two new uuids.
16249f91b7e3SAndre Fischer        $target_product_code = "{" . create_guid() . "}";
16259f91b7e3SAndre Fischer        $target_upgrade_code = "{" . create_guid() . "}";
1626f5a0c083SAndre Fischer        $installer::logger::Lang->printf("there is no source version => created new guids\n");
16279f91b7e3SAndre Fischer    }
16289f91b7e3SAndre Fischer
16299f91b7e3SAndre Fischer    $installer::globals::productcode = $target_product_code;
16309f91b7e3SAndre Fischer    $installer::globals::upgradecode = $target_upgrade_code;
16319f91b7e3SAndre Fischer    $allvariableshashref->{'PRODUCTCODE'} = $target_product_code;
16329f91b7e3SAndre Fischer	$allvariableshashref->{'UPGRADECODE'} = $target_upgrade_code;
16339f91b7e3SAndre Fischer
16349f91b7e3SAndre Fischer	$installer::logger::Lang->printf("target product code is %s\n", $target_product_code);
16359f91b7e3SAndre Fischer	$installer::logger::Lang->printf("target upgrade code is %s\n", $target_upgrade_code);
16369f91b7e3SAndre Fischer}
1637cdf0e10cSrcweir
1638cdf0e10cSrcweir
1639cdf0e10cSrcweir
1640cdf0e10cSrcweir
1641cdf0e10cSrcweir###############################################################
1642cdf0e10cSrcweir# Setting the product version used in property table and
1643cdf0e10cSrcweir# upgrade table. Saving in global variable $msiproductversion
1644cdf0e10cSrcweir###############################################################
1645cdf0e10cSrcweir
1646cdf0e10cSrcweirsub set_msiproductversion
1647cdf0e10cSrcweir{
1648cdf0e10cSrcweir	my ( $allvariables ) = @_;
1649cdf0e10cSrcweir
1650cdf0e10cSrcweir	my $productversion = $allvariables->{'PRODUCTVERSION'};
1651cdf0e10cSrcweir
1652cdf0e10cSrcweir	if (( $productversion =~ /^\s*\d+\s*$/ ) && ( $productversion > 255 )) { $productversion = $productversion%256; }
1653cdf0e10cSrcweir
1654cdf0e10cSrcweir	if ( $productversion =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ )
1655cdf0e10cSrcweir	{
1656cdf0e10cSrcweir		$productversion = $1 . "\." . $2 . $3 . "\." . $installer::globals::buildid;
1657cdf0e10cSrcweir	}
1658cdf0e10cSrcweir	elsif  ( $productversion =~ /^\s*(\d+)\.(\d+)\s*$/ )
1659cdf0e10cSrcweir	{
1660cdf0e10cSrcweir		$productversion = $1 . "\." . $2 . "\." . $installer::globals::buildid;
1661cdf0e10cSrcweir	}
1662cdf0e10cSrcweir	else
1663cdf0e10cSrcweir	{
1664cdf0e10cSrcweir		my $productminor = "00";
1665cdf0e10cSrcweir		if (( $allvariables->{'PACKAGEVERSION'} ) && ( $allvariables->{'PACKAGEVERSION'} ne "" ))
1666cdf0e10cSrcweir		{
1667cdf0e10cSrcweir			if ( $allvariables->{'PACKAGEVERSION'} =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ ) { $productminor = $2; }
1668cdf0e10cSrcweir		}
1669cdf0e10cSrcweir
1670cdf0e10cSrcweir		$productversion = $productversion . "\." . $productminor . "\." . $installer::globals::buildid;
1671cdf0e10cSrcweir	}
1672cdf0e10cSrcweir
1673cdf0e10cSrcweir	$installer::globals::msiproductversion = $productversion;
1674cdf0e10cSrcweir
1675cdf0e10cSrcweir	# Setting $installer::globals::msimajorproductversion, to differ between old version in upgrade table
1676cdf0e10cSrcweir
1677cdf0e10cSrcweir	if ( $installer::globals::msiproductversion =~ /^\s*(\d+)\./ )
1678cdf0e10cSrcweir	{
1679cdf0e10cSrcweir		my $major = $1;
1680cdf0e10cSrcweir		$installer::globals::msimajorproductversion = $major . "\.0\.0";
1681cdf0e10cSrcweir	}
1682cdf0e10cSrcweir}
1683cdf0e10cSrcweir
1684cdf0e10cSrcweir#################################################################################
1685cdf0e10cSrcweir# Including the msi product version into the bootstrap.ini, Windows only
1686cdf0e10cSrcweir#################################################################################
1687cdf0e10cSrcweir
1688cdf0e10cSrcweirsub put_msiproductversion_into_bootstrapfile
1689cdf0e10cSrcweir{
1690cdf0e10cSrcweir	my ($filesref) = @_;
1691cdf0e10cSrcweir
1692cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$filesref}; $i++ )
1693cdf0e10cSrcweir	{
1694cdf0e10cSrcweir		my $onefile = ${$filesref}[$i];
1695cdf0e10cSrcweir
1696cdf0e10cSrcweir		if ( $onefile->{'gid'} eq "gid_Profile_Version_Ini" )
1697cdf0e10cSrcweir		{
1698cdf0e10cSrcweir			my $file = installer::files::read_file($onefile->{'sourcepath'});
1699cdf0e10cSrcweir
1700cdf0e10cSrcweir			for ( my $j = 0; $j <= $#{$file}; $j++ )
1701cdf0e10cSrcweir			{
1702cdf0e10cSrcweir				${$file}[$j] =~ s/\<msiproductversion\>/$installer::globals::msiproductversion/;
1703cdf0e10cSrcweir			}
1704cdf0e10cSrcweir
1705cdf0e10cSrcweir			installer::files::save_file($onefile->{'sourcepath'}, $file);
1706cdf0e10cSrcweir
1707cdf0e10cSrcweir			last;
1708cdf0e10cSrcweir		}
1709cdf0e10cSrcweir	}
1710cdf0e10cSrcweir}
1711cdf0e10cSrcweir
1712cdf0e10cSrcweir####################################################################################
1713cdf0e10cSrcweir# Updating the file Property.idt dynamically
1714cdf0e10cSrcweir# Content:
1715cdf0e10cSrcweir# Property Value
1716cdf0e10cSrcweir####################################################################################
1717cdf0e10cSrcweir
1718cdf0e10cSrcweirsub update_reglocat_table
1719cdf0e10cSrcweir{
1720cdf0e10cSrcweir	my ($basedir, $allvariables) = @_;
1721cdf0e10cSrcweir
1722cdf0e10cSrcweir	my $reglocatfilename = $basedir . $installer::globals::separator . "RegLocat.idt";
1723cdf0e10cSrcweir
1724cdf0e10cSrcweir	# Only do something, if this file exists
1725cdf0e10cSrcweir
1726cdf0e10cSrcweir	if ( -f $reglocatfilename )
1727cdf0e10cSrcweir	{
1728cdf0e10cSrcweir		my $reglocatfile = installer::files::read_file($reglocatfilename);
1729cdf0e10cSrcweir
1730cdf0e10cSrcweir		my $layername = "";
1731cdf0e10cSrcweir		if ( $allvariables->{'REGISTRYLAYERNAME'} )
1732cdf0e10cSrcweir		{
1733cdf0e10cSrcweir			$layername = $allvariables->{'REGISTRYLAYERNAME'};
1734cdf0e10cSrcweir		}
1735cdf0e10cSrcweir		else
1736cdf0e10cSrcweir		{
1737cdf0e10cSrcweir			for ( my $i = 0; $i <= $#{$reglocatfile}; $i++ )
1738cdf0e10cSrcweir			{
1739cdf0e10cSrcweir				if ( ${$reglocatfile}[$i] =~ /\bLAYERNAMETEMPLATE\b/ )
1740cdf0e10cSrcweir				{
1741cdf0e10cSrcweir					installer::exiter::exit_program("ERROR: Variable \"REGISTRYLAYERNAME\" has to be defined", "update_reglocat_table");
1742cdf0e10cSrcweir				}
1743cdf0e10cSrcweir			}
1744cdf0e10cSrcweir		}
1745cdf0e10cSrcweir
1746cdf0e10cSrcweir		if ( $layername ne "" )
1747cdf0e10cSrcweir		{
1748cdf0e10cSrcweir			# Updating the layername in
1749cdf0e10cSrcweir
1750cdf0e10cSrcweir			for ( my $i = 0; $i <= $#{$reglocatfile}; $i++ )
1751cdf0e10cSrcweir			{
1752cdf0e10cSrcweir				${$reglocatfile}[$i] =~ s/\bLAYERNAMETEMPLATE\b/$layername/;
1753cdf0e10cSrcweir			}
1754cdf0e10cSrcweir
1755cdf0e10cSrcweir			# Saving the file
1756cdf0e10cSrcweir			installer::files::save_file($reglocatfilename ,$reglocatfile);
1757cdf0e10cSrcweir			my $infoline = "Updated idt file: $reglocatfilename\n";
1758b274bc22SAndre Fischer			$installer::logger::Lang->print($infoline);
1759cdf0e10cSrcweir		}
1760cdf0e10cSrcweir	}
1761cdf0e10cSrcweir}
1762cdf0e10cSrcweir
1763cdf0e10cSrcweir
1764cdf0e10cSrcweir
1765cdf0e10cSrcweir####################################################################################
1766cdf0e10cSrcweir# Updating the file RemoveRe.idt dynamically (RemoveRegistry.idt)
1767cdf0e10cSrcweir# The name of the component has to be replaced.
1768cdf0e10cSrcweir####################################################################################
1769cdf0e10cSrcweir
1770cdf0e10cSrcweirsub update_removere_table
1771cdf0e10cSrcweir{
1772cdf0e10cSrcweir	my ($basedir) = @_;
1773cdf0e10cSrcweir
1774cdf0e10cSrcweir	my $removeregistryfilename = $basedir . $installer::globals::separator . "RemoveRe.idt";
1775cdf0e10cSrcweir
1776cdf0e10cSrcweir	# Only do something, if this file exists
1777cdf0e10cSrcweir
1778cdf0e10cSrcweir	if ( -f $removeregistryfilename )
1779cdf0e10cSrcweir	{
1780cdf0e10cSrcweir		my $removeregistryfile = installer::files::read_file($removeregistryfilename);
1781cdf0e10cSrcweir
1782cdf0e10cSrcweir		for ( my $i = 0; $i <= $#{$removeregistryfile}; $i++ )
1783cdf0e10cSrcweir		{
1784cdf0e10cSrcweir			for ( my $i = 0; $i <= $#{$removeregistryfile}; $i++ )
1785cdf0e10cSrcweir			{
1786cdf0e10cSrcweir				${$removeregistryfile}[$i] =~ s/\bREGISTRYROOTCOMPONENT\b/$installer::globals::registryrootcomponent/;
1787cdf0e10cSrcweir			}
1788cdf0e10cSrcweir		}
1789cdf0e10cSrcweir
1790cdf0e10cSrcweir		# Saving the file
1791cdf0e10cSrcweir		installer::files::save_file($removeregistryfilename ,$removeregistryfile);
1792cdf0e10cSrcweir		my $infoline = "Updated idt file: $removeregistryfilename \n";
1793b274bc22SAndre Fischer		$installer::logger::Lang->print($infoline);
1794cdf0e10cSrcweir	}
1795cdf0e10cSrcweir}
1796cdf0e10cSrcweir
1797cdf0e10cSrcweir
1798cdf0e10cSrcweir1;
1799cdf0e10cSrcweir
1800