summaryrefslogtreecommitdiff
path: root/solenv/bin/modules/installer/configuration.pm
diff options
context:
space:
mode:
Diffstat (limited to 'solenv/bin/modules/installer/configuration.pm')
-rw-r--r--solenv/bin/modules/installer/configuration.pm901
1 files changed, 901 insertions, 0 deletions
diff --git a/solenv/bin/modules/installer/configuration.pm b/solenv/bin/modules/installer/configuration.pm
new file mode 100644
index 000000000000..4aa82d25b5b2
--- /dev/null
+++ b/solenv/bin/modules/installer/configuration.pm
@@ -0,0 +1,901 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+package installer::configuration;
+
+use Cwd;
+use installer::converter;
+use installer::existence;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::remover;
+use installer::systemactions;
+
+################################################################################
+# Getting package from configurationitem (for instance: org.openoffice.Office)
+# Getting name from configurationitem (for instance: Common)
+################################################################################
+
+sub analyze_path_of_configurationitem
+{
+ my ($configurationitemsref) = @_;
+
+ if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::analyze_path_of_configurationitem : $#{$configurationitemsref}"); }
+
+ my ($startpath, $nodes, $name, $packagename, $onenode, $first, $second, $third, $bracketnode);
+
+ for ( my $i = 0; $i <= $#{$configurationitemsref}; $i++ )
+ {
+ my $oneconfig = ${$configurationitemsref}[$i];
+ my $path = $oneconfig->{'Path'};
+
+ installer::remover::remove_leading_and_ending_slashes(\$path); # in scp are some path beginning with "/"
+
+ if ( $path =~ /^\s*(.*?)\/(.*)\s*$/ )
+ {
+ $startpath = $1;
+ $nodes = $2;
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: Unknown format of ConfigurationItem path: $path", "analyze_path_of_configurationitem");
+ }
+
+ # Startpath is now: org.openoffice.Setup
+ # Nodes is now: Office/Factories/com.sun.star.chart.ChartDocument
+
+ # Dividing the startpath into package (org.openoffic) and name (Setup).
+
+ $oneconfig->{'startpath'} = $startpath; # saving the startpath into the hash
+
+ if ( $startpath =~ /^\s*(\S*)\.(\S*?)\s*$/ )
+ {
+ $packagename = $1;
+ $name = $2;
+ $oneconfig->{'name'} = $name;
+ $oneconfig->{'packagename'} = $packagename;
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: Unknown format of ConfigurationItem startpath: $startpath", "analyze_path_of_configurationitem");
+ }
+
+ # Collecting all nodes
+
+ installer::remover::remove_leading_and_ending_slashes(\$nodes);
+
+ my $counter = 1;
+
+ # Attention: Do not trust the slash
+ # Filters/Filter['StarWriter 5.0 Vorlage/Template']
+ # Menus/New/*['m10']/Title
+
+ if ( $nodes =~ /^(.*\[\')(.*\/.*)(\'\].*)$/ )
+ {
+ $first = $1;
+ $second = $2;
+ $third = $3;
+
+ $second =~ s/\//SUBSTITUTEDSLASH/g; # substituting "/" to "SUBSTITUTEDSLASH"
+ $nodes = $first . $second . $third;
+ }
+
+ while ( $nodes =~ /\// )
+ {
+ if ($nodes =~ /^\s*(.*?)\/(.*)\s*$/ )
+ {
+ $onenode = $1;
+ $nodes = $2;
+ $nodename = "node". $counter;
+
+ # Special handling for filters. Difference between:
+ # Filter['StarWriter 5.0 Vorlage/Template'] without oor:op="replace"
+ # *['m10'] with oor:op="replace"
+
+ if ( $onenode =~ /^\s*Filter\[\'(.*)\'\].*$/ ) { $oneconfig->{'isfilter'} = 1; }
+
+ # Changing the nodes with brackets:
+ # Filter['StarWriter 5.0 Vorlage/Template']
+ # *['m10']
+
+ if ( $onenode =~ /^.*\[\'(.*)\'\].*$/ )
+ {
+ $onenode = $1;
+ $bracketnode = "bracket_" . $nodename;
+ $oneconfig->{$bracketnode} = 1;
+ }
+
+ $onenode =~ s/SUBSTITUTEDSLASH/\//g; # substituting "SUBSTITUTEDSLASH" to "/"
+ $oneconfig->{$nodename} = $onenode;
+
+ # special handling for nodes "Factories"
+
+ if ( $onenode eq "Factories" ) { $oneconfig->{'factoriesnode'} = $counter; }
+ else { $oneconfig->{'factoriesnode'} = -99; }
+ }
+
+ $counter++
+ }
+
+ # and the final node
+
+ if ( $nodes =~ /^\s*Filter\[\'(.*)\'\].*$/ ) { $oneconfig->{'isfilter'} = 1; }
+
+ $nodename = "node". $counter;
+
+ if ( $nodes =~ /^.*\[\'(.*)\'\].*$/ )
+ {
+ $nodes = $1;
+ $bracketnode = "bracket_" . $nodename;
+ $oneconfig->{$bracketnode} = 1;
+ }
+
+ $nodes =~ s/SUBSTITUTEDSLASH/\//g; # substituting "SUBSTITUTEDSLASH" to "/"
+
+ if (($nodes eq "Name") || ($nodes eq "Title")) # isocodes below "Name" or "Title"
+ {
+ # if the last node $nodes is "Name" or "Title", it is a Property, not a name! See Common.xcu
+
+ $oneconfig->{'isisocode'} = 1;
+
+ if ( $nodes eq "Name" ) { $oneconfig->{'isname'} = 1; }
+ if ( $nodes eq "Title" ) { $oneconfig->{'istitle'} = 1; }
+ $counter--; # decreasing the counter, because "Name" and "Title" are no nodes
+ }
+ else
+ {
+ $oneconfig->{$nodename} = $nodes;
+ $oneconfig->{'isisocode'} = 0;
+ }
+
+ # special handling for nodes "Factories"
+
+ if ( $onenode eq "Factories" ) { $oneconfig->{'factoriesnode'} = $counter; }
+ else { $oneconfig->{'factoriesnode'} = -99; }
+
+ # saving the number of nodes
+
+ $oneconfig->{'nodenumber'} = $counter;
+ }
+}
+
+####################################################################
+# Inserting the start block into a configuration file
+####################################################################
+
+sub insert_start_block_into_configfile
+{
+ my ($configfileref, $oneconfig) = @_;
+
+ if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::insert_start_block_into_configfile : $#{$configfileref} : $oneconfig->{'name'}"); }
+
+ my $line = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
+ push( @{$configfileref}, $line);
+
+ $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";
+ my $packagename = $oneconfig->{'packagename'};
+ my $name = $oneconfig->{'name'};
+ $line =~ s/PACKAGENAME/$packagename/g;
+ $line =~ s/FILENAME/$name/g;
+ push( @{$configfileref}, $line);
+
+ $line = "\n";
+ push( @{$configfileref}, $line);
+}
+
+####################################################################
+# Inserting the end block into a configuration file
+####################################################################
+
+sub insert_end_block_into_configfile
+{
+ my ($configfileref) = @_;
+
+ if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::insert_end_block_into_configfile : $#{$configfileref}"); }
+
+ my $line = "\n" . '</oor:component-data>' . "\n";
+ push( @{$configfileref}, $line);
+}
+
+##############################################################
+# Getting the content of a node
+##############################################################
+
+sub get_node_content
+{
+ my ($nodeline) = @_;
+
+ if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::get_node_content : $nodeline"); }
+
+ my $content = "";
+
+ if ( $nodeline =~ /name\=\"(.*?)\"/ )
+ {
+ $content = $1;
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: Impossible error in function get_node_content!", "get_node_content");
+ }
+
+ return \$content;
+}
+
+##############################################################
+# Getting the line number of an existing node
+# Return "-1" if node does not exist
+##############################################################
+
+sub get_node_line_number
+{
+ my ($nodecount, $oneconfig, $oneconfigfileref) = @_;
+
+ if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::get_node_line_number : $nodecount : $oneconfig->{'name'} : $#{$oneconfigfileref}"); }
+
+ my $linenumber = -1; # the node does not exists, if returnvalue is "-1"
+
+ # Attention: Take care of the two title nodes:
+ # Path=org.openoffice.Office.Common/Menus/Wizard/*['m14']/Title
+ # Path=org.openoffice.Office.Common/Menus/Wizard/*['m15']/Title
+ # -> every subnode has to be identical
+
+ # creating the allnodes string from $oneconfig
+
+ my $allnodes = "";
+
+ for ( my $i = 1; $i <= $nodecount; $i++ )
+ {
+ my $nodename = "node" . $i;
+ $allnodes .= $oneconfig->{$nodename} . "/";
+ }
+
+ installer::remover::remove_leading_and_ending_slashes(\$allnodes); # exactly this string has to be found in the following iteration
+
+ # Iterating over the already built configuration file
+
+ my @allnodes = ();
+
+ for ( my $i = 0; $i <= $#{$oneconfigfileref}; $i++ )
+ {
+ my $line = ${$oneconfigfileref}[$i];
+ installer::remover::remove_leading_and_ending_whitespaces(\$line);
+ my $nodechanged = 0;
+
+ if ( $line =~ /^\s*\<node/ ) # opening node
+ {
+ $nodechanged = 1;
+ my $nodecontentref = get_node_content($line);
+ push(@allnodes, $$nodecontentref); # collecting all nodes in an array
+ }
+
+ if ( $line =~ /^\s*\<\/node/ ) # ending node
+ {
+ $nodechanged = 1;
+ pop(@allnodes); # removing the last node from the array
+ }
+
+ if (( $nodechanged ) && ($#allnodes > -1)) # a node was found and the node array is not empty
+ {
+ # creating the string to compare with the string $allnodes
+
+ my $nodestring = "";
+
+ for ( my $j = 0; $j <= $#allnodes; $j++ )
+ {
+ $nodestring .= $allnodes[$j] . "/";
+ }
+
+ installer::remover::remove_leading_and_ending_slashes(\$nodestring);
+
+ if ( $nodestring eq $allnodes )
+ {
+ # that is exactly the same node
+
+ $linenumber = $i;
+ $linenumber++; # increasing the linenumber
+ last;
+
+ }
+ }
+ }
+
+ return $linenumber;
+}
+
+##############################################################
+# Inserting one configurationitem into the configurationfile
+##############################################################
+
+sub insert_into_config_file
+{
+ my ($oneconfig, $oneconfigfileref) = @_;
+
+ if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::insert_into_config_file : $oneconfig->{'nodenumber'} : $#{$oneconfigfileref}"); }
+
+ my ($nodename, $nodecontent, $newnodeline, $bracketkey, $line, $insertline);
+
+ # interpreting the nodes, keys and values
+
+ my $nodeline = '<node oor:name="NODECONTENT" REPLACEPART >' . "\n";
+ my $propline = '<prop oor:name="KEYCONTENT" REPLACEPART TYPEPART>' . "\n";
+ my $valueline = '<value SEPARATORPART>VALUECONTENT</value>' . "\n";
+ my $langvalueline = '<value xml:lang="SAVEDLANGUAGE">VALUECONTENT</value>' . "\n";
+ my $propendline = '</prop>' . "\n";
+ my $nodeendline = '</node>' . "\n";
+
+ my $replacepart = 'oor:op="replace"';
+ my $typepart = 'oor:type="xs:VALUETYPE"'; # VALUETYPE can be "string", "boolean", ...
+
+ my $nodecount = $oneconfig->{'nodenumber'};
+ my $styles = $oneconfig->{'Styles'};
+
+ for ( my $i = 1; $i <= $nodecount; $i++ )
+ {
+ $insertline = get_node_line_number($i, $oneconfig, $oneconfigfileref);
+
+ if ( $insertline == -1) # if true, the node does not exist
+ {
+ $nodename = "node" . $i;
+ $nodecontent = $oneconfig->{$nodename};
+ $newnodeline = $nodeline;
+
+ $newnodeline =~ s/NODECONTENT/$nodecontent/g;
+
+ # Case1:
+ # Nodes with brackets, need the replacepart 'oor:op="replace"'
+ # Bracket node is set for each node with: bracket_node1=1, bracket_node2=1, ...
+ # Case a: <node oor:name="m0" oor:op="replace"> (Common.xcu needs oor:op="replace")
+ # Case b: <node oor:name="Ami Pro 1.x-3.1 (W4W)"> (TypeDetection.xcu does not need oor:op="replace")
+ # For case b introducting a special case for Filters
+
+ $bracketkey = "bracket_" . $nodename;
+
+ my $localbracketkey = 0;
+
+ if ( $oneconfig->{$bracketkey} ) { $localbracketkey = $oneconfig->{$bracketkey}; }
+
+ if ( $localbracketkey == 1 ) # 'oor:op="replace"' is needed
+ {
+ my $isfilter = 0;
+ if ( $oneconfig->{'isfilter'} ) { $isfilter = $oneconfig->{'isfilter'}; }
+
+ if ( $isfilter == 1 ) # this is a filter
+ {
+ $newnodeline =~ s/REPLACEPART//;
+ }
+ else
+ {
+ $newnodeline =~ s/REPLACEPART/$replacepart/;
+ }
+
+ $newnodeline =~ s/\s*\>/\>/; # removing resulting whitespaces
+ }
+
+ # Case2:
+ # Nodes below a Node "Factories", also need the replacepart 'oor:op="replace"'
+ # This is saved in $oneconfig->{'factoriesnode'}. If not set, the value is "-99"
+
+ if ( $i == $oneconfig->{'factoriesnode'} )
+ {
+ $newnodeline =~ s/REPLACEPART/$replacepart/;
+ $newnodeline =~ s/\s*\>/\>/; # removing resulting whitespaces
+ }
+
+ # Case3:
+ # In all other cases, REPLACEPART in nodes can be removed
+
+ $newnodeline =~ s/REPLACEPART//;
+ $newnodeline =~ s/\s*\>/\>/; # removing resulting whitespaces
+
+ # Finding the correct place for inserting the node
+
+ if ( $i == 1 ) # this is a toplevel node
+ {
+ push(@{$oneconfigfileref}, $newnodeline);
+ push(@{$oneconfigfileref}, $nodeendline);
+ }
+ else
+ {
+ # searching for the parent node
+
+ my $parentnumber = $i-1;
+ $insertline = get_node_line_number($parentnumber, $oneconfig, $oneconfigfileref);
+ splice(@{$oneconfigfileref}, $insertline, 0, ($newnodeline, $nodeendline));
+ }
+ }
+ }
+
+ # Setting variables $isbracketnode and $isfactorynode for the properties
+
+
+ my $isbracketnode = 0;
+ my $isfactorynode = 0;
+
+ for ( my $i = 1; $i <= $nodecount; $i++ )
+ {
+ $nodename = "node" . $i;
+ $bracketkey = "bracket_" . $nodename;
+
+ my $localbracketkey = 0;
+ if ( $oneconfig->{$bracketkey} ) { $localbracketkey = $oneconfig->{$bracketkey}; }
+
+ if ( $localbracketkey == 1 ) { $isbracketnode = 1; }
+ if ( $i == $oneconfig->{'factoriesnode'} ) { $isfactorynode = 1; }
+ }
+
+ # now all nodes exist, and the key and value can be inserted into the configfile
+ # the next line contains the key, for instance: <prop oor:name="UseDefaultMailer" oor:type="xs:boolean">
+ # my $propline = '<prop oor:name="KEYCONTENT" REPLACEPART TYPEPART>' . "\n";
+ # The type is only needed, if a replace is set.
+
+ my $newpropline = $propline;
+
+ # Replacement of KEYCONTENT, REPLACEPART and TYPEPART
+
+ # Case 1:
+ # Properties with oor:name="Name" (Common.xcu) are simply <prop oor:name="Name">
+ # The information about such a property is stored in $oneconfig->{'isisocode'}
+
+ if ( $oneconfig->{'isisocode'} )
+ {
+ if ( $oneconfig->{'isname'} ) { $newpropline =~ s/KEYCONTENT/Name/; } # The property name is always "Name"
+ if ( $oneconfig->{'istitle'} ) { $newpropline =~ s/KEYCONTENT/Title/; } # The property name is always "Title"
+ $newpropline =~ s/REPLACEPART//;
+ $newpropline =~ s/TYPEPART//;
+ $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces
+ }
+
+ # Begin of all other cases
+
+ my $key = $oneconfig->{'Key'};
+ $newpropline =~ s/KEYCONTENT/$key/;
+
+ my $valuetype;
+
+ if ( $styles =~ /CFG_STRING\b/ ) { $valuetype = "string"; }
+ elsif ( $styles =~ /CFG_NUMERIC/ ) { $valuetype = "int"; }
+ elsif ( $styles =~ /CFG_BOOLEAN/ ) { $valuetype = "boolean"; }
+ elsif ( $styles =~ /CFG_STRINGLIST/ ) { $valuetype = "string-list"; }
+# elsif ( $styles =~ /CFG_STRINGLIST/ ) { $valuetype = "string-list oor:separator=\"\|\""; }
+ else
+ {
+ installer::exiter::exit_program("ERROR: Unknown configuration value type: $styles", "insert_into_config_file");
+ }
+
+ # Case 2:
+ # Properties below a node "Factories" do not need a 'oor:op="replace"' and a 'oor:type="xs:VALUETYPE"'
+
+ if ( $isfactorynode )
+ {
+ $newpropline =~ s/REPLACEPART//;
+ $newpropline =~ s/TYPEPART//;
+ $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces
+ }
+
+ # Case 3:
+ # Properties below a "bracket" node do not need a 'oor:op="replace"', except they are iso-codes
+ # Assumption here: They are multilingual
+
+ if ( $isbracketnode )
+ {
+ my $localtypepart = $typepart;
+ $localtypepart =~ s/VALUETYPE/$valuetype/;
+ $newpropline =~ s/TYPEPART/$localtypepart/;
+
+ if ( $oneconfig->{'ismultilingual'} ) # This is solved by "Name" and "Title"
+ {
+ $newpropline =~ s/REPLACEPART/$replacepart/;
+ }
+ else
+ {
+ $newpropline =~ s/REPLACEPART//;
+ }
+
+ $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces
+ }
+
+ # Case 4:
+ # if the flag CREATE is set, the properties get 'oor:op="replace"' and 'oor:type="xs:VALUETYPE"'
+
+ if (( $styles =~ /\bCREATE\b/ ) && (!($isbracketnode)))
+ {
+ # my $typepart = 'oor:type="xs:VALUETYPE"'; # VALUETYPE can be "string", "boolean", ...
+
+ my $localtypepart = $typepart;
+ $localtypepart =~ s/VALUETYPE/$valuetype/;
+
+ $newpropline =~ s/TYPEPART/$localtypepart/;
+ $newpropline =~ s/REPLACEPART/$replacepart/;
+ $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces
+ }
+
+ # Case 5:
+ # all other ConfigurationItems do not need 'oor:op="replace"' and 'oor:type="xs:VALUETYPE"'
+
+ $newpropline =~ s/REPLACEPART//;
+ $newpropline =~ s/TYPEPART//;
+ $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces
+
+ # finally the value can be set
+
+ my $value = $oneconfig->{'Value'};
+
+ # Some values in setup script are written during installation process by the setup. These
+ # have values like "<title>". This will lead to an error, because of the brackets. Therefore the
+ # brackets have to be removed.
+
+ # ToDo: Substituting the setup replace variables
+
+ # replace_setting_variables();
+
+ $value =~ s/^\s*\<//;
+ $value =~ s/\>\s*$//;
+
+ # Deal with list separators
+ my $separatorpart = '';
+ if ( ($valuetype eq "string-list") && ($value =~ /\|/) )
+ {
+ $separatorpart = 'oor:separator="|"';
+ }
+
+ # Fake: substituting german umlauts
+
+ $value =~ s/\/ae/;
+ $value =~ s/\/oe/;
+ $value =~ s/\/ue/;
+ $value =~ s/\/AE/;
+ $value =~ s/\/OE/;
+ $value =~ s/\/UE/;
+
+ my $newvalueline;
+
+ if (!($oneconfig->{'isisocode'} )) # this is the simpe case
+ {
+ # my $valueline = '<value SEPARATORPART>VALUECONTENT</value>' . "\n";
+ $newvalueline = $valueline;
+ $newvalueline =~ s/VALUECONTENT/$value/g;
+ $newvalueline =~ s/SEPARATORPART/$separatorpart/;
+ }
+ else
+ {
+ # my $langvalueline = '<value xml:lang="SAVEDLANGUAGE">VALUECONTENT</value>' . "\n";
+ $newvalueline = $langvalueline;
+ $newvalueline =~ s/VALUECONTENT/$value/;
+ my $savedlanguage = $oneconfig->{'Key'};
+ $newvalueline =~ s/SAVEDLANGUAGE/$savedlanguage/;
+ }
+
+ # For language dependent values, it is possible, that the property already exist.
+ # In this case the prop must not be created again and only the value has to be included:
+ # <prop oor:name="Name">
+ # <value xml:lang="de">OpenOffice.org 2.0 Diagramm</value>
+ # <value xml:lang="en-US">OpenOffice.org 2.0 Chart</value>
+ # </prop>
+
+ # The key has to be written after the line, containing the complete node
+
+ $insertline = get_node_line_number($nodecount, $oneconfig, $oneconfigfileref);
+
+ if ( $oneconfig->{'ismultilingual'} )
+ {
+ if ( $newpropline eq ${$oneconfigfileref}[$insertline] )
+ {
+ if (!($newvalueline eq ${$oneconfigfileref}[$insertline+1])) # only include, if the value not already exists (example: value="FALSE" for many languages)
+ {
+ splice(@{$oneconfigfileref}, $insertline+1, 0, ($newvalueline)); # only the value needs to be added
+ }
+ }
+ else
+ {
+ splice(@{$oneconfigfileref}, $insertline, 0, ($newpropline, $newvalueline, $propendline));
+ }
+ }
+ else
+ {
+ splice(@{$oneconfigfileref}, $insertline, 0, ($newpropline, $newvalueline, $propendline));
+ }
+
+ return $oneconfigfileref;
+}
+
+##########################################################
+# Inserting tabs for better view into configuration file
+##########################################################
+
+sub insert_tabs_into_configfile
+{
+ my ($configfileref) = @_;
+
+ if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::insert_tabs_into_configfile : $#{$configfileref}"); }
+
+ my $counter = 0;
+
+ for ( my $i = 0; $i <= $#{$configfileref}; $i++ )
+ {
+ my $line = ${$configfileref}[$i];
+ my $linebefore = ${$configfileref}[$i-1];
+
+ if (( $line =~ /^\s*\<node/ ) || ( $line =~ /^\s*\<prop/ ))
+ {
+ if ((!( $linebefore =~ /^\s*\<\/node/ )) && (!( $linebefore =~ /^\s*\<\/prop/ ))) # do not increase after "</node" and after "</prop"
+ {
+ $counter++;
+ }
+ }
+
+ if ( $line =~ /^\s*\<value/ )
+ {
+ if (!($linebefore =~ /^\s*\<value/ )) # do not increase counter with "<value>" after "<value>" (multilingual configitems)
+ {
+ $counter++;
+ }
+ }
+
+ if (( $line =~ /^\s*\<\/node\>/ ) || ( $line =~ /^\s*\<\/prop\>/ ))
+ {
+ if ((!( $linebefore =~ /^\s*\<node/ )) && (!( $linebefore =~ /^\s*\<prop/ ))) # do not decrease after "<node" and after "<prop"
+ {
+ $counter--;
+ }
+ }
+
+ if ($counter > 0)
+ {
+ for ( my $j = 0; $j < $counter; $j++ )
+ {
+ $line = "\t" . $line;
+ }
+ }
+
+ ${$configfileref}[$i] = $line;
+ }
+}
+
+######################################################################
+# Collecting all different configuration items (Files and Modules)
+######################################################################
+
+sub collect_all_configuration_items
+{
+ my ($configurationitemsref, $item) = @_;
+
+ if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::collect_all_configuration_items : $#{$configurationitemsref} : $item"); }
+
+ my @allitems = ();
+
+ for ( my $i = 0; $i <= $#{$configurationitemsref}; $i++ )
+ {
+ my $oneconfig = ${$configurationitemsref}[$i];
+
+ if (! installer::existence::exists_in_array($oneconfig->{$item}, \@allitems))
+ {
+ push(@allitems, $oneconfig->{$item});
+ }
+ }
+
+ return \@allitems;
+}
+
+######################################################################
+# Collecting all module specific configuration items
+######################################################################
+
+sub get_all_configitems_at_module
+{
+ my ($moduleid, $configurationitemsref) = @_;
+
+ if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::get_all_configitems_at_module : $moduleid : $#{$configurationitemsref}"); }
+
+ my @moduleconfigurationitems = ();
+
+ for ( my $i = 0; $i <= $#{$configurationitemsref}; $i++ )
+ {
+ my $oneconfig = ${$configurationitemsref}[$i];
+
+ if ( $oneconfig->{'ModuleID'} eq $moduleid )
+ {
+ push(@moduleconfigurationitems, $oneconfig);
+ }
+ }
+
+ return \@moduleconfigurationitems;
+}
+
+#######################################################
+# Saving and zipping the created configurationfile
+#######################################################
+
+sub save_and_zip_configfile
+{
+ my ($oneconfigfileref, $onefile, $onemodule, $configdir) = @_;
+
+ if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::save_and_zip_configfile : $#{$oneconfigfileref} : $onefile : $onemodule : $configdir"); }
+
+ my $savefilename = $onefile;
+ $savefilename =~ s/\./\_/g;
+ $savefilename = $savefilename . "_" . $onemodule;
+ $savefilename = $savefilename . ".xcu";
+ my $shortsavefilename = $savefilename;
+
+ $savefilename = $configdir . $installer::globals::separator . $savefilename;
+
+ installer::files::save_file($savefilename, $oneconfigfileref);
+
+ # zipping the configfile
+
+ my $returnvalue = 1;
+
+ my $zipfilename = $shortsavefilename;
+ $zipfilename =~ s/\.xcu/\.zip/;
+
+ my $currentdir = cwd();
+ if ( $installer::globals::iswin ) { $currentdir =~ s/\//\\/g; }
+
+ chdir($configdir);
+
+ my $systemcall = "$installer::globals::zippath -q -m $zipfilename $shortsavefilename";
+ $returnvalue = system($systemcall);
+
+ chdir($currentdir);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not zip $savefilename to $zipfilename\n";
+ }
+ else
+ {
+ $infoline = "SUCCESS: Zipped file $savefilename to $zipfilename\n";
+ }
+ push( @installer::globals::logfileinfo, $infoline);
+
+ return $zipfilename;
+}
+
+#####################################################################
+# Adding the newly created configuration file into the file list
+#####################################################################
+
+sub add_zipfile_into_filelist
+{
+ my ($zipfilename, $configdir, $filesarrayref, $onemodule) = @_;
+
+ if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::add_zipfile_into_filelist: $zipfilename : $configdir : $#{$filesarrayref} : $onemodule"); }
+
+ my $longzipfilename = $configdir . $installer::globals::separator . $zipfilename;
+ my $gid = "gid_" . $zipfilename;
+ $gid =~ s/\./\_/g;
+
+ my %configfile = ();
+
+ # Taking the base data from the "gid_File_Lib_Vcl"
+
+ my $vclgid = "gid_File_Lib_Vcl";
+ my $vclfile = installer::existence::get_specified_file($filesarrayref, $vclgid);
+
+ # copying all base data
+ installer::converter::copy_item_object($vclfile, \%configfile);
+
+ # and overriding all new data
+ $configfile{'ismultilingual'} = 0;
+ $configfile{'sourcepath'} = $longzipfilename;
+ $configfile{'Name'} = $zipfilename;
+ $configfile{'UnixRights'} = "644";
+ $configfile{'gid'} = $gid;
+ $configfile{'Dir'} = "gid_Dir_Share_Uno_Packages";
+ $configfile{'destination'} = "share" . $installer::globals::separator . "uno_packages" . $installer::globals::separator . $zipfilename;
+ $configfile{'modules'} = $onemodule; # assigning the file to the correct module!
+
+ push(@{$filesarrayref}, \%configfile);
+}
+
+#######################################################
+# Creating configuration files from configurationitems
+#######################################################
+
+sub create_configuration_files
+{
+ my ($configurationitemsref, $filesarrayref, $languagestringref) = @_;
+
+ if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::create_configuration_files: $#{$configurationitemsref} : $#{$filesarrayref} : $$languagestringref"); }
+
+ installer::logger::include_header_into_logfile("Creating configuration files:");
+
+ # creating the directory
+
+ my $configdir = installer::systemactions::create_directories("configfiles", $languagestringref);
+
+ $configdir = installer::converter::make_path_conform($configdir);
+
+ # collecting an array of all modules
+ my $allmodules = collect_all_configuration_items($configurationitemsref, "ModuleID");
+
+ # iterating over all modules
+
+ for ( my $i = 0; $i <= $#{$allmodules}; $i++ )
+ {
+ my $onemodule = ${$allmodules}[$i];
+
+ my $moduleconfigitems = get_all_configitems_at_module($onemodule, $configurationitemsref);
+
+ # collecting an array of all "startpath". This are all different files (org.openoffice.Office.Common).
+ my $allfiles = collect_all_configuration_items($moduleconfigitems, "startpath");
+
+ # iteration over all files
+
+ for ( my $j = 0; $j <= $#{$allfiles}; $j++ )
+ {
+ my $onefile = ${$allfiles}[$j];
+
+ my @oneconfigfile = ();
+ my $oneconfigfileref = \@oneconfigfile;
+
+ my $startblockwritten = 0;
+
+ for ( my $k = 0; $k <= $#{$moduleconfigitems}; $k++ )
+ {
+ my $oneconfig = ${$moduleconfigitems}[$k];
+
+ my $startpath = $oneconfig->{'startpath'};
+
+ if ($startpath eq $onefile)
+ {
+ if (!($startblockwritten)) # writing some global lines into the xcu file
+ {
+ insert_start_block_into_configfile($oneconfigfileref, $oneconfig);
+ $startblockwritten = 1;
+ }
+
+ $oneconfigfileref = insert_into_config_file($oneconfig, $oneconfigfileref);
+ }
+ }
+
+ insert_end_block_into_configfile($oneconfigfileref);
+
+ # inserting tabs for nice appearance
+ insert_tabs_into_configfile($oneconfigfileref);
+
+ # saving the configfile
+ my $zipfilename = save_and_zip_configfile($oneconfigfileref, $onefile, $onemodule, $configdir);
+
+ # adding the zipped configfile to the list of installed files
+ # Some data are set now, others are taken from the file "soffice.exe" ("soffice.bin")
+
+ add_zipfile_into_filelist($zipfilename, $configdir, $filesarrayref, $onemodule);
+ }
+ }
+
+ my $infoline = "\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+}
+
+1;