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::files;
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielskiuse installer::exiter;
27*b1cdbd2cSJim Jagielskiuse installer::logger;
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski############################################
30*b1cdbd2cSJim Jagielski# File Operations
31*b1cdbd2cSJim Jagielski############################################
32*b1cdbd2cSJim Jagielski
33*b1cdbd2cSJim Jagielskisub check_file
34*b1cdbd2cSJim Jagielski{
35*b1cdbd2cSJim Jagielski	my ($arg) = @_;
36*b1cdbd2cSJim Jagielski
37*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::check_file : $arg"); }
38*b1cdbd2cSJim Jagielski
39*b1cdbd2cSJim Jagielski	if(!( -f $arg ))
40*b1cdbd2cSJim Jagielski	{
41*b1cdbd2cSJim Jagielski		installer::exiter::exit_program("ERROR: Cannot find file $arg", "check_file");
42*b1cdbd2cSJim Jagielski	}
43*b1cdbd2cSJim Jagielski}
44*b1cdbd2cSJim Jagielski
45*b1cdbd2cSJim Jagielskisub read_file
46*b1cdbd2cSJim Jagielski{
47*b1cdbd2cSJim Jagielski	my ($localfile) = @_;
48*b1cdbd2cSJim Jagielski	my @localfile = ();
49*b1cdbd2cSJim Jagielski
50*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::read_file : $localfile"); }
51*b1cdbd2cSJim Jagielski
52*b1cdbd2cSJim Jagielski	open( IN, "<$localfile" ) || installer::exiter::exit_program("ERROR: Cannot open file $localfile for reading", "read_file");
53*b1cdbd2cSJim Jagielski
54*b1cdbd2cSJim Jagielski#	Don't use "my @localfile = <IN>" here, because
55*b1cdbd2cSJim Jagielski#	perl has a problem with the internal "large_and_huge_malloc" function
56*b1cdbd2cSJim Jagielski#	when calling perl using MacOS 10.5 with a perl built with MacOS 10.4
57*b1cdbd2cSJim Jagielski	while ( $line = <IN> ) {
58*b1cdbd2cSJim Jagielski		push @localfile, $line;
59*b1cdbd2cSJim Jagielski	}
60*b1cdbd2cSJim Jagielski
61*b1cdbd2cSJim Jagielski	close( IN );
62*b1cdbd2cSJim Jagielski
63*b1cdbd2cSJim Jagielski	return \@localfile;
64*b1cdbd2cSJim Jagielski}
65*b1cdbd2cSJim Jagielski
66*b1cdbd2cSJim Jagielski###########################################
67*b1cdbd2cSJim Jagielski# Saving files, arrays and hashes
68*b1cdbd2cSJim Jagielski###########################################
69*b1cdbd2cSJim Jagielski
70*b1cdbd2cSJim Jagielskisub save_file
71*b1cdbd2cSJim Jagielski{
72*b1cdbd2cSJim Jagielski	my ($savefile, $savecontent) = @_;
73*b1cdbd2cSJim Jagielski
74*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::save_file : $savefile : $#{$savecontent}"); }
75*b1cdbd2cSJim Jagielski
76*b1cdbd2cSJim Jagielski	if ( open( OUT, ">$savefile" ) )
77*b1cdbd2cSJim Jagielski	{
78*b1cdbd2cSJim Jagielski		print OUT @{$savecontent};
79*b1cdbd2cSJim Jagielski		close( OUT);
80*b1cdbd2cSJim Jagielski	}
81*b1cdbd2cSJim Jagielski	else
82*b1cdbd2cSJim Jagielski	{
83*b1cdbd2cSJim Jagielski		# it is useless to save a log file, if there is no write access
84*b1cdbd2cSJim Jagielski
85*b1cdbd2cSJim Jagielski		if ( $savefile =~ /\.log/ )
86*b1cdbd2cSJim Jagielski		{
87*b1cdbd2cSJim Jagielski			print "*************************************************\n";
88*b1cdbd2cSJim Jagielski			print "ERROR: Cannot write log file: $savefile";
89*b1cdbd2cSJim Jagielski			print "*************************************************\n";
90*b1cdbd2cSJim Jagielski			exit(-1);	# exiting the program to avoid endless loops
91*b1cdbd2cSJim Jagielski		}
92*b1cdbd2cSJim Jagielski
93*b1cdbd2cSJim Jagielski		installer::exiter::exit_program("ERROR: Cannot open file $savefile for writing", "save_file");
94*b1cdbd2cSJim Jagielski	}
95*b1cdbd2cSJim Jagielski}
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielskisub save_hash
98*b1cdbd2cSJim Jagielski{
99*b1cdbd2cSJim Jagielski	my ($savefile, $hashref) = @_;
100*b1cdbd2cSJim Jagielski
101*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::save_hash : $savefile"); }
102*b1cdbd2cSJim Jagielski
103*b1cdbd2cSJim Jagielski	my @printcontent = ();
104*b1cdbd2cSJim Jagielski
105*b1cdbd2cSJim Jagielski	my $itemkey;
106*b1cdbd2cSJim Jagielski
107*b1cdbd2cSJim Jagielski	foreach $itemkey ( keys %{$hashref} )
108*b1cdbd2cSJim Jagielski	{
109*b1cdbd2cSJim Jagielski		my $line = "";
110*b1cdbd2cSJim Jagielski		my $itemvalue = $hashref->{$itemkey};
111*b1cdbd2cSJim Jagielski		$line = $itemkey . "=" . $itemvalue . "\n";
112*b1cdbd2cSJim Jagielski		push(@printcontent, $line);
113*b1cdbd2cSJim Jagielski	}
114*b1cdbd2cSJim Jagielski
115*b1cdbd2cSJim Jagielski	open( OUT, ">$savefile" ) || installer::exiter::exit_program("ERROR: Cannot open file $savefile for writing", "save_hash");
116*b1cdbd2cSJim Jagielski	print OUT @printcontent;
117*b1cdbd2cSJim Jagielski	close( OUT);
118*b1cdbd2cSJim Jagielski}
119*b1cdbd2cSJim Jagielski
120*b1cdbd2cSJim Jagielskisub save_array_of_hashes
121*b1cdbd2cSJim Jagielski{
122*b1cdbd2cSJim Jagielski	my ($savefile, $arrayref) = @_;
123*b1cdbd2cSJim Jagielski
124*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::save_array_of_hashes : $savefile : $#{$arrayref}"); }
125*b1cdbd2cSJim Jagielski
126*b1cdbd2cSJim Jagielski	my @printcontent = ();
127*b1cdbd2cSJim Jagielski
128*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$arrayref}; $i++ )
129*b1cdbd2cSJim Jagielski	{
130*b1cdbd2cSJim Jagielski		my $line = "";
131*b1cdbd2cSJim Jagielski		my $hashref = ${$arrayref}[$i];
132*b1cdbd2cSJim Jagielski		my $itemkey;
133*b1cdbd2cSJim Jagielski
134*b1cdbd2cSJim Jagielski		foreach $itemkey ( keys %{$hashref} )
135*b1cdbd2cSJim Jagielski		{
136*b1cdbd2cSJim Jagielski			my $itemvalue = $hashref->{$itemkey};
137*b1cdbd2cSJim Jagielski			$line = $line . $itemkey . "=" . $itemvalue . "\t";
138*b1cdbd2cSJim Jagielski		}
139*b1cdbd2cSJim Jagielski
140*b1cdbd2cSJim Jagielski		$line = $line . "\n";
141*b1cdbd2cSJim Jagielski
142*b1cdbd2cSJim Jagielski		push(@printcontent, $line);
143*b1cdbd2cSJim Jagielski	}
144*b1cdbd2cSJim Jagielski
145*b1cdbd2cSJim Jagielski	open( OUT, ">$savefile" ) || installer::exiter::exit_program("ERROR: Cannot open file $savefile for writing", "save_array_of_hashes");
146*b1cdbd2cSJim Jagielski	print OUT @printcontent;
147*b1cdbd2cSJim Jagielski	close( OUT);
148*b1cdbd2cSJim Jagielski}
149*b1cdbd2cSJim Jagielski
150*b1cdbd2cSJim Jagielskisub save_array_of_hashes_modules
151*b1cdbd2cSJim Jagielski{
152*b1cdbd2cSJim Jagielski	my ($savefile, $arrayref) = @_;
153*b1cdbd2cSJim Jagielski
154*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::save_array_of_hashes : $savefile : $#{$arrayref}"); }
155*b1cdbd2cSJim Jagielski
156*b1cdbd2cSJim Jagielski	my @printcontent = ();
157*b1cdbd2cSJim Jagielski
158*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$arrayref}; $i++ )
159*b1cdbd2cSJim Jagielski	{
160*b1cdbd2cSJim Jagielski		my $line = "***************************************************\n";
161*b1cdbd2cSJim Jagielski		my $hashref = ${$arrayref}[$i];
162*b1cdbd2cSJim Jagielski		my $itemkey;
163*b1cdbd2cSJim Jagielski
164*b1cdbd2cSJim Jagielski		foreach $itemkey ( keys %{$hashref} )
165*b1cdbd2cSJim Jagielski		{
166*b1cdbd2cSJim Jagielski			my $itemvalue = $hashref->{$itemkey};
167*b1cdbd2cSJim Jagielski			$line = $line . $itemkey . "=" . $itemvalue . "\n";
168*b1cdbd2cSJim Jagielski		}
169*b1cdbd2cSJim Jagielski
170*b1cdbd2cSJim Jagielski		$line = $line . "\n";
171*b1cdbd2cSJim Jagielski
172*b1cdbd2cSJim Jagielski		push(@printcontent, $line);
173*b1cdbd2cSJim Jagielski	}
174*b1cdbd2cSJim Jagielski
175*b1cdbd2cSJim Jagielski	open( OUT, ">$savefile" ) || installer::exiter::exit_program("ERROR: Cannot open file $savefile for writing", "save_array_of_hashes");
176*b1cdbd2cSJim Jagielski	print OUT @printcontent;
177*b1cdbd2cSJim Jagielski	close( OUT);
178*b1cdbd2cSJim Jagielski}
179*b1cdbd2cSJim Jagielski
180*b1cdbd2cSJim Jagielski###########################################
181*b1cdbd2cSJim Jagielski# Binary file operations
182*b1cdbd2cSJim Jagielski###########################################
183*b1cdbd2cSJim Jagielski
184*b1cdbd2cSJim Jagielskisub read_binary_file
185*b1cdbd2cSJim Jagielski{
186*b1cdbd2cSJim Jagielski	my ($filename) = @_;
187*b1cdbd2cSJim Jagielski
188*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::read_binary_file : $filename"); }
189*b1cdbd2cSJim Jagielski
190*b1cdbd2cSJim Jagielski	my $file;
191*b1cdbd2cSJim Jagielski
192*b1cdbd2cSJim Jagielski	open( IN, "<$filename" ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for reading", "read_binary_file");
193*b1cdbd2cSJim Jagielski	binmode IN;
194*b1cdbd2cSJim Jagielski	seek IN, 0, 2;
195*b1cdbd2cSJim Jagielski	my $length = tell IN;
196*b1cdbd2cSJim Jagielski	seek IN, 0, 0;
197*b1cdbd2cSJim Jagielski	read IN, $file, $length;
198*b1cdbd2cSJim Jagielski	close IN;
199*b1cdbd2cSJim Jagielski
200*b1cdbd2cSJim Jagielski	return $file;
201*b1cdbd2cSJim Jagielski}
202*b1cdbd2cSJim Jagielski
203*b1cdbd2cSJim Jagielskisub save_binary_file
204*b1cdbd2cSJim Jagielski{
205*b1cdbd2cSJim Jagielski	my ($file, $filename) = @_;
206*b1cdbd2cSJim Jagielski
207*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::save_binary_file : $filename"); }
208*b1cdbd2cSJim Jagielski
209*b1cdbd2cSJim Jagielski	open( OUT, ">$filename" ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for writing", "save_binary_file");
210*b1cdbd2cSJim Jagielski	binmode OUT;
211*b1cdbd2cSJim Jagielski	print OUT $file;
212*b1cdbd2cSJim Jagielski	close OUT;
213*b1cdbd2cSJim Jagielski}
214*b1cdbd2cSJim Jagielski
215*b1cdbd2cSJim Jagielski1;
216