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::scppatchsoname; 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielskiuse installer::files; 27*b1cdbd2cSJim Jagielskiuse installer::globals; 28*b1cdbd2cSJim Jagielskiuse installer::logger; 29*b1cdbd2cSJim Jagielskiuse installer::setupscript; 30*b1cdbd2cSJim Jagielskiuse installer::systemactions; 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski######################################################################################## 33*b1cdbd2cSJim Jagielski# The length of the new string must be identical with the length of the old string 34*b1cdbd2cSJim Jagielski######################################################################################## 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielskisub change_length_of_string 37*b1cdbd2cSJim Jagielski{ 38*b1cdbd2cSJim Jagielski my ($newstringref, $oldstring) = @_; 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski while ( length($$newstringref) < length($oldstring) ) 41*b1cdbd2cSJim Jagielski { 42*b1cdbd2cSJim Jagielski $$newstringref = $$newstringref . chr(0); 43*b1cdbd2cSJim Jagielski } 44*b1cdbd2cSJim Jagielski} 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski######################################################################################## 47*b1cdbd2cSJim Jagielski# The length of the new string must be identical with the length of the old string 48*b1cdbd2cSJim Jagielski######################################################################################## 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielskisub change_length_of_string_with_letter 51*b1cdbd2cSJim Jagielski{ 52*b1cdbd2cSJim Jagielski my ($newstringref, $oldstring, $onestring) = @_; 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski while ( length($$newstringref) < length($oldstring) ) 55*b1cdbd2cSJim Jagielski { 56*b1cdbd2cSJim Jagielski $$newstringref = $$newstringref . $onestring; 57*b1cdbd2cSJim Jagielski } 58*b1cdbd2cSJim Jagielski} 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski######################################################################################## 61*b1cdbd2cSJim Jagielski# Converting a string to a unicode string 62*b1cdbd2cSJim Jagielski######################################################################################## 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielskisub convert_to_unicode 65*b1cdbd2cSJim Jagielski{ 66*b1cdbd2cSJim Jagielski my ($string) = @_; 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielski my $unicodestring = ""; 69*b1cdbd2cSJim Jagielski 70*b1cdbd2cSJim Jagielski my $stringlength = length($string); 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski for ( my $i = 0; $i < $stringlength; $i++ ) 73*b1cdbd2cSJim Jagielski { 74*b1cdbd2cSJim Jagielski $unicodestring = $unicodestring . substr($string, $i, 1); 75*b1cdbd2cSJim Jagielski $unicodestring = $unicodestring . chr(0); 76*b1cdbd2cSJim Jagielski } 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski return $unicodestring; 79*b1cdbd2cSJim Jagielski} 80*b1cdbd2cSJim Jagielski 81*b1cdbd2cSJim Jagielski######################################################################################## 82*b1cdbd2cSJim Jagielski# Replacing the so name in all files with flag PATCH_SO_NAME 83*b1cdbd2cSJim Jagielski######################################################################################## 84*b1cdbd2cSJim Jagielski 85*b1cdbd2cSJim Jagielskisub replace_productname_in_file 86*b1cdbd2cSJim Jagielski{ 87*b1cdbd2cSJim Jagielski my ($sourcepath, $destpath, $variableshashref, $onefilehash, $styles) = @_; 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski my $onefile = installer::files::read_binary_file($sourcepath); 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski # searching for "x" 92*b1cdbd2cSJim Jagielski 93*b1cdbd2cSJim Jagielski my $onestring = "x" . chr(0); 94*b1cdbd2cSJim Jagielski my $replacestring = ""; 95*b1cdbd2cSJim Jagielski for ( my $i = 1; $i <= 80; $i++ ) { $replacestring .= $onestring; } 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("processing PATCH_SO_NAME: %s -> %s\n", $sourcepath, $destpath); 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielski my $productname = $variableshashref->{'PRODUCTNAME'} . " " . $variableshashref->{'PRODUCTVERSION'}; 100*b1cdbd2cSJim Jagielski if ( exists($onefilehash->{'FileDescription'}) ) { $productname = $onefilehash->{'FileDescription'}; } 101*b1cdbd2cSJim Jagielski my $unicode_productname = convert_to_unicode($productname); 102*b1cdbd2cSJim Jagielski 103*b1cdbd2cSJim Jagielski change_length_of_string(\$unicode_productname, $replacestring); 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielski my $found = $onefile =~ s/$replacestring/$unicode_productname/sg; 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski installer::files::save_binary_file($onefile, $destpath); 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim Jagielski return $found; 110*b1cdbd2cSJim Jagielski} 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski######################################################### 113*b1cdbd2cSJim Jagielski# Analyzing files with flag PATCH_SO_NAME 114*b1cdbd2cSJim Jagielski######################################################### 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielskisub resolving_patchsoname_flag 117*b1cdbd2cSJim Jagielski{ 118*b1cdbd2cSJim Jagielski my ($filesarrayref, $variableshashref, $item, $languagestringref) = @_; 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielski my $diritem = lc($item); 121*b1cdbd2cSJim Jagielski 122*b1cdbd2cSJim Jagielski my $replacedirbase = installer::systemactions::create_directories("patchsoname_$diritem", $languagestringref); 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski installer::logger::include_header_into_logfile("$item with flag PATCH_SO_NAME:"); 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) 127*b1cdbd2cSJim Jagielski { 128*b1cdbd2cSJim Jagielski my $onefile = ${$filesarrayref}[$i]; 129*b1cdbd2cSJim Jagielski my $styles = ""; 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } 132*b1cdbd2cSJim Jagielski 133*b1cdbd2cSJim Jagielski if ( $styles =~ /\bPATCH_SO_NAME\b/ ) 134*b1cdbd2cSJim Jagielski { 135*b1cdbd2cSJim Jagielski # Language specific subdirectory 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski my $onelanguage = $onefile->{'specificlanguage'}; 138*b1cdbd2cSJim Jagielski my $filedescription = ""; 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski if ($onelanguage eq "") 141*b1cdbd2cSJim Jagielski { 142*b1cdbd2cSJim Jagielski $onelanguage = "00"; # files without language into directory "00" 143*b1cdbd2cSJim Jagielski } 144*b1cdbd2cSJim Jagielski 145*b1cdbd2cSJim Jagielski my $replacedir = $replacedirbase . $installer::globals::separator . $onelanguage . $installer::globals::separator; 146*b1cdbd2cSJim Jagielski installer::systemactions::create_directory($replacedir); # creating language specific directories 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski # copy files and edit them with the variables defined in the zip.lst 149*b1cdbd2cSJim Jagielski 150*b1cdbd2cSJim Jagielski my $onefilename = $onefile->{'Name'}; 151*b1cdbd2cSJim Jagielski my $sourcepath = $onefile->{'sourcepath'}; 152*b1cdbd2cSJim Jagielski my $destinationpath = $replacedir . $onefilename; 153*b1cdbd2cSJim Jagielski my $movepath = $destinationpath . ".orig"; 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski # if (!(-f $destinationpath)) # do nothing if the file already exists 156*b1cdbd2cSJim Jagielski # { 157*b1cdbd2cSJim Jagielski 158*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("PATCH_SO_NAME: copying '%s' to '%s'\n", $sourcepath, $movepath); 159*b1cdbd2cSJim Jagielski my $copysuccess = installer::systemactions::copy_one_file($sourcepath, $movepath); 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski if ( $copysuccess ) 162*b1cdbd2cSJim Jagielski { 163*b1cdbd2cSJim Jagielski # Now the file can be patch (binary!) 164*b1cdbd2cSJim Jagielski my $found = replace_productname_in_file($movepath, $destinationpath, $variableshashref, $onefile, $styles); 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski if ($found == 0) 167*b1cdbd2cSJim Jagielski { 168*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Did not patch the file %s\n", $destinationpath); 169*b1cdbd2cSJim Jagielski } 170*b1cdbd2cSJim Jagielski else 171*b1cdbd2cSJim Jagielski { 172*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Successfully patched %s, Count: %s\n", 173*b1cdbd2cSJim Jagielski $destinationpath, $found); 174*b1cdbd2cSJim Jagielski } 175*b1cdbd2cSJim Jagielski } 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski # } 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski # Saving the original source, where the file was found 180*b1cdbd2cSJim Jagielski $onefile->{'originalsourcepath'} = $onefile->{'sourcepath'}; 181*b1cdbd2cSJim Jagielski 182*b1cdbd2cSJim Jagielski # Saving the original source, where the file was found 183*b1cdbd2cSJim Jagielski $onefile->{'originalsourcepath'} = $onefile->{'sourcepath'}; 184*b1cdbd2cSJim Jagielski 185*b1cdbd2cSJim Jagielski # Writing the new sourcepath into the hashref, even if it was no copied 186*b1cdbd2cSJim Jagielski 187*b1cdbd2cSJim Jagielski $onefile->{'sourcepath'} = $destinationpath; 188*b1cdbd2cSJim Jagielski } 189*b1cdbd2cSJim Jagielski } 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 192*b1cdbd2cSJim Jagielski} 193*b1cdbd2cSJim Jagielski 194*b1cdbd2cSJim Jagielski1; 195