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