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