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::configuration;
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielskiuse Cwd;
27*b1cdbd2cSJim Jagielskiuse installer::converter;
28*b1cdbd2cSJim Jagielskiuse installer::existence;
29*b1cdbd2cSJim Jagielskiuse installer::exiter;
30*b1cdbd2cSJim Jagielskiuse installer::files;
31*b1cdbd2cSJim Jagielskiuse installer::globals;
32*b1cdbd2cSJim Jagielskiuse installer::logger;
33*b1cdbd2cSJim Jagielskiuse installer::remover;
34*b1cdbd2cSJim Jagielskiuse installer::systemactions;
35*b1cdbd2cSJim Jagielski
36*b1cdbd2cSJim Jagielski################################################################################
37*b1cdbd2cSJim Jagielski# Getting package from configurationitem (for instance: org.openoffice.Office)
38*b1cdbd2cSJim Jagielski# Getting name from configurationitem (for instance: Common)
39*b1cdbd2cSJim Jagielski################################################################################
40*b1cdbd2cSJim Jagielski
41*b1cdbd2cSJim Jagielskisub analyze_path_of_configurationitem
42*b1cdbd2cSJim Jagielski{
43*b1cdbd2cSJim Jagielski	my ($configurationitemsref) = @_;
44*b1cdbd2cSJim Jagielski
45*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::analyze_path_of_configurationitem : $#{$configurationitemsref}"); }
46*b1cdbd2cSJim Jagielski
47*b1cdbd2cSJim Jagielski	my ($startpath, $nodes, $name, $packagename, $onenode, $first, $second, $third, $bracketnode);
48*b1cdbd2cSJim Jagielski
49*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$configurationitemsref}; $i++ )
50*b1cdbd2cSJim Jagielski	{
51*b1cdbd2cSJim Jagielski		my $oneconfig = ${$configurationitemsref}[$i];
52*b1cdbd2cSJim Jagielski		my $path = $oneconfig->{'Path'};
53*b1cdbd2cSJim Jagielski
54*b1cdbd2cSJim Jagielski		installer::remover::remove_leading_and_ending_slashes(\$path);	# in scp are some path beginning with "/"
55*b1cdbd2cSJim Jagielski
56*b1cdbd2cSJim Jagielski		if ( $path =~ /^\s*(.*?)\/(.*)\s*$/ )
57*b1cdbd2cSJim Jagielski		{
58*b1cdbd2cSJim Jagielski			$startpath = $1;
59*b1cdbd2cSJim Jagielski			$nodes = $2;
60*b1cdbd2cSJim Jagielski		}
61*b1cdbd2cSJim Jagielski		else
62*b1cdbd2cSJim Jagielski		{
63*b1cdbd2cSJim Jagielski			installer::exiter::exit_program("ERROR: Unknown format of ConfigurationItem path: $path", "analyze_path_of_configurationitem");
64*b1cdbd2cSJim Jagielski		}
65*b1cdbd2cSJim Jagielski
66*b1cdbd2cSJim Jagielski		# Startpath is now: org.openoffice.Setup
67*b1cdbd2cSJim Jagielski		# Nodes is now: Office/Factories/com.sun.star.chart.ChartDocument
68*b1cdbd2cSJim Jagielski
69*b1cdbd2cSJim Jagielski		# Dividing the startpath into package (org.openoffic) and name (Setup).
70*b1cdbd2cSJim Jagielski
71*b1cdbd2cSJim Jagielski		$oneconfig->{'startpath'} = $startpath;	# saving the startpath into the hash
72*b1cdbd2cSJim Jagielski
73*b1cdbd2cSJim Jagielski		if ( $startpath =~ /^\s*(\S*)\.(\S*?)\s*$/ )
74*b1cdbd2cSJim Jagielski		{
75*b1cdbd2cSJim Jagielski			$packagename = $1;
76*b1cdbd2cSJim Jagielski			$name = $2;
77*b1cdbd2cSJim Jagielski			$oneconfig->{'name'} = $name;
78*b1cdbd2cSJim Jagielski			$oneconfig->{'packagename'} = $packagename;
79*b1cdbd2cSJim Jagielski		}
80*b1cdbd2cSJim Jagielski		else
81*b1cdbd2cSJim Jagielski		{
82*b1cdbd2cSJim Jagielski			installer::exiter::exit_program("ERROR: Unknown format of ConfigurationItem startpath: $startpath", "analyze_path_of_configurationitem");
83*b1cdbd2cSJim Jagielski		}
84*b1cdbd2cSJim Jagielski
85*b1cdbd2cSJim Jagielski		# Collecting all nodes
86*b1cdbd2cSJim Jagielski
87*b1cdbd2cSJim Jagielski		installer::remover::remove_leading_and_ending_slashes(\$nodes);
88*b1cdbd2cSJim Jagielski
89*b1cdbd2cSJim Jagielski		my $counter = 1;
90*b1cdbd2cSJim Jagielski
91*b1cdbd2cSJim Jagielski		# Attention: Do not trust the slash
92*b1cdbd2cSJim Jagielski		# Filters/Filter['StarWriter 5.0 Vorlage/Template']
93*b1cdbd2cSJim Jagielski		# Menus/New/*['m10']/Title
94*b1cdbd2cSJim Jagielski
95*b1cdbd2cSJim Jagielski		if ( $nodes =~ /^(.*\[\')(.*\/.*)(\'\].*)$/ )
96*b1cdbd2cSJim Jagielski		{
97*b1cdbd2cSJim Jagielski			$first = $1;
98*b1cdbd2cSJim Jagielski			$second = $2;
99*b1cdbd2cSJim Jagielski			$third = $3;
100*b1cdbd2cSJim Jagielski
101*b1cdbd2cSJim Jagielski			$second =~ s/\//SUBSTITUTEDSLASH/g;	# substituting "/" to "SUBSTITUTEDSLASH"
102*b1cdbd2cSJim Jagielski			$nodes = $first . $second . $third;
103*b1cdbd2cSJim Jagielski		}
104*b1cdbd2cSJim Jagielski
105*b1cdbd2cSJim Jagielski		while ( $nodes =~ /\// )
106*b1cdbd2cSJim Jagielski		{
107*b1cdbd2cSJim Jagielski			if ($nodes =~ /^\s*(.*?)\/(.*)\s*$/ )
108*b1cdbd2cSJim Jagielski			{
109*b1cdbd2cSJim Jagielski				$onenode = $1;
110*b1cdbd2cSJim Jagielski				$nodes = $2;
111*b1cdbd2cSJim Jagielski				$nodename = "node". $counter;
112*b1cdbd2cSJim Jagielski
113*b1cdbd2cSJim Jagielski				# Special handling for filters. Difference between:
114*b1cdbd2cSJim Jagielski				# Filter['StarWriter 5.0 Vorlage/Template']	without oor:op="replace"
115*b1cdbd2cSJim Jagielski				# *['m10'] with oor:op="replace"
116*b1cdbd2cSJim Jagielski
117*b1cdbd2cSJim Jagielski				if ( $onenode =~ /^\s*Filter\[\'(.*)\'\].*$/ ) { $oneconfig->{'isfilter'} = 1; }
118*b1cdbd2cSJim Jagielski
119*b1cdbd2cSJim Jagielski				# Changing the nodes with brackets:
120*b1cdbd2cSJim Jagielski				# Filter['StarWriter 5.0 Vorlage/Template']
121*b1cdbd2cSJim Jagielski				# *['m10']
122*b1cdbd2cSJim Jagielski
123*b1cdbd2cSJim Jagielski				if ( $onenode =~ /^.*\[\'(.*)\'\].*$/ )
124*b1cdbd2cSJim Jagielski				{
125*b1cdbd2cSJim Jagielski					$onenode = $1;
126*b1cdbd2cSJim Jagielski					$bracketnode = "bracket_" . $nodename;
127*b1cdbd2cSJim Jagielski					$oneconfig->{$bracketnode} = 1;
128*b1cdbd2cSJim Jagielski				}
129*b1cdbd2cSJim Jagielski
130*b1cdbd2cSJim Jagielski				$onenode =~ s/SUBSTITUTEDSLASH/\//g;	# substituting "SUBSTITUTEDSLASH" to "/"
131*b1cdbd2cSJim Jagielski				$oneconfig->{$nodename} = $onenode;
132*b1cdbd2cSJim Jagielski
133*b1cdbd2cSJim Jagielski				# special handling for nodes "Factories"
134*b1cdbd2cSJim Jagielski
135*b1cdbd2cSJim Jagielski				if ( $onenode eq "Factories" ) { $oneconfig->{'factoriesnode'} = $counter; }
136*b1cdbd2cSJim Jagielski				else { $oneconfig->{'factoriesnode'} = -99; }
137*b1cdbd2cSJim Jagielski			}
138*b1cdbd2cSJim Jagielski
139*b1cdbd2cSJim Jagielski			$counter++
140*b1cdbd2cSJim Jagielski		}
141*b1cdbd2cSJim Jagielski
142*b1cdbd2cSJim Jagielski		# and the final node
143*b1cdbd2cSJim Jagielski
144*b1cdbd2cSJim Jagielski		if ( $nodes =~ /^\s*Filter\[\'(.*)\'\].*$/ ) { $oneconfig->{'isfilter'} = 1; }
145*b1cdbd2cSJim Jagielski
146*b1cdbd2cSJim Jagielski		$nodename = "node". $counter;
147*b1cdbd2cSJim Jagielski
148*b1cdbd2cSJim Jagielski		if ( $nodes =~ /^.*\[\'(.*)\'\].*$/ )
149*b1cdbd2cSJim Jagielski		{
150*b1cdbd2cSJim Jagielski			$nodes = $1;
151*b1cdbd2cSJim Jagielski			$bracketnode = "bracket_" . $nodename;
152*b1cdbd2cSJim Jagielski			$oneconfig->{$bracketnode} = 1;
153*b1cdbd2cSJim Jagielski		}
154*b1cdbd2cSJim Jagielski
155*b1cdbd2cSJim Jagielski		$nodes =~ s/SUBSTITUTEDSLASH/\//g;	# substituting "SUBSTITUTEDSLASH" to "/"
156*b1cdbd2cSJim Jagielski
157*b1cdbd2cSJim Jagielski		if (($nodes eq "Name") || ($nodes eq "Title"))	# isocodes below "Name" or "Title"
158*b1cdbd2cSJim Jagielski		{
159*b1cdbd2cSJim Jagielski			# if the last node $nodes is "Name" or "Title", it is a Property, not a name! See Common.xcu
160*b1cdbd2cSJim Jagielski
161*b1cdbd2cSJim Jagielski			$oneconfig->{'isisocode'} = 1;
162*b1cdbd2cSJim Jagielski
163*b1cdbd2cSJim Jagielski			if ( $nodes eq "Name" ) { $oneconfig->{'isname'} = 1; }
164*b1cdbd2cSJim Jagielski			if ( $nodes eq "Title" ) { $oneconfig->{'istitle'} = 1;	}
165*b1cdbd2cSJim Jagielski			$counter--;		# decreasing the counter, because "Name" and "Title" are no nodes
166*b1cdbd2cSJim Jagielski		}
167*b1cdbd2cSJim Jagielski		else
168*b1cdbd2cSJim Jagielski		{
169*b1cdbd2cSJim Jagielski			$oneconfig->{$nodename} = $nodes;
170*b1cdbd2cSJim Jagielski			$oneconfig->{'isisocode'} = 0;
171*b1cdbd2cSJim Jagielski		}
172*b1cdbd2cSJim Jagielski
173*b1cdbd2cSJim Jagielski		# special handling for nodes "Factories"
174*b1cdbd2cSJim Jagielski
175*b1cdbd2cSJim Jagielski		if ( $onenode eq "Factories" ) { $oneconfig->{'factoriesnode'} = $counter; }
176*b1cdbd2cSJim Jagielski		else { $oneconfig->{'factoriesnode'} = -99; }
177*b1cdbd2cSJim Jagielski
178*b1cdbd2cSJim Jagielski		# saving the number of nodes
179*b1cdbd2cSJim Jagielski
180*b1cdbd2cSJim Jagielski		$oneconfig->{'nodenumber'} = $counter;
181*b1cdbd2cSJim Jagielski	}
182*b1cdbd2cSJim Jagielski}
183*b1cdbd2cSJim Jagielski
184*b1cdbd2cSJim Jagielski####################################################################
185*b1cdbd2cSJim Jagielski# Inserting the start block into a configuration file
186*b1cdbd2cSJim Jagielski####################################################################
187*b1cdbd2cSJim Jagielski
188*b1cdbd2cSJim Jagielskisub insert_start_block_into_configfile
189*b1cdbd2cSJim Jagielski{
190*b1cdbd2cSJim Jagielski	my ($configfileref, $oneconfig) = @_;
191*b1cdbd2cSJim Jagielski
192*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::insert_start_block_into_configfile : $#{$configfileref} : $oneconfig->{'name'}"); }
193*b1cdbd2cSJim Jagielski
194*b1cdbd2cSJim Jagielski	my $line = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
195*b1cdbd2cSJim Jagielski	push( @{$configfileref}, $line);
196*b1cdbd2cSJim Jagielski
197*b1cdbd2cSJim Jagielski	$line = '<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:install="http://openoffice.org/2004/installation" oor:name="FILENAME" oor:package="PACKAGENAME">' . "\n";
198*b1cdbd2cSJim Jagielski	my $packagename = $oneconfig->{'packagename'};
199*b1cdbd2cSJim Jagielski	my $name = $oneconfig->{'name'};
200*b1cdbd2cSJim Jagielski	$line =~ s/PACKAGENAME/$packagename/g;
201*b1cdbd2cSJim Jagielski	$line =~ s/FILENAME/$name/g;
202*b1cdbd2cSJim Jagielski	push( @{$configfileref}, $line);
203*b1cdbd2cSJim Jagielski
204*b1cdbd2cSJim Jagielski	$line = "\n";
205*b1cdbd2cSJim Jagielski	push( @{$configfileref}, $line);
206*b1cdbd2cSJim Jagielski}
207*b1cdbd2cSJim Jagielski
208*b1cdbd2cSJim Jagielski####################################################################
209*b1cdbd2cSJim Jagielski# Inserting the end block into a configuration file
210*b1cdbd2cSJim Jagielski####################################################################
211*b1cdbd2cSJim Jagielski
212*b1cdbd2cSJim Jagielskisub insert_end_block_into_configfile
213*b1cdbd2cSJim Jagielski{
214*b1cdbd2cSJim Jagielski	my ($configfileref) = @_;
215*b1cdbd2cSJim Jagielski
216*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::insert_end_block_into_configfile : $#{$configfileref}"); }
217*b1cdbd2cSJim Jagielski
218*b1cdbd2cSJim Jagielski	my $line = "\n" . '</oor:component-data>' . "\n";
219*b1cdbd2cSJim Jagielski	push( @{$configfileref}, $line);
220*b1cdbd2cSJim Jagielski}
221*b1cdbd2cSJim Jagielski
222*b1cdbd2cSJim Jagielski##############################################################
223*b1cdbd2cSJim Jagielski# Getting the content of a node
224*b1cdbd2cSJim Jagielski##############################################################
225*b1cdbd2cSJim Jagielski
226*b1cdbd2cSJim Jagielskisub get_node_content
227*b1cdbd2cSJim Jagielski{
228*b1cdbd2cSJim Jagielski	my ($nodeline) = @_;
229*b1cdbd2cSJim Jagielski
230*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::get_node_content : $nodeline"); }
231*b1cdbd2cSJim Jagielski
232*b1cdbd2cSJim Jagielski	my $content = "";
233*b1cdbd2cSJim Jagielski
234*b1cdbd2cSJim Jagielski	if ( $nodeline =~ /name\=\"(.*?)\"/ )
235*b1cdbd2cSJim Jagielski	{
236*b1cdbd2cSJim Jagielski		$content = $1;
237*b1cdbd2cSJim Jagielski	}
238*b1cdbd2cSJim Jagielski	else
239*b1cdbd2cSJim Jagielski	{
240*b1cdbd2cSJim Jagielski		installer::exiter::exit_program("ERROR: Impossible error in function get_node_content!", "get_node_content");
241*b1cdbd2cSJim Jagielski	}
242*b1cdbd2cSJim Jagielski
243*b1cdbd2cSJim Jagielski	return \$content;
244*b1cdbd2cSJim Jagielski}
245*b1cdbd2cSJim Jagielski
246*b1cdbd2cSJim Jagielski##############################################################
247*b1cdbd2cSJim Jagielski# Getting the line number of an existing node
248*b1cdbd2cSJim Jagielski# Return "-1" if node does not exist
249*b1cdbd2cSJim Jagielski##############################################################
250*b1cdbd2cSJim Jagielski
251*b1cdbd2cSJim Jagielskisub get_node_line_number
252*b1cdbd2cSJim Jagielski{
253*b1cdbd2cSJim Jagielski	my ($nodecount, $oneconfig, $oneconfigfileref) = @_;
254*b1cdbd2cSJim Jagielski
255*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::get_node_line_number : $nodecount : $oneconfig->{'name'} : $#{$oneconfigfileref}"); }
256*b1cdbd2cSJim Jagielski
257*b1cdbd2cSJim Jagielski	my $linenumber = -1;	# the node does not exists, if returnvalue is "-1"
258*b1cdbd2cSJim Jagielski
259*b1cdbd2cSJim Jagielski	# Attention: Take care of the two title nodes:
260*b1cdbd2cSJim Jagielski	# Path=org.openoffice.Office.Common/Menus/Wizard/*['m14']/Title
261*b1cdbd2cSJim Jagielski	# Path=org.openoffice.Office.Common/Menus/Wizard/*['m15']/Title
262*b1cdbd2cSJim Jagielski	# -> every subnode has to be identical
263*b1cdbd2cSJim Jagielski
264*b1cdbd2cSJim Jagielski	# creating the allnodes string from $oneconfig
265*b1cdbd2cSJim Jagielski
266*b1cdbd2cSJim Jagielski	my $allnodes = "";
267*b1cdbd2cSJim Jagielski
268*b1cdbd2cSJim Jagielski	for ( my $i = 1; $i <= $nodecount; $i++ )
269*b1cdbd2cSJim Jagielski	{
270*b1cdbd2cSJim Jagielski		my $nodename = "node" . $i;
271*b1cdbd2cSJim Jagielski		$allnodes .= $oneconfig->{$nodename} . "/";
272*b1cdbd2cSJim Jagielski	}
273*b1cdbd2cSJim Jagielski
274*b1cdbd2cSJim Jagielski	installer::remover::remove_leading_and_ending_slashes(\$allnodes);	# exactly this string has to be found  in the following iteration
275*b1cdbd2cSJim Jagielski
276*b1cdbd2cSJim Jagielski	# Iterating over the already built configuration file
277*b1cdbd2cSJim Jagielski
278*b1cdbd2cSJim Jagielski	my @allnodes = ();
279*b1cdbd2cSJim Jagielski
280*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$oneconfigfileref}; $i++ )
281*b1cdbd2cSJim Jagielski	{
282*b1cdbd2cSJim Jagielski		my $line = ${$oneconfigfileref}[$i];
283*b1cdbd2cSJim Jagielski		installer::remover::remove_leading_and_ending_whitespaces(\$line);
284*b1cdbd2cSJim Jagielski		my $nodechanged = 0;
285*b1cdbd2cSJim Jagielski
286*b1cdbd2cSJim Jagielski		if ( $line =~ /^\s*\<node/ )	# opening node
287*b1cdbd2cSJim Jagielski		{
288*b1cdbd2cSJim Jagielski			$nodechanged = 1;
289*b1cdbd2cSJim Jagielski			my $nodecontentref = get_node_content($line);
290*b1cdbd2cSJim Jagielski			push(@allnodes, $$nodecontentref);	# collecting all nodes in an array
291*b1cdbd2cSJim Jagielski		}
292*b1cdbd2cSJim Jagielski
293*b1cdbd2cSJim Jagielski		if ( $line =~ /^\s*\<\/node/ )	# ending node
294*b1cdbd2cSJim Jagielski		{
295*b1cdbd2cSJim Jagielski			$nodechanged = 1;
296*b1cdbd2cSJim Jagielski			pop(@allnodes);		# removing the last node from the array
297*b1cdbd2cSJim Jagielski		}
298*b1cdbd2cSJim Jagielski
299*b1cdbd2cSJim Jagielski		if (( $nodechanged ) && ($#allnodes > -1))	# a node was found and the node array is not empty
300*b1cdbd2cSJim Jagielski		{
301*b1cdbd2cSJim Jagielski			# creating the string to compare with the string $allnodes
302*b1cdbd2cSJim Jagielski
303*b1cdbd2cSJim Jagielski			my $nodestring = "";
304*b1cdbd2cSJim Jagielski
305*b1cdbd2cSJim Jagielski			for ( my $j = 0; $j <= $#allnodes; $j++ )
306*b1cdbd2cSJim Jagielski			{
307*b1cdbd2cSJim Jagielski				$nodestring .= $allnodes[$j] . "/";
308*b1cdbd2cSJim Jagielski			}
309*b1cdbd2cSJim Jagielski
310*b1cdbd2cSJim Jagielski			installer::remover::remove_leading_and_ending_slashes(\$nodestring);
311*b1cdbd2cSJim Jagielski
312*b1cdbd2cSJim Jagielski			if ( $nodestring eq $allnodes )
313*b1cdbd2cSJim Jagielski			{
314*b1cdbd2cSJim Jagielski				# that is exactly the same node
315*b1cdbd2cSJim Jagielski
316*b1cdbd2cSJim Jagielski				$linenumber = $i;
317*b1cdbd2cSJim Jagielski				$linenumber++;	# increasing the linenumber
318*b1cdbd2cSJim Jagielski				last;
319*b1cdbd2cSJim Jagielski
320*b1cdbd2cSJim Jagielski			}
321*b1cdbd2cSJim Jagielski		}
322*b1cdbd2cSJim Jagielski	}
323*b1cdbd2cSJim Jagielski
324*b1cdbd2cSJim Jagielski	return $linenumber;
325*b1cdbd2cSJim Jagielski}
326*b1cdbd2cSJim Jagielski
327*b1cdbd2cSJim Jagielski##############################################################
328*b1cdbd2cSJim Jagielski# Inserting one configurationitem into the configurationfile
329*b1cdbd2cSJim Jagielski##############################################################
330*b1cdbd2cSJim Jagielski
331*b1cdbd2cSJim Jagielskisub insert_into_config_file
332*b1cdbd2cSJim Jagielski{
333*b1cdbd2cSJim Jagielski	my ($oneconfig, $oneconfigfileref) = @_;
334*b1cdbd2cSJim Jagielski
335*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::insert_into_config_file : $oneconfig->{'nodenumber'} : $#{$oneconfigfileref}"); }
336*b1cdbd2cSJim Jagielski
337*b1cdbd2cSJim Jagielski	my ($nodename, $nodecontent, $newnodeline, $bracketkey, $line, $insertline);
338*b1cdbd2cSJim Jagielski
339*b1cdbd2cSJim Jagielski	# interpreting the nodes, keys and values
340*b1cdbd2cSJim Jagielski
341*b1cdbd2cSJim Jagielski	my $nodeline = '<node oor:name="NODECONTENT" REPLACEPART >' . "\n";
342*b1cdbd2cSJim Jagielski	my $propline = '<prop oor:name="KEYCONTENT" REPLACEPART TYPEPART>' . "\n";
343*b1cdbd2cSJim Jagielski	my $valueline = '<value SEPARATORPART>VALUECONTENT</value>' . "\n";
344*b1cdbd2cSJim Jagielski	my $langvalueline = '<value xml:lang="SAVEDLANGUAGE">VALUECONTENT</value>' . "\n";
345*b1cdbd2cSJim Jagielski	my $propendline = '</prop>' . "\n";
346*b1cdbd2cSJim Jagielski	my $nodeendline = '</node>' . "\n";
347*b1cdbd2cSJim Jagielski
348*b1cdbd2cSJim Jagielski	my $replacepart = 'oor:op="replace"';
349*b1cdbd2cSJim Jagielski	my $typepart = 'oor:type="xs:VALUETYPE"';	# VALUETYPE can be "string", "boolean", ...
350*b1cdbd2cSJim Jagielski
351*b1cdbd2cSJim Jagielski	my $nodecount = $oneconfig->{'nodenumber'};
352*b1cdbd2cSJim Jagielski	my $styles = $oneconfig->{'Styles'};
353*b1cdbd2cSJim Jagielski
354*b1cdbd2cSJim Jagielski	for ( my $i = 1; $i <= $nodecount; $i++ )
355*b1cdbd2cSJim Jagielski	{
356*b1cdbd2cSJim Jagielski		$insertline = get_node_line_number($i, $oneconfig, $oneconfigfileref);
357*b1cdbd2cSJim Jagielski
358*b1cdbd2cSJim Jagielski		if ( $insertline == -1)	# if true, the node does not exist
359*b1cdbd2cSJim Jagielski		{
360*b1cdbd2cSJim Jagielski			$nodename = "node" . $i;
361*b1cdbd2cSJim Jagielski			$nodecontent = $oneconfig->{$nodename};
362*b1cdbd2cSJim Jagielski			$newnodeline = $nodeline;
363*b1cdbd2cSJim Jagielski
364*b1cdbd2cSJim Jagielski			$newnodeline =~ s/NODECONTENT/$nodecontent/g;
365*b1cdbd2cSJim Jagielski
366*b1cdbd2cSJim Jagielski			# Case1:
367*b1cdbd2cSJim Jagielski			# Nodes with brackets, need the replacepart 'oor:op="replace"'
368*b1cdbd2cSJim Jagielski			# Bracket node is set for each node with: bracket_node1=1, bracket_node2=1, ...
369*b1cdbd2cSJim Jagielski			# Case a: <node oor:name="m0" oor:op="replace">		(Common.xcu needs oor:op="replace")
370*b1cdbd2cSJim Jagielski			# Case b: <node oor:name="Ami Pro 1.x-3.1 (W4W)">	(TypeDetection.xcu does not need oor:op="replace")
371*b1cdbd2cSJim Jagielski			# For case b introducting a special case for Filters
372*b1cdbd2cSJim Jagielski
373*b1cdbd2cSJim Jagielski			$bracketkey = "bracket_" . $nodename;
374*b1cdbd2cSJim Jagielski
375*b1cdbd2cSJim Jagielski			my $localbracketkey = 0;
376*b1cdbd2cSJim Jagielski
377*b1cdbd2cSJim Jagielski			if ( $oneconfig->{$bracketkey} ) { $localbracketkey = $oneconfig->{$bracketkey}; }
378*b1cdbd2cSJim Jagielski
379*b1cdbd2cSJim Jagielski			if ( $localbracketkey == 1 )	# 'oor:op="replace"' is needed
380*b1cdbd2cSJim Jagielski			{
381*b1cdbd2cSJim Jagielski				my $isfilter = 0;
382*b1cdbd2cSJim Jagielski				if ( $oneconfig->{'isfilter'} ) { $isfilter = $oneconfig->{'isfilter'}; }
383*b1cdbd2cSJim Jagielski
384*b1cdbd2cSJim Jagielski				if ( $isfilter == 1 )	# this is a filter
385*b1cdbd2cSJim Jagielski				{
386*b1cdbd2cSJim Jagielski					$newnodeline =~ s/REPLACEPART//;
387*b1cdbd2cSJim Jagielski				}
388*b1cdbd2cSJim Jagielski				else
389*b1cdbd2cSJim Jagielski				{
390*b1cdbd2cSJim Jagielski					$newnodeline =~ s/REPLACEPART/$replacepart/;
391*b1cdbd2cSJim Jagielski				}
392*b1cdbd2cSJim Jagielski
393*b1cdbd2cSJim Jagielski				$newnodeline =~ s/\s*\>/\>/;	# removing resulting whitespaces
394*b1cdbd2cSJim Jagielski			}
395*b1cdbd2cSJim Jagielski
396*b1cdbd2cSJim Jagielski			# Case2:
397*b1cdbd2cSJim Jagielski			# Nodes below a Node "Factories", also need the replacepart 'oor:op="replace"'
398*b1cdbd2cSJim Jagielski			# This is saved in $oneconfig->{'factoriesnode'}. If not set, the value is "-99"
399*b1cdbd2cSJim Jagielski
400*b1cdbd2cSJim Jagielski			if ( $i == $oneconfig->{'factoriesnode'} )
401*b1cdbd2cSJim Jagielski			{
402*b1cdbd2cSJim Jagielski				$newnodeline =~ s/REPLACEPART/$replacepart/;
403*b1cdbd2cSJim Jagielski				$newnodeline =~ s/\s*\>/\>/;	# removing resulting whitespaces
404*b1cdbd2cSJim Jagielski			}
405*b1cdbd2cSJim Jagielski
406*b1cdbd2cSJim Jagielski			# Case3:
407*b1cdbd2cSJim Jagielski			# In all other cases, REPLACEPART in nodes can be removed
408*b1cdbd2cSJim Jagielski
409*b1cdbd2cSJim Jagielski			$newnodeline =~ s/REPLACEPART//;
410*b1cdbd2cSJim Jagielski			$newnodeline =~ s/\s*\>/\>/;	# removing resulting whitespaces
411*b1cdbd2cSJim Jagielski
412*b1cdbd2cSJim Jagielski			# Finding the correct place for inserting the node
413*b1cdbd2cSJim Jagielski
414*b1cdbd2cSJim Jagielski			if ( $i == 1 )	# this is a toplevel node
415*b1cdbd2cSJim Jagielski			{
416*b1cdbd2cSJim Jagielski				push(@{$oneconfigfileref}, $newnodeline);
417*b1cdbd2cSJim Jagielski				push(@{$oneconfigfileref}, $nodeendline);
418*b1cdbd2cSJim Jagielski			}
419*b1cdbd2cSJim Jagielski			else
420*b1cdbd2cSJim Jagielski			{
421*b1cdbd2cSJim Jagielski				# searching for the parent node
422*b1cdbd2cSJim Jagielski
423*b1cdbd2cSJim Jagielski				my $parentnumber = $i-1;
424*b1cdbd2cSJim Jagielski				$insertline = get_node_line_number($parentnumber, $oneconfig, $oneconfigfileref);
425*b1cdbd2cSJim Jagielski				splice(@{$oneconfigfileref}, $insertline, 0, ($newnodeline, $nodeendline));
426*b1cdbd2cSJim Jagielski			}
427*b1cdbd2cSJim Jagielski		}
428*b1cdbd2cSJim Jagielski	}
429*b1cdbd2cSJim Jagielski
430*b1cdbd2cSJim Jagielski	# Setting variables $isbracketnode and $isfactorynode for the properties
431*b1cdbd2cSJim Jagielski
432*b1cdbd2cSJim Jagielski
433*b1cdbd2cSJim Jagielski	my $isbracketnode = 0;
434*b1cdbd2cSJim Jagielski	my $isfactorynode = 0;
435*b1cdbd2cSJim Jagielski
436*b1cdbd2cSJim Jagielski	for ( my $i = 1; $i <= $nodecount; $i++ )
437*b1cdbd2cSJim Jagielski	{
438*b1cdbd2cSJim Jagielski		$nodename = "node" . $i;
439*b1cdbd2cSJim Jagielski		$bracketkey = "bracket_" . $nodename;
440*b1cdbd2cSJim Jagielski
441*b1cdbd2cSJim Jagielski		my $localbracketkey = 0;
442*b1cdbd2cSJim Jagielski		if ( $oneconfig->{$bracketkey} ) { $localbracketkey = $oneconfig->{$bracketkey}; }
443*b1cdbd2cSJim Jagielski
444*b1cdbd2cSJim Jagielski		if ( $localbracketkey == 1 ) { $isbracketnode = 1;	}
445*b1cdbd2cSJim Jagielski		if ( $i == $oneconfig->{'factoriesnode'} ) { $isfactorynode = 1; }
446*b1cdbd2cSJim Jagielski	}
447*b1cdbd2cSJim Jagielski
448*b1cdbd2cSJim Jagielski	# now all nodes exist, and the key and value can be inserted into the configfile
449*b1cdbd2cSJim Jagielski	# the next line contains the key, for instance: <prop oor:name="UseDefaultMailer" oor:type="xs:boolean">
450*b1cdbd2cSJim Jagielski	# my $propline = '<prop oor:name="KEYCONTENT" REPLACEPART TYPEPART>' . "\n";
451*b1cdbd2cSJim Jagielski	# The type is only needed, if a replace is set.
452*b1cdbd2cSJim Jagielski
453*b1cdbd2cSJim Jagielski	my $newpropline = $propline;
454*b1cdbd2cSJim Jagielski
455*b1cdbd2cSJim Jagielski	# Replacement of KEYCONTENT, REPLACEPART and TYPEPART
456*b1cdbd2cSJim Jagielski
457*b1cdbd2cSJim Jagielski	# Case 1:
458*b1cdbd2cSJim Jagielski	# Properties with oor:name="Name" (Common.xcu) are simply <prop oor:name="Name">
459*b1cdbd2cSJim Jagielski	# The information about such a property is stored in $oneconfig->{'isisocode'}
460*b1cdbd2cSJim Jagielski
461*b1cdbd2cSJim Jagielski	if ( $oneconfig->{'isisocode'} )
462*b1cdbd2cSJim Jagielski	{
463*b1cdbd2cSJim Jagielski		if ( $oneconfig->{'isname'} ) { $newpropline =~ s/KEYCONTENT/Name/; }		# The property name is always "Name"
464*b1cdbd2cSJim Jagielski		if ( $oneconfig->{'istitle'} ) { $newpropline =~ s/KEYCONTENT/Title/; }		# The property name is always "Title"
465*b1cdbd2cSJim Jagielski		$newpropline =~ s/REPLACEPART//;
466*b1cdbd2cSJim Jagielski		$newpropline =~ s/TYPEPART//;
467*b1cdbd2cSJim Jagielski		$newpropline =~ s/\s*\>/\>/;	# removing resulting whitespaces
468*b1cdbd2cSJim Jagielski	}
469*b1cdbd2cSJim Jagielski
470*b1cdbd2cSJim Jagielski	# Begin of all other cases
471*b1cdbd2cSJim Jagielski
472*b1cdbd2cSJim Jagielski	my $key = $oneconfig->{'Key'};
473*b1cdbd2cSJim Jagielski	$newpropline =~ s/KEYCONTENT/$key/;
474*b1cdbd2cSJim Jagielski
475*b1cdbd2cSJim Jagielski	my $valuetype;
476*b1cdbd2cSJim Jagielski
477*b1cdbd2cSJim Jagielski	if ( $styles =~ /CFG_STRING\b/ ) { $valuetype = "string"; }
478*b1cdbd2cSJim Jagielski	elsif ( $styles =~ /CFG_NUMERIC/ ) { $valuetype = "int"; }
479*b1cdbd2cSJim Jagielski	elsif ( $styles =~ /CFG_BOOLEAN/ ) { $valuetype = "boolean"; }
480*b1cdbd2cSJim Jagielski	elsif ( $styles =~ /CFG_STRINGLIST/ ) { $valuetype = "string-list"; }
481*b1cdbd2cSJim Jagielski#	elsif ( $styles =~ /CFG_STRINGLIST/ ) { $valuetype = "string-list oor:separator=\"\|\""; }
482*b1cdbd2cSJim Jagielski	else
483*b1cdbd2cSJim Jagielski	{
484*b1cdbd2cSJim Jagielski		installer::exiter::exit_program("ERROR: Unknown configuration value type: $styles", "insert_into_config_file");
485*b1cdbd2cSJim Jagielski	}
486*b1cdbd2cSJim Jagielski
487*b1cdbd2cSJim Jagielski	# Case 2:
488*b1cdbd2cSJim Jagielski	# Properties below a node "Factories" do not need a 'oor:op="replace"' and a 'oor:type="xs:VALUETYPE"'
489*b1cdbd2cSJim Jagielski
490*b1cdbd2cSJim Jagielski	if ( $isfactorynode )
491*b1cdbd2cSJim Jagielski	{
492*b1cdbd2cSJim Jagielski		$newpropline =~ s/REPLACEPART//;
493*b1cdbd2cSJim Jagielski		$newpropline =~ s/TYPEPART//;
494*b1cdbd2cSJim Jagielski		$newpropline =~ s/\s*\>/\>/;	# removing resulting whitespaces
495*b1cdbd2cSJim Jagielski	}
496*b1cdbd2cSJim Jagielski
497*b1cdbd2cSJim Jagielski	# Case 3:
498*b1cdbd2cSJim Jagielski	# Properties below a "bracket" node do not need a 'oor:op="replace"', except they are iso-codes
499*b1cdbd2cSJim Jagielski	# Assumption here: They are multilingual
500*b1cdbd2cSJim Jagielski
501*b1cdbd2cSJim Jagielski	if ( $isbracketnode )
502*b1cdbd2cSJim Jagielski	{
503*b1cdbd2cSJim Jagielski		my $localtypepart = $typepart;
504*b1cdbd2cSJim Jagielski		$localtypepart =~ s/VALUETYPE/$valuetype/;
505*b1cdbd2cSJim Jagielski		$newpropline =~ s/TYPEPART/$localtypepart/;
506*b1cdbd2cSJim Jagielski
507*b1cdbd2cSJim Jagielski		if ( $oneconfig->{'ismultilingual'} )	# This is solved by "Name" and "Title"
508*b1cdbd2cSJim Jagielski		{
509*b1cdbd2cSJim Jagielski			$newpropline =~ s/REPLACEPART/$replacepart/;
510*b1cdbd2cSJim Jagielski		}
511*b1cdbd2cSJim Jagielski		else
512*b1cdbd2cSJim Jagielski		{
513*b1cdbd2cSJim Jagielski			$newpropline =~ s/REPLACEPART//;
514*b1cdbd2cSJim Jagielski		}
515*b1cdbd2cSJim Jagielski
516*b1cdbd2cSJim Jagielski		$newpropline =~ s/\s*\>/\>/;	# removing resulting whitespaces
517*b1cdbd2cSJim Jagielski	}
518*b1cdbd2cSJim Jagielski
519*b1cdbd2cSJim Jagielski	# Case 4:
520*b1cdbd2cSJim Jagielski	# if the flag CREATE is set, the properties get 'oor:op="replace"' and 'oor:type="xs:VALUETYPE"'
521*b1cdbd2cSJim Jagielski
522*b1cdbd2cSJim Jagielski	if (( $styles =~ /\bCREATE\b/ ) && (!($isbracketnode)))
523*b1cdbd2cSJim Jagielski	{
524*b1cdbd2cSJim Jagielski		# my $typepart = 'oor:type="xs:VALUETYPE"';	# VALUETYPE can be "string", "boolean", ...
525*b1cdbd2cSJim Jagielski
526*b1cdbd2cSJim Jagielski		my $localtypepart = $typepart;
527*b1cdbd2cSJim Jagielski		$localtypepart =~ s/VALUETYPE/$valuetype/;
528*b1cdbd2cSJim Jagielski
529*b1cdbd2cSJim Jagielski		$newpropline =~ s/TYPEPART/$localtypepart/;
530*b1cdbd2cSJim Jagielski		$newpropline =~ s/REPLACEPART/$replacepart/;
531*b1cdbd2cSJim Jagielski		$newpropline =~ s/\s*\>/\>/;	# removing resulting whitespaces
532*b1cdbd2cSJim Jagielski	}
533*b1cdbd2cSJim Jagielski
534*b1cdbd2cSJim Jagielski	# Case 5:
535*b1cdbd2cSJim Jagielski	# all other ConfigurationItems do not need 'oor:op="replace"' and 'oor:type="xs:VALUETYPE"'
536*b1cdbd2cSJim Jagielski
537*b1cdbd2cSJim Jagielski	$newpropline =~ s/REPLACEPART//;
538*b1cdbd2cSJim Jagielski	$newpropline =~ s/TYPEPART//;
539*b1cdbd2cSJim Jagielski	$newpropline =~ s/\s*\>/\>/;	# removing resulting whitespaces
540*b1cdbd2cSJim Jagielski
541*b1cdbd2cSJim Jagielski	# finally the value can be set
542*b1cdbd2cSJim Jagielski
543*b1cdbd2cSJim Jagielski	my $value = $oneconfig->{'Value'};
544*b1cdbd2cSJim Jagielski
545*b1cdbd2cSJim Jagielski	# Some values in setup script are written during installation process by the setup. These
546*b1cdbd2cSJim Jagielski	# have values like "<title>". This will lead to an error, because of the brackets. Therefore the
547*b1cdbd2cSJim Jagielski	# brackets have to be removed.
548*b1cdbd2cSJim Jagielski
549*b1cdbd2cSJim Jagielski	# ToDo: Substituting the setup replace variables
550*b1cdbd2cSJim Jagielski
551*b1cdbd2cSJim Jagielski	# replace_setting_variables();
552*b1cdbd2cSJim Jagielski
553*b1cdbd2cSJim Jagielski	$value =~ s/^\s*\<//;
554*b1cdbd2cSJim Jagielski	$value =~ s/\>\s*$//;
555*b1cdbd2cSJim Jagielski
556*b1cdbd2cSJim Jagielski	# Deal with list separators
557*b1cdbd2cSJim Jagielski	my $separatorpart = '';
558*b1cdbd2cSJim Jagielski	if ( ($valuetype eq "string-list") && ($value =~ /\|/) )
559*b1cdbd2cSJim Jagielski    {
560*b1cdbd2cSJim Jagielski	    $separatorpart = 'oor:separator="|"';
561*b1cdbd2cSJim Jagielski    }
562*b1cdbd2cSJim Jagielski
563*b1cdbd2cSJim Jagielski	# Fake: substituting german umlauts
564*b1cdbd2cSJim Jagielski
565*b1cdbd2cSJim Jagielski	$value =~ s/\�/ae/;
566*b1cdbd2cSJim Jagielski	$value =~ s/\�/oe/;
567*b1cdbd2cSJim Jagielski	$value =~ s/\�/ue/;
568*b1cdbd2cSJim Jagielski	$value =~ s/\�/AE/;
569*b1cdbd2cSJim Jagielski	$value =~ s/\�/OE/;
570*b1cdbd2cSJim Jagielski	$value =~ s/\�/UE/;
571*b1cdbd2cSJim Jagielski
572*b1cdbd2cSJim Jagielski	my $newvalueline;
573*b1cdbd2cSJim Jagielski
574*b1cdbd2cSJim Jagielski	if (!($oneconfig->{'isisocode'} ))	# this is the simpe case
575*b1cdbd2cSJim Jagielski	{
576*b1cdbd2cSJim Jagielski		# my $valueline = '<value SEPARATORPART>VALUECONTENT</value>' . "\n";
577*b1cdbd2cSJim Jagielski		$newvalueline = $valueline;
578*b1cdbd2cSJim Jagielski		$newvalueline =~ s/VALUECONTENT/$value/g;
579*b1cdbd2cSJim Jagielski		$newvalueline =~ s/SEPARATORPART/$separatorpart/;
580*b1cdbd2cSJim Jagielski	}
581*b1cdbd2cSJim Jagielski	else
582*b1cdbd2cSJim Jagielski	{
583*b1cdbd2cSJim Jagielski		# my $langvalueline = '<value xml:lang="SAVEDLANGUAGE">VALUECONTENT</value>' . "\n";
584*b1cdbd2cSJim Jagielski		$newvalueline = $langvalueline;
585*b1cdbd2cSJim Jagielski		$newvalueline =~ s/VALUECONTENT/$value/;
586*b1cdbd2cSJim Jagielski		my $savedlanguage = $oneconfig->{'Key'};
587*b1cdbd2cSJim Jagielski		$newvalueline =~ s/SAVEDLANGUAGE/$savedlanguage/;
588*b1cdbd2cSJim Jagielski	}
589*b1cdbd2cSJim Jagielski
590*b1cdbd2cSJim Jagielski	# For language dependent values, it is possible, that the property already exist.
591*b1cdbd2cSJim Jagielski	# In this case the prop must not be created again and only the value has to be included:
592*b1cdbd2cSJim Jagielski	# <prop oor:name="Name">
593*b1cdbd2cSJim Jagielski	#  <value xml:lang="de">OpenOffice.org 2.0 Diagramm</value>
594*b1cdbd2cSJim Jagielski	#  <value xml:lang="en-US">OpenOffice.org 2.0 Chart</value>
595*b1cdbd2cSJim Jagielski	# </prop>
596*b1cdbd2cSJim Jagielski
597*b1cdbd2cSJim Jagielski	# The key has to be written after the line, containing the complete node
598*b1cdbd2cSJim Jagielski
599*b1cdbd2cSJim Jagielski	$insertline = get_node_line_number($nodecount, $oneconfig, $oneconfigfileref);
600*b1cdbd2cSJim Jagielski
601*b1cdbd2cSJim Jagielski	if ( $oneconfig->{'ismultilingual'} )
602*b1cdbd2cSJim Jagielski	{
603*b1cdbd2cSJim Jagielski		if ( $newpropline eq ${$oneconfigfileref}[$insertline] )
604*b1cdbd2cSJim Jagielski		{
605*b1cdbd2cSJim Jagielski			if (!($newvalueline eq ${$oneconfigfileref}[$insertline+1]))	# only include, if the value not already exists (example: value="FALSE" for many languages)
606*b1cdbd2cSJim Jagielski			{
607*b1cdbd2cSJim Jagielski				splice(@{$oneconfigfileref}, $insertline+1, 0, ($newvalueline));	# only the value needs to be added
608*b1cdbd2cSJim Jagielski			}
609*b1cdbd2cSJim Jagielski		}
610*b1cdbd2cSJim Jagielski		else
611*b1cdbd2cSJim Jagielski		{
612*b1cdbd2cSJim Jagielski			splice(@{$oneconfigfileref}, $insertline, 0, ($newpropline, $newvalueline, $propendline));
613*b1cdbd2cSJim Jagielski		}
614*b1cdbd2cSJim Jagielski	}
615*b1cdbd2cSJim Jagielski	else
616*b1cdbd2cSJim Jagielski	{
617*b1cdbd2cSJim Jagielski		splice(@{$oneconfigfileref}, $insertline, 0, ($newpropline, $newvalueline, $propendline));
618*b1cdbd2cSJim Jagielski	}
619*b1cdbd2cSJim Jagielski
620*b1cdbd2cSJim Jagielski	return $oneconfigfileref;
621*b1cdbd2cSJim Jagielski}
622*b1cdbd2cSJim Jagielski
623*b1cdbd2cSJim Jagielski##########################################################
624*b1cdbd2cSJim Jagielski# Inserting tabs for better view into configuration file
625*b1cdbd2cSJim Jagielski##########################################################
626*b1cdbd2cSJim Jagielski
627*b1cdbd2cSJim Jagielskisub insert_tabs_into_configfile
628*b1cdbd2cSJim Jagielski{
629*b1cdbd2cSJim Jagielski	my ($configfileref) = @_;
630*b1cdbd2cSJim Jagielski
631*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::insert_tabs_into_configfile : $#{$configfileref}"); }
632*b1cdbd2cSJim Jagielski
633*b1cdbd2cSJim Jagielski	my $counter = 0;
634*b1cdbd2cSJim Jagielski
635*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$configfileref}; $i++ )
636*b1cdbd2cSJim Jagielski	{
637*b1cdbd2cSJim Jagielski		my $line = ${$configfileref}[$i];
638*b1cdbd2cSJim Jagielski		my $linebefore = ${$configfileref}[$i-1];
639*b1cdbd2cSJim Jagielski
640*b1cdbd2cSJim Jagielski		if (( $line =~ /^\s*\<node/ ) || ( $line =~ /^\s*\<prop/ ))
641*b1cdbd2cSJim Jagielski		{
642*b1cdbd2cSJim Jagielski			if ((!( $linebefore =~ /^\s*\<\/node/ )) && (!( $linebefore =~ /^\s*\<\/prop/ )))		# do not increase after "</node" and after "</prop"
643*b1cdbd2cSJim Jagielski			{
644*b1cdbd2cSJim Jagielski				$counter++;
645*b1cdbd2cSJim Jagielski			}
646*b1cdbd2cSJim Jagielski		}
647*b1cdbd2cSJim Jagielski
648*b1cdbd2cSJim Jagielski		if ( $line =~ /^\s*\<value/ )
649*b1cdbd2cSJim Jagielski		{
650*b1cdbd2cSJim Jagielski			if (!($linebefore =~ /^\s*\<value/ ))		# do not increase counter with "<value>" after "<value>" (multilingual configitems)
651*b1cdbd2cSJim Jagielski			{
652*b1cdbd2cSJim Jagielski				$counter++;
653*b1cdbd2cSJim Jagielski			}
654*b1cdbd2cSJim Jagielski		}
655*b1cdbd2cSJim Jagielski
656*b1cdbd2cSJim Jagielski		if (( $line =~ /^\s*\<\/node\>/ ) || ( $line =~ /^\s*\<\/prop\>/ ))
657*b1cdbd2cSJim Jagielski		{
658*b1cdbd2cSJim Jagielski			if ((!( $linebefore =~ /^\s*\<node/ )) && (!( $linebefore =~ /^\s*\<prop/ )))		# do not decrease after "<node" and after "<prop"
659*b1cdbd2cSJim Jagielski			{
660*b1cdbd2cSJim Jagielski				$counter--;
661*b1cdbd2cSJim Jagielski			}
662*b1cdbd2cSJim Jagielski		}
663*b1cdbd2cSJim Jagielski
664*b1cdbd2cSJim Jagielski		if ($counter > 0)
665*b1cdbd2cSJim Jagielski		{
666*b1cdbd2cSJim Jagielski			for ( my $j = 0; $j < $counter; $j++ )
667*b1cdbd2cSJim Jagielski			{
668*b1cdbd2cSJim Jagielski				$line = "\t" . $line;
669*b1cdbd2cSJim Jagielski			}
670*b1cdbd2cSJim Jagielski		}
671*b1cdbd2cSJim Jagielski
672*b1cdbd2cSJim Jagielski		${$configfileref}[$i] = $line;
673*b1cdbd2cSJim Jagielski	}
674*b1cdbd2cSJim Jagielski}
675*b1cdbd2cSJim Jagielski
676*b1cdbd2cSJim Jagielski######################################################################
677*b1cdbd2cSJim Jagielski# Collecting all different configuration items (Files and Modules)
678*b1cdbd2cSJim Jagielski######################################################################
679*b1cdbd2cSJim Jagielski
680*b1cdbd2cSJim Jagielskisub collect_all_configuration_items
681*b1cdbd2cSJim Jagielski{
682*b1cdbd2cSJim Jagielski	my ($configurationitemsref, $item) = @_;
683*b1cdbd2cSJim Jagielski
684*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::collect_all_configuration_items : $#{$configurationitemsref} : $item"); }
685*b1cdbd2cSJim Jagielski
686*b1cdbd2cSJim Jagielski	my @allitems = ();
687*b1cdbd2cSJim Jagielski
688*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$configurationitemsref}; $i++ )
689*b1cdbd2cSJim Jagielski	{
690*b1cdbd2cSJim Jagielski		my $oneconfig = ${$configurationitemsref}[$i];
691*b1cdbd2cSJim Jagielski
692*b1cdbd2cSJim Jagielski		if (! installer::existence::exists_in_array($oneconfig->{$item}, \@allitems))
693*b1cdbd2cSJim Jagielski		{
694*b1cdbd2cSJim Jagielski			push(@allitems, $oneconfig->{$item});
695*b1cdbd2cSJim Jagielski		}
696*b1cdbd2cSJim Jagielski	}
697*b1cdbd2cSJim Jagielski
698*b1cdbd2cSJim Jagielski	return \@allitems;
699*b1cdbd2cSJim Jagielski}
700*b1cdbd2cSJim Jagielski
701*b1cdbd2cSJim Jagielski######################################################################
702*b1cdbd2cSJim Jagielski# Collecting all module specific configuration items
703*b1cdbd2cSJim Jagielski######################################################################
704*b1cdbd2cSJim Jagielski
705*b1cdbd2cSJim Jagielskisub get_all_configitems_at_module
706*b1cdbd2cSJim Jagielski{
707*b1cdbd2cSJim Jagielski	my ($moduleid, $configurationitemsref) = @_;
708*b1cdbd2cSJim Jagielski
709*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::get_all_configitems_at_module : $moduleid : $#{$configurationitemsref}"); }
710*b1cdbd2cSJim Jagielski
711*b1cdbd2cSJim Jagielski	my @moduleconfigurationitems = ();
712*b1cdbd2cSJim Jagielski
713*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$configurationitemsref}; $i++ )
714*b1cdbd2cSJim Jagielski	{
715*b1cdbd2cSJim Jagielski		my $oneconfig = ${$configurationitemsref}[$i];
716*b1cdbd2cSJim Jagielski
717*b1cdbd2cSJim Jagielski		if ( $oneconfig->{'ModuleID'} eq $moduleid )
718*b1cdbd2cSJim Jagielski		{
719*b1cdbd2cSJim Jagielski			push(@moduleconfigurationitems, $oneconfig);
720*b1cdbd2cSJim Jagielski		}
721*b1cdbd2cSJim Jagielski	}
722*b1cdbd2cSJim Jagielski
723*b1cdbd2cSJim Jagielski	return \@moduleconfigurationitems;
724*b1cdbd2cSJim Jagielski}
725*b1cdbd2cSJim Jagielski
726*b1cdbd2cSJim Jagielski#######################################################
727*b1cdbd2cSJim Jagielski# Saving and zipping the created configurationfile
728*b1cdbd2cSJim Jagielski#######################################################
729*b1cdbd2cSJim Jagielski
730*b1cdbd2cSJim Jagielskisub save_and_zip_configfile
731*b1cdbd2cSJim Jagielski{
732*b1cdbd2cSJim Jagielski	my ($oneconfigfileref, $onefile, $onemodule, $configdir) = @_;
733*b1cdbd2cSJim Jagielski
734*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::save_and_zip_configfile : $#{$oneconfigfileref} : $onefile : $onemodule : $configdir"); }
735*b1cdbd2cSJim Jagielski
736*b1cdbd2cSJim Jagielski	my $savefilename = $onefile;
737*b1cdbd2cSJim Jagielski	$savefilename =~ s/\./\_/g;
738*b1cdbd2cSJim Jagielski	$savefilename = $savefilename . "_" . $onemodule;
739*b1cdbd2cSJim Jagielski	$savefilename = $savefilename . ".xcu";
740*b1cdbd2cSJim Jagielski	my $shortsavefilename = $savefilename;
741*b1cdbd2cSJim Jagielski
742*b1cdbd2cSJim Jagielski	$savefilename = $configdir . $installer::globals::separator . $savefilename;
743*b1cdbd2cSJim Jagielski
744*b1cdbd2cSJim Jagielski	installer::files::save_file($savefilename, $oneconfigfileref);
745*b1cdbd2cSJim Jagielski
746*b1cdbd2cSJim Jagielski	# zipping the configfile
747*b1cdbd2cSJim Jagielski
748*b1cdbd2cSJim Jagielski	my $returnvalue = 1;
749*b1cdbd2cSJim Jagielski
750*b1cdbd2cSJim Jagielski	my $zipfilename = $shortsavefilename;
751*b1cdbd2cSJim Jagielski	$zipfilename =~ s/\.xcu/\.zip/;
752*b1cdbd2cSJim Jagielski
753*b1cdbd2cSJim Jagielski	my $currentdir = cwd();
754*b1cdbd2cSJim Jagielski	if ( $installer::globals::iswin ) { $currentdir =~ s/\//\\/g; }
755*b1cdbd2cSJim Jagielski
756*b1cdbd2cSJim Jagielski	chdir($configdir);
757*b1cdbd2cSJim Jagielski
758*b1cdbd2cSJim Jagielski 	my $systemcall = "$installer::globals::zippath -q -m $zipfilename $shortsavefilename";
759*b1cdbd2cSJim Jagielski	$returnvalue = system($systemcall);
760*b1cdbd2cSJim Jagielski
761*b1cdbd2cSJim Jagielski	chdir($currentdir);
762*b1cdbd2cSJim Jagielski
763*b1cdbd2cSJim Jagielski    $installer::logger::Lang->printf("Systemcall: %s\n", $systemcall);
764*b1cdbd2cSJim Jagielski
765*b1cdbd2cSJim Jagielski	if ($returnvalue)
766*b1cdbd2cSJim Jagielski	{
767*b1cdbd2cSJim Jagielski        $installer::logger::Lang->printf("ERROR: Could not zip %s to %s\n", $savefilename, $zipfilename);
768*b1cdbd2cSJim Jagielski	}
769*b1cdbd2cSJim Jagielski	else
770*b1cdbd2cSJim Jagielski	{
771*b1cdbd2cSJim Jagielski        $installer::logger::Lang->printf("SUCCESS: Zipped file %s to %s\n", $savefilename, $zipfilename);
772*b1cdbd2cSJim Jagielski	}
773*b1cdbd2cSJim Jagielski
774*b1cdbd2cSJim Jagielski	return $zipfilename;
775*b1cdbd2cSJim Jagielski}
776*b1cdbd2cSJim Jagielski
777*b1cdbd2cSJim Jagielski#####################################################################
778*b1cdbd2cSJim Jagielski# Adding the newly created configuration file into the file list
779*b1cdbd2cSJim Jagielski#####################################################################
780*b1cdbd2cSJim Jagielski
781*b1cdbd2cSJim Jagielskisub add_zipfile_into_filelist
782*b1cdbd2cSJim Jagielski{
783*b1cdbd2cSJim Jagielski	my ($zipfilename, $configdir, $filesarrayref, $onemodule) = @_;
784*b1cdbd2cSJim Jagielski
785*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::add_zipfile_into_filelist: $zipfilename : $configdir : $#{$filesarrayref} : $onemodule"); }
786*b1cdbd2cSJim Jagielski
787*b1cdbd2cSJim Jagielski	my $longzipfilename = $configdir . $installer::globals::separator . $zipfilename;
788*b1cdbd2cSJim Jagielski	my $gid = "gid_" . $zipfilename;
789*b1cdbd2cSJim Jagielski	$gid =~ s/\./\_/g;
790*b1cdbd2cSJim Jagielski
791*b1cdbd2cSJim Jagielski	my %configfile = ();
792*b1cdbd2cSJim Jagielski
793*b1cdbd2cSJim Jagielski	# Taking the base data from the "gid_File_Lib_Vcl"
794*b1cdbd2cSJim Jagielski
795*b1cdbd2cSJim Jagielski	my $vclgid = "gid_File_Lib_Vcl";
796*b1cdbd2cSJim Jagielski	my $vclfile = installer::existence::get_specified_file($filesarrayref, $vclgid);
797*b1cdbd2cSJim Jagielski
798*b1cdbd2cSJim Jagielski	# copying all base data
799*b1cdbd2cSJim Jagielski	installer::converter::copy_item_object($vclfile, \%configfile);
800*b1cdbd2cSJim Jagielski
801*b1cdbd2cSJim Jagielski	# and overriding all new data
802*b1cdbd2cSJim Jagielski	$configfile{'ismultilingual'} = 0;
803*b1cdbd2cSJim Jagielski	$configfile{'sourcepath'} = $longzipfilename;
804*b1cdbd2cSJim Jagielski	$configfile{'Name'} = $zipfilename;
805*b1cdbd2cSJim Jagielski	$configfile{'UnixRights'} = "644";
806*b1cdbd2cSJim Jagielski	$configfile{'gid'} = $gid;
807*b1cdbd2cSJim Jagielski	$configfile{'Dir'} = "gid_Dir_Share_Uno_Packages";
808*b1cdbd2cSJim Jagielski	$configfile{'destination'} = "share" . $installer::globals::separator . "uno_packages" . $installer::globals::separator . $zipfilename;
809*b1cdbd2cSJim Jagielski	$configfile{'modules'} = $onemodule;	# assigning the file to the correct module!
810*b1cdbd2cSJim Jagielski
811*b1cdbd2cSJim Jagielski	push(@{$filesarrayref}, \%configfile);
812*b1cdbd2cSJim Jagielski}
813*b1cdbd2cSJim Jagielski
814*b1cdbd2cSJim Jagielski#######################################################
815*b1cdbd2cSJim Jagielski# Creating configuration files from configurationitems
816*b1cdbd2cSJim Jagielski#######################################################
817*b1cdbd2cSJim Jagielski
818*b1cdbd2cSJim Jagielskisub create_configuration_files
819*b1cdbd2cSJim Jagielski{
820*b1cdbd2cSJim Jagielski	my ($configurationitemsref, $filesarrayref, $languagestringref) = @_;
821*b1cdbd2cSJim Jagielski
822*b1cdbd2cSJim Jagielski	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::create_configuration_files: $#{$configurationitemsref} : $#{$filesarrayref} : $$languagestringref"); }
823*b1cdbd2cSJim Jagielski
824*b1cdbd2cSJim Jagielski	installer::logger::include_header_into_logfile("Creating configuration files:");
825*b1cdbd2cSJim Jagielski
826*b1cdbd2cSJim Jagielski	# creating the directory
827*b1cdbd2cSJim Jagielski
828*b1cdbd2cSJim Jagielski	my $configdir = installer::systemactions::create_directories("configfiles", $languagestringref);
829*b1cdbd2cSJim Jagielski
830*b1cdbd2cSJim Jagielski	$configdir = installer::converter::make_path_conform($configdir);
831*b1cdbd2cSJim Jagielski
832*b1cdbd2cSJim Jagielski	# collecting an array of all modules
833*b1cdbd2cSJim Jagielski	my $allmodules = collect_all_configuration_items($configurationitemsref, "ModuleID");
834*b1cdbd2cSJim Jagielski
835*b1cdbd2cSJim Jagielski	# iterating over all modules
836*b1cdbd2cSJim Jagielski
837*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$allmodules}; $i++ )
838*b1cdbd2cSJim Jagielski	{
839*b1cdbd2cSJim Jagielski		my $onemodule = ${$allmodules}[$i];
840*b1cdbd2cSJim Jagielski
841*b1cdbd2cSJim Jagielski		my $moduleconfigitems = get_all_configitems_at_module($onemodule, $configurationitemsref);
842*b1cdbd2cSJim Jagielski
843*b1cdbd2cSJim Jagielski		# collecting an array of all "startpath". This are all different files (org.openoffice.Office.Common).
844*b1cdbd2cSJim Jagielski		my $allfiles = collect_all_configuration_items($moduleconfigitems, "startpath");
845*b1cdbd2cSJim Jagielski
846*b1cdbd2cSJim Jagielski		# iteration over all files
847*b1cdbd2cSJim Jagielski
848*b1cdbd2cSJim Jagielski		for ( my $j = 0; $j <= $#{$allfiles}; $j++ )
849*b1cdbd2cSJim Jagielski		{
850*b1cdbd2cSJim Jagielski			my $onefile = ${$allfiles}[$j];
851*b1cdbd2cSJim Jagielski
852*b1cdbd2cSJim Jagielski			my @oneconfigfile = ();
853*b1cdbd2cSJim Jagielski			my $oneconfigfileref = \@oneconfigfile;
854*b1cdbd2cSJim Jagielski
855*b1cdbd2cSJim Jagielski			my $startblockwritten = 0;
856*b1cdbd2cSJim Jagielski
857*b1cdbd2cSJim Jagielski			for ( my $k = 0; $k <= $#{$moduleconfigitems}; $k++ )
858*b1cdbd2cSJim Jagielski			{
859*b1cdbd2cSJim Jagielski				my $oneconfig = ${$moduleconfigitems}[$k];
860*b1cdbd2cSJim Jagielski
861*b1cdbd2cSJim Jagielski				my $startpath = $oneconfig->{'startpath'};
862*b1cdbd2cSJim Jagielski
863*b1cdbd2cSJim Jagielski				if ($startpath eq $onefile)
864*b1cdbd2cSJim Jagielski				{
865*b1cdbd2cSJim Jagielski					if (!($startblockwritten))	# writing some global lines into the xcu file
866*b1cdbd2cSJim Jagielski					{
867*b1cdbd2cSJim Jagielski						insert_start_block_into_configfile($oneconfigfileref, $oneconfig);
868*b1cdbd2cSJim Jagielski						$startblockwritten = 1;
869*b1cdbd2cSJim Jagielski					}
870*b1cdbd2cSJim Jagielski
871*b1cdbd2cSJim Jagielski					$oneconfigfileref = insert_into_config_file($oneconfig, $oneconfigfileref);
872*b1cdbd2cSJim Jagielski				}
873*b1cdbd2cSJim Jagielski			}
874*b1cdbd2cSJim Jagielski
875*b1cdbd2cSJim Jagielski			insert_end_block_into_configfile($oneconfigfileref);
876*b1cdbd2cSJim Jagielski
877*b1cdbd2cSJim Jagielski			# inserting tabs for nice appearance
878*b1cdbd2cSJim Jagielski			insert_tabs_into_configfile($oneconfigfileref);
879*b1cdbd2cSJim Jagielski
880*b1cdbd2cSJim Jagielski			# saving the configfile
881*b1cdbd2cSJim Jagielski			my $zipfilename = save_and_zip_configfile($oneconfigfileref, $onefile, $onemodule, $configdir);
882*b1cdbd2cSJim Jagielski
883*b1cdbd2cSJim Jagielski			# adding the zipped configfile to the list of installed files
884*b1cdbd2cSJim Jagielski			# Some data are set now, others are taken from the file "soffice.exe" ("soffice.bin")
885*b1cdbd2cSJim Jagielski
886*b1cdbd2cSJim Jagielski			add_zipfile_into_filelist($zipfilename, $configdir, $filesarrayref, $onemodule);
887*b1cdbd2cSJim Jagielski		}
888*b1cdbd2cSJim Jagielski	}
889*b1cdbd2cSJim Jagielski
890*b1cdbd2cSJim Jagielski    $installer::logger::Lang->print("\n");
891*b1cdbd2cSJim Jagielski}
892*b1cdbd2cSJim Jagielski
893*b1cdbd2cSJim Jagielski1;
894