diff options
Diffstat (limited to 'solenv/bin/modules/par2script/work.pm')
-rw-r--r-- | solenv/bin/modules/par2script/work.pm | 416 |
1 files changed, 416 insertions, 0 deletions
diff --git a/solenv/bin/modules/par2script/work.pm b/solenv/bin/modules/par2script/work.pm new file mode 100644 index 000000000000..fd266e306d04 --- /dev/null +++ b/solenv/bin/modules/par2script/work.pm @@ -0,0 +1,416 @@ +#************************************************************************* +# +# 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 par2script::work; + +use par2script::existence; +use par2script::globals; +use par2script::remover; + +############################################ +# par2script working module +############################################ + +sub analyze_comma_separated_list +{ + my ($list, $listref) = @_; # second parameter is optional + + my @list = (); + my $locallistref; + + if (!( $listref )) { $locallistref = \@list; } + else { $locallistref = $listref; } + + par2script::remover::remove_leading_and_ending_comma(\$list); + par2script::remover::remove_leading_and_ending_whitespaces(\$list); + + while ( $list =~ /^\s*(.*?)\s*\,\s*(.*)\s*$/ ) + { + my $oneentry = $1; + $list = $2; + par2script::remover::remove_leading_and_ending_whitespaces(\$oneentry); + push(@{$locallistref}, $oneentry); + } + + # the last entry + + par2script::remover::remove_leading_and_ending_whitespaces(\$list); + push(@{$locallistref}, $list); + + return $locallistref; +} + +############################################ +# setting list of include pathes +############################################ + +sub setincludes +{ + my ($list) = @_; + + # input is the comma separated list of include pathes + + my $includes = analyze_comma_separated_list($list); + + return $includes; +} + +############################################ +# setting list of all par files +############################################ + +sub setparfiles +{ + my ($filename) = @_; + + # input is the name of the list file + $filename =~ s/\@//; # removing the leading \@ + + my $filecontent = par2script::files::read_file($filename); + + my @parfiles = (); + my $parfilesref = \@parfiles; + + foreach ( @{$filecontent} ) { $parfilesref = analyze_comma_separated_list($_, $parfilesref); } + + return $parfilesref; +} + +############################################ +# finding the correct include path +# for the par files +############################################ + +sub make_complete_pathes_for_parfiles +{ + my ($parfiles, $includes) = @_; + + my $oneparfile; + + foreach $oneparfile ( @{$parfiles} ) + { + my $foundparfile = 0; + my $includepath; + + foreach $includepath ( @{$includes} ) + { + my $parfile = "$includepath/$oneparfile"; + + if ( -f $parfile ) + { + $foundparfile = 1; + $oneparfile = $parfile; + last; + } + } + + if ( ! $foundparfile ) + { + die "ERROR: Could not find parfile ${$parfiles}[$i] in includes pathes: $par2script::globals::includepathlist !\n"; + } + } +} + +###################################################### +# collecting one special item in the par files and +# including it into the "definitions" hash +###################################################### + +sub collect_definitions +{ + my ($parfilecontent) = @_; + + my $multidefinitionerror = 0; + my @multidefinitiongids = (); + + + foreach $oneitem ( @par2script::globals::allitems ) + { + my $docollect = 0; + my $gid = ""; + my %allitemhash = (); + + for ( my $i = 0; $i <= $#{$parfilecontent}; $i++ ) + { + my $line = ${$parfilecontent}[$i]; + + if ( $line =~ /^\s*$oneitem\s+(\w+)\s*$/ ) + { + $gid = $1; + $docollect = 1; + } + else + { + $docollect = 0; + } + + if ( $docollect ) + { + my $currentline = $i; + my %oneitemhash; + + while (! ( ${$parfilecontent}[$currentline] =~ /^\s*End\s*$/i ) ) + { + if ( ${$parfilecontent}[$currentline] =~ /^\s*(.+?)\s*\=\s*(.+?)\s*\;\s*$/ ) # only oneliner! + { + $itemkey = $1; + $itemvalue = $2; + + if ( $oneitem eq "Directory" ) { if ( $itemkey =~ "DosName" ) { $itemkey =~ s/DosName/HostName/; } } + if (( $oneitem eq "Directory" ) || ( $oneitem eq "File" ) || ( $oneitem eq "Unixlink" )) { if ( $itemvalue eq "PD_PROGDIR" ) { $itemvalue = "PREDEFINED_PROGDIR"; }} + if (( $itemkey eq "Styles" ) && ( $itemvalue =~ /^\s*(\w+)(\s*\;\s*)$/ )) { $itemvalue = "($1)$2"; } + + $oneitemhash{$itemkey} = $itemvalue; + } + + $currentline++; + } + + # no hyphen allowed in gids -> cannot happen here because (\w+) is required for gids + if ( $gid =~ /-/ ) { par2script::exiter::exit_program("ERROR: No hyphen allowed in global id: $gid", "test_of_hyphen"); } + + # test of uniqueness + if ( exists($allitemhash{$gid}) ) + { + $multidefinitionerror = 1; + push(@multidefinitiongids, $gid); + } + + $allitemhash{$gid} = \%oneitemhash; + } + } + + $par2script::globals::definitions{$oneitem} = \%allitemhash; + } + + if ( $multidefinitionerror ) { par2script::exiter::multidefinitionerror(\@multidefinitiongids); } + + # foreach $key (keys %par2script::globals::definitions) + # { + # print "Key: $key \n"; + # + # foreach $key (keys %{$par2script::globals::definitions{$key}}) + # { + # print "\t$key \n"; + # } + # } +} + +###################################################### +# Filling content into the script +###################################################### + +sub put_oneitem_into_script +{ + my ( $script, $item, $itemhash, $itemkey ) = @_; + + push(@{$script}, "$item $itemkey\n" ); + my $content = ""; + foreach $content (sort keys %{$itemhash->{$itemkey}}) { push(@{$script}, "\t$content = $itemhash->{$itemkey}->{$content};\n" ); } + push(@{$script}, "End\n" ); + push(@{$script}, "\n" ); +} + +###################################################### +# Creating the script +###################################################### + +sub create_script +{ + my @script = (); + my $oneitem; + + foreach $oneitem ( @par2script::globals::allitems ) + { + if ( exists($par2script::globals::definitions{$oneitem}) ) + { + if ( $oneitem eq "Shortcut" ) { next; } # "Shortcuts" after "Files" + + if (( $oneitem eq "Module" ) || ( $oneitem eq "Directory" )) { write_sorted_items(\@script, $oneitem); } + else { write_unsorted_items(\@script, $oneitem); } + } + } + + return \@script; +} + +###################################################### +# Adding script content for the unsorted items +###################################################### + +sub write_unsorted_items +{ + my ( $script, $oneitem ) = @_; + + my $itemhash = $par2script::globals::definitions{$oneitem}; + + my $itemkey = ""; + foreach $itemkey (sort keys %{$itemhash}) + { + put_oneitem_into_script($script, $oneitem, $itemhash, $itemkey); + + # special handling for Shortcuts after Files + if (( $oneitem eq "File" ) && ( exists($par2script::globals::definitions{"Shortcut"}) )) + { + my $shortcutkey; + foreach $shortcutkey ( keys %{$par2script::globals::definitions{"Shortcut"}} ) + { + if ( $par2script::globals::definitions{"Shortcut"}->{$shortcutkey}->{'FileID'} eq $itemkey ) + { + put_oneitem_into_script($script, "Shortcut", $par2script::globals::definitions{"Shortcut"}, $shortcutkey); + + # and Shortcut to Shortcut also + my $internshortcutkey; + foreach $internshortcutkey ( keys %{$par2script::globals::definitions{"Shortcut"}} ) + { + if ( $par2script::globals::definitions{"Shortcut"}->{$internshortcutkey}->{'ShortcutID'} eq $shortcutkey ) + { + put_oneitem_into_script($script, "Shortcut", $par2script::globals::definitions{"Shortcut"}, $internshortcutkey); + } + } + } + } + } + } +} + +###################################################### +# Collecting all children of a specified parent +###################################################### + +sub collect_children +{ + my ( $itemhash, $parent, $order ) = @_; + + my $item; + foreach $item ( keys %{$itemhash} ) + { + if ( $itemhash->{$item}->{'ParentID'} eq $parent ) + { + push(@{$order}, $item); + my $newparent = $item; + collect_children($itemhash, $newparent, $order); + } + } +} + +###################################################### +# Adding script content for the sorted items +###################################################### + +sub write_sorted_items +{ + my ( $script, $oneitem ) = @_; + + my $itemhash = $par2script::globals::definitions{$oneitem}; + + my @itemorder = (); + my @startparents = (); + + if ( $oneitem eq "Module" ) { push(@startparents, ""); } + elsif ( $oneitem eq "Directory" ) { push(@startparents, "PREDEFINED_PROGDIR"); } + else { die "ERROR: No root parent defined for item type $oneitem !\n"; } + + # supporting more than one toplevel item + my $parent; + foreach $parent ( @startparents ) { collect_children($itemhash, $parent, \@itemorder); } + + my $itemkey; + foreach $itemkey ( @itemorder ) { put_oneitem_into_script($script, $oneitem, $itemhash, $itemkey); } +} + +####################################################################### +# Collecting all assigned gids of the type "item" from the modules +# in the par files. Using a hash! +####################################################################### + +sub collect_assigned_gids +{ + my $allmodules = $par2script::globals::definitions{'Module'}; + + my $item; + foreach $item ( @par2script::globals::items_assigned_at_modules ) + { + if ( ! exists($par2script::globals::searchkeys{$item}) ) { par2script::exiter::exit_program("ERROR: Unknown type \"$item\" at modules.", "collect_assigned_gids"); } + + my $searchkey = $par2script::globals::searchkeys{$item}; + + my %assignitems = (); + my $modulegid = ""; + + foreach $modulegid (keys %{$allmodules} ) + { + # print "Module $modulegid\n"; + # my $content = ""; + # foreach $content (sort keys %{$allmodules->{$modulegid}}) { print "\t$content = $allmodules->{$modulegid}->{$content};\n"; } + # print "End\n"; + # print "\n"; + + if ( exists($allmodules->{$modulegid}->{$searchkey}) ) + { + my $list = $allmodules->{$modulegid}->{$searchkey}; + if ( $list =~ /^\s*\((.*?)\)\s*(.*?)\s*$/ ) { $list = $1; } + else { par2script::exiter::exit_program("ERROR: Invalid module list: $list", "collect_assigned_gids"); } + my $allassigneditems = par2script::converter::convert_stringlist_into_array_2($list, ","); + + my $gid; + foreach $gid ( @{$allassigneditems} ) + { + if ( exists($assignitems{$gid}) ) { $assignitems{$gid} = $assignitems{$gid} + 1; } + else { $assignitems{$gid} = 1; } + } + } + } + + $par2script::globals::assignedgids{$item} = \%assignitems; + } +} + +################################################## +# Collecting the content of all par files. +# Then the files do not need to be opened twice. +################################################## + +sub read_all_parfiles +{ + my ($parfiles) = @_; + + my @parfilecontent = (); + my $parfilename; + + foreach $parfilename ( @{$parfiles} ) + { + my $parfile = par2script::files::read_file($parfilename); + foreach ( @{$parfile} ) { push(@parfilecontent, $_); } + push(@parfilecontent, "\n"); + } + + return \@parfilecontent; +} + +1; |