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.
11286e1cf34SPedro Giffuni# Therefore it can be useful to use relative paths. 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
18686e1cf34SPedro Giffuni        # to avoid lines with more than 256 characters, it can be useful to use relative paths
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
58486e1cf34SPedro Giffuni		# Problem: msitran.exe in version 4.0 always returns "1", even if no failure occurred.
585cdf0e10cSrcweir		# Therefore it has to be checked, if this is version 4.0. If yes, if the mst file
58686e1cf34SPedro Giffuni		# exists and if it is larger than 0 bytes. If this is true, then no error occurred.
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					{
63186e1cf34SPedro Giffuni						$infoline = "Filesize indicates that an error occurred.\n";
632b274bc22SAndre Fischer						$installer::logger::Lang->print($infoline);
633cdf0e10cSrcweir					}
634cdf0e10cSrcweir				}
635cdf0e10cSrcweir				else
636cdf0e10cSrcweir				{
63786e1cf34SPedro Giffuni					$infoline = "File $transformfile does not exist -> An error occurred.\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
129286e1cf34SPedro Giffuni		# 2. Replacing all occurrences 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
141686e1cf34SPedro Giffuni	# if the ddf file contains relative paths, 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
157077bec208SAndre Fischer    As preparation for building a Windows patch, certain conditions have to be fulfilled.
157177bec208SAndre Fischer     - The upgrade code remains the same
15729f91b7e3SAndre Fischer     - The product code remains the same
157377bec208SAndre Fischer       [this is still to be determined.  For patches to work we need the same product codes but
157477bec208SAndre Fischer        the install sets install only when the product codes differ.]
157577bec208SAndre Fischer    In order to enforce that we have to access information about the source version.
1576cdf0e10cSrcweir
15779f91b7e3SAndre Fischer    The resulting values are stored as global variables
15789f91b7e3SAndre Fischer        $installer::globals::productcode
15799f91b7e3SAndre Fischer        $installer::globals::upgradecode
15809f91b7e3SAndre Fischer    and as variables in the given hash
15819f91b7e3SAndre Fischer    	$allvariableshashref->{'PRODUCTCODE'}
15829f91b7e3SAndre Fischer        $allvariableshashref->{'UPGRADECODE'}
1583cdf0e10cSrcweir
15849f91b7e3SAndre Fischer=cut
15859f91b7e3SAndre Fischersub set_global_code_variables ($$)
15869f91b7e3SAndre Fischer{
15879f91b7e3SAndre Fischer	my ($languagesref, $allvariableshashref) = @_;
1588cdf0e10cSrcweir
15899f91b7e3SAndre Fischer    my ($source_product_code, $source_upgrade_code) = get_source_codes($languagesref);
15909f91b7e3SAndre Fischer    my ($target_product_code, $target_upgrade_code) = (undef, undef);
15919f91b7e3SAndre Fischer
15929f91b7e3SAndre Fischer    if (defined $source_product_code && defined $source_upgrade_code)
15939f91b7e3SAndre Fischer    {
15949f91b7e3SAndre Fischer        if ($installer::globals::is_major_release)
15959f91b7e3SAndre Fischer        {
15969f91b7e3SAndre Fischer            # For a major release we have to change the product code.
15979f91b7e3SAndre Fischer            $target_product_code = "{" . create_guid() . "}";
15989f91b7e3SAndre Fischer            $installer::logger::Lang->printf("building a major release, created new product code %s\n",
15999f91b7e3SAndre Fischer                $target_product_code);
16009f91b7e3SAndre Fischer
16019f91b7e3SAndre Fischer            # Let's do a paranoia check that the new and the old guids are
16029f91b7e3SAndre Fischer            # different.  In reality the new guid really has to be
16039f91b7e3SAndre Fischer            # different from all other guids used for * codes, components,
16049f91b7e3SAndre Fischer            # etc.
16059f91b7e3SAndre Fischer            if ($target_product_code eq $source_product_code)
16069f91b7e3SAndre Fischer            {
16079f91b7e3SAndre Fischer                installer::logger::PrintError(
16089f91b7e3SAndre Fischer                    "new GUID for product code is the same as the old product code but should be different.");
16099f91b7e3SAndre Fischer            }
16109f91b7e3SAndre Fischer        }
16119f91b7e3SAndre Fischer        else
16129f91b7e3SAndre Fischer        {
16139f91b7e3SAndre Fischer            # For minor or micro releases we have to keeep the old product code.
16149f91b7e3SAndre Fischer            $target_product_code = "{" . $source_product_code . "}";
16159f91b7e3SAndre Fischer            $installer::logger::Lang->printf("building a minor or micro release, reusing product code %s\n",
16169f91b7e3SAndre Fischer                $target_product_code);
16179f91b7e3SAndre Fischer        }
16189f91b7e3SAndre Fischer
16199f91b7e3SAndre Fischer        $target_upgrade_code = "{" . create_guid() . "}";
16209f91b7e3SAndre Fischer        # Again, just one test for paranoia.
16219f91b7e3SAndre Fischer        if ($target_upgrade_code eq $source_upgrade_code)
16229f91b7e3SAndre Fischer        {
16239f91b7e3SAndre Fischer            installer::logger::PrintError(
16249f91b7e3SAndre Fischer                "new GUID for upgrade code is the same as the old upgrade code but should be different.");
16259f91b7e3SAndre Fischer        }
16269f91b7e3SAndre Fischer    }
16279f91b7e3SAndre Fischer    else
16289f91b7e3SAndre Fischer    {
16299f91b7e3SAndre Fischer        # There is no previous version with which to compare the product code.
16309f91b7e3SAndre Fischer        # Just create two new uuids.
16319f91b7e3SAndre Fischer        $target_product_code = "{" . create_guid() . "}";
16329f91b7e3SAndre Fischer        $target_upgrade_code = "{" . create_guid() . "}";
1633f5a0c083SAndre Fischer        $installer::logger::Lang->printf("there is no source version => created new guids\n");
16349f91b7e3SAndre Fischer    }
163577bec208SAndre Fischer
163677bec208SAndre Fischer    # Keep the upgrade code constant between versions.  Read it from the codes.txt file.
163777bec208SAndre Fischer    # Note that this handles regular installation sets and language packs.
163877bec208SAndre Fischer    my $onelanguage = ${$languagesref}[0];
163977bec208SAndre Fischer    $installer::logger::Lang->printf("reading upgrade code for language %s from %s\n",
164077bec208SAndre Fischer        $onelanguage,
164177bec208SAndre Fischer        $installer::globals::codefilename);
164277bec208SAndre Fischer    if (defined $installer::globals::codefilename)
164377bec208SAndre Fischer    {
164477bec208SAndre Fischer        my $code_filename = $installer::globals::codefilename;
164577bec208SAndre Fischer        installer::files::check_file($code_filename);
164677bec208SAndre Fischer        my $codefile = installer::files::read_file($code_filename);
164777bec208SAndre Fischer        my $searchstring = "UPGRADECODE";
164877bec208SAndre Fischer        my $codeblock = installer::windows::idtglobal::get_language_block_from_language_file(
164977bec208SAndre Fischer            $searchstring,
165077bec208SAndre Fischer            $codefile);
165177bec208SAndre Fischer        $target_upgrade_code = installer::windows::idtglobal::get_language_string_from_language_block(
165277bec208SAndre Fischer            $codeblock,
165377bec208SAndre Fischer            $onelanguage,
165477bec208SAndre Fischer            "");
165577bec208SAndre Fischer    }
165677bec208SAndre Fischer    # else use the previously generated upgrade code.
165777bec208SAndre Fischer
16589f91b7e3SAndre Fischer    $installer::globals::productcode = $target_product_code;
16599f91b7e3SAndre Fischer    $installer::globals::upgradecode = $target_upgrade_code;
16609f91b7e3SAndre Fischer    $allvariableshashref->{'PRODUCTCODE'} = $target_product_code;
16619f91b7e3SAndre Fischer	$allvariableshashref->{'UPGRADECODE'} = $target_upgrade_code;
16629f91b7e3SAndre Fischer
16639f91b7e3SAndre Fischer	$installer::logger::Lang->printf("target product code is %s\n", $target_product_code);
16649f91b7e3SAndre Fischer	$installer::logger::Lang->printf("target upgrade code is %s\n", $target_upgrade_code);
16659f91b7e3SAndre Fischer}
1666cdf0e10cSrcweir
1667cdf0e10cSrcweir
1668cdf0e10cSrcweir
1669cdf0e10cSrcweir
1670cdf0e10cSrcweir###############################################################
1671cdf0e10cSrcweir# Setting the product version used in property table and
1672cdf0e10cSrcweir# upgrade table. Saving in global variable $msiproductversion
1673cdf0e10cSrcweir###############################################################
1674cdf0e10cSrcweir
1675cdf0e10cSrcweirsub set_msiproductversion
1676cdf0e10cSrcweir{
1677cdf0e10cSrcweir	my ( $allvariables ) = @_;
1678cdf0e10cSrcweir
1679cdf0e10cSrcweir	my $productversion = $allvariables->{'PRODUCTVERSION'};
1680*c1467797Smseidel	my $productmajor;
1681*c1467797Smseidel	my $productminor; # It must be 3 digits long
1682cdf0e10cSrcweir
1683cdf0e10cSrcweir	if (( $productversion =~ /^\s*\d+\s*$/ ) && ( $productversion > 255 )) { $productversion = $productversion%256; }
1684cdf0e10cSrcweir
1685cdf0e10cSrcweir	if ( $productversion =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ )
1686cdf0e10cSrcweir	{
1687*c1467797Smseidel		my $productmicro = $3;
1688*c1467797Smseidel		$productmajor = $1;
1689*c1467797Smseidel		$productminor = $2;
1690*c1467797Smseidel		$productmicro = "0" . $productmicro while ( length ( $productminor . $productmicro ) < 3 );
1691*c1467797Smseidel		$productminor .= $productmicro;
1692cdf0e10cSrcweir	}
1693cdf0e10cSrcweir	elsif  ( $productversion =~ /^\s*(\d+)\.(\d+)\s*$/ )
1694cdf0e10cSrcweir	{
1695*c1467797Smseidel		$productmajor = $1;
1696*c1467797Smseidel		$productminor = $2;
1697cdf0e10cSrcweir	}
1698cdf0e10cSrcweir	else
1699cdf0e10cSrcweir	{
1700cdf0e10cSrcweir		if (( $allvariables->{'PACKAGEVERSION'} ) && ( $allvariables->{'PACKAGEVERSION'} ne "" ))
1701cdf0e10cSrcweir		{
1702cdf0e10cSrcweir			if ( $allvariables->{'PACKAGEVERSION'} =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ ) { $productminor = $2; }
1703cdf0e10cSrcweir		}
1704cdf0e10cSrcweir
1705*c1467797Smseidel		$productmajor = $productversion;
1706cdf0e10cSrcweir	}
1707*c1467797Smseidel	$productminor .= "0" while ( length( $productminor ) < 3);
1708*c1467797Smseidel	$productversion = $productmajor . "\." . $productminor . "\." . $installer::globals::buildid;
1709cdf0e10cSrcweir
1710cdf0e10cSrcweir	$installer::globals::msiproductversion = $productversion;
1711cdf0e10cSrcweir
1712cdf0e10cSrcweir	# Setting $installer::globals::msimajorproductversion, to differ between old version in upgrade table
1713cdf0e10cSrcweir
1714cdf0e10cSrcweir	if ( $installer::globals::msiproductversion =~ /^\s*(\d+)\./ )
1715cdf0e10cSrcweir	{
1716cdf0e10cSrcweir		my $major = $1;
1717cdf0e10cSrcweir		$installer::globals::msimajorproductversion = $major . "\.0\.0";
1718cdf0e10cSrcweir	}
1719cdf0e10cSrcweir}
1720cdf0e10cSrcweir
1721cdf0e10cSrcweir#################################################################################
1722cdf0e10cSrcweir# Including the msi product version into the bootstrap.ini, Windows only
1723cdf0e10cSrcweir#################################################################################
1724cdf0e10cSrcweir
1725cdf0e10cSrcweirsub put_msiproductversion_into_bootstrapfile
1726cdf0e10cSrcweir{
1727cdf0e10cSrcweir	my ($filesref) = @_;
1728cdf0e10cSrcweir
1729cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$filesref}; $i++ )
1730cdf0e10cSrcweir	{
1731cdf0e10cSrcweir		my $onefile = ${$filesref}[$i];
1732cdf0e10cSrcweir
1733cdf0e10cSrcweir		if ( $onefile->{'gid'} eq "gid_Profile_Version_Ini" )
1734cdf0e10cSrcweir		{
1735cdf0e10cSrcweir			my $file = installer::files::read_file($onefile->{'sourcepath'});
1736cdf0e10cSrcweir
1737cdf0e10cSrcweir			for ( my $j = 0; $j <= $#{$file}; $j++ )
1738cdf0e10cSrcweir			{
1739cdf0e10cSrcweir				${$file}[$j] =~ s/\<msiproductversion\>/$installer::globals::msiproductversion/;
1740cdf0e10cSrcweir			}
1741cdf0e10cSrcweir
1742cdf0e10cSrcweir			installer::files::save_file($onefile->{'sourcepath'}, $file);
1743cdf0e10cSrcweir
1744cdf0e10cSrcweir			last;
1745cdf0e10cSrcweir		}
1746cdf0e10cSrcweir	}
1747cdf0e10cSrcweir}
1748cdf0e10cSrcweir
1749cdf0e10cSrcweir####################################################################################
1750cdf0e10cSrcweir# Updating the file Property.idt dynamically
1751cdf0e10cSrcweir# Content:
1752cdf0e10cSrcweir# Property Value
1753cdf0e10cSrcweir####################################################################################
1754cdf0e10cSrcweir
1755cdf0e10cSrcweirsub update_reglocat_table
1756cdf0e10cSrcweir{
1757cdf0e10cSrcweir	my ($basedir, $allvariables) = @_;
1758cdf0e10cSrcweir
1759cdf0e10cSrcweir	my $reglocatfilename = $basedir . $installer::globals::separator . "RegLocat.idt";
1760cdf0e10cSrcweir
1761cdf0e10cSrcweir	# Only do something, if this file exists
1762cdf0e10cSrcweir
1763cdf0e10cSrcweir	if ( -f $reglocatfilename )
1764cdf0e10cSrcweir	{
1765cdf0e10cSrcweir		my $reglocatfile = installer::files::read_file($reglocatfilename);
1766cdf0e10cSrcweir
1767cdf0e10cSrcweir		my $layername = "";
1768cdf0e10cSrcweir		if ( $allvariables->{'REGISTRYLAYERNAME'} )
1769cdf0e10cSrcweir		{
1770cdf0e10cSrcweir			$layername = $allvariables->{'REGISTRYLAYERNAME'};
1771cdf0e10cSrcweir		}
1772cdf0e10cSrcweir		else
1773cdf0e10cSrcweir		{
1774cdf0e10cSrcweir			for ( my $i = 0; $i <= $#{$reglocatfile}; $i++ )
1775cdf0e10cSrcweir			{
1776cdf0e10cSrcweir				if ( ${$reglocatfile}[$i] =~ /\bLAYERNAMETEMPLATE\b/ )
1777cdf0e10cSrcweir				{
1778cdf0e10cSrcweir					installer::exiter::exit_program("ERROR: Variable \"REGISTRYLAYERNAME\" has to be defined", "update_reglocat_table");
1779cdf0e10cSrcweir				}
1780cdf0e10cSrcweir			}
1781cdf0e10cSrcweir		}
1782cdf0e10cSrcweir
1783cdf0e10cSrcweir		if ( $layername ne "" )
1784cdf0e10cSrcweir		{
1785cdf0e10cSrcweir			# Updating the layername in
1786cdf0e10cSrcweir
1787cdf0e10cSrcweir			for ( my $i = 0; $i <= $#{$reglocatfile}; $i++ )
1788cdf0e10cSrcweir			{
1789cdf0e10cSrcweir				${$reglocatfile}[$i] =~ s/\bLAYERNAMETEMPLATE\b/$layername/;
1790cdf0e10cSrcweir			}
1791cdf0e10cSrcweir
1792cdf0e10cSrcweir			# Saving the file
1793cdf0e10cSrcweir			installer::files::save_file($reglocatfilename ,$reglocatfile);
1794cdf0e10cSrcweir			my $infoline = "Updated idt file: $reglocatfilename\n";
1795b274bc22SAndre Fischer			$installer::logger::Lang->print($infoline);
1796cdf0e10cSrcweir		}
1797cdf0e10cSrcweir	}
1798cdf0e10cSrcweir}
1799cdf0e10cSrcweir
1800cdf0e10cSrcweir
1801cdf0e10cSrcweir
1802cdf0e10cSrcweir####################################################################################
1803cdf0e10cSrcweir# Updating the file RemoveRe.idt dynamically (RemoveRegistry.idt)
1804cdf0e10cSrcweir# The name of the component has to be replaced.
1805cdf0e10cSrcweir####################################################################################
1806cdf0e10cSrcweir
1807cdf0e10cSrcweirsub update_removere_table
1808cdf0e10cSrcweir{
1809cdf0e10cSrcweir	my ($basedir) = @_;
1810cdf0e10cSrcweir
1811cdf0e10cSrcweir	my $removeregistryfilename = $basedir . $installer::globals::separator . "RemoveRe.idt";
1812cdf0e10cSrcweir
1813cdf0e10cSrcweir	# Only do something, if this file exists
1814cdf0e10cSrcweir
1815cdf0e10cSrcweir	if ( -f $removeregistryfilename )
1816cdf0e10cSrcweir	{
1817cdf0e10cSrcweir		my $removeregistryfile = installer::files::read_file($removeregistryfilename);
1818cdf0e10cSrcweir
1819cdf0e10cSrcweir		for ( my $i = 0; $i <= $#{$removeregistryfile}; $i++ )
1820cdf0e10cSrcweir		{
1821cdf0e10cSrcweir			for ( my $i = 0; $i <= $#{$removeregistryfile}; $i++ )
1822cdf0e10cSrcweir			{
1823cdf0e10cSrcweir				${$removeregistryfile}[$i] =~ s/\bREGISTRYROOTCOMPONENT\b/$installer::globals::registryrootcomponent/;
1824cdf0e10cSrcweir			}
1825cdf0e10cSrcweir		}
1826cdf0e10cSrcweir
1827cdf0e10cSrcweir		# Saving the file
1828cdf0e10cSrcweir		installer::files::save_file($removeregistryfilename ,$removeregistryfile);
1829cdf0e10cSrcweir		my $infoline = "Updated idt file: $removeregistryfilename \n";
1830b274bc22SAndre Fischer		$installer::logger::Lang->print($infoline);
1831cdf0e10cSrcweir	}
1832cdf0e10cSrcweir}
1833cdf0e10cSrcweir
1834cdf0e10cSrcweir
1835cdf0e10cSrcweir1;
1836cdf0e10cSrcweir
1837