1 #*************************************************************************
3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 # Copyright 2008 by Sun Microsystems, Inc.
7 # OpenOffice.org - a multi-platform office productivity suite
9 # $RCSfile: configuration.pm,v $
13 # This file is part of OpenOffice.org.
15 # OpenOffice.org is free software: you can redistribute it and/or modify
16 # it under the terms of the GNU Lesser General Public License version 3
17 # only, as published by the Free Software Foundation.
19 # OpenOffice.org is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 # GNU Lesser General Public License version 3 for more details
23 # (a copy is included in the LICENSE file that accompanied this code).
25 # You should have received a copy of the GNU Lesser General Public License
26 # version 3 along with OpenOffice.org. If not, see
27 # <http://www.openoffice.org/license.html>
28 # for a copy of the LGPLv3 License.
30 #*************************************************************************
32 package installer
::configuration
;
35 use installer
::converter
;
36 use installer
::existence
;
37 use installer
::exiter
;
39 use installer
::globals
;
40 use installer
::logger
;
41 use installer
::remover
;
42 use installer
::systemactions
;
44 ################################################################################
45 # Getting package from configurationitem (for instance: org.openoffice.Office)
46 # Getting name from configurationitem (for instance: Common)
47 ################################################################################
49 sub analyze_path_of_configurationitem
51 my ($configurationitemsref) = @_;
53 if ( $installer::globals
::debug
) { installer
::logger
::debuginfo
("installer::configuration::analyze_path_of_configurationitem : $#{$configurationitemsref}"); }
55 my ($startpath, $nodes, $name, $packagename, $onenode, $first, $second, $third, $bracketnode);
57 for ( my $i = 0; $i <= $#{$configurationitemsref}; $i++ )
59 my $oneconfig = ${$configurationitemsref}[$i];
60 my $path = $oneconfig->{'Path'};
62 installer
::remover
::remove_leading_and_ending_slashes
(\
$path); # in scp are some path beginning with "/"
64 if ( $path =~ /^\s*(.*?)\/(.*)\s
*$/ )
71 installer
::exiter
::exit_program
("ERROR: Unknown format of ConfigurationItem path: $path", "analyze_path_of_configurationitem");
74 # Startpath is now: org.openoffice.Setup
75 # Nodes is now: Office/Factories/com.sun.star.chart.ChartDocument
77 # Dividing the startpath into package (org.openoffic) and name (Setup).
79 $oneconfig->{'startpath'} = $startpath; # saving the startpath into the hash
81 if ( $startpath =~ /^\s*(\S*)\.(\S*?)\s*$/ )
85 $oneconfig->{'name'} = $name;
86 $oneconfig->{'packagename'} = $packagename;
90 installer
::exiter
::exit_program
("ERROR: Unknown format of ConfigurationItem startpath: $startpath", "analyze_path_of_configurationitem");
93 # Collecting all nodes
95 installer
::remover
::remove_leading_and_ending_slashes
(\
$nodes);
99 # Attention: Do not trust the slash
100 # Filters/Filter['StarWriter 5.0 Vorlage/Template']
101 # Menus/New/*['m10']/Title
103 if ( $nodes =~ /^(.*\[\')(.*\/.*)(\'\
].*)$/ )
109 $second =~ s/\//SUBSTITUTEDSLASH
/g; # substituting "/" to "SUBSTITUTEDSLASH
"
110 $nodes = $first . $second . $third;
113 while ( $nodes =~ /\// )
115 if ($nodes =~ /^\s*(.*?)\/(.*)\s*$/ )
119 $nodename = "node
". $counter;
121 # Special handling for filters. Difference between:
122 # Filter['StarWriter 5.0 Vorlage/Template'] without oor:op="replace
"
123 # *['m10'] with oor:op="replace
"
125 if ( $onenode =~ /^\s*Filter\[\'(.*)\'\].*$/ ) { $oneconfig->{'isfilter'} = 1; }
127 # Changing the nodes with brackets:
128 # Filter['StarWriter 5.0 Vorlage/Template']
131 if ( $onenode =~ /^.*\[\'(.*)\'\].*$/ )
134 $bracketnode = "bracket_
" . $nodename;
135 $oneconfig->{$bracketnode} = 1;
138 $onenode =~ s/SUBSTITUTEDSLASH/\//g; # substituting "SUBSTITUTEDSLASH
" to "/"
139 $oneconfig->{$nodename} = $onenode;
141 # special handling for nodes "Factories
"
143 if ( $onenode eq "Factories
" ) { $oneconfig->{'factoriesnode'} = $counter; }
144 else { $oneconfig->{'factoriesnode'} = -99; }
152 if ( $nodes =~ /^\s*Filter\[\'(.*)\'\].*$/ ) { $oneconfig->{'isfilter'} = 1; }
154 $nodename = "node
". $counter;
156 if ( $nodes =~ /^.*\[\'(.*)\'\].*$/ )
159 $bracketnode = "bracket_
" . $nodename;
160 $oneconfig->{$bracketnode} = 1;
163 $nodes =~ s/SUBSTITUTEDSLASH/\//g; # substituting "SUBSTITUTEDSLASH
" to "/"
165 if (($nodes eq "Name
") || ($nodes eq "Title
")) # isocodes below "Name
" or "Title
"
167 # if the last node $nodes is "Name
" or "Title
", it is a Property, not a name! See Common.xcu
169 $oneconfig->{'isisocode'} = 1;
171 if ( $nodes eq "Name
" ) { $oneconfig->{'isname'} = 1; }
172 if ( $nodes eq "Title
" ) { $oneconfig->{'istitle'} = 1; }
173 $counter--; # decreasing the counter, because "Name
" and "Title
" are no nodes
177 $oneconfig->{$nodename} = $nodes;
178 $oneconfig->{'isisocode'} = 0;
181 # special handling for nodes "Factories
"
183 if ( $onenode eq "Factories
" ) { $oneconfig->{'factoriesnode'} = $counter; }
184 else { $oneconfig->{'factoriesnode'} = -99; }
186 # saving the number of nodes
188 $oneconfig->{'nodenumber'} = $counter;
192 ####################################################################
193 # Inserting the start block into a configuration file
194 ####################################################################
196 sub insert_start_block_into_configfile
198 my ($configfileref, $oneconfig) = @_;
200 if ( $installer::globals::debug ) { installer::logger::debuginfo("installer
::configuration
::insert_start_block_into_configfile
: $#{$configfileref} : $oneconfig->{'name'}"); }
202 my $line = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
203 push( @
{$configfileref}, $line);
205 $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";
206 my $packagename = $oneconfig->{'packagename'};
207 my $name = $oneconfig->{'name'};
208 $line =~ s/PACKAGENAME/$packagename/g;
209 $line =~ s/FILENAME/$name/g;
210 push( @
{$configfileref}, $line);
213 push( @
{$configfileref}, $line);
216 ####################################################################
217 # Inserting the end block into a configuration file
218 ####################################################################
220 sub insert_end_block_into_configfile
222 my ($configfileref) = @_;
224 if ( $installer::globals
::debug
) { installer
::logger
::debuginfo
("installer::configuration::insert_end_block_into_configfile : $#{$configfileref}"); }
226 my $line = "\n" . '</oor:component-data>' . "\n";
227 push( @
{$configfileref}, $line);
230 ##############################################################
231 # Getting the content of a node
232 ##############################################################
238 if ( $installer::globals
::debug
) { installer
::logger
::debuginfo
("installer::configuration::get_node_content : $nodeline"); }
242 if ( $nodeline =~ /name\=\"(.*?)\"/ )
248 installer
::exiter
::exit_program
("ERROR: Impossible error in function get_node_content!", "get_node_content");
254 ##############################################################
255 # Getting the line number of an existing node
256 # Return "-1" if node does not exist
257 ##############################################################
259 sub get_node_line_number
261 my ($nodecount, $oneconfig, $oneconfigfileref) = @_;
263 if ( $installer::globals
::debug
) { installer
::logger
::debuginfo
("installer::configuration::get_node_line_number : $nodecount : $oneconfig->{'name'} : $#{$oneconfigfileref}"); }
265 my $linenumber = -1; # the node does not exists, if returnvalue is "-1"
267 # Attention: Take care of the two title nodes:
268 # Path=org.openoffice.Office.Common/Menus/Wizard/*['m14']/Title
269 # Path=org.openoffice.Office.Common/Menus/Wizard/*['m15']/Title
270 # -> every subnode has to be identical
272 # creating the allnodes string from $oneconfig
276 for ( my $i = 1; $i <= $nodecount; $i++ )
278 my $nodename = "node" . $i;
279 $allnodes .= $oneconfig->{$nodename} . "/";
282 installer
::remover
::remove_leading_and_ending_slashes
(\
$allnodes); # exactly this string has to be found in the following iteration
284 # Iterating over the already built configuration file
288 for ( my $i = 0; $i <= $#{$oneconfigfileref}; $i++ )
290 my $line = ${$oneconfigfileref}[$i];
291 installer
::remover
::remove_leading_and_ending_whitespaces
(\
$line);
294 if ( $line =~ /^\s*\<node/ ) # opening node
297 my $nodecontentref = get_node_content
($line);
298 push(@allnodes, $$nodecontentref); # collecting all nodes in an array
301 if ( $line =~ /^\s*\<\/node
/ ) # ending node
304 pop(@allnodes); # removing the last node from the array
307 if (( $nodechanged ) && ($#allnodes > -1)) # a node was found and the node array is not empty
309 # creating the string to compare with the string $allnodes
313 for ( my $j = 0; $j <= $#allnodes; $j++ )
315 $nodestring .= $allnodes[$j] . "/";
318 installer
::remover
::remove_leading_and_ending_slashes
(\
$nodestring);
320 if ( $nodestring eq $allnodes )
322 # that is exactly the same node
325 $linenumber++; # increasing the linenumber
335 ##############################################################
336 # Inserting one configurationitem into the configurationfile
337 ##############################################################
339 sub insert_into_config_file
341 my ($oneconfig, $oneconfigfileref) = @_;
343 if ( $installer::globals
::debug
) { installer
::logger
::debuginfo
("installer::configuration::insert_into_config_file : $oneconfig->{'nodenumber'} : $#{$oneconfigfileref}"); }
345 my ($nodename, $nodecontent, $newnodeline, $bracketkey, $line, $insertline);
347 # interpreting the nodes, keys and values
349 my $nodeline = '<node oor:name="NODECONTENT" REPLACEPART >' . "\n";
350 my $propline = '<prop oor:name="KEYCONTENT" REPLACEPART TYPEPART>' . "\n";
351 my $valueline = '<value SEPARATORPART>VALUECONTENT</value>' . "\n";
352 my $langvalueline = '<value xml:lang="SAVEDLANGUAGE">VALUECONTENT</value>' . "\n";
353 my $propendline = '</prop>' . "\n";
354 my $nodeendline = '</node>' . "\n";
356 my $replacepart = 'oor:op="replace"';
357 my $typepart = 'oor:type="xs:VALUETYPE"'; # VALUETYPE can be "string", "boolean", ...
359 my $nodecount = $oneconfig->{'nodenumber'};
360 my $styles = $oneconfig->{'Styles'};
362 for ( my $i = 1; $i <= $nodecount; $i++ )
364 $insertline = get_node_line_number
($i, $oneconfig, $oneconfigfileref);
366 if ( $insertline == -1) # if true, the node does not exist
368 $nodename = "node" . $i;
369 $nodecontent = $oneconfig->{$nodename};
370 $newnodeline = $nodeline;
372 $newnodeline =~ s/NODECONTENT/$nodecontent/g;
375 # Nodes with brackets, need the replacepart 'oor:op="replace"'
376 # Bracket node is set for each node with: bracket_node1=1, bracket_node2=1, ...
377 # Case a: <node oor:name="m0" oor:op="replace"> (Common.xcu needs oor:op="replace")
378 # Case b: <node oor:name="Ami Pro 1.x-3.1 (W4W)"> (TypeDetection.xcu does not need oor:op="replace")
379 # For case b introducting a special case for Filters
381 $bracketkey = "bracket_" . $nodename;
383 my $localbracketkey = 0;
385 if ( $oneconfig->{$bracketkey} ) { $localbracketkey = $oneconfig->{$bracketkey}; }
387 if ( $localbracketkey == 1 ) # 'oor:op="replace"' is needed
390 if ( $oneconfig->{'isfilter'} ) { $isfilter = $oneconfig->{'isfilter'}; }
392 if ( $isfilter == 1 ) # this is a filter
394 $newnodeline =~ s/REPLACEPART//;
398 $newnodeline =~ s/REPLACEPART/$replacepart/;
401 $newnodeline =~ s/\s*\>/\>/; # removing resulting whitespaces
405 # Nodes below a Node "Factories", also need the replacepart 'oor:op="replace"'
406 # This is saved in $oneconfig->{'factoriesnode'}. If not set, the value is "-99"
408 if ( $i == $oneconfig->{'factoriesnode'} )
410 $newnodeline =~ s/REPLACEPART/$replacepart/;
411 $newnodeline =~ s/\s*\>/\>/; # removing resulting whitespaces
415 # In all other cases, REPLACEPART in nodes can be removed
417 $newnodeline =~ s/REPLACEPART//;
418 $newnodeline =~ s/\s*\>/\>/; # removing resulting whitespaces
420 # Finding the correct place for inserting the node
422 if ( $i == 1 ) # this is a toplevel node
424 push(@
{$oneconfigfileref}, $newnodeline);
425 push(@
{$oneconfigfileref}, $nodeendline);
429 # searching for the parent node
431 my $parentnumber = $i-1;
432 $insertline = get_node_line_number
($parentnumber, $oneconfig, $oneconfigfileref);
433 splice(@
{$oneconfigfileref}, $insertline, 0, ($newnodeline, $nodeendline));
438 # Setting variables $isbracketnode and $isfactorynode for the properties
441 my $isbracketnode = 0;
442 my $isfactorynode = 0;
444 for ( my $i = 1; $i <= $nodecount; $i++ )
446 $nodename = "node" . $i;
447 $bracketkey = "bracket_" . $nodename;
449 my $localbracketkey = 0;
450 if ( $oneconfig->{$bracketkey} ) { $localbracketkey = $oneconfig->{$bracketkey}; }
452 if ( $localbracketkey == 1 ) { $isbracketnode = 1; }
453 if ( $i == $oneconfig->{'factoriesnode'} ) { $isfactorynode = 1; }
456 # now all nodes exist, and the key and value can be inserted into the configfile
457 # the next line contains the key, for instance: <prop oor:name="UseDefaultMailer" oor:type="xs:boolean">
458 # my $propline = '<prop oor:name="KEYCONTENT" REPLACEPART TYPEPART>' . "\n";
459 # The type is only needed, if a replace is set.
461 my $newpropline = $propline;
463 # Replacement of KEYCONTENT, REPLACEPART and TYPEPART
466 # Properties with oor:name="Name" (Common.xcu) are simply <prop oor:name="Name">
467 # The information about such a property is stored in $oneconfig->{'isisocode'}
469 if ( $oneconfig->{'isisocode'} )
471 if ( $oneconfig->{'isname'} ) { $newpropline =~ s/KEYCONTENT/Name/; } # The property name is always "Name"
472 if ( $oneconfig->{'istitle'} ) { $newpropline =~ s/KEYCONTENT/Title/; } # The property name is always "Title"
473 $newpropline =~ s/REPLACEPART//;
474 $newpropline =~ s/TYPEPART//;
475 $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces
478 # Begin of all other cases
480 my $key = $oneconfig->{'Key'};
481 $newpropline =~ s/KEYCONTENT/$key/;
485 if ( $styles =~ /CFG_STRING\b/ ) { $valuetype = "string"; }
486 elsif ( $styles =~ /CFG_NUMERIC/ ) { $valuetype = "int"; }
487 elsif ( $styles =~ /CFG_BOOLEAN/ ) { $valuetype = "boolean"; }
488 elsif ( $styles =~ /CFG_STRINGLIST/ ) { $valuetype = "string-list"; }
489 # elsif ( $styles =~ /CFG_STRINGLIST/ ) { $valuetype = "string-list oor:separator=\"\|\""; }
492 installer
::exiter
::exit_program
("ERROR: Unknown configuration value type: $styles", "insert_into_config_file");
496 # Properties below a node "Factories" do not need a 'oor:op="replace"' and a 'oor:type="xs:VALUETYPE"'
498 if ( $isfactorynode )
500 $newpropline =~ s/REPLACEPART//;
501 $newpropline =~ s/TYPEPART//;
502 $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces
506 # Properties below a "bracket" node do not need a 'oor:op="replace"', except they are iso-codes
507 # Assumption here: They are multilingual
509 if ( $isbracketnode )
511 my $localtypepart = $typepart;
512 $localtypepart =~ s/VALUETYPE/$valuetype/;
513 $newpropline =~ s/TYPEPART/$localtypepart/;
515 if ( $oneconfig->{'ismultilingual'} ) # This is solved by "Name" and "Title"
517 $newpropline =~ s/REPLACEPART/$replacepart/;
521 $newpropline =~ s/REPLACEPART//;
524 $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces
528 # if the flag CREATE is set, the properties get 'oor:op="replace"' and 'oor:type="xs:VALUETYPE"'
530 if (( $styles =~ /\bCREATE\b/ ) && (!($isbracketnode)))
532 # my $typepart = 'oor:type="xs:VALUETYPE"'; # VALUETYPE can be "string", "boolean", ...
534 my $localtypepart = $typepart;
535 $localtypepart =~ s/VALUETYPE/$valuetype/;
537 $newpropline =~ s/TYPEPART/$localtypepart/;
538 $newpropline =~ s/REPLACEPART/$replacepart/;
539 $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces
543 # all other ConfigurationItems do not need 'oor:op="replace"' and 'oor:type="xs:VALUETYPE"'
545 $newpropline =~ s/REPLACEPART//;
546 $newpropline =~ s/TYPEPART//;
547 $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces
549 # finally the value can be set
551 my $value = $oneconfig->{'Value'};
553 # Some values in setup script are written during installation process by the setup. These
554 # have values like "<title>". This will lead to an error, because of the brackets. Therefore the
555 # brackets have to be removed.
557 # ToDo: Substituting the setup replace variables
559 # replace_setting_variables();
561 $value =~ s/^\s*\<//;
562 $value =~ s/\>\s*$//;
564 # Deal with list separators
565 my $separatorpart = '';
566 if ( ($valuetype eq "string-list") && ($value =~ /\|/) )
568 $separatorpart = 'oor:separator="|"';
571 # Fake: substituting german umlauts
582 if (!($oneconfig->{'isisocode'} )) # this is the simpe case
584 # my $valueline = '<value SEPARATORPART>VALUECONTENT</value>' . "\n";
585 $newvalueline = $valueline;
586 $newvalueline =~ s/VALUECONTENT/$value/g;
587 $newvalueline =~ s/SEPARATORPART/$separatorpart/;
591 # my $langvalueline = '<value xml:lang="SAVEDLANGUAGE">VALUECONTENT</value>' . "\n";
592 $newvalueline = $langvalueline;
593 $newvalueline =~ s/VALUECONTENT/$value/;
594 my $savedlanguage = $oneconfig->{'Key'};
595 $newvalueline =~ s/SAVEDLANGUAGE/$savedlanguage/;
598 # For language dependent values, it is possible, that the property already exist.
599 # In this case the prop must not be created again and only the value has to be included:
600 # <prop oor:name="Name">
601 # <value xml:lang="de">OpenOffice.org 2.0 Diagramm</value>
602 # <value xml:lang="en-US">OpenOffice.org 2.0 Chart</value>
605 # The key has to be written after the line, containing the complete node
607 $insertline = get_node_line_number
($nodecount, $oneconfig, $oneconfigfileref);
609 if ( $oneconfig->{'ismultilingual'} )
611 if ( $newpropline eq ${$oneconfigfileref}[$insertline] )
613 if (!($newvalueline eq ${$oneconfigfileref}[$insertline+1])) # only include, if the value not already exists (example: value="FALSE" for many languages)
615 splice(@
{$oneconfigfileref}, $insertline+1, 0, ($newvalueline)); # only the value needs to be added
620 splice(@
{$oneconfigfileref}, $insertline, 0, ($newpropline, $newvalueline, $propendline));
625 splice(@
{$oneconfigfileref}, $insertline, 0, ($newpropline, $newvalueline, $propendline));
628 return $oneconfigfileref;
631 ##########################################################
632 # Inserting tabs for better view into configuration file
633 ##########################################################
635 sub insert_tabs_into_configfile
637 my ($configfileref) = @_;
639 if ( $installer::globals
::debug
) { installer
::logger
::debuginfo
("installer::configuration::insert_tabs_into_configfile : $#{$configfileref}"); }
643 for ( my $i = 0; $i <= $#{$configfileref}; $i++ )
645 my $line = ${$configfileref}[$i];
646 my $linebefore = ${$configfileref}[$i-1];
648 if (( $line =~ /^\s*\<node/ ) || ( $line =~ /^\s*\<prop/ ))
650 if ((!( $linebefore =~ /^\s*\<\/node
/ )) && (!( $linebefore =~ /^\s
*\
<\
/prop/ ))) # do not increase after "</node" and after "</prop"
656 if ( $line =~ /^\s*\<value/ )
658 if (!($linebefore =~ /^\s*\<value/ )) # do not increase counter with "<value>" after "<value>" (multilingual configitems)
664 if (( $line =~ /^\s*\<\/node\
>/ ) || ( $line =~ /^\s
*\
<\
/prop\>/ ))
666 if ((!( $linebefore =~ /^\s*\<node/ )) && (!( $linebefore =~ /^\s*\<prop/ ))) # do not decrease after "<node" and after "<prop"
674 for ( my $j = 0; $j < $counter; $j++ )
676 $line = "\t" . $line;
680 ${$configfileref}[$i] = $line;
684 ######################################################################
685 # Collecting all different configuration items (Files and Modules)
686 ######################################################################
688 sub collect_all_configuration_items
690 my ($configurationitemsref, $item) = @_;
692 if ( $installer::globals
::debug
) { installer
::logger
::debuginfo
("installer::configuration::collect_all_configuration_items : $#{$configurationitemsref} : $item"); }
696 for ( my $i = 0; $i <= $#{$configurationitemsref}; $i++ )
698 my $oneconfig = ${$configurationitemsref}[$i];
700 if (! installer
::existence
::exists_in_array
($oneconfig->{$item}, \
@allitems))
702 push(@allitems, $oneconfig->{$item});
709 ######################################################################
710 # Collecting all module specific configuration items
711 ######################################################################
713 sub get_all_configitems_at_module
715 my ($moduleid, $configurationitemsref) = @_;
717 if ( $installer::globals
::debug
) { installer
::logger
::debuginfo
("installer::configuration::get_all_configitems_at_module : $moduleid : $#{$configurationitemsref}"); }
719 my @moduleconfigurationitems = ();
721 for ( my $i = 0; $i <= $#{$configurationitemsref}; $i++ )
723 my $oneconfig = ${$configurationitemsref}[$i];
725 if ( $oneconfig->{'ModuleID'} eq $moduleid )
727 push(@moduleconfigurationitems, $oneconfig);
731 return \
@moduleconfigurationitems;
734 #######################################################
735 # Saving and zipping the created configurationfile
736 #######################################################
738 sub save_and_zip_configfile
740 my ($oneconfigfileref, $onefile, $onemodule, $configdir) = @_;
742 if ( $installer::globals
::debug
) { installer
::logger
::debuginfo
("installer::configuration::save_and_zip_configfile : $#{$oneconfigfileref} : $onefile : $onemodule : $configdir"); }
744 my $savefilename = $onefile;
745 $savefilename =~ s/\./\_/g;
746 $savefilename = $savefilename . "_" . $onemodule;
747 $savefilename = $savefilename . ".xcu";
748 my $shortsavefilename = $savefilename;
750 $savefilename = $configdir . $installer::globals
::separator
. $savefilename;
752 installer
::files
::save_file
($savefilename, $oneconfigfileref);
754 # zipping the configfile
758 my $zipfilename = $shortsavefilename;
759 $zipfilename =~ s/\.xcu/\.zip/;
761 my $currentdir = cwd
();
762 if ( $installer::globals
::iswin
) { $currentdir =~ s/\//\\/g
; }
766 my $systemcall = "$installer::globals::zippath -q -m $zipfilename $shortsavefilename";
767 $returnvalue = system($systemcall);
771 my $infoline = "Systemcall: $systemcall\n";
772 push( @installer::globals
::logfileinfo
, $infoline);
776 $infoline = "ERROR: Could not zip $savefilename to $zipfilename\n";
780 $infoline = "SUCCESS: Zipped file $savefilename to $zipfilename\n";
782 push( @installer::globals
::logfileinfo
, $infoline);
787 #####################################################################
788 # Adding the newly created configuration file into the file list
789 #####################################################################
791 sub add_zipfile_into_filelist
793 my ($zipfilename, $configdir, $filesarrayref, $onemodule) = @_;
795 if ( $installer::globals
::debug
) { installer
::logger
::debuginfo
("installer::configuration::add_zipfile_into_filelist: $zipfilename : $configdir : $#{$filesarrayref} : $onemodule"); }
797 my $longzipfilename = $configdir . $installer::globals
::separator
. $zipfilename;
798 my $gid = "gid_" . $zipfilename;
803 # Taking the base data from the "gid_File_Lib_Vcl"
805 my $vclgid = "gid_File_Lib_Vcl";
806 my $vclfile = installer
::existence
::get_specified_file
($filesarrayref, $vclgid);
808 # copying all base data
809 installer
::converter
::copy_item_object
($vclfile, \
%configfile);
811 # and overriding all new data
812 $configfile{'ismultilingual'} = 0;
813 $configfile{'sourcepath'} = $longzipfilename;
814 $configfile{'Name'} = $zipfilename;
815 $configfile{'UnixRights'} = "644";
816 $configfile{'gid'} = $gid;
817 $configfile{'Dir'} = "gid_Dir_Share_Uno_Packages";
818 $configfile{'destination'} = "share" . $installer::globals
::separator
. "uno_packages" . $installer::globals
::separator
. $zipfilename;
819 $configfile{'modules'} = $onemodule; # assigning the file to the correct module!
821 push(@
{$filesarrayref}, \
%configfile);
824 #######################################################
825 # Creating configuration files from configurationitems
826 #######################################################
828 sub create_configuration_files
830 my ($configurationitemsref, $filesarrayref, $languagestringref) = @_;
832 if ( $installer::globals
::debug
) { installer
::logger
::debuginfo
("installer::configuration::create_configuration_files: $#{$configurationitemsref} : $#{$filesarrayref} : $$languagestringref"); }
834 installer
::logger
::include_header_into_logfile
("Creating configuration files:");
836 # creating the directory
838 my $configdir = installer
::systemactions
::create_directories
("configfiles", $languagestringref);
840 $configdir = installer
::converter
::make_path_conform
($configdir);
842 # collecting an array of all modules
843 my $allmodules = collect_all_configuration_items
($configurationitemsref, "ModuleID");
845 # iterating over all modules
847 for ( my $i = 0; $i <= $#{$allmodules}; $i++ )
849 my $onemodule = ${$allmodules}[$i];
851 my $moduleconfigitems = get_all_configitems_at_module
($onemodule, $configurationitemsref);
853 # collecting an array of all "startpath". This are all different files (org.openoffice.Office.Common).
854 my $allfiles = collect_all_configuration_items
($moduleconfigitems, "startpath");
856 # iteration over all files
858 for ( my $j = 0; $j <= $#{$allfiles}; $j++ )
860 my $onefile = ${$allfiles}[$j];
862 my @oneconfigfile = ();
863 my $oneconfigfileref = \
@oneconfigfile;
865 my $startblockwritten = 0;
867 for ( my $k = 0; $k <= $#{$moduleconfigitems}; $k++ )
869 my $oneconfig = ${$moduleconfigitems}[$k];
871 my $startpath = $oneconfig->{'startpath'};
873 if ($startpath eq $onefile)
875 if (!($startblockwritten)) # writing some global lines into the xcu file
877 insert_start_block_into_configfile
($oneconfigfileref, $oneconfig);
878 $startblockwritten = 1;
881 $oneconfigfileref = insert_into_config_file
($oneconfig, $oneconfigfileref);
885 insert_end_block_into_configfile
($oneconfigfileref);
887 # inserting tabs for nice appearance
888 insert_tabs_into_configfile
($oneconfigfileref);
890 # saving the configfile
891 my $zipfilename = save_and_zip_configfile
($oneconfigfileref, $onefile, $onemodule, $configdir);
893 # adding the zipped configfile to the list of installed files
894 # Some data are set now, others are taken from the file "soffice.exe" ("soffice.bin")
896 add_zipfile_into_filelist
($zipfilename, $configdir, $filesarrayref, $onemodule);
901 push( @installer::globals
::logfileinfo
, $infoline);