1*b1cdbd2cSJim Jagielski#**************************************************************
2*b1cdbd2cSJim Jagielski#
3*b1cdbd2cSJim Jagielski#  Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski#  or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski#  distributed with this work for additional information
6*b1cdbd2cSJim Jagielski#  regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski#  to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski#  "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski#  with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski#
11*b1cdbd2cSJim Jagielski#    http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski#
13*b1cdbd2cSJim Jagielski#  Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski#  software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski#  KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski#  specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski#  under the License.
19*b1cdbd2cSJim Jagielski#
20*b1cdbd2cSJim Jagielski#**************************************************************
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielskipackage installer::simplepackage;
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielski# use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
27*b1cdbd2cSJim Jagielskiuse Cwd;
28*b1cdbd2cSJim Jagielskiuse File::Copy;
29*b1cdbd2cSJim Jagielskiuse installer::download;
30*b1cdbd2cSJim Jagielskiuse installer::exiter;
31*b1cdbd2cSJim Jagielskiuse installer::globals;
32*b1cdbd2cSJim Jagielskiuse installer::logger;
33*b1cdbd2cSJim Jagielskiuse installer::strip;
34*b1cdbd2cSJim Jagielskiuse installer::systemactions;
35*b1cdbd2cSJim Jagielskiuse installer::worker;
36*b1cdbd2cSJim Jagielski
37*b1cdbd2cSJim Jagielski####################################################
38*b1cdbd2cSJim Jagielski# Checking if the simple packager is required.
39*b1cdbd2cSJim Jagielski# This can be achieved by setting the global
40*b1cdbd2cSJim Jagielski# variable SIMPLE_PACKAGE in *.lst file or by
41*b1cdbd2cSJim Jagielski# setting the environment variable SIMPLE_PACKAGE.
42*b1cdbd2cSJim Jagielski####################################################
43*b1cdbd2cSJim Jagielski
44*b1cdbd2cSJim Jagielskisub check_simple_packager_project
45*b1cdbd2cSJim Jagielski{
46*b1cdbd2cSJim Jagielski	my ( $allvariables ) = @_;
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski	if (( $installer::globals::packageformat eq "installed" ) ||
49*b1cdbd2cSJim Jagielski		( $installer::globals::packageformat eq "archive" ))
50*b1cdbd2cSJim Jagielski	{
51*b1cdbd2cSJim Jagielski		$installer::globals::is_simple_packager_project = 1;
52*b1cdbd2cSJim Jagielski		$installer::globals::patch_user_dir = 1;
53*b1cdbd2cSJim Jagielski	}
54*b1cdbd2cSJim Jagielski	elsif( $installer::globals::packageformat eq "dmg" )
55*b1cdbd2cSJim Jagielski	{
56*b1cdbd2cSJim Jagielski		$installer::globals::is_simple_packager_project = 1;
57*b1cdbd2cSJim Jagielski	}
58*b1cdbd2cSJim Jagielski}
59*b1cdbd2cSJim Jagielski
60*b1cdbd2cSJim Jagielski####################################################
61*b1cdbd2cSJim Jagielski# Detecting the directory with extensions
62*b1cdbd2cSJim Jagielski####################################################
63*b1cdbd2cSJim Jagielski
64*b1cdbd2cSJim Jagielskisub get_extensions_dir
65*b1cdbd2cSJim Jagielski{
66*b1cdbd2cSJim Jagielski	my ( $subfolderdir ) = @_;
67*b1cdbd2cSJim Jagielski
68*b1cdbd2cSJim Jagielski	my $extensiondir = $subfolderdir . $installer::globals::separator;
69*b1cdbd2cSJim Jagielski	if ( $installer::globals::officedirhostname ne "" ) { $extensiondir = $extensiondir . $installer::globals::officedirhostname . $installer::globals::separator; }
70*b1cdbd2cSJim Jagielski	my $extensionsdir = $extensiondir . "share" . $installer::globals::separator . "extensions";
71*b1cdbd2cSJim Jagielski	my $preregdir = $extensiondir . "share" . $installer::globals::separator . "prereg" . $installer::globals::separator . "bundled";
72*b1cdbd2cSJim Jagielski
73*b1cdbd2cSJim Jagielski	return ( $extensionsdir, $preregdir );
74*b1cdbd2cSJim Jagielski}
75*b1cdbd2cSJim Jagielski
76*b1cdbd2cSJim Jagielski####################################################
77*b1cdbd2cSJim Jagielski# Registering extensions
78*b1cdbd2cSJim Jagielski####################################################
79*b1cdbd2cSJim Jagielski
80*b1cdbd2cSJim Jagielskisub register_extensions
81*b1cdbd2cSJim Jagielski{
82*b1cdbd2cSJim Jagielski	my ($officedir, $languagestringref, $preregdir) = @_;
83*b1cdbd2cSJim Jagielski
84*b1cdbd2cSJim Jagielski	my $infoline = "";
85*b1cdbd2cSJim Jagielski
86*b1cdbd2cSJim Jagielski	if ( $preregdir eq "" )
87*b1cdbd2cSJim Jagielski	{
88*b1cdbd2cSJim Jagielski		$infoline = "ERROR: Failed to determine directory \"prereg\" for extension registration! Please check your installation set.\n";
89*b1cdbd2cSJim Jagielski		$installer::logger::Lang->print($infoline);
90*b1cdbd2cSJim Jagielski		installer::exiter::exit_program($infoline, "register_extensions");
91*b1cdbd2cSJim Jagielski	}
92*b1cdbd2cSJim Jagielski
93*b1cdbd2cSJim Jagielski	my $programdir = $officedir . $installer::globals::separator;
94*b1cdbd2cSJim Jagielski	if ( $installer::globals::officedirhostname ne "" ) { $programdir = $programdir . $installer::globals::officedirhostname . $installer::globals::separator; }
95*b1cdbd2cSJim Jagielski	$programdir = $programdir . "program";
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielski	my $from = cwd();
98*b1cdbd2cSJim Jagielski	chdir($programdir);
99*b1cdbd2cSJim Jagielski
100*b1cdbd2cSJim Jagielski	my $unopkgfile = $installer::globals::unopkgfile;
101*b1cdbd2cSJim Jagielski
102*b1cdbd2cSJim Jagielski	my $unopkgexists = 1;
103*b1cdbd2cSJim Jagielski	if (( $installer::globals::languagepack ) && ( ! -f $unopkgfile ))
104*b1cdbd2cSJim Jagielski	{
105*b1cdbd2cSJim Jagielski		$unopkgexists = 0;
106*b1cdbd2cSJim Jagielski		$infoline = "Language packs do not contain unopkg!\n";
107*b1cdbd2cSJim Jagielski		$installer::logger::Lang->print($infoline);
108*b1cdbd2cSJim Jagielski	}
109*b1cdbd2cSJim Jagielski
110*b1cdbd2cSJim Jagielski	if ( ! -f $unopkgfile )
111*b1cdbd2cSJim Jagielski	{
112*b1cdbd2cSJim Jagielski		$unopkgexists = 0;
113*b1cdbd2cSJim Jagielski		$infoline = "Info: File $unopkgfile does not exist! Extensions cannot be registered.\n";
114*b1cdbd2cSJim Jagielski		$installer::logger::Lang->print($infoline);
115*b1cdbd2cSJim Jagielski	}
116*b1cdbd2cSJim Jagielski
117*b1cdbd2cSJim Jagielski	if ( $unopkgexists )
118*b1cdbd2cSJim Jagielski	{
119*b1cdbd2cSJim Jagielski		my $currentdir = cwd();
120*b1cdbd2cSJim Jagielski		$installer::logger::Info->printf("... current dir: %s ...\n", $currentdir);
121*b1cdbd2cSJim Jagielski		$infoline = "Current dir: $currentdir\n";
122*b1cdbd2cSJim Jagielski		$installer::logger::Lang->print($infoline);
123*b1cdbd2cSJim Jagielski
124*b1cdbd2cSJim Jagielski		if ( ! -f $unopkgfile ) { installer::exiter::exit_program("ERROR: $unopkgfile not found!", "register_extensions"); }
125*b1cdbd2cSJim Jagielski
126*b1cdbd2cSJim Jagielski		my $systemcall = $unopkgfile . " sync --verbose" . " -env:UNO_JAVA_JFW_ENV_JREHOME=true 2\>\&1 |";
127*b1cdbd2cSJim Jagielski
128*b1cdbd2cSJim Jagielski		$installer::logger::Info->printf("... %s ...\n", $systemcall);
129*b1cdbd2cSJim Jagielski
130*b1cdbd2cSJim Jagielski		$infoline = "Systemcall: $systemcall\n";
131*b1cdbd2cSJim Jagielski		$installer::logger::Lang->print($infoline);
132*b1cdbd2cSJim Jagielski
133*b1cdbd2cSJim Jagielski		my @unopkgoutput = ();
134*b1cdbd2cSJim Jagielski
135*b1cdbd2cSJim Jagielski		open (UNOPKG, $systemcall);
136*b1cdbd2cSJim Jagielski		while (<UNOPKG>)
137*b1cdbd2cSJim Jagielski		{
138*b1cdbd2cSJim Jagielski			my $lastline = $_;
139*b1cdbd2cSJim Jagielski			push(@unopkgoutput, $lastline);
140*b1cdbd2cSJim Jagielski		}
141*b1cdbd2cSJim Jagielski		close (UNOPKG);
142*b1cdbd2cSJim Jagielski
143*b1cdbd2cSJim Jagielski		my $returnvalue = $?;	# $? contains the return value of the systemcall
144*b1cdbd2cSJim Jagielski
145*b1cdbd2cSJim Jagielski		if ($returnvalue)
146*b1cdbd2cSJim Jagielski		{
147*b1cdbd2cSJim Jagielski			# Writing content of @unopkgoutput only in the error case into the log file. Sometimes it
148*b1cdbd2cSJim Jagielski			# contains strings like "Error" even in the case of success. This causes a packaging error
149*b1cdbd2cSJim Jagielski			# when the log file is analyzed at the end, even if there is no real error.
150*b1cdbd2cSJim Jagielski			foreach my $line (@unopkgoutput)
151*b1cdbd2cSJim Jagielski            {
152*b1cdbd2cSJim Jagielski                $installer::logger::Lang->printf($line);
153*b1cdbd2cSJim Jagielski            }
154*b1cdbd2cSJim Jagielski
155*b1cdbd2cSJim Jagielski			$infoline = "ERROR: Could not execute \"$systemcall\"!\nExitcode: '$returnvalue'\n";
156*b1cdbd2cSJim Jagielski			$installer::logger::Lang->print($infoline);
157*b1cdbd2cSJim Jagielski			installer::exiter::exit_program("ERROR: $systemcall failed!", "register_extensions");
158*b1cdbd2cSJim Jagielski		}
159*b1cdbd2cSJim Jagielski		else
160*b1cdbd2cSJim Jagielski		{
161*b1cdbd2cSJim Jagielski			$infoline = "Success: Executed \"$systemcall\" successfully!\n";
162*b1cdbd2cSJim Jagielski			$installer::logger::Lang->print($infoline);
163*b1cdbd2cSJim Jagielski		}
164*b1cdbd2cSJim Jagielski	}
165*b1cdbd2cSJim Jagielski
166*b1cdbd2cSJim Jagielski	chdir($from);
167*b1cdbd2cSJim Jagielski}
168*b1cdbd2cSJim Jagielski
169*b1cdbd2cSJim Jagielski########################################################################
170*b1cdbd2cSJim Jagielski# Getting the translation file for the Mac Language Pack installer
171*b1cdbd2cSJim Jagielski########################################################################
172*b1cdbd2cSJim Jagielski
173*b1cdbd2cSJim Jagielskisub get_mac_translation_file
174*b1cdbd2cSJim Jagielski{
175*b1cdbd2cSJim Jagielski	my $translationfilename = $installer::globals::maclangpackfilename;
176*b1cdbd2cSJim Jagielski	if ( ! -f $translationfilename ) { installer::exiter::exit_program("ERROR: Could not find language file $translationfilename!", "get_mac_translation_file"); }
177*b1cdbd2cSJim Jagielski	my $translationfile = installer::files::read_file($translationfilename);
178*b1cdbd2cSJim Jagielski
179*b1cdbd2cSJim Jagielski	my $infoline = "Reading translation file: $translationfilename\n";
180*b1cdbd2cSJim Jagielski	$installer::logger::Lang->print($infoline);
181*b1cdbd2cSJim Jagielski
182*b1cdbd2cSJim Jagielski	return $translationfile;
183*b1cdbd2cSJim Jagielski}
184*b1cdbd2cSJim Jagielski
185*b1cdbd2cSJim Jagielski##################################################################
186*b1cdbd2cSJim Jagielski# Collecting all identifier from ulf file
187*b1cdbd2cSJim Jagielski##################################################################
188*b1cdbd2cSJim Jagielski
189*b1cdbd2cSJim Jagielskisub get_identifier
190*b1cdbd2cSJim Jagielski{
191*b1cdbd2cSJim Jagielski	my ( $translationfile ) = @_;
192*b1cdbd2cSJim Jagielski
193*b1cdbd2cSJim Jagielski	my @identifier = ();
194*b1cdbd2cSJim Jagielski
195*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$translationfile}; $i++ )
196*b1cdbd2cSJim Jagielski	{
197*b1cdbd2cSJim Jagielski		my $oneline = ${$translationfile}[$i];
198*b1cdbd2cSJim Jagielski
199*b1cdbd2cSJim Jagielski		if ( $oneline =~ /^\s*\[(.+)\]\s*$/ )
200*b1cdbd2cSJim Jagielski		{
201*b1cdbd2cSJim Jagielski			my $identifier = $1;
202*b1cdbd2cSJim Jagielski			push(@identifier, $identifier);
203*b1cdbd2cSJim Jagielski		}
204*b1cdbd2cSJim Jagielski	}
205*b1cdbd2cSJim Jagielski
206*b1cdbd2cSJim Jagielski	return \@identifier;
207*b1cdbd2cSJim Jagielski}
208*b1cdbd2cSJim Jagielski
209*b1cdbd2cSJim Jagielski##############################################################
210*b1cdbd2cSJim Jagielski# Returning the complete block in all languages
211*b1cdbd2cSJim Jagielski# for a specified string
212*b1cdbd2cSJim Jagielski##############################################################
213*b1cdbd2cSJim Jagielski
214*b1cdbd2cSJim Jagielskisub get_language_block_from_language_file
215*b1cdbd2cSJim Jagielski{
216*b1cdbd2cSJim Jagielski	my ($searchstring, $languagefile) = @_;
217*b1cdbd2cSJim Jagielski
218*b1cdbd2cSJim Jagielski	my @language_block = ();
219*b1cdbd2cSJim Jagielski
220*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$languagefile}; $i++ )
221*b1cdbd2cSJim Jagielski	{
222*b1cdbd2cSJim Jagielski		if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ )
223*b1cdbd2cSJim Jagielski		{
224*b1cdbd2cSJim Jagielski			my $counter = $i;
225*b1cdbd2cSJim Jagielski
226*b1cdbd2cSJim Jagielski			push(@language_block, ${$languagefile}[$counter]);
227*b1cdbd2cSJim Jagielski			$counter++;
228*b1cdbd2cSJim Jagielski
229*b1cdbd2cSJim Jagielski			while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ )))
230*b1cdbd2cSJim Jagielski			{
231*b1cdbd2cSJim Jagielski				push(@language_block, ${$languagefile}[$counter]);
232*b1cdbd2cSJim Jagielski				$counter++;
233*b1cdbd2cSJim Jagielski			}
234*b1cdbd2cSJim Jagielski
235*b1cdbd2cSJim Jagielski			last;
236*b1cdbd2cSJim Jagielski		}
237*b1cdbd2cSJim Jagielski	}
238*b1cdbd2cSJim Jagielski
239*b1cdbd2cSJim Jagielski	return \@language_block;
240*b1cdbd2cSJim Jagielski}
241*b1cdbd2cSJim Jagielski
242*b1cdbd2cSJim Jagielski##############################################################
243*b1cdbd2cSJim Jagielski# Returning a specific language string from the block
244*b1cdbd2cSJim Jagielski# of all translations
245*b1cdbd2cSJim Jagielski##############################################################
246*b1cdbd2cSJim Jagielski
247*b1cdbd2cSJim Jagielskisub get_language_string_from_language_block
248*b1cdbd2cSJim Jagielski{
249*b1cdbd2cSJim Jagielski	my ($language_block, $language) = @_;
250*b1cdbd2cSJim Jagielski
251*b1cdbd2cSJim Jagielski	my $newstring = "";
252*b1cdbd2cSJim Jagielski
253*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$language_block}; $i++ )
254*b1cdbd2cSJim Jagielski	{
255*b1cdbd2cSJim Jagielski		if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
256*b1cdbd2cSJim Jagielski		{
257*b1cdbd2cSJim Jagielski			$newstring = $1;
258*b1cdbd2cSJim Jagielski			last;
259*b1cdbd2cSJim Jagielski		}
260*b1cdbd2cSJim Jagielski	}
261*b1cdbd2cSJim Jagielski
262*b1cdbd2cSJim Jagielski	if ( $newstring eq "" )
263*b1cdbd2cSJim Jagielski	{
264*b1cdbd2cSJim Jagielski		$language = "en-US"; 	# defaulting to english
265*b1cdbd2cSJim Jagielski
266*b1cdbd2cSJim Jagielski		for ( my $i = 0; $i <= $#{$language_block}; $i++ )
267*b1cdbd2cSJim Jagielski		{
268*b1cdbd2cSJim Jagielski			if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
269*b1cdbd2cSJim Jagielski			{
270*b1cdbd2cSJim Jagielski				$newstring = $1;
271*b1cdbd2cSJim Jagielski				last;
272*b1cdbd2cSJim Jagielski			}
273*b1cdbd2cSJim Jagielski		}
274*b1cdbd2cSJim Jagielski	}
275*b1cdbd2cSJim Jagielski
276*b1cdbd2cSJim Jagielski	return $newstring;
277*b1cdbd2cSJim Jagielski}
278*b1cdbd2cSJim Jagielski
279*b1cdbd2cSJim Jagielski########################################################################
280*b1cdbd2cSJim Jagielski# Localizing the script for the Mac Language Pack installer
281*b1cdbd2cSJim Jagielski########################################################################
282*b1cdbd2cSJim Jagielski
283*b1cdbd2cSJim Jagielskisub localize_scriptfile
284*b1cdbd2cSJim Jagielski{
285*b1cdbd2cSJim Jagielski	my ($scriptfile, $translationfile, $languagestringref) = @_;
286*b1cdbd2cSJim Jagielski
287*b1cdbd2cSJim Jagielski	# my $translationfile = get_mac_translation_file();
288*b1cdbd2cSJim Jagielski
289*b1cdbd2cSJim Jagielski	my $onelanguage = $$languagestringref;
290*b1cdbd2cSJim Jagielski	if ( $onelanguage =~ /^\s*(.*?)_/ ) { $onelanguage = $1; }
291*b1cdbd2cSJim Jagielski
292*b1cdbd2cSJim Jagielski	# Analyzing the ulf file, collecting all Identifier
293*b1cdbd2cSJim Jagielski	my $allidentifier = get_identifier($translationfile);
294*b1cdbd2cSJim Jagielski
295*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$allidentifier}; $i++ )
296*b1cdbd2cSJim Jagielski	{
297*b1cdbd2cSJim Jagielski		my $identifier = ${$allidentifier}[$i];
298*b1cdbd2cSJim Jagielski		my $language_block = get_language_block_from_language_file($identifier, $translationfile);
299*b1cdbd2cSJim Jagielski		my $newstring = get_language_string_from_language_block($language_block, $onelanguage);
300*b1cdbd2cSJim Jagielski
301*b1cdbd2cSJim Jagielski		# removing mask
302*b1cdbd2cSJim Jagielski		$newstring =~ s/\\\'/\'/g;
303*b1cdbd2cSJim Jagielski
304*b1cdbd2cSJim Jagielski		replace_one_variable_in_shellscript($scriptfile, $newstring, $identifier);
305*b1cdbd2cSJim Jagielski	}
306*b1cdbd2cSJim Jagielski}
307*b1cdbd2cSJim Jagielski
308*b1cdbd2cSJim Jagielski#################################################################################
309*b1cdbd2cSJim Jagielski# Replacing one variable in Mac shell script
310*b1cdbd2cSJim Jagielski#################################################################################
311*b1cdbd2cSJim Jagielski
312*b1cdbd2cSJim Jagielskisub replace_one_variable_in_shellscript
313*b1cdbd2cSJim Jagielski{
314*b1cdbd2cSJim Jagielski	my ($scriptfile, $variable, $searchstring) = @_;
315*b1cdbd2cSJim Jagielski
316*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
317*b1cdbd2cSJim Jagielski	{
318*b1cdbd2cSJim Jagielski		${$scriptfile}[$i] =~ s/\[$searchstring\]/$variable/g;
319*b1cdbd2cSJim Jagielski	}
320*b1cdbd2cSJim Jagielski}
321*b1cdbd2cSJim Jagielski
322*b1cdbd2cSJim Jagielski#############################################
323*b1cdbd2cSJim Jagielski# Replacing variables in Mac shell script
324*b1cdbd2cSJim Jagielski#############################################
325*b1cdbd2cSJim Jagielski
326*b1cdbd2cSJim Jagielskisub replace_variables_in_scriptfile
327*b1cdbd2cSJim Jagielski{
328*b1cdbd2cSJim Jagielski	my ($scriptfile, $volume_name, $volume_name_app, $allvariables) = @_;
329*b1cdbd2cSJim Jagielski
330*b1cdbd2cSJim Jagielski	replace_one_variable_in_shellscript($scriptfile, $volume_name, "FULLPRODUCTNAME" );
331*b1cdbd2cSJim Jagielski	replace_one_variable_in_shellscript($scriptfile, $volume_name_app, "FULLAPPPRODUCTNAME" );
332*b1cdbd2cSJim Jagielski	replace_one_variable_in_shellscript($scriptfile, $allvariables->{'PRODUCTNAME'}, "PRODUCTNAME" );
333*b1cdbd2cSJim Jagielski	replace_one_variable_in_shellscript($scriptfile, $allvariables->{'PRODUCTVERSION'}, "PRODUCTVERSION" );
334*b1cdbd2cSJim Jagielski
335*b1cdbd2cSJim Jagielski	my $scriptname = lc($allvariables->{'PRODUCTNAME'}) . "\.script";
336*b1cdbd2cSJim Jagielski	if ( $allvariables->{'PRODUCTNAME'} eq "OpenOffice" )
337*b1cdbd2cSJim Jagielski    {
338*b1cdbd2cSJim Jagielski        $scriptname = "org.openoffice.script";
339*b1cdbd2cSJim Jagielski    }
340*b1cdbd2cSJim Jagielski
341*b1cdbd2cSJim Jagielski	replace_one_variable_in_shellscript($scriptfile, $scriptname, "SEARCHSCRIPTNAME" );
342*b1cdbd2cSJim Jagielski}
343*b1cdbd2cSJim Jagielski
344*b1cdbd2cSJim Jagielski#############################################
345*b1cdbd2cSJim Jagielski# Creating the "simple" package.
346*b1cdbd2cSJim Jagielski# "zip" for Windows
347*b1cdbd2cSJim Jagielski# "tar.gz" for all other platforms
348*b1cdbd2cSJim Jagielski# additionally "dmg" on Mac OS X
349*b1cdbd2cSJim Jagielski#############################################
350*b1cdbd2cSJim Jagielski
351*b1cdbd2cSJim Jagielskisub create_package
352*b1cdbd2cSJim Jagielski{
353*b1cdbd2cSJim Jagielski	my ( $installdir, $archivedir, $packagename, $allvariables, $includepatharrayref, $languagestringref, $format ) = @_;
354*b1cdbd2cSJim Jagielski
355*b1cdbd2cSJim Jagielski    $installer::logger::Info->printf("... creating %s file ...\n", $installer::globals::packageformat);
356*b1cdbd2cSJim Jagielski    installer::logger::include_header_into_logfile("Creating $installer::globals::packageformat file:");
357*b1cdbd2cSJim Jagielski
358*b1cdbd2cSJim Jagielski	# moving dir into temporary directory
359*b1cdbd2cSJim Jagielski	my $pid = $$; # process id
360*b1cdbd2cSJim Jagielski	my $tempdir = $installdir . "_temp" . "." . $pid;
361*b1cdbd2cSJim Jagielski	my $systemcall = "";
362*b1cdbd2cSJim Jagielski	my $from = "";
363*b1cdbd2cSJim Jagielski	my $makesystemcall = 1;
364*b1cdbd2cSJim Jagielski	my $return_to_start = 0;
365*b1cdbd2cSJim Jagielski	installer::systemactions::rename_directory($installdir, $tempdir);
366*b1cdbd2cSJim Jagielski
367*b1cdbd2cSJim Jagielski	# creating new directory with original name
368*b1cdbd2cSJim Jagielski	installer::systemactions::create_directory($archivedir);
369*b1cdbd2cSJim Jagielski
370*b1cdbd2cSJim Jagielski	my $archive = $archivedir . $installer::globals::separator . $packagename . $format;
371*b1cdbd2cSJim Jagielski
372*b1cdbd2cSJim Jagielski	if ( $archive =~ /zip$/ )
373*b1cdbd2cSJim Jagielski	{
374*b1cdbd2cSJim Jagielski		$from = cwd();
375*b1cdbd2cSJim Jagielski		$return_to_start = 1;
376*b1cdbd2cSJim Jagielski		chdir($tempdir);
377*b1cdbd2cSJim Jagielski		if ( $^O =~ /os2/i )
378*b1cdbd2cSJim Jagielski		{
379*b1cdbd2cSJim Jagielski			my $zip = Cwd::realpath($archive);
380*b1cdbd2cSJim Jagielski			$systemcall = "$installer::globals::zippath -qr $zip .";
381*b1cdbd2cSJim Jagielski		}
382*b1cdbd2cSJim Jagielski	 	else
383*b1cdbd2cSJim Jagielski		{
384*b1cdbd2cSJim Jagielski			$systemcall = "$installer::globals::zippath -qr $archive .";
385*b1cdbd2cSJim Jagielski		}
386*b1cdbd2cSJim Jagielski
387*b1cdbd2cSJim Jagielski		# Using Archive::Zip fails because of very long path names below "share/uno_packages/cache"
388*b1cdbd2cSJim Jagielski		# my $packzip = Archive::Zip->new();
389*b1cdbd2cSJim Jagielski		# $packzip->addTree(".");	# after changing into $tempdir
390*b1cdbd2cSJim Jagielski		# $packzip->writeToFileNamed($archive);
391*b1cdbd2cSJim Jagielski		# $makesystemcall = 0;
392*b1cdbd2cSJim Jagielski	}
393*b1cdbd2cSJim Jagielski 	elsif ( $archive =~ /dmg$/ )
394*b1cdbd2cSJim Jagielski	{
395*b1cdbd2cSJim Jagielski		my $folder = (( -l "$tempdir/$packagename/Applications" ) or ( -l "$tempdir/$packagename/opt" )) ? $packagename : "\.";
396*b1cdbd2cSJim Jagielski
397*b1cdbd2cSJim Jagielski		if ( $allvariables->{'PACK_INSTALLED'} ) {
398*b1cdbd2cSJim Jagielski		    $folder = $packagename;
399*b1cdbd2cSJim Jagielski		}
400*b1cdbd2cSJim Jagielski
401*b1cdbd2cSJim Jagielski		# my $volume_name = $allvariables->{'PRODUCTNAME'} . ' ' . $allvariables->{'PRODUCTVERSION'}; # Adding PRODUCTVERSION makes this difficult to maintain!
402*b1cdbd2cSJim Jagielski		my $volume_name = $allvariables->{'PRODUCTNAME'};
403*b1cdbd2cSJim Jagielski		my $volume_name_classic = $allvariables->{'PRODUCTNAME'} . ' ' . $allvariables->{'PRODUCTVERSION'};
404*b1cdbd2cSJim Jagielski		my $volume_name_classic_app = $volume_name;  # "app" should not contain version number
405*b1cdbd2cSJim Jagielski		# $volume_name = $volume_name . ' ' . $allvariables->{'PRODUCTEXTENSION'} if $allvariables->{'PRODUCTEXTENSION'}; # Adding PRODUCTEXTENSION makes this difficult to maintain!
406*b1cdbd2cSJim Jagielski		$volume_name_classic = $volume_name_classic . ' ' . $allvariables->{'PRODUCTEXTENSION'} if $allvariables->{'PRODUCTEXTENSION'};
407*b1cdbd2cSJim Jagielski		$volume_name_classic_app = $volume_name_classic_app . ' ' . $allvariables->{'PRODUCTEXTENSION'} if $allvariables->{'PRODUCTEXTENSION'};
408*b1cdbd2cSJim Jagielski		if ( $allvariables->{'DMG_VOLUMEEXTENSION'} ) {
409*b1cdbd2cSJim Jagielski		    $volume_name = $volume_name . ' ' . $allvariables->{'DMG_VOLUMEEXTENSION'};
410*b1cdbd2cSJim Jagielski		    $volume_name_classic = $volume_name_classic . ' ' . $allvariables->{'DMG_VOLUMEEXTENSION'};
411*b1cdbd2cSJim Jagielski		    $volume_name_classic_app = $volume_name_classic_app . ' ' . $allvariables->{'DMG_VOLUMEEXTENSION'};
412*b1cdbd2cSJim Jagielski		}
413*b1cdbd2cSJim Jagielski
414*b1cdbd2cSJim Jagielski		my $sla = 'sla.r';
415*b1cdbd2cSJim Jagielski		my $ref = "";
416*b1cdbd2cSJim Jagielski
417*b1cdbd2cSJim Jagielski		if ( ! $allvariables->{'HIDELICENSEDIALOG'} )
418*b1cdbd2cSJim Jagielski		{
419*b1cdbd2cSJim Jagielski			installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$sla, $includepatharrayref, 0);
420*b1cdbd2cSJim Jagielski		}
421*b1cdbd2cSJim Jagielski
422*b1cdbd2cSJim Jagielski		my $localtempdir = $tempdir;
423*b1cdbd2cSJim Jagielski
424*b1cdbd2cSJim Jagielski		if (( $installer::globals::languagepack ) || ( $installer::globals::patch ))
425*b1cdbd2cSJim Jagielski		{
426*b1cdbd2cSJim Jagielski			$localtempdir = "$tempdir/$packagename";
427*b1cdbd2cSJim Jagielski			if ( $installer::globals::languagepack )
428*b1cdbd2cSJim Jagielski			{
429*b1cdbd2cSJim Jagielski				$volume_name = "$volume_name Language Pack";
430*b1cdbd2cSJim Jagielski				$volume_name_classic = "$volume_name_classic Language Pack";
431*b1cdbd2cSJim Jagielski				$volume_name_classic_app = "$volume_name_classic_app Language Pack";
432*b1cdbd2cSJim Jagielski			}
433*b1cdbd2cSJim Jagielski			if ( $installer::globals::patch )
434*b1cdbd2cSJim Jagielski			{
435*b1cdbd2cSJim Jagielski				$volume_name = "$volume_name Patch";
436*b1cdbd2cSJim Jagielski				$volume_name_classic = "$volume_name_classic Patch";
437*b1cdbd2cSJim Jagielski				$volume_name_classic_app = "$volume_name_classic_app Patch";
438*b1cdbd2cSJim Jagielski			}
439*b1cdbd2cSJim Jagielski
440*b1cdbd2cSJim Jagielski			# Create tar ball named tarball.tar.bz2
441*b1cdbd2cSJim Jagielski			# my $appfolder = $localtempdir . "/" . $volume_name . "\.app";
442*b1cdbd2cSJim Jagielski			my $appfolder = $localtempdir . "/" . $volume_name_classic_app . "\.app";
443*b1cdbd2cSJim Jagielski			my $contentsfolder = $appfolder . "/Contents";
444*b1cdbd2cSJim Jagielski			my $tarballname = "tarball.tar.bz2";
445*b1cdbd2cSJim Jagielski
446*b1cdbd2cSJim Jagielski			my $localfrom = cwd();
447*b1cdbd2cSJim Jagielski			chdir $appfolder;
448*b1cdbd2cSJim Jagielski
449*b1cdbd2cSJim Jagielski			$systemcall = "tar -cjf $tarballname Contents/";
450*b1cdbd2cSJim Jagielski
451*b1cdbd2cSJim Jagielski			$installer::logger::Info->printf("... %s ...\n", $systemcall);
452*b1cdbd2cSJim Jagielski			my $localreturnvalue = system($systemcall);
453*b1cdbd2cSJim Jagielski			$infoline = "Systemcall: $systemcall\n";
454*b1cdbd2cSJim Jagielski			$installer::logger::Lang->print($infoline);
455*b1cdbd2cSJim Jagielski
456*b1cdbd2cSJim Jagielski			if ($localreturnvalue)
457*b1cdbd2cSJim Jagielski			{
458*b1cdbd2cSJim Jagielski				$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
459*b1cdbd2cSJim Jagielski				$installer::logger::Lang->print($infoline);
460*b1cdbd2cSJim Jagielski			}
461*b1cdbd2cSJim Jagielski			else
462*b1cdbd2cSJim Jagielski			{
463*b1cdbd2cSJim Jagielski				$infoline = "Success: Executed \"$systemcall\" successfully!\n";
464*b1cdbd2cSJim Jagielski				$installer::logger::Lang->print($infoline);
465*b1cdbd2cSJim Jagielski			}
466*b1cdbd2cSJim Jagielski
467*b1cdbd2cSJim Jagielski			my $sourcefile = $appfolder . "/" . $tarballname;
468*b1cdbd2cSJim Jagielski			my $destfile = $contentsfolder . "/" . $tarballname;
469*b1cdbd2cSJim Jagielski
470*b1cdbd2cSJim Jagielski			installer::systemactions::remove_complete_directory($contentsfolder);
471*b1cdbd2cSJim Jagielski			installer::systemactions::create_directory($contentsfolder);
472*b1cdbd2cSJim Jagielski
473*b1cdbd2cSJim Jagielski			installer::systemactions::copy_one_file($sourcefile, $destfile);
474*b1cdbd2cSJim Jagielski			unlink($sourcefile);
475*b1cdbd2cSJim Jagielski
476*b1cdbd2cSJim Jagielski			# Copy two files into installation set next to the tar ball
477*b1cdbd2cSJim Jagielski			# 1. "osx_install.applescript"
478*b1cdbd2cSJim Jagielski			# 2 "OpenOffice.org Languagepack"
479*b1cdbd2cSJim Jagielski
480*b1cdbd2cSJim Jagielski			my $scriptrealfilename = "osx_install.applescript";
481*b1cdbd2cSJim Jagielski			my $scriptfilename = "";
482*b1cdbd2cSJim Jagielski			if ( $installer::globals::languagepack ) { $scriptfilename = "osx_install_languagepack.applescript"; }
483*b1cdbd2cSJim Jagielski			if ( $installer::globals::patch ) { $scriptfilename = "osx_install_patch.applescript"; }
484*b1cdbd2cSJim Jagielski			my $scripthelpersolverfilename = "mac_install.script";
485*b1cdbd2cSJim Jagielski			# my $scripthelperrealfilename = $volume_name;
486*b1cdbd2cSJim Jagielski			my $scripthelperrealfilename = $volume_name_classic_app;
487*b1cdbd2cSJim Jagielski			my $translationfilename = $installer::globals::macinstallfilename;
488*b1cdbd2cSJim Jagielski
489*b1cdbd2cSJim Jagielski			# Finding both files in solver
490*b1cdbd2cSJim Jagielski
491*b1cdbd2cSJim Jagielski			my $scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$scriptfilename, $includepatharrayref, 0);
492*b1cdbd2cSJim Jagielski			if ($$scriptref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script $scriptfilename!", "create_package"); }
493*b1cdbd2cSJim Jagielski			my $scripthelperref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$scripthelpersolverfilename, $includepatharrayref, 0);
494*b1cdbd2cSJim Jagielski			if ($$scripthelperref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script $scripthelpersolverfilename!", "create_package"); }
495*b1cdbd2cSJim Jagielski			my $translationfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$translationfilename, $includepatharrayref, 0);
496*b1cdbd2cSJim Jagielski			if ($$translationfileref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script translation file $translationfilename!", "create_package"); }
497*b1cdbd2cSJim Jagielski
498*b1cdbd2cSJim Jagielski			$scriptfilename = $contentsfolder . "/" . $scriptrealfilename;
499*b1cdbd2cSJim Jagielski			$scripthelperrealfilename = $contentsfolder . "/" . $scripthelperrealfilename;
500*b1cdbd2cSJim Jagielski
501*b1cdbd2cSJim Jagielski			installer::systemactions::copy_one_file($$scriptref, $scriptfilename);
502*b1cdbd2cSJim Jagielski			installer::systemactions::copy_one_file($$scripthelperref, $scripthelperrealfilename);
503*b1cdbd2cSJim Jagielski
504*b1cdbd2cSJim Jagielski			# Replacing variables in script $scriptfilename
505*b1cdbd2cSJim Jagielski			# Localizing script $scriptfilename
506*b1cdbd2cSJim Jagielski			my $scriptfilecontent = installer::files::read_file($scriptfilename);
507*b1cdbd2cSJim Jagielski			my $translationfilecontent = installer::files::read_file($$translationfileref);
508*b1cdbd2cSJim Jagielski			localize_scriptfile($scriptfilecontent, $translationfilecontent, $languagestringref);
509*b1cdbd2cSJim Jagielski			# replace_variables_in_scriptfile($scriptfilecontent, $volume_name, $allvariables);
510*b1cdbd2cSJim Jagielski			replace_variables_in_scriptfile($scriptfilecontent, $volume_name_classic, $volume_name_classic_app, $allvariables);
511*b1cdbd2cSJim Jagielski			installer::files::save_file($scriptfilename, $scriptfilecontent);
512*b1cdbd2cSJim Jagielski
513*b1cdbd2cSJim Jagielski			$systemcall = "chmod 775 " . "\"" . $scriptfilename . "\"";
514*b1cdbd2cSJim Jagielski			system($systemcall);
515*b1cdbd2cSJim Jagielski			$systemcall = "chmod 775 " . "\"" . $scripthelperrealfilename . "\"";
516*b1cdbd2cSJim Jagielski			system($systemcall);
517*b1cdbd2cSJim Jagielski
518*b1cdbd2cSJim Jagielski			# Copy also Info.plist and icon file
519*b1cdbd2cSJim Jagielski			# Finding both files in solver
520*b1cdbd2cSJim Jagielski			my $iconfile = "ooo3_installer.icns";
521*b1cdbd2cSJim Jagielski			my $iconfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$iconfile, $includepatharrayref, 0);
522*b1cdbd2cSJim Jagielski			if ($$iconfileref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script icon file $iconfile!", "create_package"); }
523*b1cdbd2cSJim Jagielski			my $subdir = $contentsfolder . "/" . "Resources";
524*b1cdbd2cSJim Jagielski			if ( ! -d $subdir ) { installer::systemactions::create_directory($subdir); }
525*b1cdbd2cSJim Jagielski			$destfile = $subdir . "/" . $iconfile;
526*b1cdbd2cSJim Jagielski			installer::systemactions::copy_one_file($$iconfileref, $destfile);
527*b1cdbd2cSJim Jagielski
528*b1cdbd2cSJim Jagielski			my $infoplistfile = "Info.plist.langpack";
529*b1cdbd2cSJim Jagielski			my $installname = "Info.plist";
530*b1cdbd2cSJim Jagielski			my $infoplistfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$infoplistfile, $includepatharrayref, 0);
531*b1cdbd2cSJim Jagielski			if ($$infoplistfileref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script Info.plist: $infoplistfile!", "create_package"); }
532*b1cdbd2cSJim Jagielski			$destfile = $contentsfolder . "/" . $installname;
533*b1cdbd2cSJim Jagielski			installer::systemactions::copy_one_file($$infoplistfileref, $destfile);
534*b1cdbd2cSJim Jagielski
535*b1cdbd2cSJim Jagielski			# Replacing variables in Info.plist
536*b1cdbd2cSJim Jagielski			$scriptfilecontent = installer::files::read_file($destfile);
537*b1cdbd2cSJim Jagielski			# replace_one_variable_in_shellscript($scriptfilecontent, $volume_name, "FULLPRODUCTNAME" );
538*b1cdbd2cSJim Jagielski			replace_one_variable_in_shellscript($scriptfilecontent, $volume_name_classic_app, "FULLAPPPRODUCTNAME" ); # OpenOffice.org Language Pack
539*b1cdbd2cSJim Jagielski			installer::files::save_file($destfile, $scriptfilecontent);
540*b1cdbd2cSJim Jagielski
541*b1cdbd2cSJim Jagielski			chdir $localfrom;
542*b1cdbd2cSJim Jagielski		}
543*b1cdbd2cSJim Jagielski
544*b1cdbd2cSJim Jagielski		$systemcall = "cd $localtempdir && hdiutil makehybrid -hfs -hfs-openfolder $folder $folder -hfs-volume-name \"$volume_name\" -ov -o $installdir/tmp && hdiutil convert -ov -format UDZO $installdir/tmp.dmg -o $archive && ";
545*b1cdbd2cSJim Jagielski        if (( $ref ne "" ) && ( $$ref ne "" )) {
546*b1cdbd2cSJim Jagielski			$systemcall .= "hdiutil unflatten $archive && Rez -a $$ref -o $archive && hdiutil flatten $archive &&";
547*b1cdbd2cSJim Jagielski		}
548*b1cdbd2cSJim Jagielski		$systemcall .= "rm -f $installdir/tmp.dmg";
549*b1cdbd2cSJim Jagielski	}
550*b1cdbd2cSJim Jagielski	else
551*b1cdbd2cSJim Jagielski	{
552*b1cdbd2cSJim Jagielski		# getting the path of the getuid.so (only required for Solaris and Linux)
553*b1cdbd2cSJim Jagielski		my $getuidlibrary = "";
554*b1cdbd2cSJim Jagielski		my $ldpreloadstring = "";
555*b1cdbd2cSJim Jagielski		if (( $installer::globals::issolarisbuild ) || ( $installer::globals::islinuxbuild ))
556*b1cdbd2cSJim Jagielski		{
557*b1cdbd2cSJim Jagielski			$getuidlibrary = installer::download::get_path_for_library($includepatharrayref);
558*b1cdbd2cSJim Jagielski			if ( $getuidlibrary ne "" ) { $ldpreloadstring = "LD_PRELOAD=" . $getuidlibrary; }
559*b1cdbd2cSJim Jagielski		}
560*b1cdbd2cSJim Jagielski
561*b1cdbd2cSJim Jagielski		$systemcall = "cd $tempdir; $ldpreloadstring tar -cf - . | gzip > $archive";
562*b1cdbd2cSJim Jagielski	}
563*b1cdbd2cSJim Jagielski
564*b1cdbd2cSJim Jagielski	if ( $makesystemcall )
565*b1cdbd2cSJim Jagielski	{
566*b1cdbd2cSJim Jagielski		$installer::logger::Info->printf("... %s ...\n", $systemcall);
567*b1cdbd2cSJim Jagielski		my $returnvalue = system($systemcall);
568*b1cdbd2cSJim Jagielski		my $infoline = "Systemcall: $systemcall\n";
569*b1cdbd2cSJim Jagielski		$installer::logger::Lang->print($infoline);
570*b1cdbd2cSJim Jagielski
571*b1cdbd2cSJim Jagielski		if ($returnvalue)
572*b1cdbd2cSJim Jagielski		{
573*b1cdbd2cSJim Jagielski			$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
574*b1cdbd2cSJim Jagielski			$installer::logger::Lang->print($infoline);
575*b1cdbd2cSJim Jagielski		}
576*b1cdbd2cSJim Jagielski		else
577*b1cdbd2cSJim Jagielski		{
578*b1cdbd2cSJim Jagielski			$infoline = "Success: Executed \"$systemcall\" successfully!\n";
579*b1cdbd2cSJim Jagielski			$installer::logger::Lang->print($infoline);
580*b1cdbd2cSJim Jagielski		}
581*b1cdbd2cSJim Jagielski	}
582*b1cdbd2cSJim Jagielski
583*b1cdbd2cSJim Jagielski	if ( $return_to_start ) { chdir($from); }
584*b1cdbd2cSJim Jagielski
585*b1cdbd2cSJim Jagielski	$installer::logger::Info->printf("... removing %s ...\n", $tempdir);
586*b1cdbd2cSJim Jagielski	installer::systemactions::remove_complete_directory($tempdir);
587*b1cdbd2cSJim Jagielski}
588*b1cdbd2cSJim Jagielski
589*b1cdbd2cSJim Jagielski####################################################
590*b1cdbd2cSJim Jagielski# Main method for creating the simple package
591*b1cdbd2cSJim Jagielski# installation sets
592*b1cdbd2cSJim Jagielski####################################################
593*b1cdbd2cSJim Jagielski
594*b1cdbd2cSJim Jagielskisub create_simple_package
595*b1cdbd2cSJim Jagielski{
596*b1cdbd2cSJim Jagielski	my ( $filesref, $dirsref, $scpactionsref, $linksref, $unixlinksref, $loggingdir, $languagestringref, $shipinstalldir, $allsettingsarrayref, $allvariables, $includepatharrayref ) = @_;
597*b1cdbd2cSJim Jagielski
598*b1cdbd2cSJim Jagielski	# Creating directories
599*b1cdbd2cSJim Jagielski
600*b1cdbd2cSJim Jagielski	my $current_install_number = "";
601*b1cdbd2cSJim Jagielski	my $infoline = "";
602*b1cdbd2cSJim Jagielski
603*b1cdbd2cSJim Jagielski	$installer::logger::Info->print( "... creating installation directory ...\n" );
604*b1cdbd2cSJim Jagielski	installer::logger::include_header_into_logfile("Creating installation directory");
605*b1cdbd2cSJim Jagielski
606*b1cdbd2cSJim Jagielski	$installer::globals::csp_installdir = installer::worker::create_installation_directory($shipinstalldir, $languagestringref, \$current_install_number);
607*b1cdbd2cSJim Jagielski	$installer::globals::csp_installlogdir = installer::systemactions::create_directory_next_to_directory($installer::globals::csp_installdir, "log");
608*b1cdbd2cSJim Jagielski
609*b1cdbd2cSJim Jagielski	my $installdir = $installer::globals::csp_installdir;
610*b1cdbd2cSJim Jagielski	my $installlogdir = $installer::globals::csp_installlogdir;
611*b1cdbd2cSJim Jagielski
612*b1cdbd2cSJim Jagielski	# Setting package name (similar to the download name)
613*b1cdbd2cSJim Jagielski	my $packagename = "";
614*b1cdbd2cSJim Jagielski
615*b1cdbd2cSJim Jagielski	if ( $installer::globals::packageformat eq "archive"  ||
616*b1cdbd2cSJim Jagielski		$installer::globals::packageformat eq "dmg" )
617*b1cdbd2cSJim Jagielski	{
618*b1cdbd2cSJim Jagielski		$installer::globals::csp_languagestring = $$languagestringref;
619*b1cdbd2cSJim Jagielski
620*b1cdbd2cSJim Jagielski		my $locallanguage = $installer::globals::csp_languagestring;
621*b1cdbd2cSJim Jagielski
622*b1cdbd2cSJim Jagielski		if ( $allvariables->{'AOODOWNLOADNAME'} )
623*b1cdbd2cSJim Jagielski		{
624*b1cdbd2cSJim Jagielski			$packagename = installer::download::set_download_filename(\$locallanguage, $allvariables);
625*b1cdbd2cSJim Jagielski		}
626*b1cdbd2cSJim Jagielski		else
627*b1cdbd2cSJim Jagielski		{
628*b1cdbd2cSJim Jagielski			$downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "downloadname");
629*b1cdbd2cSJim Jagielski			if ( $installer::globals::languagepack ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "langpackdownloadname"); }
630*b1cdbd2cSJim Jagielski			if ( $installer::globals::patch ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "patchdownloadname"); }
631*b1cdbd2cSJim Jagielski			$packagename = installer::download::resolve_variables_in_downloadname($allvariables, $$downloadname, \$locallanguage);
632*b1cdbd2cSJim Jagielski		}
633*b1cdbd2cSJim Jagielski	}
634*b1cdbd2cSJim Jagielski
635*b1cdbd2cSJim Jagielski    # Work around Windows problems with long pathnames (see issue 50885) by
636*b1cdbd2cSJim Jagielski    # putting the to-be-archived installation tree into the temp directory
637*b1cdbd2cSJim Jagielski    # instead of the module output tree (unless LOCALINSTALLDIR dictates
638*b1cdbd2cSJim Jagielski    # otherwise, anyway); can be removed once issue 50885 is fixed:
639*b1cdbd2cSJim Jagielski    my $tempinstalldir = $installdir;
640*b1cdbd2cSJim Jagielski    if ( $installer::globals::iswindowsbuild &&
641*b1cdbd2cSJim Jagielski         $installer::globals::packageformat eq "archive" &&
642*b1cdbd2cSJim Jagielski         !$installer::globals::localinstalldirset )
643*b1cdbd2cSJim Jagielski    {
644*b1cdbd2cSJim Jagielski        $tempinstalldir = File::Temp::tempdir;
645*b1cdbd2cSJim Jagielski    }
646*b1cdbd2cSJim Jagielski
647*b1cdbd2cSJim Jagielski	# Creating subfolder in installdir, which shall become the root of package or zip file
648*b1cdbd2cSJim Jagielski	my $subfolderdir = "";
649*b1cdbd2cSJim Jagielski	if ( $packagename ne "" ) { $subfolderdir = $tempinstalldir . $installer::globals::separator . $packagename; }
650*b1cdbd2cSJim Jagielski	else { $subfolderdir = $tempinstalldir; }
651*b1cdbd2cSJim Jagielski
652*b1cdbd2cSJim Jagielski	if ( ! -d $subfolderdir ) { installer::systemactions::create_directory($subfolderdir); }
653*b1cdbd2cSJim Jagielski
654*b1cdbd2cSJim Jagielski	# Create directories, copy files and ScpActions
655*b1cdbd2cSJim Jagielski
656*b1cdbd2cSJim Jagielski	$installer::logger::Info->print("... creating directories ...\n");
657*b1cdbd2cSJim Jagielski	installer::logger::include_header_into_logfile("Creating directories:");
658*b1cdbd2cSJim Jagielski
659*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
660*b1cdbd2cSJim Jagielski	{
661*b1cdbd2cSJim Jagielski		my $onedir = ${$dirsref}[$i];
662*b1cdbd2cSJim Jagielski
663*b1cdbd2cSJim Jagielski		if ( $onedir->{'HostName'} )
664*b1cdbd2cSJim Jagielski		{
665*b1cdbd2cSJim Jagielski			my $destdir = $subfolderdir . $installer::globals::separator . $onedir->{'HostName'};
666*b1cdbd2cSJim Jagielski
667*b1cdbd2cSJim Jagielski			if ( ! -d $destdir )
668*b1cdbd2cSJim Jagielski			{
669*b1cdbd2cSJim Jagielski				if ( $^O =~ /cygwin/i || $^O =~ /os2/i ) # Cygwin performance check
670*b1cdbd2cSJim Jagielski				{
671*b1cdbd2cSJim Jagielski                    $installer::logger::Lang->printf("Try to create directory %s\n", $destdir);
672*b1cdbd2cSJim Jagielski					# Directories in $dirsref are sorted and all parents were added -> "mkdir" works without parent creation!
673*b1cdbd2cSJim Jagielski					if ( ! ( -d $destdir )) { mkdir($destdir, 0775); }
674*b1cdbd2cSJim Jagielski				}
675*b1cdbd2cSJim Jagielski				else
676*b1cdbd2cSJim Jagielski				{
677*b1cdbd2cSJim Jagielski					installer::systemactions::create_directory_structure($destdir);
678*b1cdbd2cSJim Jagielski				}
679*b1cdbd2cSJim Jagielski			}
680*b1cdbd2cSJim Jagielski		}
681*b1cdbd2cSJim Jagielski	}
682*b1cdbd2cSJim Jagielski
683*b1cdbd2cSJim Jagielski	# stripping files ?!
684*b1cdbd2cSJim Jagielski	if (( $installer::globals::strip ) && ( ! $installer::globals::iswindowsbuild ) && ( ! $installer::globals::isos2 )) { installer::strip::strip_libraries($filesref, $languagestringref); }
685*b1cdbd2cSJim Jagielski
686*b1cdbd2cSJim Jagielski	# copy Files
687*b1cdbd2cSJim Jagielski	$installer::logger::Info->print("... copying files ...\n");
688*b1cdbd2cSJim Jagielski	installer::logger::include_header_into_logfile("Copying files:");
689*b1cdbd2cSJim Jagielski
690*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$filesref}; $i++ )
691*b1cdbd2cSJim Jagielski	{
692*b1cdbd2cSJim Jagielski		my $onefile = ${$filesref}[$i];
693*b1cdbd2cSJim Jagielski
694*b1cdbd2cSJim Jagielski		if (( $onefile->{'Styles'} ) && ( $onefile->{'Styles'} =~ /\bBINARYTABLE_ONLY\b/ )) { next; }
695*b1cdbd2cSJim Jagielski		if (( $installer::globals::patch ) && ( $onefile->{'Styles'} ) && ( ! ( $onefile->{'Styles'} =~ /\bPATCH\b/ ))) { next; }
696*b1cdbd2cSJim Jagielski		if (( $installer::globals::patch ) && ( $installer::globals::packageformat eq "dmg" )) { push(@installer::globals::patchfilecollector, "$onefile->{'destination'}\n"); }
697*b1cdbd2cSJim Jagielski
698*b1cdbd2cSJim Jagielski		my $source = $onefile->{'sourcepath'};
699*b1cdbd2cSJim Jagielski		my $destination = $onefile->{'destination'};
700*b1cdbd2cSJim Jagielski		$destination = $subfolderdir . $installer::globals::separator . $destination;
701*b1cdbd2cSJim Jagielski
702*b1cdbd2cSJim Jagielski		# Replacing $$ by $ is necessary to install files with $ in its name (back-masquerading)
703*b1cdbd2cSJim Jagielski		# Otherwise, the following shell command does not work and the file list is not correct
704*b1cdbd2cSJim Jagielski		$source =~ s/\$\$/\$/;
705*b1cdbd2cSJim Jagielski		$destination =~ s/\$\$/\$/;
706*b1cdbd2cSJim Jagielski
707*b1cdbd2cSJim Jagielski		if ( $^O =~ /cygwin/i || $^O =~ /os2/i )	# Cygwin performance, do not use copy_one_file. "chmod -R" at the end
708*b1cdbd2cSJim Jagielski		{
709*b1cdbd2cSJim Jagielski			my $copyreturn = copy($source, $destination);
710*b1cdbd2cSJim Jagielski
711*b1cdbd2cSJim Jagielski			if ($copyreturn)
712*b1cdbd2cSJim Jagielski			{
713*b1cdbd2cSJim Jagielski                $installer::logger::Lang->printf("Copy: $source to %s\n", $destination);
714*b1cdbd2cSJim Jagielski				$returnvalue = 1;
715*b1cdbd2cSJim Jagielski			}
716*b1cdbd2cSJim Jagielski			else
717*b1cdbd2cSJim Jagielski			{
718*b1cdbd2cSJim Jagielski                $installer::logger::Lang->printf("ERROR: Could not copy %s to %s\n", $source, $destination);
719*b1cdbd2cSJim Jagielski				$returnvalue = 0;
720*b1cdbd2cSJim Jagielski			}
721*b1cdbd2cSJim Jagielski		}
722*b1cdbd2cSJim Jagielski		else
723*b1cdbd2cSJim Jagielski		{
724*b1cdbd2cSJim Jagielski			installer::systemactions::copy_one_file($source, $destination);
725*b1cdbd2cSJim Jagielski
726*b1cdbd2cSJim Jagielski			if ( ! $installer::globals::iswindowsbuild )
727*b1cdbd2cSJim Jagielski			{
728*b1cdbd2cSJim Jagielski				# see issue 102274
729*b1cdbd2cSJim Jagielski				my $unixrights = "";
730*b1cdbd2cSJim Jagielski				if ( $onefile->{'UnixRights'} )
731*b1cdbd2cSJim Jagielski				{
732*b1cdbd2cSJim Jagielski					$unixrights = $onefile->{'UnixRights'};
733*b1cdbd2cSJim Jagielski
734*b1cdbd2cSJim Jagielski					my $localcall = "$installer::globals::wrapcmd chmod $unixrights \'$destination\' \>\/dev\/null 2\>\&1";
735*b1cdbd2cSJim Jagielski					system($localcall);
736*b1cdbd2cSJim Jagielski				}
737*b1cdbd2cSJim Jagielski			}
738*b1cdbd2cSJim Jagielski		}
739*b1cdbd2cSJim Jagielski	}
740*b1cdbd2cSJim Jagielski
741*b1cdbd2cSJim Jagielski	# creating Links
742*b1cdbd2cSJim Jagielski
743*b1cdbd2cSJim Jagielski	$installer::logger::Info->print("... creating links ...\n");
744*b1cdbd2cSJim Jagielski	installer::logger::include_header_into_logfile("Creating links:");
745*b1cdbd2cSJim Jagielski
746*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$linksref}; $i++ )
747*b1cdbd2cSJim Jagielski	{
748*b1cdbd2cSJim Jagielski		my $onelink = ${$linksref}[$i];
749*b1cdbd2cSJim Jagielski
750*b1cdbd2cSJim Jagielski		if (( $installer::globals::patch ) && ( $onelink->{'Styles'} ) && ( ! ( $onelink->{'Styles'} =~ /\bPATCH\b/ ))) { next; }
751*b1cdbd2cSJim Jagielski
752*b1cdbd2cSJim Jagielski		my $destination = $onelink->{'destination'};
753*b1cdbd2cSJim Jagielski		$destination = $subfolderdir . $installer::globals::separator . $destination;
754*b1cdbd2cSJim Jagielski		my $destinationfile = $onelink->{'destinationfile'};
755*b1cdbd2cSJim Jagielski
756*b1cdbd2cSJim Jagielski		my $localcall = "ln -sf \'$destinationfile\' \'$destination\' \>\/dev\/null 2\>\&1";
757*b1cdbd2cSJim Jagielski		system($localcall);
758*b1cdbd2cSJim Jagielski
759*b1cdbd2cSJim Jagielski        $installer::logger::Lang->printf("Creating link: \"ln -sf %s %s\"\n",
760*b1cdbd2cSJim Jagielski            $destinationfile,
761*b1cdbd2cSJim Jagielski            $destination);
762*b1cdbd2cSJim Jagielski	}
763*b1cdbd2cSJim Jagielski
764*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$unixlinksref}; $i++ )
765*b1cdbd2cSJim Jagielski	{
766*b1cdbd2cSJim Jagielski		my $onelink = ${$unixlinksref}[$i];
767*b1cdbd2cSJim Jagielski
768*b1cdbd2cSJim Jagielski		if (( $installer::globals::patch ) && ( $onelink->{'Styles'} ) && ( ! ( $onelink->{'Styles'} =~ /\bPATCH\b/ ))) { next; }
769*b1cdbd2cSJim Jagielski
770*b1cdbd2cSJim Jagielski		my $target = $onelink->{'Target'};
771*b1cdbd2cSJim Jagielski		my $destination = $subfolderdir . $installer::globals::separator . $onelink->{'destination'};
772*b1cdbd2cSJim Jagielski
773*b1cdbd2cSJim Jagielski		my $localcall = "ln -sf \'$target\' \'$destination\' \>\/dev\/null 2\>\&1";
774*b1cdbd2cSJim Jagielski		system($localcall);
775*b1cdbd2cSJim Jagielski
776*b1cdbd2cSJim Jagielski        $installer::logger::Lang->printf("Creating Unix link: \"ln -sf %s %s\"\n",
777*b1cdbd2cSJim Jagielski            $target,
778*b1cdbd2cSJim Jagielski            $destination);
779*b1cdbd2cSJim Jagielski	}
780*b1cdbd2cSJim Jagielski
781*b1cdbd2cSJim Jagielski	# Setting privileges for cygwin globally
782*b1cdbd2cSJim Jagielski
783*b1cdbd2cSJim Jagielski	if ( $^O =~ /cygwin/i )
784*b1cdbd2cSJim Jagielski	{
785*b1cdbd2cSJim Jagielski		$installer::logger::Lang->print( "... changing privileges in $subfolderdir ...\n" );
786*b1cdbd2cSJim Jagielski		installer::logger::include_header_into_logfile("Changing privileges in $subfolderdir:");
787*b1cdbd2cSJim Jagielski
788*b1cdbd2cSJim Jagielski		my $localcall = "chmod -R 755 " . "\"" . $subfolderdir . "\"";
789*b1cdbd2cSJim Jagielski		system($localcall);
790*b1cdbd2cSJim Jagielski	}
791*b1cdbd2cSJim Jagielski
792*b1cdbd2cSJim Jagielski	$installer::logger::Lang->print( "... removing superfluous directories ...\n" );
793*b1cdbd2cSJim Jagielski	installer::logger::include_header_into_logfile("Removing superfluous directories:");
794*b1cdbd2cSJim Jagielski
795*b1cdbd2cSJim Jagielski	my ( $extensionfolder, $preregdir ) = get_extensions_dir($subfolderdir);
796*b1cdbd2cSJim Jagielski	installer::systemactions::remove_empty_dirs_in_folder($extensionfolder);
797*b1cdbd2cSJim Jagielski
798*b1cdbd2cSJim Jagielski	# Registering the extensions
799*b1cdbd2cSJim Jagielski
800*b1cdbd2cSJim Jagielski	$installer::logger::Lang->print( "... registering extensions ...\n" );
801*b1cdbd2cSJim Jagielski	installer::logger::include_header_into_logfile("Registering extensions:");
802*b1cdbd2cSJim Jagielski	register_extensions($subfolderdir, $languagestringref, $preregdir);
803*b1cdbd2cSJim Jagielski
804*b1cdbd2cSJim Jagielski	if ( $installer::globals::compiler =~ /^unxmac/ )
805*b1cdbd2cSJim Jagielski	{
806*b1cdbd2cSJim Jagielski		installer::worker::put_scpactions_into_installset("$installdir/$packagename");
807*b1cdbd2cSJim Jagielski	}
808*b1cdbd2cSJim Jagielski
809*b1cdbd2cSJim Jagielski	# Creating archive file
810*b1cdbd2cSJim Jagielski    if ( $installer::globals::packageformat eq "archive" )
811*b1cdbd2cSJim Jagielski    {
812*b1cdbd2cSJim Jagielski        create_package($tempinstalldir, $installdir, $packagename, $allvariables, $includepatharrayref, $languagestringref, $installer::globals::archiveformat);
813*b1cdbd2cSJim Jagielski    }
814*b1cdbd2cSJim Jagielski    elsif ( $installer::globals::packageformat eq "dmg" )
815*b1cdbd2cSJim Jagielski    {
816*b1cdbd2cSJim Jagielski        create_package($installdir, $installdir, $packagename, $allvariables, $includepatharrayref, $languagestringref, ".dmg");
817*b1cdbd2cSJim Jagielski    }
818*b1cdbd2cSJim Jagielski
819*b1cdbd2cSJim Jagielski	# Analyzing the log file
820*b1cdbd2cSJim Jagielski
821*b1cdbd2cSJim Jagielski	installer::worker::clean_output_tree();	# removing directories created in the output tree
822*b1cdbd2cSJim Jagielski	installer::worker::analyze_and_save_logfile($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number);
823*b1cdbd2cSJim Jagielski}
824*b1cdbd2cSJim Jagielski
825*b1cdbd2cSJim Jagielski1;
826