summaryrefslogtreecommitdiff
path: root/solenv/bin/modules/installer/regmerge.pm
diff options
context:
space:
mode:
Diffstat (limited to 'solenv/bin/modules/installer/regmerge.pm')
-rw-r--r--solenv/bin/modules/installer/regmerge.pm344
1 files changed, 344 insertions, 0 deletions
diff --git a/solenv/bin/modules/installer/regmerge.pm b/solenv/bin/modules/installer/regmerge.pm
new file mode 100644
index 000000000000..bb6461b00d7d
--- /dev/null
+++ b/solenv/bin/modules/installer/regmerge.pm
@@ -0,0 +1,344 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: regmerge.pm,v $
+#
+# $Revision: 1.7 $
+#
+# 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::regmerge;
+
+use Cwd;
+use installer::converter;
+use installer::existence;
+use installer::exiter;
+use installer::globals;
+use installer::logger;
+use installer::pathanalyzer;
+use installer::remover;
+use installer::scriptitems;
+use installer::systemactions;
+
+################################################################
+# Collecting all files with content:
+# Regmergefile = "mydatabasepart.rdb";
+################################################################
+
+sub collect_all_regmergefiles
+{
+ my ($filesarrayref) = @_;
+
+ my @regmergefiles = ();
+
+ for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
+ {
+ my $onefile = ${$filesarrayref}[$i];
+ if ( $onefile->{'Regmergefile'} ) { push(@regmergefiles, $onefile); }
+ }
+
+ return \@regmergefiles;
+}
+
+################################################################
+# Collecting all gids of the databases, that are part of
+# the file definition
+################################################################
+
+sub collect_all_database_gids
+{
+ my ($filesarrayref) = @_;
+
+ my @databasegids = ();
+
+ for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
+ {
+ my $onefile = ${$filesarrayref}[$i];
+
+ if ( $onefile->{'RegistryID'} )
+ {
+ my $databasegid = $onefile->{'RegistryID'};
+ if (! installer::existence::exists_in_array($databasegid, \@databasegids)) { push(@databasegids, $databasegid); }
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: File defintion error. File :$onefile->{'gid'} without RegistryID!", "collect_all_database_gids");
+ }
+ }
+
+ return \@databasegids;
+}
+
+################################################################
+# Returning the database file from the files collector. In the
+# future this file does not need to exist, but currently it
+# has to exist already in the files collector.
+################################################################
+
+sub get_database_file
+{
+ my ($databasegid, $filesarrayref) = @_;
+
+ my $found = 0;
+ my $onefile;
+
+ for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
+ {
+ $onefile = ${$filesarrayref}[$i];
+ my $gid = $onefile->{'gid'};
+
+ if ( $databasegid eq $gid )
+ {
+ $found = 1;
+ last;
+ }
+ }
+
+ if ( ! $found ) { installer::exiter::exit_program("ERROR: Did not find StarRegistry file $databasegid!", "get_database_file"); }
+
+ return $onefile;
+}
+
+################################################################
+# The regmerge file has to be found the in include pathes
+################################################################
+
+sub get_regmerge_file
+{
+ my ($includepatharrayref) = @_;
+
+ my $searchname;
+
+ if ($installer::globals::isunix) { $searchname = "regcomplazy"; }
+ else { $searchname = "regcomplazy.exe"; }
+
+ my $regmergefileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$searchname, $includepatharrayref, 1);
+ if ( $$regmergefileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find file $searchname for merging the StarRegistry!", "get_regmerge_file"); }
+
+ return $$regmergefileref;
+}
+
+################################################################
+# Collecting all files that are merged to one defined
+# StarRegistry database
+################################################################
+
+sub collect_all_files_for_one_registry
+{
+ my ($regmergefiles, $databasegid) = @_;
+
+ my @regmergefiles = ();
+
+ for ( my $i = 0; $i <= $#{$regmergefiles}; $i++ )
+ {
+ my $onefile = ${$regmergefiles}[$i];
+ if ( $onefile->{'RegistryID'} eq $databasegid ) { push(@regmergefiles, $onefile); }
+ }
+
+ return \@regmergefiles;
+}
+
+################################################################
+# Collecting all particles from the regmerge files
+################################################################
+
+sub collect_all_regmerge_particles
+{
+ my ($databaseregisterfiles) = @_;
+
+ my @regmergeparticles = ();
+
+ for ( my $i = 0; $i <= $#{$databaseregisterfiles}; $i++ )
+ {
+ my $onefile = ${$databaseregisterfiles}[$i];
+ if ( $onefile->{'Regmergefile'} ) { push(@regmergeparticles, $onefile->{'Regmergefile'}); }
+ else { installer::exiter::exit_program("ERROR: Could not find entry for \"Regmergefile\" in $onefile->{'gid'}!", "collect_all_regmerge_particles"); }
+ }
+
+ return \@regmergeparticles;
+}
+
+################################################################
+# Collecting all source pathes of the regmerge particles
+################################################################
+
+sub get_all_source_pathes
+{
+ my ($regmergeparticles, $includepatharrayref) = @_;
+
+ my @regmergeparticles = ();
+
+ for ( my $i = 0; $i <= $#{$regmergeparticles}; $i++ )
+ {
+ my $filename = ${$regmergeparticles}[$i];
+
+ my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$filename, $includepatharrayref, 1);
+ if ( $$fileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find file $filename for merging the StarRegistry!", "get_all_source_pathes"); }
+
+ push(@regmergeparticles, $$fileref);
+ }
+
+ return \@regmergeparticles;
+}
+
+################################################################
+# Merging the rdb files into the StarRegistry database
+################################################################
+
+sub merge_files
+{
+ my ($regmergefile, $databasefile, $registerfiles, $databasedir, $allvariableshashref) = @_;
+
+ my $databasesource = $databasefile->{'sourcepath'};
+ my $databasename = $databasefile->{'Name'};
+ my $databasedest = $databasedir . $installer::globals::separator . $databasename;
+
+ installer::systemactions::copy_one_file($databasesource, $databasedest);
+ $databasefile->{'sourcepath'} = $databasedest; # new sourcepath for the StarRegistry file
+
+ # One call for every merge particle. This is only possible, if there are only a few merge particles.
+
+ my $prefix = $databasefile->{'NativeServicesURLPrefix'};
+ # TODO: "NativeServicesURLPrefix" or "JavaServicesURLPrefix"
+
+ my $error_occured = 0;
+
+ for ( my $i = 0; $i <= $#{$registerfiles}; $i++ )
+ {
+ my $registerfile = $databasedir . $installer::globals::separator . $i . ".tmp";
+ open (IN, '<', $registerfiles->[$i]) or $error_occured = 1;
+ open (OUT, '>', $registerfile) or $error_occured = 1;
+ while (<IN>)
+ {
+ s/^ComponentName=/ComponentName=$prefix/;
+ print OUT $_ or $error_occured = 1;
+ }
+ close IN or $error_occured = 1;
+ close OUT or $error_occured = 1;
+
+ my $systemcall = $regmergefile . " -v " . $databasedest . " " . $registerfile . " 2\>\&1 |";
+
+ my @regmergeoutput = ();
+
+ my $var_library_path;
+ my $old_library_path;
+ if ($installer::globals::isunix) {
+ $var_library_path = $installer::globals::ismacosx ?
+ 'DYLD_LIBRARY_PATH' : 'LD_LIBRARY_PATH';
+ $old_library_path = $ENV{$var_library_path};
+ installer::servicesfile::include_libdir_into_ld_library_path(
+ $var_library_path, $regmergefile);
+ }
+
+ open (REG, "$systemcall");
+ while (<REG>) {push(@regmergeoutput, $_); }
+ close (REG);
+
+ my $returnvalue = $?; # $? contains the return value of the systemcall
+
+ if (defined $var_library_path) {
+ if (defined $old_library_path) {
+ $ENV{$var_library_path} = $old_library_path;
+ } else {
+ delete $ENV{$var_library_path};
+ }
+ }
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $j = 0; $j <= $#regmergeoutput; $j++ ) { push( @installer::globals::logfileinfo, "$regmergeoutput[$j]"); }
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $error_occured = 1;
+ }
+ else
+ {
+ $infoline = "SUCCESS: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ return $error_occured;
+}
+
+################################################################
+# Expanding the registry database files by merging rdb files
+# into this registry database files.
+################################################################
+
+sub merge_registration_files
+{
+ my ($filesarrayref, $includepatharrayref, $languagestringref, $allvariableshashref) = @_;
+
+ installer::logger::include_header_into_logfile("Creating starregistry databases:");
+
+ # Test if there is something to do. At least one file has to have the content:
+ # Regmergefile = "mydatabasepart.rdb";
+
+ my $regmergefiles = collect_all_regmergefiles($filesarrayref);
+
+ if ( $#{$regmergefiles} > -1 ) # not empty -> at least one regmerge file
+ {
+ # prepare registration
+
+ my $regmergefile = get_regmerge_file($includepatharrayref); # searching for regmerge (regcomplazy.exe)
+
+ my $databasegids = collect_all_database_gids($regmergefiles);
+
+ # iterating over all database gids
+
+ my $regmergeerror = 0;
+
+ for ( my $i = 0; $i <= $#{$databasegids}; $i++ )
+ {
+ $databasegid = ${$databasegids}[$i];
+
+ # my $databasedirname = "starregistryrdb"; <- not unique!
+ my $databasedirname = $databasegid . "_rdb"; # <- unique!
+ my $databasedir = installer::systemactions::create_directories($databasedirname, $languagestringref);
+ push(@installer::globals::removedirs, $databasedir);
+
+ my $databasefile = get_database_file($databasegid, $filesarrayref);
+ my $databaseregisterfiles = collect_all_files_for_one_registry($regmergefiles, $databasegid);
+
+ if ( $#{$databaseregisterfiles} > -1 ) # not empty -> at least one regmerge file
+ {
+ my $regmergeparticles = collect_all_regmerge_particles($databaseregisterfiles);
+ $regmergeparticles = get_all_source_pathes($regmergeparticles, $includepatharrayref);
+ my $oneregmergeerror = merge_files($regmergefile, $databasefile, $regmergeparticles, $databasedir, $allvariableshashref);
+ if ($oneregmergeerror) { $regmergeerror = 1; }
+ }
+ }
+
+ if ( $regmergeerror ) { installer::exiter::exit_program("ERROR: regmerge !", "merge_registration_files"); }
+
+ }
+}
+
+1;