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