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