1*cdf0e10cSrcweir#*************************************************************************
2*cdf0e10cSrcweir#
3*cdf0e10cSrcweir# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir#
5*cdf0e10cSrcweir# Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir#
7*cdf0e10cSrcweir# OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir#
9*cdf0e10cSrcweir# This file is part of OpenOffice.org.
10*cdf0e10cSrcweir#
11*cdf0e10cSrcweir# OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir# it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir# only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir#
15*cdf0e10cSrcweir# OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir# but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir# GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir# (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir#
21*cdf0e10cSrcweir# You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir# version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir# <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir# for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir#
26*cdf0e10cSrcweir#*************************************************************************
27*cdf0e10cSrcweir
28*cdf0e10cSrcweirpackage installer::archivefiles;
29*cdf0e10cSrcweir
30*cdf0e10cSrcweiruse Archive::Zip qw( :ERROR_CODES :CONSTANTS );
31*cdf0e10cSrcweiruse installer::converter;
32*cdf0e10cSrcweiruse installer::existence;
33*cdf0e10cSrcweiruse installer::exiter;
34*cdf0e10cSrcweiruse installer::files;
35*cdf0e10cSrcweiruse installer::globals;
36*cdf0e10cSrcweiruse installer::logger;
37*cdf0e10cSrcweiruse installer::pathanalyzer;
38*cdf0e10cSrcweiruse installer::systemactions;
39*cdf0e10cSrcweir
40*cdf0e10cSrcweir#################################################################
41*cdf0e10cSrcweir# Changing the name for files with flag RENAME_TO_LANGUAGE
42*cdf0e10cSrcweir#################################################################
43*cdf0e10cSrcweir
44*cdf0e10cSrcweirsub put_language_into_name
45*cdf0e10cSrcweir{
46*cdf0e10cSrcweir	my ( $oldname, $onelanguage ) = @_;
47*cdf0e10cSrcweir
48*cdf0e10cSrcweir	my $newname = "";
49*cdf0e10cSrcweir
50*cdf0e10cSrcweir	my $filename = "";
51*cdf0e10cSrcweir	my $extension = "";
52*cdf0e10cSrcweir
53*cdf0e10cSrcweir	if ( $oldname =~ /en-US/ )	# files, that contain the language in the file name
54*cdf0e10cSrcweir	{
55*cdf0e10cSrcweir		$newname = $oldname;
56*cdf0e10cSrcweir		$newname =~ s/en-US/$onelanguage/;
57*cdf0e10cSrcweir	}
58*cdf0e10cSrcweir	else	# files, that do not contain the language in the file name
59*cdf0e10cSrcweir	{
60*cdf0e10cSrcweir		if ( $oldname =~ /^\s*(.*)(\..*?)\s*$/ )	# files with extension
61*cdf0e10cSrcweir		{
62*cdf0e10cSrcweir			$filename = $1;
63*cdf0e10cSrcweir			$extension = $2;
64*cdf0e10cSrcweir		}
65*cdf0e10cSrcweir		else
66*cdf0e10cSrcweir		{
67*cdf0e10cSrcweir			$filename = $oldname;
68*cdf0e10cSrcweir			$extension = "";
69*cdf0e10cSrcweir		}
70*cdf0e10cSrcweir
71*cdf0e10cSrcweir		$newname = $1 . "_" . $onelanguage . $2;
72*cdf0e10cSrcweir	}
73*cdf0e10cSrcweir
74*cdf0e10cSrcweir	return $newname;
75*cdf0e10cSrcweir}
76*cdf0e10cSrcweir
77*cdf0e10cSrcweir#################################################################
78*cdf0e10cSrcweir# Converting patchfiles string into array
79*cdf0e10cSrcweir#################################################################
80*cdf0e10cSrcweir
81*cdf0e10cSrcweirsub get_patch_file_list
82*cdf0e10cSrcweir{
83*cdf0e10cSrcweir	my ( $patchfilestring ) = @_;
84*cdf0e10cSrcweir
85*cdf0e10cSrcweir	$patchfilestring =~ s/^\s*\(?//;
86*cdf0e10cSrcweir	$patchfilestring =~ s/\)?\s*$//;
87*cdf0e10cSrcweir	$patchfilestring =~ s/^\s*\///;
88*cdf0e10cSrcweir	$patchfilestring =~ s/^\s*\\//;
89*cdf0e10cSrcweir
90*cdf0e10cSrcweir	my $patchfilesarray = installer::converter::convert_stringlist_into_array_without_linebreak_and_quotes(\$patchfilestring, ",");
91*cdf0e10cSrcweir
92*cdf0e10cSrcweir	return $patchfilesarray;
93*cdf0e10cSrcweir}
94*cdf0e10cSrcweir
95*cdf0e10cSrcweir#################################################################
96*cdf0e10cSrcweir# Reading all executables in the "manifest.xml"
97*cdf0e10cSrcweir#################################################################
98*cdf0e10cSrcweir
99*cdf0e10cSrcweirsub get_all_executables_from_manifest
100*cdf0e10cSrcweir{
101*cdf0e10cSrcweir	my ($unzipdir, $manifestfile, $executable_files_in_extensions) = @_;
102*cdf0e10cSrcweir
103*cdf0e10cSrcweir	my $is_executable = 0;
104*cdf0e10cSrcweir
105*cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$manifestfile}; $i++ )
106*cdf0e10cSrcweir	{
107*cdf0e10cSrcweir		my $line = ${$manifestfile}[$i];
108*cdf0e10cSrcweir
109*cdf0e10cSrcweir		if ( $line =~ /\"application\/vnd\.sun\.star\.executable\"/ ) { $is_executable = 1; }
110*cdf0e10cSrcweir
111*cdf0e10cSrcweir		if (( $line =~ /manifest\:full\-path=\"(.*?)\"/ ) && ( $is_executable ))
112*cdf0e10cSrcweir		{
113*cdf0e10cSrcweir			my $filename = $unzipdir . $installer::globals::separator . $1;
114*cdf0e10cSrcweir			# making only slashes for comparison reasons
115*cdf0e10cSrcweir			$filename =~ s/\\/\//g;
116*cdf0e10cSrcweir			$executable_files_in_extensions->{$filename} = 1;
117*cdf0e10cSrcweir		}
118*cdf0e10cSrcweir
119*cdf0e10cSrcweir		if ( $line =~ /\/\>/ ) { $is_executable = 0; }
120*cdf0e10cSrcweir	}
121*cdf0e10cSrcweir}
122*cdf0e10cSrcweir
123*cdf0e10cSrcweir#################################################################
124*cdf0e10cSrcweir# Reading the "manifest.xml" in extensions and determine, if
125*cdf0e10cSrcweir# there are executable files
126*cdf0e10cSrcweir#################################################################
127*cdf0e10cSrcweir
128*cdf0e10cSrcweirsub collect_all_executable_files_in_extensions
129*cdf0e10cSrcweir{
130*cdf0e10cSrcweir	my ($unzipdir, $executable_files_in_extensions) = @_;
131*cdf0e10cSrcweir
132*cdf0e10cSrcweir	$unzipdir =~ s/\Q$installer::globals::separator\E\s*$//;
133*cdf0e10cSrcweir
134*cdf0e10cSrcweir	my $manifestfilename = $unzipdir . $installer::globals::separator . "META-INF" . $installer::globals::separator . "manifest.xml";
135*cdf0e10cSrcweir
136*cdf0e10cSrcweir	if ( -f $manifestfilename )
137*cdf0e10cSrcweir	{
138*cdf0e10cSrcweir		my $manifestfile = installer::files::read_file($manifestfilename);
139*cdf0e10cSrcweir		get_all_executables_from_manifest($unzipdir, $manifestfile, $executable_files_in_extensions);
140*cdf0e10cSrcweir	}
141*cdf0e10cSrcweir}
142*cdf0e10cSrcweir
143*cdf0e10cSrcweir#################################################################
144*cdf0e10cSrcweir# Analyzing files with flag ARCHIVE
145*cdf0e10cSrcweir#################################################################
146*cdf0e10cSrcweir
147*cdf0e10cSrcweirsub resolving_archive_flag
148*cdf0e10cSrcweir{
149*cdf0e10cSrcweir	my ($filesarrayref, $additionalpathsref, $languagestringref, $loggingdir) = @_;
150*cdf0e10cSrcweir
151*cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::archivefiles::resolving_archive_flag : $#{$filesarrayref} : $#{$additionalpathsref} : $$languagestringref : $loggingdir"); }
152*cdf0e10cSrcweir
153*cdf0e10cSrcweir	my @newallfilesarray = ();
154*cdf0e10cSrcweir
155*cdf0e10cSrcweir	my ($systemcall, $returnvalue, $infoline);
156*cdf0e10cSrcweir
157*cdf0e10cSrcweir	my $unziplistfile = $loggingdir . "unziplist_" . $installer::globals::build . "_" . $installer::globals::compiler . "_" . $$languagestringref . ".txt";
158*cdf0e10cSrcweir
159*cdf0e10cSrcweir	my $platformunzipdirbase = installer::systemactions::create_directories("zip", $languagestringref);
160*cdf0e10cSrcweir	push(@installer::globals::removedirs, $platformunzipdirbase);
161*cdf0e10cSrcweir
162*cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Files with flag ARCHIVE:");
163*cdf0e10cSrcweir
164*cdf0e10cSrcweir	my $repeat_unzip = 0;
165*cdf0e10cSrcweir	my $maxcounter = 0;
166*cdf0e10cSrcweir
167*cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
168*cdf0e10cSrcweir	{
169*cdf0e10cSrcweir		if ( $repeat_unzip ) { $i--; }	# decreasing the counter
170*cdf0e10cSrcweir
171*cdf0e10cSrcweir		my $onefile = ${$filesarrayref}[$i];
172*cdf0e10cSrcweir		my $styles = "";
173*cdf0e10cSrcweir
174*cdf0e10cSrcweir		if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
175*cdf0e10cSrcweir
176*cdf0e10cSrcweir		if ( $styles =~ /\bARCHIVE\b/ )		# copying, unzipping and changing the file list
177*cdf0e10cSrcweir		{
178*cdf0e10cSrcweir			my $iscommonfile = 0;
179*cdf0e10cSrcweir			my $sourcepath = $onefile->{'sourcepath'};
180*cdf0e10cSrcweir
181*cdf0e10cSrcweir			if ( $sourcepath =~ /\Q$installer::globals::separator\E\bcommon$installer::globals::productextension\Q$installer::globals::separator\E/ )	# /common/ or /common.pro/
182*cdf0e10cSrcweir			{
183*cdf0e10cSrcweir				$iscommonfile = 1;
184*cdf0e10cSrcweir			}
185*cdf0e10cSrcweir
186*cdf0e10cSrcweir			my $use_internal_rights = 0;
187*cdf0e10cSrcweir			if ( $styles =~ /\bUSE_INTERNAL_RIGHTS\b/ ) { $use_internal_rights = 1; }	# using the rights used inside the zip file
188*cdf0e10cSrcweir
189*cdf0e10cSrcweir			my $rename_to_language = 0;
190*cdf0e10cSrcweir			if ( $styles =~ /\bRENAME_TO_LANGUAGE\b/ ) { $rename_to_language = 1; }	# special handling for renamed files (scriptitems.pm)
191*cdf0e10cSrcweir
192*cdf0e10cSrcweir			my %executable_files_in_extensions = ();
193*cdf0e10cSrcweir			my $set_executable_privileges = 0;  # setting privileges for exectables is required for oxt files
194*cdf0e10cSrcweir			if ( $onefile->{'Name'} =~ /\.oxt\s*$/ ) { $set_executable_privileges = 1; }
195*cdf0e10cSrcweir
196*cdf0e10cSrcweir			# mechanism to select files from an archive files
197*cdf0e10cSrcweir			my $select_files = 0;
198*cdf0e10cSrcweir			my $selectlistfiles = "";
199*cdf0e10cSrcweir			my @keptfiles = ();
200*cdf0e10cSrcweir			if ( $onefile->{'Selectfiles'} )
201*cdf0e10cSrcweir			{
202*cdf0e10cSrcweir				$select_files = 1;
203*cdf0e10cSrcweir				$selectlistfiles = get_patch_file_list( $onefile->{'Selectfiles'} );
204*cdf0e10cSrcweir				$infoline = "Selected file list defined at file: $onefile->{'Name'} :\n";
205*cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
206*cdf0e10cSrcweir				for ( my $k = 0; $k <= $#{$selectlistfiles}; $k++ )
207*cdf0e10cSrcweir				{
208*cdf0e10cSrcweir					$infoline = "\"${$selectlistfiles}[$k]\"\n";
209*cdf0e10cSrcweir					push( @installer::globals::logfileinfo, $infoline);
210*cdf0e10cSrcweir				}
211*cdf0e10cSrcweir			}
212*cdf0e10cSrcweir
213*cdf0e10cSrcweir			if ( $onefile->{'Selectfiles'} ) { $onefile->{'Selectfiles'} = ""; } # Selected files list no longer required
214*cdf0e10cSrcweir
215*cdf0e10cSrcweir			# mechanism to define patch files inside an archive files
216*cdf0e10cSrcweir			my $select_patch_files = 0;
217*cdf0e10cSrcweir			my $patchlistfiles = "";
218*cdf0e10cSrcweir			my @keptpatchflags = ();
219*cdf0e10cSrcweir			if (( $styles =~ /\bPATCH\b/ ) && ( $onefile->{'Patchfiles'} ) && ( $installer::globals::patch ))
220*cdf0e10cSrcweir			{
221*cdf0e10cSrcweir				$select_patch_files = 1; # special handling if a Patchlist is defined
222*cdf0e10cSrcweir				$patchlistfiles = get_patch_file_list( $onefile->{'Patchfiles'} );
223*cdf0e10cSrcweir				$infoline = "Patch file list defined at file: $onefile->{'Name'} :\n";
224*cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
225*cdf0e10cSrcweir				for ( my $k = 0; $k <= $#{$patchlistfiles}; $k++ )
226*cdf0e10cSrcweir				{
227*cdf0e10cSrcweir					$infoline = "\"${$patchlistfiles}[$k]\"\n";
228*cdf0e10cSrcweir					push( @installer::globals::logfileinfo, $infoline);
229*cdf0e10cSrcweir				}
230*cdf0e10cSrcweir			}
231*cdf0e10cSrcweir
232*cdf0e10cSrcweir			if ( $onefile->{'Patchfiles'} ) { $onefile->{'Patchfiles'} = ""; } # Patch file list no longer required
233*cdf0e10cSrcweir
234*cdf0e10cSrcweir			# creating directories
235*cdf0e10cSrcweir
236*cdf0e10cSrcweir			my $onelanguage = $onefile->{'specificlanguage'};
237*cdf0e10cSrcweir
238*cdf0e10cSrcweir			# files without language into directory "00"
239*cdf0e10cSrcweir
240*cdf0e10cSrcweir			if ($onelanguage eq "") { $onelanguage = "00"; }
241*cdf0e10cSrcweir
242*cdf0e10cSrcweir			my $unzipdir;
243*cdf0e10cSrcweir
244*cdf0e10cSrcweir			# if ($iscommonfile) { $unzipdir = $commonunzipdirbase . $installer::globals::separator . $onelanguage . $installer::globals::separator; }
245*cdf0e10cSrcweir			# else { $unzipdir = $platformunzipdirbase . $installer::globals::separator . $onelanguage . $installer::globals::separator; }
246*cdf0e10cSrcweir
247*cdf0e10cSrcweir			$unzipdir = $platformunzipdirbase . $installer::globals::separator . $onelanguage . $installer::globals::separator;
248*cdf0e10cSrcweir
249*cdf0e10cSrcweir			installer::systemactions::create_directory($unzipdir);	# creating language specific subdirectories
250*cdf0e10cSrcweir
251*cdf0e10cSrcweir			my $onefilename = $onefile->{'Name'};
252*cdf0e10cSrcweir			$onefilename =~ s/\./\_/g;		# creating new directory name
253*cdf0e10cSrcweir			$onefilename =~ s/\//\_/g;		# only because of /letter/fontunxpsprint.zip, the only zip file with path
254*cdf0e10cSrcweir			$unzipdir = $unzipdir . $onefilename . $installer::globals::separator;
255*cdf0e10cSrcweir
256*cdf0e10cSrcweir			if ( $installer::globals::dounzip ) { installer::systemactions::create_directory($unzipdir); }	# creating subdirectories with the names of the zipfiles
257*cdf0e10cSrcweir
258*cdf0e10cSrcweir			my $zip = Archive::Zip->new();
259*cdf0e10cSrcweir			if ( $zip->read($sourcepath) != AZ_OK )
260*cdf0e10cSrcweir			{
261*cdf0e10cSrcweir				$infoline = "ERROR: Could not unzip $sourcepath\n";
262*cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
263*cdf0e10cSrcweir			}
264*cdf0e10cSrcweir
265*cdf0e10cSrcweir			my $counter = 0;
266*cdf0e10cSrcweir			my $contains_dll = 0;
267*cdf0e10cSrcweir			foreach my $member ( $zip->memberNames() )
268*cdf0e10cSrcweir			{
269*cdf0e10cSrcweir				$counter++;
270*cdf0e10cSrcweir				if ( $member =~ /.dll\s*$/ ) { $contains_dll = 1; }
271*cdf0e10cSrcweir			}
272*cdf0e10cSrcweir
273*cdf0e10cSrcweir			if (! ( $counter > 0 ))	# the zipfile is empty
274*cdf0e10cSrcweir			{
275*cdf0e10cSrcweir				$infoline = "ERROR: Could not unzip $sourcepath\n";
276*cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
277*cdf0e10cSrcweir
278*cdf0e10cSrcweir			}
279*cdf0e10cSrcweir			else
280*cdf0e10cSrcweir			{
281*cdf0e10cSrcweir				if ( $installer::globals::dounzip )			# really unpacking the files
282*cdf0e10cSrcweir				{
283*cdf0e10cSrcweir					if ( $zip->extractTree("", $unzipdir) != AZ_OK ) { installer::exiter::exit_program("ERROR: $infoline", "resolving_archive_flag"); }
284*cdf0e10cSrcweir
285*cdf0e10cSrcweir					if (( $^O =~ /cygwin/i ) && ( $contains_dll ))
286*cdf0e10cSrcweir					{
287*cdf0e10cSrcweir						# Make dll's executable
288*cdf0e10cSrcweir						$systemcall = "cd $unzipdir; find . -name \\*.dll -exec chmod 775 \{\} \\\;";
289*cdf0e10cSrcweir						$returnvalue = system($systemcall);
290*cdf0e10cSrcweir						$infoline = "Systemcall: $systemcall\n";
291*cdf0e10cSrcweir						push( @installer::globals::logfileinfo, $infoline);
292*cdf0e10cSrcweir
293*cdf0e10cSrcweir						if ($returnvalue)
294*cdf0e10cSrcweir						{
295*cdf0e10cSrcweir							$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
296*cdf0e10cSrcweir							push( @installer::globals::logfileinfo, $infoline);
297*cdf0e10cSrcweir						}
298*cdf0e10cSrcweir					}
299*cdf0e10cSrcweir
300*cdf0e10cSrcweir					if ( ! $installer::globals::iswindowsbuild )
301*cdf0e10cSrcweir					{
302*cdf0e10cSrcweir						# Setting unix rights to "775" for all created directories inside the package
303*cdf0e10cSrcweir
304*cdf0e10cSrcweir						$systemcall = "cd $unzipdir; find . -type d -exec chmod 775 \{\} \\\;";
305*cdf0e10cSrcweir						$returnvalue = system($systemcall);
306*cdf0e10cSrcweir						$infoline = "Systemcall: $systemcall\n";
307*cdf0e10cSrcweir						push( @installer::globals::logfileinfo, $infoline);
308*cdf0e10cSrcweir
309*cdf0e10cSrcweir						if ($returnvalue)
310*cdf0e10cSrcweir						{
311*cdf0e10cSrcweir							$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
312*cdf0e10cSrcweir							push( @installer::globals::logfileinfo, $infoline);
313*cdf0e10cSrcweir						}
314*cdf0e10cSrcweir					}
315*cdf0e10cSrcweir
316*cdf0e10cSrcweir					# Selecting names of executable files in extensions
317*cdf0e10cSrcweir					if ( $set_executable_privileges )
318*cdf0e10cSrcweir					{
319*cdf0e10cSrcweir						collect_all_executable_files_in_extensions($unzipdir, \%executable_files_in_extensions);
320*cdf0e10cSrcweir					}
321*cdf0e10cSrcweir				}
322*cdf0e10cSrcweir
323*cdf0e10cSrcweir				my $zipfileref = \@zipfile;
324*cdf0e10cSrcweir				my $unziperror = 0;
325*cdf0e10cSrcweir
326*cdf0e10cSrcweir				foreach my $zipname ( $zip->memberNames() )
327*cdf0e10cSrcweir				{
328*cdf0e10cSrcweir					# Format from Archive:::Zip :
329*cdf0e10cSrcweir					# dir1/
330*cdf0e10cSrcweir					# dir1/so7drawing.desktop
331*cdf0e10cSrcweir
332*cdf0e10cSrcweir					# some directories and files (from the help) start with "./simpress.idx"
333*cdf0e10cSrcweir
334*cdf0e10cSrcweir					$zipname =~ s/^\s*\.\///;
335*cdf0e10cSrcweir
336*cdf0e10cSrcweir					if ($installer::globals::iswin and $^O =~ /MSWin/i) { $zipname =~ s/\//\\/g; }
337*cdf0e10cSrcweir
338*cdf0e10cSrcweir					if ( $zipname =~ /\Q$installer::globals::separator\E\s*$/ )	# slash or backslash at the end characterizes a directory
339*cdf0e10cSrcweir					{
340*cdf0e10cSrcweir						$zipname = $zipname . "\n";
341*cdf0e10cSrcweir						push(@{$additionalpathsref}, $zipname);
342*cdf0e10cSrcweir
343*cdf0e10cSrcweir						# Also needed here:
344*cdf0e10cSrcweir						# Name
345*cdf0e10cSrcweir						# Language
346*cdf0e10cSrcweir						# ismultilingual
347*cdf0e10cSrcweir						# Basedirectory
348*cdf0e10cSrcweir
349*cdf0e10cSrcweir						# This is not needed, because the list of all directories for the
350*cdf0e10cSrcweir						# epm list file is generated from the destination directories of the
351*cdf0e10cSrcweir						# files included in the product!
352*cdf0e10cSrcweir					}
353*cdf0e10cSrcweir					else
354*cdf0e10cSrcweir					{
355*cdf0e10cSrcweir						my %newfile = ();
356*cdf0e10cSrcweir						%newfile = %{$onefile};
357*cdf0e10cSrcweir						$newfile{'Name'} = $zipname;
358*cdf0e10cSrcweir						my $destination = $onefile->{'destination'};
359*cdf0e10cSrcweir						installer::pathanalyzer::get_path_from_fullqualifiedname(\$destination);
360*cdf0e10cSrcweir						$newfile{'destination'} = $destination . $zipname;
361*cdf0e10cSrcweir						$newfile{'sourcepath'} = $unzipdir . $zipname;
362*cdf0e10cSrcweir						$newfile{'zipfilename'} = $onefile->{'Name'};
363*cdf0e10cSrcweir						$newfile{'zipfilesource'} = $onefile->{'sourcepath'};
364*cdf0e10cSrcweir						$newfile{'zipfiledestination'} = $onefile->{'destination'};
365*cdf0e10cSrcweir
366*cdf0e10cSrcweir						if (( $use_internal_rights ) && ( ! $installer::globals::iswin ))
367*cdf0e10cSrcweir						{
368*cdf0e10cSrcweir							my $value = sprintf("%o", (stat($newfile{'sourcepath'}))[2]);
369*cdf0e10cSrcweir							$newfile{'UnixRights'} = substr($value, 3);
370*cdf0e10cSrcweir							$infoline = "Setting unix rights for \"$newfile{'sourcepath'}\" to \"$newfile{'UnixRights'}\"\n";
371*cdf0e10cSrcweir							push( @installer::globals::logfileinfo, $infoline);
372*cdf0e10cSrcweir						}
373*cdf0e10cSrcweir
374*cdf0e10cSrcweir						if ( $set_executable_privileges )
375*cdf0e10cSrcweir						{
376*cdf0e10cSrcweir							# All pathes to executables are saved in the hash %executable_files_in_extensions
377*cdf0e10cSrcweir							my $compare_path = $newfile{'sourcepath'};
378*cdf0e10cSrcweir							$compare_path =~ s/\\/\//g;  # contains only slashes for comparison reasons
379*cdf0e10cSrcweir							if ( exists($executable_files_in_extensions{$compare_path}) )
380*cdf0e10cSrcweir							{
381*cdf0e10cSrcweir								$newfile{'UnixRights'} = "775";
382*cdf0e10cSrcweir								$infoline = "Executable in Extension: Setting unix rights for \"$newfile{'sourcepath'}\" to \"$newfile{'UnixRights'}\"\n";
383*cdf0e10cSrcweir								push( @installer::globals::logfileinfo, $infoline);
384*cdf0e10cSrcweir							}
385*cdf0e10cSrcweir						}
386*cdf0e10cSrcweir
387*cdf0e10cSrcweir						if ( $select_files )
388*cdf0e10cSrcweir						{
389*cdf0e10cSrcweir							if ( ! installer::existence::exists_in_array($zipname,$selectlistfiles) )
390*cdf0e10cSrcweir							{
391*cdf0e10cSrcweir								$infoline = "Removing from ARCHIVE file $onefilename: $zipname\n";
392*cdf0e10cSrcweir								push( @installer::globals::logfileinfo, $infoline);
393*cdf0e10cSrcweir								next; # ignoring files, that are not included in $selectlistfiles
394*cdf0e10cSrcweir							}
395*cdf0e10cSrcweir							else
396*cdf0e10cSrcweir							{
397*cdf0e10cSrcweir								$infoline = "Keeping from ARCHIVE file $onefilename: $zipname\n";
398*cdf0e10cSrcweir								push( @installer::globals::logfileinfo, $infoline);
399*cdf0e10cSrcweir								push( @keptfiles, $zipname); # collecting all kept files
400*cdf0e10cSrcweir							}
401*cdf0e10cSrcweir						}
402*cdf0e10cSrcweir
403*cdf0e10cSrcweir						if ( $select_patch_files )
404*cdf0e10cSrcweir						{
405*cdf0e10cSrcweir							# Is this file listed in the Patchfile list?
406*cdf0e10cSrcweir							# $zipname (filename including path in zip file has to be listed in patchfile list
407*cdf0e10cSrcweir
408*cdf0e10cSrcweir							if ( ! installer::existence::exists_in_array($zipname,$patchlistfiles) )
409*cdf0e10cSrcweir							{
410*cdf0e10cSrcweir								$newfile{'Styles'} =~ s/\bPATCH\b//;	# removing the flag PATCH
411*cdf0e10cSrcweir								$newfile{'Styles'} =~ s/\,\s*\,/\,/;
412*cdf0e10cSrcweir								$newfile{'Styles'} =~ s/\(\s*\,/\(/;
413*cdf0e10cSrcweir								$newfile{'Styles'} =~ s/\,\s*\)/\)/;
414*cdf0e10cSrcweir								# $infoline = "Removing PATCH flag from: $zipname\n";
415*cdf0e10cSrcweir								# push( @installer::globals::logfileinfo, $infoline);
416*cdf0e10cSrcweir							}
417*cdf0e10cSrcweir							else
418*cdf0e10cSrcweir							{
419*cdf0e10cSrcweir								# $infoline = "Keeping PATCH flag at: $zipname\n";
420*cdf0e10cSrcweir								# push( @installer::globals::logfileinfo, $infoline);
421*cdf0e10cSrcweir								push( @keptpatchflags, $zipname); # collecting all PATCH flags
422*cdf0e10cSrcweir							}
423*cdf0e10cSrcweir						}
424*cdf0e10cSrcweir
425*cdf0e10cSrcweir						if ( $rename_to_language )
426*cdf0e10cSrcweir						{
427*cdf0e10cSrcweir							my $newzipname = put_language_into_name($zipname, $onelanguage);
428*cdf0e10cSrcweir							my $oldfilename = $unzipdir . $zipname;
429*cdf0e10cSrcweir							my $newfilename = $unzipdir . $newzipname;
430*cdf0e10cSrcweir
431*cdf0e10cSrcweir							installer::systemactions::copy_one_file($oldfilename, $newfilename);
432*cdf0e10cSrcweir
433*cdf0e10cSrcweir							$newfile{'Name'} = $newzipname;
434*cdf0e10cSrcweir							$newfile{'destination'} = $destination . $newzipname;
435*cdf0e10cSrcweir							$newfile{'sourcepath'} = $unzipdir . $newzipname;
436*cdf0e10cSrcweir
437*cdf0e10cSrcweir							$infoline = "RENAME_TO_LANGUAGE: Using $newzipname instead of $zipname!\n";
438*cdf0e10cSrcweir							push( @installer::globals::logfileinfo, $infoline);
439*cdf0e10cSrcweir						}
440*cdf0e10cSrcweir
441*cdf0e10cSrcweir						my $sourcefiletest = $unzipdir . $zipname;
442*cdf0e10cSrcweir						if ( ! -f $sourcefiletest )
443*cdf0e10cSrcweir						{
444*cdf0e10cSrcweir							$infoline = "ATTENTION: Unzip failed for $sourcefiletest!\n";
445*cdf0e10cSrcweir							push( @installer::globals::logfileinfo, $infoline);
446*cdf0e10cSrcweir							$unziperror = 1;
447*cdf0e10cSrcweir						}
448*cdf0e10cSrcweir
449*cdf0e10cSrcweir						# only adding the new line into the files array, if not in repeat modus
450*cdf0e10cSrcweir
451*cdf0e10cSrcweir						if ( ! $repeat_unzip ) { push(@newallfilesarray, \%newfile); }
452*cdf0e10cSrcweir					}
453*cdf0e10cSrcweir				}
454*cdf0e10cSrcweir
455*cdf0e10cSrcweir				# Comparing the content of @keptfiles and $selectlistfiles
456*cdf0e10cSrcweir				# Do all files from the list of selected files are stored in @keptfiles ?
457*cdf0e10cSrcweir				# @keptfiles contains only files included in $selectlistfiles. But are all
458*cdf0e10cSrcweir				# files from $selectlistfiles included in @keptfiles?
459*cdf0e10cSrcweir
460*cdf0e10cSrcweir				if ( $select_files )
461*cdf0e10cSrcweir				{
462*cdf0e10cSrcweir					my $number = $#{$selectlistfiles} + 1;
463*cdf0e10cSrcweir					$infoline = "SELECTLIST: Number of files in file selection list: $number\n";
464*cdf0e10cSrcweir					push( @installer::globals::logfileinfo, $infoline);
465*cdf0e10cSrcweir					$number = $#keptfiles + 1;
466*cdf0e10cSrcweir					$infoline = "SELECTLIST: Number of kept files: $number\n";
467*cdf0e10cSrcweir					push( @installer::globals::logfileinfo, $infoline);
468*cdf0e10cSrcweir
469*cdf0e10cSrcweir					for ( my $k = 0; $k <= $#keptfiles; $k++ )
470*cdf0e10cSrcweir					{
471*cdf0e10cSrcweir						$infoline = "KEPT FILES: $keptfiles[$k]\n";
472*cdf0e10cSrcweir						push( @installer::globals::logfileinfo, $infoline);
473*cdf0e10cSrcweir					}
474*cdf0e10cSrcweir
475*cdf0e10cSrcweir					my @warningfiles = ();
476*cdf0e10cSrcweir
477*cdf0e10cSrcweir					for ( my $k = 0; $k <= $#{$selectlistfiles}; $k++ )
478*cdf0e10cSrcweir					{
479*cdf0e10cSrcweir						if ( ! installer::existence::exists_in_array(${$selectlistfiles}[$k],\@keptfiles) )
480*cdf0e10cSrcweir						{
481*cdf0e10cSrcweir							push(@warningfiles, ${$selectlistfiles}[$k]);
482*cdf0e10cSrcweir						}
483*cdf0e10cSrcweir					}
484*cdf0e10cSrcweir
485*cdf0e10cSrcweir					for ( my $k = 0; $k <= $#warningfiles; $k++ )
486*cdf0e10cSrcweir					{
487*cdf0e10cSrcweir						$infoline = "WARNING: $warningfiles[$k] not included in install set (does not exist in zip file)!\n";
488*cdf0e10cSrcweir						push( @installer::globals::logfileinfo, $infoline);
489*cdf0e10cSrcweir					}
490*cdf0e10cSrcweir
491*cdf0e10cSrcweir				}
492*cdf0e10cSrcweir
493*cdf0e10cSrcweir				# Comparing the content of @keptpatchflags and $patchlistfiles
494*cdf0e10cSrcweir				# Do all files from the patch list have a PATCH flag ?
495*cdf0e10cSrcweir				# @keptpatchflags contains only files included in $patchlistfiles. But are all
496*cdf0e10cSrcweir				# files from $patchlistfiles included in @keptpatchflags?
497*cdf0e10cSrcweir
498*cdf0e10cSrcweir				if ( $select_patch_files )
499*cdf0e10cSrcweir				{
500*cdf0e10cSrcweir					my $number = $#{$patchlistfiles} + 1;
501*cdf0e10cSrcweir					$infoline = "PATCHLIST: Number of files in patch list: $number\n";
502*cdf0e10cSrcweir					push( @installer::globals::logfileinfo, $infoline);
503*cdf0e10cSrcweir					$number = $#keptpatchflags + 1;
504*cdf0e10cSrcweir					$infoline = "PATCHLIST: Number of kept PATCH flags: $number\n";
505*cdf0e10cSrcweir					push( @installer::globals::logfileinfo, $infoline);
506*cdf0e10cSrcweir
507*cdf0e10cSrcweir					for ( my $k = 0; $k <= $#keptpatchflags; $k++ )
508*cdf0e10cSrcweir					{
509*cdf0e10cSrcweir						$infoline = "KEPT PATCH FLAGS: $keptpatchflags[$k]\n";
510*cdf0e10cSrcweir						push( @installer::globals::logfileinfo, $infoline);
511*cdf0e10cSrcweir					}
512*cdf0e10cSrcweir
513*cdf0e10cSrcweir					my @warningfiles = ();
514*cdf0e10cSrcweir
515*cdf0e10cSrcweir					for ( my $k = 0; $k <= $#{$patchlistfiles}; $k++ )
516*cdf0e10cSrcweir					{
517*cdf0e10cSrcweir						if ( ! installer::existence::exists_in_array(${$patchlistfiles}[$k],\@keptpatchflags) )
518*cdf0e10cSrcweir						{
519*cdf0e10cSrcweir							push(@warningfiles, ${$patchlistfiles}[$k]);
520*cdf0e10cSrcweir						}
521*cdf0e10cSrcweir					}
522*cdf0e10cSrcweir
523*cdf0e10cSrcweir					for ( my $k = 0; $k <= $#warningfiles; $k++ )
524*cdf0e10cSrcweir					{
525*cdf0e10cSrcweir						$infoline = "WARNING: $warningfiles[$k] did not keep PATCH flag (does not exist in zip file)!\n";
526*cdf0e10cSrcweir						push( @installer::globals::logfileinfo, $infoline);
527*cdf0e10cSrcweir					}
528*cdf0e10cSrcweir				}
529*cdf0e10cSrcweir
530*cdf0e10cSrcweir				if ( $unziperror )
531*cdf0e10cSrcweir				{
532*cdf0e10cSrcweir					installer::logger::print_warning( "Repeating to unpack $sourcepath! \n" );
533*cdf0e10cSrcweir					$infoline = "ATTENTION: Repeating to unpack $sourcepath !\n";
534*cdf0e10cSrcweir					push( @installer::globals::logfileinfo, $infoline);
535*cdf0e10cSrcweir					$repeat_unzip = 1;
536*cdf0e10cSrcweir					$maxcounter++;
537*cdf0e10cSrcweir
538*cdf0e10cSrcweir					if ( $maxcounter == 5 )	# exiting the program
539*cdf0e10cSrcweir					{
540*cdf0e10cSrcweir						installer::exiter::exit_program("ERROR: Failed to unzip $sourcepath !", "resolving_archive_flag");
541*cdf0e10cSrcweir					}
542*cdf0e10cSrcweir				}
543*cdf0e10cSrcweir				else
544*cdf0e10cSrcweir				{
545*cdf0e10cSrcweir					$infoline = "Info: $sourcepath unpacked without problems !\n";
546*cdf0e10cSrcweir					push( @installer::globals::logfileinfo, $infoline);
547*cdf0e10cSrcweir					$repeat_unzip = 0;
548*cdf0e10cSrcweir					$maxcounter = 0;
549*cdf0e10cSrcweir				}
550*cdf0e10cSrcweir			}
551*cdf0e10cSrcweir		}
552*cdf0e10cSrcweir		else		# nothing to do here, no zipped file (no ARCHIVE flag)
553*cdf0e10cSrcweir		{
554*cdf0e10cSrcweir			push(@newallfilesarray, $onefile);
555*cdf0e10cSrcweir		}
556*cdf0e10cSrcweir	}
557*cdf0e10cSrcweir
558*cdf0e10cSrcweir	$infoline = "\n";
559*cdf0e10cSrcweir	push( @installer::globals::logfileinfo, $infoline);
560*cdf0e10cSrcweir
561*cdf0e10cSrcweir	return \@newallfilesarray;
562*cdf0e10cSrcweir}
563*cdf0e10cSrcweir
564*cdf0e10cSrcweir
565*cdf0e10cSrcweir1;
566