19780544fSAndrew Rist#**************************************************************
29780544fSAndrew Rist#
39780544fSAndrew Rist#  Licensed to the Apache Software Foundation (ASF) under one
49780544fSAndrew Rist#  or more contributor license agreements.  See the NOTICE file
59780544fSAndrew Rist#  distributed with this work for additional information
69780544fSAndrew Rist#  regarding copyright ownership.  The ASF licenses this file
79780544fSAndrew Rist#  to you under the Apache License, Version 2.0 (the
89780544fSAndrew Rist#  "License"); you may not use this file except in compliance
99780544fSAndrew Rist#  with the License.  You may obtain a copy of the License at
109780544fSAndrew Rist#
119780544fSAndrew Rist#    http://www.apache.org/licenses/LICENSE-2.0
129780544fSAndrew Rist#
139780544fSAndrew Rist#  Unless required by applicable law or agreed to in writing,
149780544fSAndrew Rist#  software distributed under the License is distributed on an
159780544fSAndrew Rist#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169780544fSAndrew Rist#  KIND, either express or implied.  See the License for the
179780544fSAndrew Rist#  specific language governing permissions and limitations
189780544fSAndrew Rist#  under the License.
199780544fSAndrew Rist#
209780544fSAndrew Rist#**************************************************************
219780544fSAndrew Rist
229780544fSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweirpackage installer::scppatchsoname;
25cdf0e10cSrcweir
26cdf0e10cSrcweiruse installer::files;
27cdf0e10cSrcweiruse installer::globals;
28cdf0e10cSrcweiruse installer::logger;
29cdf0e10cSrcweiruse installer::setupscript;
30cdf0e10cSrcweiruse installer::systemactions;
31cdf0e10cSrcweir
32cdf0e10cSrcweir########################################################################################
33cdf0e10cSrcweir# The length of the new string must be identical with the length of the old string
34cdf0e10cSrcweir########################################################################################
35cdf0e10cSrcweir
36cdf0e10cSrcweirsub change_length_of_string
37cdf0e10cSrcweir{
38cdf0e10cSrcweir	my ($newstringref, $oldstring) = @_;
39cdf0e10cSrcweir
40cdf0e10cSrcweir	while ( length($$newstringref) < length($oldstring) )
41cdf0e10cSrcweir	{
42cdf0e10cSrcweir		$$newstringref = $$newstringref . chr(0);
43cdf0e10cSrcweir	}
44cdf0e10cSrcweir}
45cdf0e10cSrcweir
46cdf0e10cSrcweir########################################################################################
47cdf0e10cSrcweir# The length of the new string must be identical with the length of the old string
48cdf0e10cSrcweir########################################################################################
49cdf0e10cSrcweir
50cdf0e10cSrcweirsub change_length_of_string_with_letter
51cdf0e10cSrcweir{
52cdf0e10cSrcweir	my ($newstringref, $oldstring, $onestring) = @_;
53cdf0e10cSrcweir
54cdf0e10cSrcweir	while ( length($$newstringref) < length($oldstring) )
55cdf0e10cSrcweir	{
56cdf0e10cSrcweir		$$newstringref = $$newstringref . $onestring;
57cdf0e10cSrcweir	}
58cdf0e10cSrcweir}
59cdf0e10cSrcweir
60cdf0e10cSrcweir########################################################################################
61cdf0e10cSrcweir# Converting a string to a unicode string
62cdf0e10cSrcweir########################################################################################
63cdf0e10cSrcweir
64cdf0e10cSrcweirsub convert_to_unicode
65cdf0e10cSrcweir{
66cdf0e10cSrcweir	my ($string) = @_;
67cdf0e10cSrcweir
68cdf0e10cSrcweir	my $unicodestring = "";
69cdf0e10cSrcweir
70cdf0e10cSrcweir	my $stringlength = length($string);
71cdf0e10cSrcweir
72cdf0e10cSrcweir	for ( my $i = 0; $i < $stringlength; $i++ )
73cdf0e10cSrcweir	{
74cdf0e10cSrcweir		$unicodestring = $unicodestring . substr($string, $i, 1);
75cdf0e10cSrcweir		$unicodestring = $unicodestring . chr(0);
76cdf0e10cSrcweir	}
77cdf0e10cSrcweir
78cdf0e10cSrcweir	return $unicodestring;
79cdf0e10cSrcweir}
80cdf0e10cSrcweir
81cdf0e10cSrcweir########################################################################################
82cdf0e10cSrcweir# Replacing the so name in all files with flag PATCH_SO_NAME
83cdf0e10cSrcweir########################################################################################
84cdf0e10cSrcweir
85cdf0e10cSrcweirsub replace_productname_in_file
86cdf0e10cSrcweir{
87cdf0e10cSrcweir	my ($sourcepath, $destpath, $variableshashref, $onefilehash, $styles) = @_;
88cdf0e10cSrcweir
89cdf0e10cSrcweir	my $onefile = installer::files::read_binary_file($sourcepath);
90cdf0e10cSrcweir
91cdf0e10cSrcweir	# searching for "x"
92cdf0e10cSrcweir
93cdf0e10cSrcweir	my $onestring = "x" . chr(0);
94cdf0e10cSrcweir	my $replacestring = "";
95cdf0e10cSrcweir	for ( my $i = 1; $i <= 80; $i++ ) { $replacestring .= $onestring; }
96cdf0e10cSrcweir
97*1ba1fd99SAndre Fischer    $installer::logger::Lang->printf("processing PATCH_SO_NAME: %s -> %s\n", $sourcepath, $destpath);
98*1ba1fd99SAndre Fischer
99cdf0e10cSrcweir	my $productname = $variableshashref->{'PRODUCTNAME'} . " " . $variableshashref->{'PRODUCTVERSION'};
100cdf0e10cSrcweir	if ( exists($onefilehash->{'FileDescription'}) ) { $productname = $onefilehash->{'FileDescription'}; }
101cdf0e10cSrcweir	my $unicode_productname = convert_to_unicode($productname);
102cdf0e10cSrcweir
103cdf0e10cSrcweir	change_length_of_string(\$unicode_productname, $replacestring);
104cdf0e10cSrcweir
105dba1a2e4SAndre Fischer	my $found = $onefile =~ s/$replacestring/$unicode_productname/sg;
106cdf0e10cSrcweir
107cdf0e10cSrcweir	installer::files::save_binary_file($onefile, $destpath);
108cdf0e10cSrcweir
109cdf0e10cSrcweir	return $found;
110cdf0e10cSrcweir}
111cdf0e10cSrcweir
112cdf0e10cSrcweir#########################################################
113cdf0e10cSrcweir# Analyzing files with flag PATCH_SO_NAME
114cdf0e10cSrcweir#########################################################
115cdf0e10cSrcweir
116cdf0e10cSrcweirsub resolving_patchsoname_flag
117cdf0e10cSrcweir{
118cdf0e10cSrcweir	my ($filesarrayref, $variableshashref, $item, $languagestringref) = @_;
119cdf0e10cSrcweir
120cdf0e10cSrcweir	my $diritem = lc($item);
121cdf0e10cSrcweir
122cdf0e10cSrcweir	my $replacedirbase = installer::systemactions::create_directories("patchsoname_$diritem", $languagestringref);
123cdf0e10cSrcweir
124cdf0e10cSrcweir	installer::logger::include_header_into_logfile("$item with flag PATCH_SO_NAME:");
125cdf0e10cSrcweir
126cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
127cdf0e10cSrcweir	{
128cdf0e10cSrcweir		my $onefile = ${$filesarrayref}[$i];
129cdf0e10cSrcweir		my $styles = "";
130cdf0e10cSrcweir
131cdf0e10cSrcweir		if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
132cdf0e10cSrcweir
133cdf0e10cSrcweir		if ( $styles =~ /\bPATCH_SO_NAME\b/ )
134cdf0e10cSrcweir		{
135cdf0e10cSrcweir			# Language specific subdirectory
136cdf0e10cSrcweir
137cdf0e10cSrcweir			my $onelanguage = $onefile->{'specificlanguage'};
138cdf0e10cSrcweir            my $filedescription = "";
139cdf0e10cSrcweir
140cdf0e10cSrcweir			if ($onelanguage eq "")
141cdf0e10cSrcweir			{
142cdf0e10cSrcweir				$onelanguage = "00";	# files without language into directory "00"
143cdf0e10cSrcweir			}
144cdf0e10cSrcweir
145cdf0e10cSrcweir			my $replacedir = $replacedirbase . $installer::globals::separator . $onelanguage . $installer::globals::separator;
146cdf0e10cSrcweir			installer::systemactions::create_directory($replacedir);	# creating language specific directories
147cdf0e10cSrcweir
148cdf0e10cSrcweir			# copy files and edit them with the variables defined in the zip.lst
149cdf0e10cSrcweir
150cdf0e10cSrcweir			my $onefilename = $onefile->{'Name'};
151cdf0e10cSrcweir			my $sourcepath = $onefile->{'sourcepath'};
152cdf0e10cSrcweir			my $destinationpath = $replacedir . $onefilename;
153cdf0e10cSrcweir			my $movepath = $destinationpath . ".orig";
154cdf0e10cSrcweir
155cdf0e10cSrcweir			# if (!(-f $destinationpath))	# do nothing if the file already exists
156cdf0e10cSrcweir			# {
157*1ba1fd99SAndre Fischer
158*1ba1fd99SAndre Fischer            $installer::logger::Lang->printf("PATCH_SO_NAME: copying '%s' to '%s'\n", $sourcepath, $movepath);
159cdf0e10cSrcweir			my $copysuccess = installer::systemactions::copy_one_file($sourcepath, $movepath);
160cdf0e10cSrcweir
161cdf0e10cSrcweir			if ( $copysuccess )
162cdf0e10cSrcweir			{
163cdf0e10cSrcweir				# Now the file can be patch (binary!)
164cdf0e10cSrcweir				my $found = replace_productname_in_file($movepath, $destinationpath, $variableshashref, $onefile, $styles);
165cdf0e10cSrcweir
166cdf0e10cSrcweir				if ($found == 0)
167cdf0e10cSrcweir				{
168b274bc22SAndre Fischer					$installer::logger::Lang->printf("Did not patch the file %s\n", $destinationpath);
169cdf0e10cSrcweir				}
170cdf0e10cSrcweir				else
171cdf0e10cSrcweir				{
172b274bc22SAndre Fischer					$installer::logger::Lang->printf("Successfully patched %s, Count: %s\n",
173b274bc22SAndre Fischer                        $destinationpath, $found);
174cdf0e10cSrcweir				}
175cdf0e10cSrcweir			}
176cdf0e10cSrcweir
177cdf0e10cSrcweir			# }
178cdf0e10cSrcweir
179cdf0e10cSrcweir			# Saving the original source, where the file was found
180cdf0e10cSrcweir			$onefile->{'originalsourcepath'} = $onefile->{'sourcepath'};
181cdf0e10cSrcweir
182cdf0e10cSrcweir			# Saving the original source, where the file was found
183cdf0e10cSrcweir			$onefile->{'originalsourcepath'} = $onefile->{'sourcepath'};
184cdf0e10cSrcweir
185cdf0e10cSrcweir			# Writing the new sourcepath into the hashref, even if it was no copied
186cdf0e10cSrcweir
187cdf0e10cSrcweir			$onefile->{'sourcepath'} = $destinationpath;
188cdf0e10cSrcweir		}
189cdf0e10cSrcweir	}
190cdf0e10cSrcweir
191b274bc22SAndre Fischer	$installer::logger::Lang->print("\n");
192cdf0e10cSrcweir}
193cdf0e10cSrcweir
194cdf0e10cSrcweir1;
195