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