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