diff options
Diffstat (limited to 'solenv/bin')
192 files changed, 0 insertions, 67732 deletions
diff --git a/solenv/bin/_mkout b/solenv/bin/_mkout deleted file mode 100755 index b1ff7b0f5..000000000 --- a/solenv/bin/_mkout +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -e -if [ -z "$1" ]; then - exit 1; -fi -mkdir -p "$1"/bin -mkdir -p "$1"/inc -mkdir -p "$1"/lib -mkdir -p "$1"/misc -mkdir -p "$1"/obj -mkdir -p "$1"/slb -mkdir -p "$1"/slo diff --git a/solenv/bin/add-modelines b/solenv/bin/add-modelines deleted file mode 100755 index e7491c24a..000000000 --- a/solenv/bin/add-modelines +++ /dev/null @@ -1,174 +0,0 @@ -#!/bin/bash - -# add-modelines, a simple script to add comments to -# the beginning and end of source files for LibreOffice devs - -# Blame goes to Jesse Adelman (at least at first) -# someone AT boldandbusted dotty-dot com -# http://www.boldandbusted.com/ -# (c) 2010 Bold and Busted LLC -# Licensed under the MPL/LGPLv3 or later -# First edit 2010-10-08 -# Updated on 2010-10-09 -# Version 0.7 - -# NOTE: At present, this script only works for files with C-like comments. -# NOTE: If you don't specify -p, the script will act on the current working directory. -# NOTE: If no arguments are specified, the defitions below are in effect. - -# TO DO -# - Deuglifiy? -# - Make source file type agnostic modelines? -# - Too many/too few comments? -# - Handle top level source directories with whitespace names? (Do they exist?) - -# Turn off globbing, helps with SourceFiles -set -f - -# POSIX -set -o posix - -# Change these to taste -FirstLine='/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */' -LastLine='/* vim:set shiftwidth=4 softtabstop=4 expandtab: */' -SourceFiles='*.cxx *.cpp *.hxx *.hpp *.c *.h *.mm' - -# Set defaults (don't change these) -ModelineReplace="false" - -# Functions - -function SetEnvironment() -{ - if [ -n "$(which tail)" -a -n "$(which head)" ]; then - { - headCMD=`which head` - tailCMD=`which tail` - } - else - { - echo "Missing head or tail, exiting..." - exit 1 - } - fi - if [ -n "$(which find)" ]; then - findCMD=`which find` - else - { - echo "Missing find, exiting..." - exit 1 - } - fi - if [ -n "$(which awk)" ]; then - awkCMD=`which awk` - else - { - echo "Missing awk, exiting..." - exit 1 - } - fi -} - -function EditFile() -{ - local FileToEdit - local currentFirstLine - local currentLastLine - - FileToEdit="$1" - - currentFirstLine=`$headCMD -1 "$FileToEdit"` - currentLastLine=`$tailCMD -1 "$FileToEdit"` - - case "$ModelineReplace" in - "true" ) - if [ "${currentFirstLIne:0:6}" = "${FirstLine:0:6}" ]; then - { - echo "$FirstLine" > "$FileToEdit".new - $tailCMD -n +2 "$FileToEdit" >> "$FileToEdit".new - } - fi - if [ -e "$FileToEdit.new" ]; then - { - echo "$LastLine" >> "$FileToEdit".new - } - fi - if [ "${currentLastLine:0:6}" = "${LastLine:0:6}" ]; then - { - $headCMD -n -1 "$FileToEdit" > "$FileToEdit".new - echo "$LastLine" >> "$FileToEdit".new - } - fi - mv "$FileToEdit".new "$FileToEdit" - echo "$FileToEdit updated" ;; - "false" ) - if [ "${currentFirstLine:0:6}" != "${FirstLine:0:6}" ]; then - if [ "${currentLastLine:0:6}" != "${LastLine:0:6}" ]; then - { - echo "$FirstLine" > "$FileToEdit".new - cat "$FileToEdit" >> "$FileToEdit".new - if [ "x${currentLastLine}" != "x" ] ; then - echo "" >> "$FileToEdit".new - fi - echo "$LastLine" >> "$FileToEdit".new - mv "$FileToEdit".new "$FileToEdit" - echo "$FileToEdit updated" - } - fi - fi ;; - esac -} - -function PrintUsage() -{ - echo "Usage: $0 [-z] [-s \"<sourcefile glob>\"] [-p <path to source>]" -} - -# Main - -SetEnvironment - -# Get command line options - -while getopts "zs:p:" opt; do - case $opt in - z) ModelineReplace="true" ;; - s) SourceFiles="$OPTARG" ;; - p) findPath="$OPTARG" ;; - *) PrintUsage - exit 1 ;; - esac -done - -if [ $OPTIND -gt 1 ]; then - shift $(($OPTIND - 1)) -fi - -if [ $# -gt 1 ]; then -{ - PrintUsage - echo "Remember to quote the source file globs after -s" - exit 1 -} -fi - -# Create GNU find expressions that traverse the filesystem once and only once -if [ -z "$findPath" ]; then - findArgs='.' - else - findArgs="$findPath" -fi - -for FileType in ${SourceFiles}; do - findArgs="$findArgs"' ( -iname '"$FileType"' -print -o -true ) -a ' -done - -# This gets rid of the final " -a " in the find argument list -findArgs="${findArgs:0:(${#findArgs}-3)}" - -for file in $($findCMD $findArgs); do - EditFile "$file" - echo "Completed: " "$file" -done - -# vim:set shiftwidth=4 softtabstop=4 expandtab: diff --git a/solenv/bin/addsym-macosx.sh b/solenv/bin/addsym-macosx.sh deleted file mode 100755 index b69f59fff..000000000 --- a/solenv/bin/addsym-macosx.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -# This script is needed in the process of generating exported -# symbols list out of map files on Mac OS X (see also #i69351#) -# The magic generating the regular expression from the temporary -# mapfile containing only star and question mark symbols -# -# The script has to be called as follows: -# nm -gx <file>.o | addsym-macosx.sh <file-with-wildcard-symbols> <temporary-file-where-to-write-the-search-expression-to> -# See tg_shl.mk for an example of how to use the script -# -# Replace every * with .* and every ? with . to get awk expression -# Put ^ at the beginning of every expression -# Put $ at the beginning of every expression -# Connect them all on one line, separated by | -# Remove | at the end of this regular expression because the last end -# of line was also replaced by | - -cat $1 | sed 's#*#.*#g -s#?#.#g -s#^#^# -s#$#$#' | tr '\n' '|' | sed "s#|\$##" >$2 - -# Please note that the awk expression expects to get the output of 'nm -gx'! -# On Panther we have to filter out symbols with a value "1f" otherwise external -# symbols will erroneously be added to the generated export symbols list file. -awk -v SYMBOLSREGEXP="`cat $2`" ' -match ($6,SYMBOLSREGEXP) > 0 && $6 !~ /_GLOBAL_/ { if (($2 != 1) && ( $2 != "1f" ) ) print $6 }' - diff --git a/solenv/bin/addsym-mingw.sh b/solenv/bin/addsym-mingw.sh deleted file mode 100755 index 06d668252..000000000 --- a/solenv/bin/addsym-mingw.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -# This script is needed in the process of generating exported -# symbols list out of map files on MinGW -# The magic generating the regular expression from the temporary -# mapfile containing only star and question mark symbols -# -# The script has to be called as follows: -# nm -gx <file>.o | addsym-mingw.sh <file-with-wildcard-symbols> <temporary-file-where-to-write-the-search-expression-to> -# See tg_shl.mk for an example of how to use the script -# -# Replace every * with .* and every ? with . to get awk expression -# Remove whitespaces and comments in expression -# Put ^ at the beginning of every expression -# Put $ at the beginning of every expression -# Connect them all on one line, separated by | -# Remove | at the end of this regular expression because the last end -# of line was also replaced by | - -if [ -s $1 ] -then -cat $1 | sed 's#*#.*#g -s#?#.#g -s#;.*##g -s# ##g -s# ##g -s#^#^# -s#$#$#' | tr '\n' '|' | sed "s#|\$##" >$2 - -# Please note that the awk expression expects to get the output of 'nm -gP'! -awk -v SYMBOLSREGEXP="`cat $2`" ' -match (substr ($1,2) ,SYMBOLSREGEXP) > 0 { print substr ($1,2) ";" }' -fi - diff --git a/solenv/bin/addsym.awk b/solenv/bin/addsym.awk deleted file mode 100644 index de0b57934..000000000 --- a/solenv/bin/addsym.awk +++ /dev/null @@ -1,50 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -# Add certain symbol patterns to the first global section. -# -# The below code fails with 'perverted' mapfiles (using a strange line layout, -# or containing version UDK_3_0_0 without a global section, ...). - -BEGIN { state = 0 } -END { - if (state == 0) { - print "# Weak RTTI symbols for C++ exceptions:" - print "UDK_3_0_0 {" - print "global:" - print "_ZTI*; _ZTS*; # weak RTTI symbols for C++ exceptions" - print "};" - } -} -state == 2 { - print "_ZTI*; _ZTS*; # weak RTTI symbols for C++ exceptions" - state = 3 -} -# #i66636# - ??? -/^[\t ]*UDK_3_0_0[\t ]*\{/ { state = 1 } -/^[\t ]*global[\t ]*:/ && state == 1 { state = 2 } -{ print } diff --git a/solenv/bin/build.pl b/solenv/bin/build.pl deleted file mode 100755 index eb3c0e9b7..000000000 --- a/solenv/bin/build.pl +++ /dev/null @@ -1,3510 +0,0 @@ -: - eval 'exec perl -S $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* -# -# build - build entire project -# - use strict; - use Config; - use POSIX; - use Cwd qw (cwd); - use File::Path; - use File::Temp qw(tmpnam tempdir); - use File::Find; - use Socket; - use IO::Socket::INET; - use IO::Select; - use Fcntl; - use POSIX qw(:errno_h); - use Sys::Hostname; - use IPC::Open3; - - use lib ("$ENV{SOLARENV}/bin/modules"); - use SourceConfig; - use RepositoryHelper; - use Cwd 'chdir'; - - my $in_so_env = 0; - if (defined $ENV{COMMON_ENV_TOOLS}) { - unshift(@INC, "$ENV{COMMON_ENV_TOOLS}/modules"); - $in_so_env++; - }; - my $verbose_mode = 0; - if (defined $ENV{verbose} || defined $ENV{VERBOSE}) { - $verbose_mode = ($ENV{verbose} =~ /^t\S*$/i); - } - my $enable_multiprocessing = 1; - - ### for XML file format - eval { require XMLBuildListParser; import XMLBuildListParser; }; - my $enable_xml = 0; - my @modes_array = (); - if (!$@) { - $enable_xml = 1; - @modes_array = split('\s' , $ENV{BUILD_TYPE}); - }; -#### script id ##### - -######################### -# # -# Global Variables # -# # -######################### - - my $modules_number++; - my $perl = 'perl'; - my $remove_command = 'rm -rf'; - my $nul = '> /dev/null'; - - my $processes_to_run = 0; -# delete $pid when not needed - my %projects_deps_hash = (); # hash of projects with no dependencies, - # that could be built now - my %broken_build = (); # hash of hashes of the modules, - # where build was broken (error occurred) - my %folders_hashes = (); - my %running_children = (); - my $dependencies_hash = 0; - my $cmd_file = ''; - my $build_all_parents = 0; - my $show = 0; - my $checkparents = 0; - my $deliver = 0; - my $pre_custom_job = ''; - my $custom_job = ''; - my $post_custom_job = ''; - my %local_deps_hash = (); - my %path_hash = (); - my %platform_hash = (); - my %alive_dependencies = (); - my %global_deps_hash = (); # hash of dependencies of the all modules - my %global_deps_hash_backup = (); # backup hash of external dependencies of the all modules - my %module_deps_hash_backup = (); # backup hash of internal dependencies for aech module - my @broken_modules_names = (); # array of modules, which cannot be built further - my @dmake_args = (); - my %dead_parents = (); - my $initial_module = ''; - my $all_dependent = 1; # a flag indicating if the hash has independent keys - my $build_from_with_branches = ''; - my $build_all_cont = ''; - my $build_since = ''; - my $dlv_switch = ''; - my $child = 0; - my %processes_hash = (); - my %module_announced = (); - my $prepare = ''; # prepare for following incompatible build - my $ignore = ''; - my $html = ''; - my @ignored_errors = (); - my %incompatibles = (); - my %skip_modules = (); - my %exclude_branches = (); - my $only_platform = ''; # the only platform to prepare - my $only_common = ''; # the only common output tree to delete when preparing - my %build_modes = (); - my $maximal_processes = 0; # the max number of the processes run - my %modules_types = (); # modules types ('mod', 'img', 'lnk') hash - my %platforms = (); # platforms available or being working with - my %platforms_to_copy = (); # copy output trees for the platforms when --prepare - my $tmp_dir = get_tmp_dir(); # temp directory for checkout and other actions - my @possible_build_lists = ('gbuild.lst', 'build.lst', 'build.xlist'); # build lists names - my %build_list_paths = (); # build lists names - my %build_lists_hash = (); # hash of arrays $build_lists_hash{$module} = \($path, $xml_list_object) - my $pre_job = 'announce'; # job to add for not-single module build - my $post_job = ''; # -"- - my @warnings = (); # array of warnings to be shown at the end of the process - my @errors = (); # array of errors to be shown at the end of the process - my %html_info = (); # hash containing all necessary info for generating of html page - my %module_by_hash = (); # hash containing all modules names as values and correspondent hashes as keys - my %build_in_progress = (); # hash of modules currently being built - my %build_is_finished = (); # hash of already built modules - my %modules_with_errors = (); # hash of modules with build errors - my %build_in_progress_shown = (); # hash of modules being built, - # and shown last time (to keep order) - my $build_time = time; - my %jobs_hash = (); - my $html_path = undef; - my $build_finished = 0; - my $html_file = ''; - my %had_error = (); # hack for mysterious windows problems - try run dmake 2 times if first time there was an error - my $mkout = correct_path("$ENV{SOLARENV}/bin/mkout.pl"); - my %weights_hash = (); # hash contains info about how many modules are dependent from one module - my $grab_output = 1; - my $stop_build_on_error = 0; # for multiprocessing mode: do not build further module if there is an error - my $interactive = 0; # for interactive mode... (for testing purpose enabled by default) - my $parent_process = 1; - my $server_mode = 0; - my $setenv_string = ''; # string for configuration of the client environment - my $ports_string = ''; # string with possible ports for server - my @server_ports = (); - my $html_port = 0; - my $server_socket_obj = undef; # socket object for server - my $html_socket_obj = undef; # socket object for server - my %clients_jobs = (); - my %clients_times = (); - my $client_timeout = 0; # time for client to build (in sec)... - # The longest time period after that - # the server considered as an error/client crash - my %lost_client_jobs = (); # hash containing lost jobs - my %job_jobdir = (); # hash containing job-dir pairs - my $reschedule_queue = 0; - my %module_build_queue = (); - my %reversed_dependencies = (); - my %module_paths = (); # hash with absolute module paths - my %active_modules = (); - my $generate_config = 0; - my %add_to_config = (); - my %remove_from_config = (); - my $clear_config = 0; - my $finished_children = 0; - my $debug = 0; - my %module_deps_hash_pids = (); - my @argv = @ARGV; - my $source_config_file; - my $zenity_pid = 0; - my $zenity_in = ''; - my $zenity_out = ''; - my $zenity_err = ''; - my $allow_gbuild = 0; - my %is_gbuild = (); - my $verbose = 0; - - my @modules_built = (); - my $deliver_command = $ENV{DELIVER}; - my %prj_platform = (); - my $check_error_string = ''; - my $dmake = ''; - my $dmake_args = ''; - my $echo = ''; - my $new_line = "\n"; - my $incompatible = 0; - my $local_host_ip = 'localhost'; -### main ### - - get_options(); - - zenity_open(); - zenity_tooltip("Starting build."); - - get_build_modes(); - my %deliver_env = (); - if ($prepare) { - get_platforms(\%platforms); - - $deliver_env{'COMMON_OUTDIR'}++; - $deliver_env{'GUI'}++; - $deliver_env{'INPATH'}++; - $deliver_env{'OFFENV_PATH'}++; - $deliver_env{'OUTPATH'}++; - $deliver_env{'L10N_framework'}++; - }; - my $workspace_path = get_workspace_path(); # This also sets $initial_module - my $build_error_log = Cwd::realpath(correct_path($workspace_path)) ."/build_error.log"; - my $source_config = SourceConfig -> new($workspace_path); - check_partial_gnumake_build($initial_module); - - system("rm -f $build_error_log"); - if ($html) { - if (defined $html_path) { - $html_file = correct_path($html_path . '/' . $ENV{INPATH}. '.build.html'); - } else { - my $log_directory = Cwd::realpath(correct_path($workspace_path . '/..')) . '/log'; - if ((!-d $log_directory) && (!mkdir($log_directory))) { - print_error("Cannot create $log_directory for writing html file\n"); - }; - $html_file = $log_directory . '/' . $ENV{INPATH}. '.build.html'; - print "\nPath to html status page: $html_file\n"; - }; - }; - - if ($generate_config && ($clear_config || (scalar keys %remove_from_config)||(scalar keys %add_to_config))) { - generate_config_file(); - exit 0; - } - get_module_and_buildlist_paths(); - - $deliver_command .= ' -verbose' if ($html || $verbose); - $deliver_command .= ' '. $dlv_switch if ($dlv_switch); - $ENV{mk_tmp}++; - - get_commands(); - unlink ($cmd_file); - if ($cmd_file) { - if (open (CMD_FILE, ">>$cmd_file")) { - select CMD_FILE; - $echo = 'echo '; - if ($ENV{GUI_FOR_BUILD} ne 'UNX') { - $new_line = "echo.\n"; - print "\@$echo off\npushd\n"; - } else { - $new_line = $echo."\"\"\n"; - }; - } else { - print_error ("Cannot open file $cmd_file"); - }; - }; - - print $new_line; - get_server_ports(); - start_interactive() if ($interactive); - - if ($checkparents) { - get_parent_deps( $initial_module, \%global_deps_hash ); - } else { - build_all(); - } - if (scalar keys %broken_build) { - cancel_build(); - }; - print_warnings(); - if (scalar keys %active_modules) { - foreach (keys %dead_parents) { - delete $dead_parents{$_} if (!defined $active_modules{$_}); - }; - }; - if (scalar keys %dead_parents) { - print $new_line.$new_line; - print $echo."WARNING! Project(s):\n"; - foreach (keys %dead_parents) { - print $echo."$_\n"; - }; - print $new_line; - print $echo."not found and couldn't be built. dependencies on that module(s) ignored. Maybe you should correct build lists.\n"; - print $new_line; - do_exit(1) if ($checkparents); - }; - if (($ENV{GUI_FOR_BUILD} ne 'UNX') && $cmd_file) { - print "popd\n"; - }; - $ENV{mk_tmp} = ''; - if ($cmd_file) { - close CMD_FILE; - print STDOUT "Script $cmd_file generated\n"; - }; - if ($ignore && scalar @ignored_errors) { - print STDERR "\nERROR: next directories could not be built:\n"; - foreach (@ignored_errors) { - print STDERR "\t$_\n"; - }; - print STDERR "\nERROR: please check these directories and build the corresponding module(s) anew!!\n\n"; - do_exit(1); - }; - do_exit(0); - - -######################### -# # -# Procedures # -# # -######################### - -sub print_warnings { - if (scalar @warnings) { - print STDERR "\nWARNING(S):\n"; - print STDERR $_ foreach (@warnings); - }; -}; - -sub rename_file { - my ($old_file_name, $new_file_name, $throw_error) = @_; - - if(-e $old_file_name) { - rename($old_file_name, $new_file_name) or system("mv", $old_file_name, $new_file_name); - if (-e $old_file_name) { - system("rm -rf $old_file_name") if (!unlink $old_file_name); - }; - } elsif ($throw_error) { - print_error("No such file $old_file_name"); - }; -}; - -sub generate_config_file { - $source_config->add_active_modules([keys %add_to_config], 1) if (scalar %add_to_config); - $source_config->remove_activated_modules([keys %remove_from_config], 1) if (scalar %remove_from_config); - $source_config->remove_all_activated_modules() if ($clear_config); -}; - - -sub start_interactive { - my $pid = open(HTML_PIPE, "-|"); - print "Pipe is open\n"; - - if ($pid) { # parent - # make file handle non-blocking - my $flags = ''; - fcntl(HTML_PIPE, F_GETFL, $flags); - $flags |= O_NONBLOCK; - fcntl(HTML_PIPE, F_SETFL, $flags); - } else { # child - $parent_process = 0; - start_html_listener(); - }; -}; - -sub start_html_listener { - $html_port = $server_ports[$#server_ports]; - do { - $html_port++ - } while (start_server_on_port($html_port, \$html_socket_obj)); - print "html_port:$html_port html_socket_obj: $html_socket_obj\n"; - my $new_socket_obj; - do { - $new_socket_obj = accept_html_connection(); - if (defined $new_socket_obj) { - my $html_message; - $html_message = <$new_socket_obj>; - chomp $html_message; - print $html_message . "\n"; - my $socket_message = ''; - for my $action ('rebuild', 'delete') { - if ($html_message =~ /$action=(\S+)/) { - print $new_socket_obj "Module $1 is scheduled for $action"; - }; - }; - close($new_socket_obj); - } else { - sleep(10); - }; - } while(1); -}; - -sub start_html_message_trigger { - my $child_id=fork(); ### VG: for windows there is a "simulation of the "fork"", no new procs... One can use Win32::Process::Create - - if ($child_id) { - # parent - } else { - my $buffer_size = 1024; - my $buffer; - my $rv; - my $full_buffer = ''; - my %modules_to_rebuild = (); - my $paddr; - while ($rv = sysread(HTML_PIPE, $buffer, $buffer_size)) { - $full_buffer .= $buffer; - }; - if (length $full_buffer) { - print "**********Got message $full_buffer\n"; - socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or die "socket: $!"; - if (connect(SOCKET, $paddr)) { - $full_buffer .= "\n"; - syswrite SOCKET, $full_buffer, length $full_buffer; - } else { - die "Child connect: $!"; - }; - } - _exit(0); - }; -}; - -sub get_html_orders { - return if (!$interactive); - my $buffer_size = 1024; - my $buffer; - my $rv; - my $full_buffer = ''; - my %modules_to_rebuild = (); - my %modules_to_delete = (); - while ($rv = sysread(HTML_PIPE, $buffer, $buffer_size)) { - $full_buffer .= $buffer; - }; - my @html_messages = split(/\n/, $full_buffer); - foreach (@html_messages) { - if (/^html_port:(\d+)/) { - $html_port = $1; - print "Html port is: $html_port\n"; - next; - };# GET /rebuild=officenames HTTP/1.0 - print "Message: $_\n"; - chomp; - if (/GET\s+\/delete=(\S+)[:(\S+)]*\s*HTTP/) { - $modules_to_delete{$1} = $2; - print "$1 scheduled for removal from build for \n"; - } - if (/GET\s+\/rebuild=(\S+)[:(\S+)]*\s*HTTP/) { - if (defined $global_deps_hash{$1}) { - print "!!! /tarModule $1 has not been built. Html order ignored\n"; - } else { - $modules_to_rebuild{$1} = $2; - print "Scheduled $1 for rebuild\n"; - } - } - }; - if (scalar keys %modules_to_delete) { - $reschedule_queue++; - schedule_delete(\%modules_to_delete); - generate_html_file(); - }; - if (scalar keys %modules_to_rebuild) { - $reschedule_queue++; - schedule_rebuild(\%modules_to_rebuild); - generate_html_file(); - }; -}; - -sub schedule_delete { - my $modules_to_delete = shift; - foreach (keys %$modules_to_delete) { - print "Schedule module $_ for delete\n"; - delete ($global_deps_hash{$_}); - delete ($global_deps_hash_backup{$_}); - if (scalar keys %{$module_deps_hash_pids{$projects_deps_hash{$_}}}) { - kill 9, keys %{$module_deps_hash_pids{$projects_deps_hash{$_}}}; - handle_dead_children(0); - }; - remove_from_dependencies($_, \%global_deps_hash); - remove_from_dependencies($_, \%global_deps_hash_backup); - delete $reversed_dependencies{$_}; - delete $build_is_finished{$_} if defined $build_is_finished{$_}; - delete $modules_with_errors{$_} if defined $modules_with_errors{$_}; - delete $module_announced{$_} if defined $module_announced{$_}; - delete $html_info{$_} if defined $html_info{$_}; - delete $projects_deps_hash{$_} if defined $projects_deps_hash{$_}; - }; -}; - -sub schedule_rebuild { - my $modules_to_rebuild = shift; - foreach (keys %$modules_to_rebuild) { - if (defined $$modules_to_rebuild{$_}) { - print "Schedule directory for rebuild"; - } else { - print "Schedule complete $_ module for rebuild\n"; - if (scalar keys %{$module_deps_hash_pids{$projects_deps_hash{$_}}}) { - kill 9, keys %{$module_deps_hash_pids{$projects_deps_hash{$_}}}; - handle_dead_children(0); - }; - delete $build_is_finished{$_} if defined $build_is_finished{$_}; - delete $modules_with_errors{$_} if defined $modules_with_errors{$_}; - delete $module_announced{$_}; - initialize_html_info($_); - - foreach my $waiter (keys %{$reversed_dependencies{$_}}) { - # for rebuild_all_dependent - refacture "if" condition - ${$global_deps_hash{$waiter}}{$_}++ if (!defined $build_is_finished{$waiter}); - }; - delete $projects_deps_hash{$_} if defined $projects_deps_hash{$_}; - my %single_module_dep_hash = (); - foreach my $module (keys %{$global_deps_hash_backup{$_}}) { - if (defined ${$global_deps_hash_backup{$_}}{$module} && (!defined $build_is_finished{$module})) { - $single_module_dep_hash{$module}++; - }; - }; - $global_deps_hash{$_} = \%single_module_dep_hash; - }; - }; -}; - -# -# procedure retrieves build list path -# (all possibilities are taken into account) -# -sub get_build_list_path { - my $module = shift; - return $build_list_paths{$module} if (defined $build_list_paths{$module}); - my @possible_dirs = ($module, $module. '.lnk', $module. '.link'); - return $build_list_paths{$module} if (defined $build_list_paths{$module}); - foreach (@possible_dirs) { - my $possible_dir_path = $module_paths{$_}.'/prj/'; - if (-d $possible_dir_path) { - foreach my $build_list (@possible_build_lists) { - # if gbuild are allow we favor gbuild.lst as the build instruction - if($build_list ne "gbuild.lst" || $allow_gbuild) { - my $possible_build_list_path = correct_path($possible_dir_path . $build_list); - if (-f $possible_build_list_path) { - $build_list_paths{$module} = $possible_build_list_path; - if ($build_list eq "gbuild.lst") { -# print "Using gmake for module $module\n"; - $is_gbuild{$module} = 1; - }; - return $possible_build_list_path; - }; - }; - } - print_error("There's no build list for $module"); - }; - }; - $dead_parents{$module}++; - $build_list_paths{$module} = correct_path(retrieve_build_list($module)) if (!defined $build_list_paths{$module}); - return $build_list_paths{$module}; -}; - -# -# Get dependencies hash of the current and all parent projects -# -sub get_parent_deps { - my $prj_dir = shift; - my $deps_hash = shift; - my @unresolved_parents = ($prj_dir); - my %skipped_branches = (); - while (my $module = pop(@unresolved_parents)) { - next if (defined $$deps_hash{$module}); - my %parents_deps_hash = (); - foreach (get_parents_array($module)) { - if (defined $exclude_branches{$_}) { - $skipped_branches{$_}++; - next; - }; - $parents_deps_hash{$_}++; - } - $$deps_hash{$module} = \%parents_deps_hash; - foreach my $parent (keys %parents_deps_hash) { - if (!defined($$deps_hash{$parent}) && (!defined $exclude_branches{$module})) { - push (@unresolved_parents, $parent); - }; - }; - }; - check_deps_hash($deps_hash); - foreach (keys %skipped_branches) { - print $echo . "Skipping module's $_ branch\n"; - delete $exclude_branches{$_}; - }; - my @missing_branches = keys %exclude_branches; - if (scalar @missing_branches) { - print_error("For $prj_dir branche(s): \"@missing_branches\" not found\n"); - }; -}; - -sub store_weights { - my $deps_hash = shift; - foreach (keys %$deps_hash) { - foreach my $module_deps_hash ($$deps_hash{$_}) { - foreach my $dependency (keys %$module_deps_hash) { - $weights_hash{$dependency}++; - }; - }; - }; -}; - -# -# This procedure builds comlete dependency for each module, ie if the deps look like: -# mod1 -> mod2 -> mod3 -> mod4,mod5, -# than mod1 get mod3,mod4,mod5 as eplicit list of deps, not only mod2 as earlier -# -sub expand_dependencies { - my $deps_hash = shift; - - foreach my $module1 (keys %$deps_hash) { - foreach my $module2 (keys %$deps_hash) { - next if ($module1 eq $module2); - if (defined ${$$deps_hash{$module2}}{$module1}) { - ${$$deps_hash{$module2}}{$_}++ foreach (keys %{$$deps_hash{$module1}}) - }; - }; - }; -}; - -# -# This procedure fills the second hash with reversed dependencies, -# ie, with info about modules "waiting" for the module -# -sub reverse_dependencies { - my ($deps_hash, $reversed) = @_; - foreach my $module (keys %$deps_hash) { - foreach (keys %{$$deps_hash{$module}}) { - if (defined $$reversed{$_}) { - ${$$reversed{$_}}{$module}++ - } else { - my %single_module_dep_hash = ($module => 1); - $$reversed{$_} = \%single_module_dep_hash; - }; - }; - }; -}; - -# -# Build everything that should be built -# -sub build_all { - if ($build_all_parents) { - my ($prj, $prj_dir, $orig_prj); - get_parent_deps( $initial_module, \%global_deps_hash); - if (scalar keys %active_modules) { - $active_modules{$initial_module}++; - $modules_types{$initial_module} = 'mod'; - }; - modules_classify(keys %global_deps_hash); - expand_dependencies (\%global_deps_hash); - prepare_incompatible_build(\%global_deps_hash) if ($incompatible && (!$build_from_with_branches)); - if ($build_from_with_branches) { - my %reversed_full_deps_hash = (); - reverse_dependencies(\%global_deps_hash, \%reversed_full_deps_hash); - prepare_build_from_with_branches(\%global_deps_hash, \%reversed_full_deps_hash); - } - if ($build_all_cont || $build_since) { - store_weights(\%global_deps_hash); - prepare_build_all_cont(\%global_deps_hash); - %weights_hash = (); - }; - if ($generate_config) { - %add_to_config = %global_deps_hash; - generate_config_file(); - exit 0; - } elsif ($incompatible) { - my @missing_modules = (); - foreach (sort keys %global_deps_hash) { - push(@missing_modules, $_) if (!defined $active_modules{$_}); - }; - if (scalar @missing_modules) { - push(@warnings, "The modules: \"@missing_modules\" should be have been built, but they are not activated and have been skipped. Be aware, that can cause compatibility problems. Maybe you should verify your $source_config_file.\n"); - }; - }; - foreach my $module (keys %dead_parents, keys %skip_modules) { - remove_from_dependencies($module, \%global_deps_hash); - delete ($global_deps_hash{$module}) if (defined $global_deps_hash{$module}); - }; - store_weights(\%global_deps_hash); - backup_deps_hash(\%global_deps_hash, \%global_deps_hash_backup); - reverse_dependencies(\%global_deps_hash_backup, \%reversed_dependencies); - $modules_number = scalar keys %global_deps_hash; - initialize_html_info($_) foreach (keys %global_deps_hash); - if ($processes_to_run) { - build_multiprocessing(); - return; - }; - if ($server_mode) { - run_server(); - }; - while ($prj = pick_prj_to_build(\%global_deps_hash)) { - if (!defined $dead_parents{$prj}) { - if (scalar keys %broken_build) { - print $echo . "Skipping project $prj because of error(s)\n"; - remove_from_dependencies($prj, \%global_deps_hash); - $build_is_finished{$prj}++; - next; - }; - - $prj_dir = $module_paths{$prj}; - get_module_dep_hash($prj, \%local_deps_hash); - my $info_hash = $html_info{$prj}; - $$info_hash{DIRS} = check_deps_hash(\%local_deps_hash, $prj); - $module_by_hash{\%local_deps_hash} = $prj; - build_dependent(\%local_deps_hash); - print $check_error_string; - }; - - remove_from_dependencies($prj, \%global_deps_hash); - $build_is_finished{$prj}++; - }; - } else { - store_build_list_content($initial_module); - get_module_dep_hash($initial_module, \%local_deps_hash); - initialize_html_info($initial_module); - my $info_hash = $html_info{$initial_module}; - $$info_hash{DIRS} = check_deps_hash(\%local_deps_hash, $initial_module); - $module_by_hash{\%local_deps_hash} = $initial_module; - if ($server_mode) { - run_server(); - } else { - build_dependent(\%local_deps_hash); - }; - }; -}; - -sub backup_deps_hash { - my $source_hash = shift; - my $backup_hash = shift; - foreach my $key (keys %$source_hash) { - my %values_hash = %{$$source_hash{$key}}; - $$backup_hash{$key} = \%values_hash; - }; -}; - -sub initialize_html_info { - my $module = shift; - return if (defined $dead_parents{$module}); - $html_info{$module} = { 'DIRS' => [], - 'ERRORFUL' => [], - 'SUCCESSFUL' => [], - 'BUILD_TIME' => 0}; -} - -# -# Do job -# -sub dmake_dir { - my ($new_job_name, $error_code); - my $job_name = shift; - $jobs_hash{$job_name}->{START_TIME} = time(); - $jobs_hash{$job_name}->{STATUS} = 'building'; - - if ($job_name =~ /(\s)/o && (!-d $job_name)) { - $error_code = do_custom_job($job_name, \%local_deps_hash); - } else { - html_store_job_info(\%local_deps_hash, $job_name); - print_error("$job_name not found!!\n") if (!-d $job_name); - if (!-d $job_name) { - $new_job_name = $job_name; - $new_job_name =~ s/_simple//g; - if ((-d $new_job_name)) { - print("\nTrying $new_job_name, $job_name not found!!\n"); - $job_name = $new_job_name; - } else { - print_error("\n$job_name not found!!\n"); - } - } - if ($cmd_file) { - print "cd $job_name\n"; - print $check_error_string; - print $echo.$job_name."\n"; - print "$dmake\n"; - print $check_error_string; - } else { - print "Entering $job_name\n"; - }; - remove_from_dependencies($job_name, \%local_deps_hash) if (!$child); - return if ($cmd_file || $show); - $error_code = run_job($dmake, $job_name); - - #if dmake fails, have a go at regenerating the dependencies - #and try again. dmakes normal failure is 255, while death on signal is 254 - my $real_exit_code = $error_code >> 8; - if (($ENV{GUI_FOR_BUILD} eq 'WNT') && ($real_exit_code == 255) && ($ENV{nodep} eq '') && ($ENV{depend} eq '')) { - print "Retrying $job_name\n"; - $error_code = run_job($dmake, $job_name); - } - - html_store_job_info(\%local_deps_hash, $job_name, $error_code) if (!$child); - }; - - if ($error_code && $ignore) { - push(@ignored_errors, $job_name); - $error_code = 0; - }; - if ($child) { - my $oldfh = select STDERR; - $| = 1; - select $oldfh; - $| =1; - if ($error_code) { - _exit($error_code >> 8); - } else { - _exit($? >> 8) if ($? && ($? != -1)); - }; - _exit(0); - } elsif ($error_code && ($error_code != -1)) { - $broken_build{$job_name} = $error_code; - return $error_code; - }; -}; - -# -# Procedure stores information about build list (and) -# build list object in build_lists_hash -# -sub store_build_list_content { - my $module = shift; - my $build_list_path = get_build_list_path($module); - return undef if (!defined $build_list_path); - return if (!$build_list_path); - my $xml_list = undef; - if ($build_list_path =~ /\.xlist$/o) { - print_error("XMLBuildListParser.pm couldn\'t be found, so XML format for build lists is not enabled") if (!defined $enable_xml); - $xml_list = XMLBuildListParser->new(); - if (!$xml_list->loadXMLFile($build_list_path)) { - print_error("Cannot use $build_list_path"); - }; - $build_lists_hash{$module} = $xml_list; - } else { - if (open (BUILD_LST, $build_list_path)) { - my @build_lst = <BUILD_LST>; - $build_lists_hash{$module} = \@build_lst; - close BUILD_LST; - return; - } - $dead_parents{$module}++; - }; -} -# -# Get string (list) of parent projects to build -# -sub get_parents_array { - my $module = shift; - store_build_list_content($module); - my $build_list_ref = $build_lists_hash{$module}; - - if (ref($build_list_ref) eq 'XMLBuildListParser') { - return $build_list_ref->getModuleDependencies(\@modes_array); - }; - foreach (@$build_list_ref) { - if ($_ =~ /#/) { - if ($`) { - $_ = $`; - } else { - next; - }; - }; - s/\r\n//; - if ($_ =~ /\:+\s+/) { - return pick_for_build_type($'); - }; - }; - return (); -}; - -# -# get folders' platform infos -# -sub get_prj_platform { - my $build_list_ref = shift; - my ($prj_alias, $line); - foreach(@$build_list_ref) { - s/\r\n//; - $line++; - if ($_ =~ /\snmake\s/) { - if ($' =~ /\s*-\s+(\w+)[,\S+]*\s+(\S+)/ ) { #' - my $platform = $1; - my $alias = $2; - print_error ("There is no correct alias set in the line $line!") if ($alias eq 'NULL'); - mark_platform($alias, $platform); - } else { - print_error("Misspelling in line: \n$_"); - }; - }; - }; -}; - -# -# Procedure populate the dependencies hash with -# information from XML build list object -# -sub get_deps_from_object { - my ($module, $build_list_object, $dependencies_hash) = @_; - - foreach my $dir ($build_list_object->getJobDirectories("make", $ENV{GUI})) { - $path_hash{$dir} = $module_paths{$module}; - $path_hash{$dir} .= $dir if ($dir ne '/'); - my %deps_hash = (); - - foreach my $dep ($build_list_object->getJobDependencies($dir, "make", $ENV{GUI})) { - $deps_hash{$dep}++; - }; - $$dependencies_hash{$dir} = \%deps_hash; - }; -}; - -# -# this function wraps the get_module_dep_hash and backups the resultung hash -# -sub get_module_dep_hash { - my ($module, $module_dep_hash) = @_; - if (defined $module_deps_hash_backup{$module}) { - backup_deps_hash($module_deps_hash_backup{$module}, $module_dep_hash); - } else { - get_deps_hash($module, $module_dep_hash); - my %values_hash = (); - backup_deps_hash($module_dep_hash, \%values_hash); - $module_deps_hash_backup{$module} = \%values_hash; - } -}; - -# -# Getting hashes of all internal dependencies and additional -# information for given project -# -sub get_deps_hash { - my ($dummy, $module_to_build); - my %dead_dependencies = (); - $module_to_build = shift; - my $dependencies_hash = shift; - if ($custom_job) { - if ($modules_types{$module_to_build} ne 'lnk') { - add_prerequisite_job($dependencies_hash, $module_to_build, $pre_custom_job); - add_prerequisite_job($dependencies_hash, $module_to_build, $pre_job); - add_dependent_job($dependencies_hash, $module_to_build, $custom_job); - add_dependent_job($dependencies_hash, $module_to_build, $post_job); - add_dependent_job($dependencies_hash, $module_to_build, $post_custom_job); - }; - return; - }; - if ( defined $modules_types{$module_to_build} && $modules_types{$module_to_build} ne 'mod') { - add_prerequisite_job($dependencies_hash, $module_to_build, $pre_job); - return; - }; - - my $build_list_ref = $build_lists_hash{$module_to_build}; - if (ref($build_list_ref) eq 'XMLBuildListParser') { - get_deps_from_object($module_to_build, $build_list_ref, $dependencies_hash); - } else { - get_prj_platform($build_list_ref); - foreach (@$build_list_ref) { - if ($_ =~ /#/o) { - next if (!$`); - $_ = $`; - }; - s/\r\n//; - if ($_ =~ /\s+nmake\s+/o) { - my ($platform, $dependencies, $dir, $dir_alias); - my %deps_hash = (); - $dependencies = $'; - $dummy = $`; - $dummy =~ /(\S+)\s+(\S*)/o; - $dir = $2; - $dependencies =~ /(\w+)/o; - $platform = $1; - $dependencies = $'; - while ($dependencies =~ /,(\w+)/o) { - $dependencies = $'; #' - }; - $dependencies =~ /\s+(\S+)\s+/o; - $dir_alias = $1; - if (!check_platform($platform)) { - next if (defined $platform_hash{$dir_alias}); - $dead_dependencies{$dir_alias}++; - next; - }; - delete $dead_dependencies{$dir_alias} if (defined $dead_dependencies{$dir_alias}); - print_error("Directory alias $dir_alias is defined at least twice!! Please, correct build.lst in module $module_to_build") if (defined $$dependencies_hash{$dir_alias}); - $platform_hash{$dir_alias}++; - $dependencies = $'; #' - print_error("$module_to_build/prj/build.lst has wrongly written dependencies string:\n$_\n") if (!$dependencies); - $deps_hash{$_}++ foreach (get_dependency_array($dependencies)); - $$dependencies_hash{$dir_alias} = \%deps_hash; - my $local_dir = ''; - if ($dir =~ /(\\|\/)/o) { - $local_dir = "/$'"; - }; - $path_hash{$dir_alias} = correct_path($module_paths{$module_to_build} . $local_dir); - } elsif ($_ !~ /^\s*$/ && $_ !~ /^\w*\s/o) { - chomp; - push(@errors, $_); - }; - }; - if (scalar @errors) { - my $message = "$module_to_build/prj/build.lst has wrongly written string(s):\n"; - $message .= "$_\n" foreach(@errors); - if ($processes_to_run) { - $broken_build{$module_to_build} = $message; - $dependencies_hash = undef; - return; - } else { - print_error($message); - }; - }; - foreach my $alias (keys %dead_dependencies) { - next if defined $alive_dependencies{$alias}; -# if (!IsHashNative($alias)) { - remove_from_dependencies($alias, $dependencies_hash); - delete $dead_dependencies{$alias}; -# }; - }; - }; - resolve_aliases($dependencies_hash, \%path_hash); - if (!$prepare) { - add_prerequisite_job($dependencies_hash, $module_to_build, $pre_custom_job); - add_prerequisite_job($dependencies_hash, $module_to_build, $pre_job); - add_dependent_job($dependencies_hash, $module_to_build, $custom_job); - add_dependent_job($dependencies_hash, $module_to_build, $post_job) if ($module_to_build ne $initial_module); - add_dependent_job($dependencies_hash, $module_to_build, $post_custom_job); - }; - store_weights($dependencies_hash); -}; - -# -# procedure adds which is independent from anothers, but anothers are dependent from it -# -sub add_prerequisite_job { - my ($dependencies_hash, $module, $job) = @_; - return if (!$job); - $job = "$module $job"; - foreach (keys %$dependencies_hash) { - my $deps_hash = $$dependencies_hash{$_}; - $$deps_hash{$job}++; - }; - $$dependencies_hash{$job} = {}; -}; - -# -# procedure adds a job wich is dependent from all already registered jobs -# -sub add_dependent_job { - # $post_job is dependent from all jobs - my ($dependencies_hash, $module, $job) = @_; - return if (!$job); - my %deps_hash = (); - $deps_hash{$_}++ foreach (keys %$dependencies_hash); - $$dependencies_hash{"$module $job"} = \%deps_hash; -}; - -# -# this procedure converts aliases to absolute paths -# -sub resolve_aliases { - my ($dependencies_hash, $path_hash) = @_; - foreach my $dir_alias (keys %$dependencies_hash) { - my $aliases_hash_ref = $$dependencies_hash{$dir_alias}; - my %paths_hash = (); - foreach (keys %$aliases_hash_ref) { - $paths_hash{$$path_hash{$_}}++; - }; - delete $$dependencies_hash{$dir_alias}; - $$dependencies_hash{$$path_hash{$dir_alias}} = \%paths_hash; - }; -}; - -# -# mark platform in order to prove if alias has been used according to specs -# -sub mark_platform { - my $prj_alias = shift; - if (exists $prj_platform{$prj_alias}) { - $prj_platform{$prj_alias} = 'all'; - } else { - $prj_platform{$prj_alias} = shift; - }; -}; - -# -# Convert path from abstract (with '\' and/or '/' delimiters) -# to system-independent -# -sub correct_path { - $_ = shift; - s/\\/\//g; - return $_; -}; - - -sub check_dmake { - if (open(DMAKEVERSION, "dmake -V |")) { - my @dmake_version = <DMAKEVERSION>; - close DMAKEVERSION; - return; - }; - my $error_message = 'dmake: Command not found.'; - $error_message .= ' Please rerun bootstrap' if (!defined $ENV{COMMON_ENV_TOOLS}); - print_error($error_message); -}; - -# -# Get platform-dependent commands -# -sub get_commands { - my $arg = ''; - # Setting alias for dmake - $dmake = 'dmake'; - check_dmake(); - - if ($cmd_file) { - if ($ENV{GUI_FOR_BUILD} eq 'UNX') { - $check_error_string = "if \"\$?\" != \"0\" exit\n"; - } else { - $check_error_string = "if \"\%?\" != \"0\" quit\n"; - }; - }; - - $dmake_args = join(' ', 'dmake', @dmake_args); - - while ($arg = pop(@dmake_args)) { - $dmake .= ' '.$arg; - }; - $dmake .= ' verbose=true' if ($html || $verbose); -}; - -# -# Procedure retrieves list of projects to be built from build.lst -# -sub get_workspace_path { - if (!defined $ENV{GUI}) { - $ENV{mk_tmp} = ''; - die "No environment set\n"; - }; - my $repository_helper = RepositoryHelper->new(); - my $workspace_path = $repository_helper->get_repository_root(); - my $initial_dir = $repository_helper->get_initial_directory(); - if ($workspace_path eq $initial_dir) { - print_error('Found no project to build'); - }; - $initial_module = substr($initial_dir, length($workspace_path) + 1); - if ($initial_module =~ /(\\|\/)/) { - $initial_module = $`; - }; - $module_paths{$initial_module} = $workspace_path . "/$initial_module"; - return $workspace_path; -}; - -# -# Picks project which can be built now from hash and then deletes it from hash -# -sub pick_prj_to_build { - my $deps_hash = shift; - get_html_orders(); - my $prj = find_indep_prj($deps_hash); - if ($prj) { - delete $$deps_hash{$prj}; - generate_html_file(); - }; - return $prj; -}; - -# -# Make a decision if the project should be built on this platform -# -sub check_platform { - my $platform = shift; - return 1 if ($platform eq 'all'); - return 1 if (($ENV{GUI} eq 'WIN') && ($platform eq 'w')); - return 1 if (($ENV{GUI} eq 'UNX') && ($platform eq 'u')); - return 1 if (($ENV{GUI} eq 'WNT') && - (($platform eq 'w') || ($platform eq 'n'))); - return 0; -}; - -# -# Remove project to build ahead from dependencies and make an array -# of all from given project dependent projects -# -sub remove_from_dependencies { - my ($exclude_prj, $i, $prj, $dependencies); - $exclude_prj = shift; - my $exclude_prj_orig = ''; - $exclude_prj_orig = $` if (($exclude_prj =~ /\.lnk$/o) || ($exclude_prj =~ /\.link$/o)); - $dependencies = shift; - foreach $prj (keys %$dependencies) { - my $prj_deps_hash = $$dependencies{$prj}; - delete $$prj_deps_hash{$exclude_prj} if (defined $$prj_deps_hash{$exclude_prj}); - }; -}; - - -# -# Check the hash for consistency -# -sub check_deps_hash { - my ($deps_hash_ref, $module) = @_; - my @possible_order; - my $module_path = $module_paths{$module} if (defined $module); - return if (!scalar keys %$deps_hash_ref); - my %deps_hash = (); - my $consistent; - backup_deps_hash($deps_hash_ref, \%deps_hash); - my $string; - my $log_name; - my $build_number = 0; - - do { - $consistent = ''; - foreach my $key (sort keys %deps_hash) { - my $local_deps_ref = $deps_hash{$key}; - if (!scalar keys %$local_deps_ref) { - if (defined $module) { - $build_number++; - $string = undef; - if ($key =~ /(\s)/o) { - $string = $key; - } else { - if (length($key) == length($module_path)) { - $string = './'; - } else { - $string = substr($key, length($module_path) + 1); - $string =~ s/\\/\//go; - }; - }; - $log_name = $string; - if ($log_name eq "$module $custom_job") { - $log_name = "custom_job"; - }; - if ($log_name eq "$module $pre_custom_job") { - $log_name = "pre_custom_job"; - }; - if ($log_name eq "$module $post_custom_job") { - $log_name = "post_custom_job"; - }; - $log_name =~ s/\\|\//\./g; - $log_name =~ s/\s/_/g; - $log_name = $module if ($log_name =~ /^\.+$/); - $log_name .= '.txt'; - push(@possible_order, $key); - $jobs_hash{$key} = { SHORT_NAME => $string, - BUILD_NUMBER => $build_number, - STATUS => 'waiting', - LOG_PATH => '../' . $source_config->get_module_repository($module) . "/$module/$ENV{INPATH}/misc/logs/$log_name", - LONG_LOG_PATH => correct_path($module_paths{$module} . "/$ENV{INPATH}/misc/logs/$log_name"), - START_TIME => 0, - FINISH_TIME => 0, - CLIENT => '-' - }; - }; - remove_from_dependencies($key, \%deps_hash); - delete $deps_hash{$key}; - $consistent++; - }; - }; - } while ($consistent && (scalar keys %deps_hash)); - return \@possible_order if ($consistent); - print STDERR "Fatal error:"; - foreach (keys %deps_hash) { - print STDERR "\n\t$_ depends on: "; - foreach my $i (keys %{$deps_hash{$_}}) { - print STDERR (' ', $i); - }; - }; - if ($child) { - my $oldfh = select STDERR; - $| = 1; - _do_exit(1); - } else { - print_error("There are dead or circular dependencies\n"); - }; -}; - -# -# Find project with no dependencies left. -# -sub find_indep_prj { - my ($dependencies, $i); - my @candidates = (); - $all_dependent = 1; - handle_dead_children(0) if ($processes_to_run); - my $children = children_number(); - return '' if (!$server_mode && $children && ($children >= $processes_to_run)); - $dependencies = shift; - if (scalar keys %$dependencies) { - foreach my $job (keys %$dependencies) { - if (!scalar keys %{$$dependencies{$job}}) { - push(@candidates, $job); - last if (!$processes_to_run); - }; - }; - if (scalar @candidates) { - $all_dependent = 0; - my $best_candidate = undef; - my $best_weight = 0; - if (scalar @candidates > 1) { - foreach my $candidate (@candidates) { - my $candidate_weight = get_waiters_number($candidate); - if ($candidate_weight > $best_weight) { - $best_candidate = $candidate; - $best_weight = $candidate_weight; - }; - }; - if (defined $best_candidate) { - return $best_candidate; - } - } - my @sorted_candidates = sort(@candidates); - return $sorted_candidates[0]; - }; - }; - return ''; -}; - -sub get_waiters_number { - my $module = shift; - if (defined $weights_hash{$module}) { - return $weights_hash{$module}; - }; - if (defined $reversed_dependencies{$module}) { - return scalar keys %{$reversed_dependencies{$module}}; - }; - return 0; -}; - -# -# Check if given entry is HASH-native, that is not a user-defined data -# -#sub IsHashNative { -# my $prj = shift; -# return 1 if ($prj =~ /^HASH\(0x[\d | a | b | c | d | e | f]{6,}\)/); -# return 0; -#}; - -# -# Getting array of dependencies from the string given -# -sub get_dependency_array { - my ($dep_string, @dependencies, $parent_prj, $prj, $string); - @dependencies = (); - $dep_string = shift; - $string = $dep_string; - $prj = shift; - while ($dep_string !~ /^NULL/o) { - print_error("Project $prj has wrongly written dependencies string:\n $string") if (!$dep_string); - $dep_string =~ /(\S+)\s*/o; - $parent_prj = $1; - $dep_string = $'; #' - if ($parent_prj =~ /\.(\w+)$/o) { - $parent_prj = $`; - if (($prj_platform{$parent_prj} ne $1) && - ($prj_platform{$parent_prj} ne 'all')) { - print_error ("$parent_prj\.$1 is a wrongly dependency identifier!\nCheck if it is platform dependent"); - }; - $alive_dependencies{$parent_prj}++ if (check_platform($1)); - push(@dependencies, $parent_prj); - } else { - if ((exists($prj_platform{$parent_prj})) && - ($prj_platform{$parent_prj} ne 'all') ) { - print_error("$parent_prj is a wrongly used dependency identifier!\nCheck if it is platform dependent"); - }; - push(@dependencies, $parent_prj); - }; - }; - return @dependencies; -}; - - -# -# Getting current directory list -# -sub get_directory_list { - my $path = shift; - opendir(CurrentDirList, $path); - my @directory_list = readdir(CurrentDirList); - closedir(CurrentDirList); - return @directory_list; -}; - -sub print_error { - my $message = shift; - my $force = shift; - $modules_number -= scalar keys %global_deps_hash; - $modules_number -= 1; - print STDERR "\nERROR: $message\n"; - $ENV{mk_tmp} = ''; - if ($cmd_file) { - close CMD_FILE; - unlink ($cmd_file); - }; - if (!$child) { - $ENV{mk_tmp} = ''; - close CMD_FILE if ($cmd_file); - unlink ($cmd_file); - do_exit(1); - }; - do_exit(1) if (defined $force); -}; - -sub usage { - print STDERR "\nbuild\n"; - print STDERR "Syntax: build [--all|-a[:prj_name]]|[--from|-f prj_name1[:prj_name2] [prj_name3 [...]]]|[--since|-c prj_name] [--with_branches prj_name1[:prj_name2] [--skip prj_name1[:prj_name2] [prj_name3 [...]] [prj_name3 [...]|-b]|[--prepare|-p][:platform] [--deliver|-d [--dlv_switch deliver_switch]]] [-P processes|--server [--setenvstring \"string\"] [--client_timeout MIN] [--port port1[:port2:...:portN]]] [--show|-s] [--help|-h] [--file|-F] [--ignore|-i] [--version|-V] [--mode|-m OOo[,SO[,EXT]] [--html [--html_path html_file_path] [--dontgraboutput]] [--pre_job=pre_job_sring] [--job=job_string|-j] [--post_job=post_job_sring] [--stoponerror] [--genconf [--removeall|--clear|--remove|--add [module1,module2[,...,moduleN]]]] [--exclude_branch_from prj_name1[:prj_name2] [prj_name3 [...]]] [--interactive] [--verbose]\n"; - print STDERR "Example1: build --from sfx2\n"; - print STDERR " - build all projects dependent from sfx2, starting with sfx2, finishing with the current module\n"; - print STDERR "Example2: build --all:sfx2\n"; - print STDERR " - the same as --all, but skip all projects that have been already built when using \"--all\" switch before sfx2\n"; - print STDERR "Example3: build --all --server\n"; - print STDERR " - build all projects in server mode, use first available port from default range 7890-7894 (running clients required!!)\n"; - print STDERR "Example4(for unixes):\n"; - print STDERR " build --all --pre_job=echo\\ Starting\\ job\\ in\\ \\\$PWD --job=some_script.sh --post_job=echo\\ Job\\ in\\ \\\$PWD\\ is\\ made\n"; - print STDERR " - go through all projects, echo \"Starting job in \$PWD\" in each module, execute script some_script.sh, and finally echo \"Job in \$PWD is made\"\n"; - print STDERR "\nSwitches:\n"; - print STDERR " --all - build all projects from very beginning till current one\n"; - print STDERR " --from - build all projects dependent from the specified (including it) till current one\n"; - print STDERR " --exclude_branch_from - exclude module(s) and its branch from the build\n"; - print STDERR " --mode OOo - build only projects needed for OpenOffice.org\n"; - print STDERR " --prepare - clear all projects for incompatible build from prj_name till current one [for platform] (cws version)\n"; - print STDERR " --with_branches- the same as \"--from\" but with build all projects in neighbour branches\n"; - print STDERR " --skip - do not build certain module(s)\n"; - print STDERR " --since - build all projects beginning from the specified till current one (the same as \"--all:prj_name\", but skipping prj_name)\n"; - print STDERR " --checkmodules - check if all required parent projects are availlable\n"; - print STDERR " --show - show what is going to be built\n"; - print STDERR " --file - generate command file file_name\n"; - print STDERR " --deliver - only deliver, no build (usable for \'-all\' and \'-from\' keys)\n"; - print STDERR " -P - start multiprocessing build, with number of processes passed\n"; - print STDERR " --server - start build in server mode (clients required)\n"; - print STDERR " --setenvstring - string for configuration of the client environment\n"; - print STDERR " --port - set server port, default is 7890. You may pass several ports, the server will be started on the first available\n"; - print STDERR " otherwise the server will be started on first available port from the default range 7890-7894\n"; - print STDERR " --client_timeout - time frame after which the client/job is considered to be lost. Default is 120 min\n"; - print STDERR " --dlv_switch - use deliver with the switch specified\n"; - print STDERR " --help - print help info\n"; - print STDERR " --ignore - force tool to ignore errors\n"; - print STDERR " --html - generate html page with build status\n"; - print STDERR " file named $ENV{INPATH}.build.html will be generated in $ENV{SOLARSRC}\n"; - print STDERR " --html_path - set html page path\n"; - print STDERR " --dontgraboutput - do not grab console output when generating html page\n"; - print STDERR " --genconf - generate/modify workspace configuration file\n"; - print STDERR " --add - add active module(s) to configuration file\n"; - print STDERR " --remove - removeactive modules(s) from configuration file\n"; - print STDERR " --removeall|--clear - remove all active modules(s) from configuration file\n"; - - print STDERR " --stoponerror - stop build when error occurs (for mp builds)\n"; - print STDERR " --interactive - start interactive build process (process can be managed via html page)\n"; - print STDERR " --verbose - generates a detailed output of the build process\n"; - print STDERR " Custom jobs:\n"; - print STDERR " --job=job_string - execute custom job in (each) module. job_string is a shell script/command to be executed instead of regular dmake jobs\n"; - print STDERR " --pre_job=pre_job_string - execute preliminary job in (each) module. pre_job_string is a shell script/command to be executed before regular job in the module\n"; - print STDERR " --post_job=job_string - execute a postprocess job in (each) module. post_job_string is a shell script/command to be executed after regular job in the module\n"; - print STDERR "Default: - build current project\n"; - print STDERR "Unknown switches passed to dmake\n"; -}; - -# -# Get all options passed -# -sub get_options { - my ($arg, $dont_grab_output); - while ($arg = shift @ARGV) { - $arg =~ /^-P$/ and $processes_to_run = shift @ARGV and next; - $arg =~ /^-P(\d+)$/ and $processes_to_run = $1 and next; - $arg =~ /^--all$/ and $build_all_parents = 1 and next; - $arg =~ /^-a$/ and $build_all_parents = 1 and next; - $arg =~ /^--show$/ and $show = 1 and next; - $arg =~ /^--checkmodules$/ and $checkparents = 1 and $ignore = 1 and next; - $arg =~ /^-s$/ and $show = 1 and next; - $arg =~ /^--deliver$/ and $deliver = 1 and next; - $arg =~ /^--gmake$/ and $allow_gbuild = 1 and print "ALLOW GBUILD" and next; - $arg =~ /^(--job=)/ and $custom_job = $' and next; - $arg =~ /^(--pre_job=)/ and $pre_custom_job = $' and next; - $arg =~ /^(--post_job=)/ and $post_custom_job = $' and next; #' - $arg =~ /^-d$/ and $deliver = 1 and next; - $arg =~ /^--dlv_switch$/ and $dlv_switch = shift @ARGV and next; - $arg =~ /^--file$/ and $cmd_file = shift @ARGV and next; - $arg =~ /^-F$/ and $cmd_file = shift @ARGV and next; - $arg =~ /^--skip$/ and get_modules_passed(\%skip_modules) and next; - - if ($arg =~ /^--with_branches$/ || $arg =~ /^-b$/) { - $build_from_with_branches = 1; - $build_all_parents = 1; - get_modules_passed(\%incompatibles); - next; - }; - $arg =~ /^--all:(\S+)$/ and $build_all_parents = 1 - and $build_all_cont = $1 and next; - $arg =~ /^-a:(\S+)$/ and $build_all_parents = 1 - and $build_all_cont = $1 and next; - if ($arg =~ /^--from$/ || $arg =~ /^-f$/) { - $build_all_parents = 1; - get_modules_passed(\%incompatibles); - next; - }; - if ($arg =~ /^--exclude_branch_from$/) { - get_modules_passed(\%exclude_branches); - next; - }; - $arg =~ /^--prepare$/ and $prepare = 1 and next; - $arg =~ /^-p$/ and $prepare = 1 and next; - $arg =~ /^--prepare:/ and $prepare = 1 and $only_platform = $' and next; - $arg =~ /^-p:/ and $prepare = 1 and $only_platform = $' and next; - $arg =~ /^--since$/ and $build_all_parents = 1 - and $build_since = shift @ARGV and next; - $arg =~ /^-c$/ and $build_all_parents = 1 - and $build_since = shift @ARGV and next; - $arg =~ /^-s$/ and $build_all_parents = 1 - and $build_since = shift @ARGV and next; - $arg =~ /^--help$/ and usage() and do_exit(0); - $arg =~ /^-h$/ and usage() and do_exit(0); - $arg =~ /^--ignore$/ and $ignore = 1 and next; - $arg =~ /^--genconf$/ and $generate_config = 1 and next; - if ($arg =~ /^--add$/) { - get_list_of_modules(\%add_to_config); - next; - }; - if ($arg =~ /^--remove$/) { - get_list_of_modules(\%remove_from_config); - if (!scalar %remove_from_config) { - print_error('No module list supplied!!'); - }; - next; - }; - ($arg =~ /^--clear$/ || $arg =~ /^--removeall$/) and $clear_config = 1 and next; - $arg =~ /^--html$/ and $html = 1 and next; - $arg =~ /^--dontgraboutput$/ and $dont_grab_output = 1 and next; - $arg =~ /^--html_path$/ and $html_path = shift @ARGV and next; - $arg =~ /^-i$/ and $ignore = 1 and next; - $arg =~ /^--server$/ and $server_mode = 1 and next; - $arg =~ /^--client_timeout$/ and $client_timeout = (shift @ARGV)*60 and next; - $arg =~ /^--setenvstring$/ and $setenv_string = shift @ARGV and next; - $arg =~ /^--port$/ and $ports_string = shift @ARGV and next; - $arg =~ /^--version$/ and do_exit(0); - $arg =~ /^-V$/ and do_exit(0); - $arg =~ /^-m$/ and get_modes() and next; - $arg =~ /^--mode$/ and get_modes() and next; - $arg =~ /^--stoponerror$/ and $stop_build_on_error = 1 and next; - $arg =~ /^--interactive$/ and $interactive = 1 and next; - $arg =~ /^--verbose$/ and $verbose = 1 and next; - if ($arg =~ /^--$/) { - push (@dmake_args, get_dmake_args()) if (!$custom_job); - next; - }; - push (@dmake_args, $arg); - }; - if (!$html) { - print_error("\"--html_path\" switch is used only with \"--html\"") if ($html_path); - print_error("\"--dontgraboutput\" switch is used only with \"--html\"") if ($dont_grab_output); - }; - if ((scalar keys %exclude_branches) && !$build_all_parents) { - print_error("\"--exclude_branch_from\" is not applicable for one module builds!!"); - }; - $grab_output = 0 if ($dont_grab_output); - print_error('Switches --with_branches and --all collision') if ($build_from_with_branches && $build_all_cont); - print_error('Switch --skip is for building multiple modules only!!') if ((scalar keys %skip_modules) && (!$build_all_parents)); - print_error('Switches --with_branches and --since collision') if ($build_from_with_branches && $build_since); - if ($show) { - $processes_to_run = 0; - $cmd_file = ''; - }; - print_error('Switches --job and --deliver collision') if ($custom_job && $deliver); - $custom_job = 'deliver' if $deliver; - $post_job = 'deliver' if (!$custom_job); - $incompatible = scalar keys %incompatibles; - if ($prepare) { - print_error("--prepare is for use with --from switch only!\n") if (!$incompatible); - }; - if ($processes_to_run) { - if ($ignore && !$html) { - print_error("Cannot ignore errors in multiprocessing build"); - }; - if (!$enable_multiprocessing) { - print_error("Cannot load Win32::Process module for multiprocessing build"); - }; - if ($server_mode) { - print_error("Switches -P and --server collision"); - }; - } elsif ($stop_build_on_error) { - print_error("Switch --stoponerror is only for multiprocessing builds"); - }; - if ($server_mode) { - $html++; - $client_timeout = 60 * 60 * 2 if (!$client_timeout); - } else { - print_error("--ports switch is for server mode only!!") if ($ports_string); - print_error("--setenvstring switch is for server mode only!!") if ($setenv_string); - print_error("--client_timeout switch is for server mode only!!") if ($client_timeout); - }; - - if (!$generate_config) { - my $error_message = ' switch(es) should be used only with "--genconf"'; - print_error('"--removeall" ("--clear")' . $error_message) if ($clear_config); - if ((scalar %add_to_config) || (scalar %remove_from_config)) { - print_error('"--add" or/and "--remove"' . $error_message); - }; - } elsif ((!scalar %add_to_config) && !$clear_config && (!scalar %remove_from_config) && !$build_all_parents){ - print_error('Please supply necessary switch for "--genconf" (--add|--remove|--removeall). --add can be used with --from and such'); - }; - - if ($only_platform) { - $only_common = 'common'; - $only_common .= '.pro' if ($only_platform =~ /\.pro$/); - }; - if ($interactive) { - $html++; # enable html page generation... - my $local_host_name = hostname(); - $local_host_ip = inet_ntoa(scalar(gethostbyname($local_host_name)) || 'localhost'); - } - # Default build modes(for OpenOffice.org) - $ENV{BUILD_TYPE} = 'OOo EXT' if (!defined $ENV{BUILD_TYPE}); - @ARGV = @dmake_args; - foreach $arg (@dmake_args) { - $arg =~ /^verbose=(\S+)$/i and $verbose_mode = ($1 =~ /^t\S*$/i); - } -}; - -sub get_module_and_buildlist_paths { - if ($build_all_parents || $checkparents) { - $source_config_file = $source_config->get_config_file_path(); - $active_modules{$_}++ foreach ($source_config->get_active_modules()); - my %active_modules_copy = %active_modules; - foreach my $module ($source_config->get_all_modules()) { - delete $active_modules_copy{$module} if defined($active_modules_copy{$module}); - next if ($module eq $initial_module); - $module_paths{$module} = $source_config->get_module_path($module); - $build_list_paths{$module} = $source_config->get_module_build_list($module); - $is_gbuild{$module} = $source_config->{GBUILD}; - } - $dead_parents{$_}++ foreach (keys %active_modules_copy); - }; -}; - - -sub get_dmake_args { - my $arg; - my @job_args = (); - while ($arg = shift @ARGV) { - next if ($arg =~ /^--$/); - push (@job_args, $arg); - }; - return @job_args; -}; - -# -# get all options without '-' -# -sub get_switch_options { - my $string = ''; - my $option = ''; - while ($option = shift @ARGV) { - if (!($option =~ /^-+/)) { - $string .= '-' . $option; - $string .= ' '; - } else { - unshift(@ARGV, $option); - last; - }; - }; - $string =~ s/\s$//; - return $string; -}; - -# -# cancel build when one of children has error exit code -# -sub cancel_build { - my $broken_modules_number = scalar @broken_modules_names; - - print STDERR "\n"; - print STDERR "-----------------------------------------------------------------------\n"; - print STDERR " Oh dear - something failed during the build - sorry !\n"; - print STDERR " For more help with debugging build errors, please see the section in:\n"; - print STDERR " http://wiki.documentfoundation.org/Development\n"; - print STDERR "\n"; - - if (!$broken_modules_number || !$build_all_parents) { - while (children_number()) { - handle_dead_children(1); - } - } - - if (keys %broken_build) { - print STDERR " internal build errors:\n\n"; - foreach (keys %broken_build) { - print STDERR "ERROR: error " . $broken_build{$_} . " occurred while making $_\n"; - }; - print STDERR "\n"; - } - - my $module = shift @broken_modules_names; - if ($broken_modules_number > 1) { - print STDERR " it seems you are using a threaded build, which means that the\n"; - print STDERR " actual compile error is probably hidden far above, and could be\n"; - print STDERR " inside any of these other modules:\n"; - print STDERR " @broken_modules_names\n"; - print STDERR " please re-run build inside each one to isolate the problem.\n"; - } else { - print STDERR " it seems that the error is inside '$module', please re-run build\n"; - print STDERR " inside this module to isolate the error and/or test your fix:\n"; - } - print STDERR "-----------------------------------------------------------------------\n"; - print STDERR "\n"; - print STDERR "rm -Rf " . $ENV{'SRC_ROOT'} . "/$module/" . $ENV{'INPATH'} . " # optional module 'clean'\n"; - print STDERR "" . $ENV{'OOO_SHELL'} . "\n"; - print STDERR "cd " . $ENV{'SRC_ROOT'} . "\n"; - print STDERR "source ./" . $ENV{'ENV_SCRIPT'} . "\n"; - print STDERR "cd $module\n"; - if (is_gnumake_module($module)) - { - print STDERR "$ENV{GNUMAKE} -r\n" - } - else - { - print STDERR "build\n"; - } - print STDERR "\n"; - print STDERR "when the problem is isolated and fixed exit and re-run 'make' from the top-level\n"; - zenity_message("LibreOffice Build Failed!"); - zenity_close(); - - do_exit(1); -}; - -# -# Function for storing errors in multiprocessing AllParents build -# -sub store_error { - my ($pid, $error_code) = @_; - return 0 if (!$error_code); - - #we don't care if zenity itself crashes, e.g. rhbz#670895 - if (zenity_enabled()) { - return 0 if ($zenity_pid == $pid); - } - - my $child_nick = $processes_hash{$pid}; - - if ($ENV{GUI_FOR_BUILD} eq 'WNT') { - if (!defined $had_error{$child_nick}) { - $had_error{$child_nick}++; - return 1; - }; - }; - $modules_with_errors{$folders_hashes{$child_nick}}++; - $broken_build{$child_nick} = $error_code; - if ($stop_build_on_error) { - clear_from_child($pid); - # Let all children finish their work - while (children_number()) { - handle_dead_children(1); - }; - cancel_build(); - }; - return 0; -}; - -# -# child handler (clears (or stores info about) the terminated child) -# -sub handle_dead_children { - my $running_children = children_number(); - return if (!$running_children); - my $force_wait = shift; - my $try_once_more = 0; - do { - my $pid = 0; - if (children_number() >= $processes_to_run || - ($force_wait && ($running_children == children_number()))) { - $pid = wait(); - } else { - $pid = waitpid( -1, &WNOHANG); - }; - if ($pid > 0) { - $try_once_more = store_error($pid, $?); - if ($try_once_more) { - give_second_chance($pid); - } else { - clear_from_child($pid); - }; - $finished_children++; - }; - } while(children_number() >= $processes_to_run); -}; - -sub give_second_chance { - my $pid = shift; - # A malicious hack for mysterious windows problems - try 2 times - # to run dmake in the same directory if errors occurs - my $child_nick = $processes_hash{$pid}; - $running_children{$folders_hashes{$child_nick}}--; - delete $processes_hash{$pid}; - start_child($child_nick, $folders_hashes{$child_nick}); -}; - -sub clear_from_child { - my $pid = shift; - my $child_nick = $processes_hash{$pid}; - my $error_code = 0; - if (defined $broken_build{$child_nick}) { - $error_code = $broken_build{$child_nick}; - } else { - remove_from_dependencies($child_nick, - $folders_hashes{$child_nick}); - }; - foreach (keys %module_deps_hash_pids) { - delete ${$module_deps_hash_pids{$_}}{$pid} if defined (${$module_deps_hash_pids{$_}}{$pid}); - }; - my $module = $module_by_hash{$folders_hashes{$child_nick}}; - html_store_job_info($folders_hashes{$child_nick}, $child_nick, $error_code); - $running_children{$folders_hashes{$child_nick}}--; - delete $processes_hash{$pid}; - $verbose_mode && print 'Running processes: ' . children_number() . "\n"; -}; - -# -# Build the entire project according to queue of dependencies -# -sub build_dependent { - $dependencies_hash = shift; - my $pid = 0; - my $child_nick = ''; - $running_children{$dependencies_hash} = 0 if (!defined $running_children{$dependencies_hash}); - while ($child_nick = pick_prj_to_build($dependencies_hash)) { - if ($processes_to_run) { - do { - if (defined $modules_with_errors{$dependencies_hash} && !$ignore) { - return 0 if ($build_all_parents); - last; - }; - # start current child & all - # that could be started now - if ($child_nick) { - start_child($child_nick, $dependencies_hash); - return 1 if ($build_all_parents); - } else { - return 0 if ($build_all_parents); - if (scalar keys %$dependencies_hash) { - handle_dead_children(1); - }; - }; - $child_nick = pick_prj_to_build($dependencies_hash); - } while (scalar keys %$dependencies_hash || $child_nick); - while (children_number()) { - handle_dead_children(1); - }; - - if (defined $modules_with_errors{$dependencies_hash}) { - cancel_build(); - } - mp_success_exit(); - } else { - if (dmake_dir($child_nick)) { - push(@broken_modules_names, $module_by_hash{$dependencies_hash}); - cancel_build(); - }; - }; - $child_nick = ''; - }; -}; - -sub children_number { - return scalar keys %processes_hash; -}; - -sub start_child { - my ($job_dir, $dependencies_hash) = @_; - $jobs_hash{$job_dir}->{START_TIME} = time(); - $jobs_hash{$job_dir}->{STATUS} = 'building'; - if ($job_dir =~ /(\s)/o) { - my $error_code = undef; - if ($job_dir !~ /\sdeliver$/o) { - $error_code = do_custom_job($job_dir, $dependencies_hash); - return; - } - }; - $build_in_progress{$module_by_hash{$dependencies_hash}}++; - html_store_job_info($dependencies_hash, $job_dir); - my $pid = undef; - my $children_running; - my $oldfh = select STDOUT; - $| = 1; - if ($pid = fork) { # parent - select $oldfh; - $processes_hash{$pid} = $job_dir; - $children_running = children_number(); - $verbose_mode && print 'Running processes: ', $children_running, "\n"; - $maximal_processes = $children_running if ($children_running > $maximal_processes); - $folders_hashes{$job_dir} = $dependencies_hash; - store_pid($dependencies_hash, $pid); - $running_children{$dependencies_hash}++; - } elsif (defined $pid) { # child - select $oldfh; - $child = 1; - dmake_dir($job_dir); - do_exit(1); - }; -}; - -sub store_pid { - my ($deps_hash, $pid) = @_; - if (!defined $module_deps_hash_pids{$deps_hash}) { - my %module_hash_pids = (); - $module_deps_hash_pids{$deps_hash} = \%module_hash_pids; - }; - ${$module_deps_hash_pids{$deps_hash}}{$pid}++; -}; - -# -# Build everything that should be built multiprocessing version -# -sub build_multiprocessing { - my $prj; - do { - my $got_module = 0; - $finished_children = 0; - while ($prj = pick_prj_to_build(\%global_deps_hash)) { - if (!defined $projects_deps_hash{$prj}) { - $projects_deps_hash{$prj} = {}; - get_module_dep_hash($prj, $projects_deps_hash{$prj}); - my $info_hash = $html_info{$prj}; - $$info_hash{DIRS} = check_deps_hash($projects_deps_hash{$prj}, $prj); - $module_by_hash{$projects_deps_hash{$prj}} = $prj; - } - $module_build_queue{$prj}++; - $got_module++; - }; - if (!$got_module) { - cancel_build() if ((!scalar keys %module_build_queue) && !children_number()); - if (!$finished_children) { - handle_dead_children(1); - }; - }; - build_actual_queue(\%module_build_queue); - } while (scalar keys %global_deps_hash); - # Let the last module be built till the end - while (scalar keys %module_build_queue) { - build_actual_queue(\%module_build_queue); - handle_dead_children(1); - }; - # Let all children finish their work - while (children_number()) { - handle_dead_children(1); - }; - cancel_build() if (scalar keys %broken_build); - mp_success_exit(); -}; - -sub mp_success_exit { - print "\nMultiprocessing build is finished\n"; - print "Maximal number of processes run: $maximal_processes\n"; - zenity_message("LibreOffice Build Success!"); - zenity_close(); - do_exit(0); -}; - -# -# Here the built queue is built as long as possible -# -sub build_actual_queue { - my $build_queue = shift; - my $finished_projects = 0; - do { - my @sorted_queue = sort {(scalar keys %{$projects_deps_hash{$a}}) <=> (scalar keys %{$projects_deps_hash{$b}})} keys %$build_queue; - my $started_children = 0; - foreach my $prj (keys %$build_queue) { - get_html_orders(); - if ($reschedule_queue) { - $reschedule_queue = 0; - foreach (keys %$build_queue) { - # Remove the module from the build queue if there is a dependency emerged - if ((defined $global_deps_hash{$_}) && (scalar keys %{$global_deps_hash{$_}})) { - delete $$build_queue{$_}; - }; - delete $$build_queue{$_} if (!defined $global_deps_hash_backup{$_}) - }; - return; - }; - if (defined $modules_with_errors{$projects_deps_hash{$prj}} && !$ignore) { - push (@broken_modules_names, $prj); - delete $$build_queue{$prj}; - next; - }; - $started_children += build_dependent($projects_deps_hash{$prj}); - if ((!scalar keys %{$projects_deps_hash{$prj}}) && - !$running_children{$projects_deps_hash{$prj}}) { - if (!defined $modules_with_errors{$projects_deps_hash{$prj}} || $ignore) - { - remove_from_dependencies($prj, \%global_deps_hash); - $build_is_finished{$prj}++; - delete $$build_queue{$prj}; - $finished_projects++; - }; - }; - }; - # trigger wait - if (!$started_children) { - if ($finished_projects) { - return; - } else { - handle_dead_children(1); - }; - }; - } while (scalar keys %$build_queue); -}; - -sub run_job { - my ($job, $path, $registered_name) = @_; - my $job_to_do = $job; - my $error_code = 0; - print "$registered_name\n"; - return 0 if ( $show ); - $job_to_do = $deliver_command if ($job eq 'deliver'); - $registered_name = $path if (!defined $registered_name); - chdir $path; - getcwd(); - - my $log_file = $jobs_hash{$registered_name}->{LONG_LOG_PATH}; - my $log_dir = File::Basename::dirname($log_file); - if (!-d $log_dir) { - system("$perl $mkout"); - }; - open (MAKE, "$job_to_do 2>&1 |") or return 8; - open (LOGFILE, "> $log_file") or return 8; - while (<MAKE>) { print LOGFILE $_; print $_ } - close MAKE; - $error_code = $?; - close LOGFILE; - if ( $error_code != 0) - { - system("echo \"log for $path\" >> $build_error_log"); - system("cat $log_file >> $build_error_log"); - } - - return $error_code; -}; - -sub do_custom_job { - my ($module_job, $dependencies_hash) = @_; - $module_job =~ /(\s)/o; - my $module = $`; - my $job = $'; #' - html_store_job_info($dependencies_hash, $module_job); - my $error_code = 0; - if ($job eq $pre_job) { - announce_module($module); - remove_from_dependencies($module_job, $dependencies_hash); - } else { - $error_code = run_job($job, $module_paths{$module}, $module_job); - if ($error_code) { - # give windows one more chance - if ($ENV{GUI_FOR_BUILD} eq 'WNT') { - $error_code = run_job($job, $module_paths{$module}, $module_job); - }; - }; - if ($error_code && $ignore) { - push(@ignored_errors, $module_job); - $error_code = 0; - }; - if ($error_code) { - $modules_with_errors{$dependencies_hash}++; -# $broken_build{$module_job} = $error_code; - } else { - remove_from_dependencies($module_job, $dependencies_hash); - }; - }; - html_store_job_info($dependencies_hash, $module_job, $error_code); - return $error_code; -}; - -# -# Print announcement for module just started -# -sub announce_module { - my $prj = shift; - $build_in_progress{$prj}++; - print_announce($prj); -}; - -sub print_announce { - my $prj = shift; - return if (defined $module_announced{$prj}); - my $prj_type = ''; - $prj_type = $modules_types{$prj} if (defined $modules_types{$prj}); - my $text; - if ($prj_type eq 'lnk') { - if (!defined $active_modules{$prj}) { - $text = "Skipping module $prj\n"; - } else { - $text = "Skipping link to $prj\n"; - }; - $build_is_finished{$prj}++; - } elsif ($prj_type eq 'img') { - $text = "Skipping incomplete $prj\n"; - $build_is_finished{$prj}++; - } elsif ($custom_job) { - $text = "Running custom job \"$custom_job\" in module $prj\n"; - } else { - $text = "Building module $prj\n"; - }; - my $announce_string = $new_line; - $announce_string .= $echo . "=============\n"; - $announce_string .= $echo . $text; - $announce_string .= $echo . "=============\n"; - print $announce_string; - my $total_modules = scalar(keys %build_lists_hash); - my $modules_started = scalar(keys %module_announced) + 1; - zenity_tooltip("($modules_started/$total_modules) $text"); - $module_announced{$prj}++; -}; - -sub zenity_enabled { - return 0 if ($ENV{ENABLE_ZENITY} ne "TRUE"); - return 0 if (!defined $ENV{DISPLAY}); - return 1 if ($ENV{DISPLAY} =~ m/^:/); # local displays only - return 0; -} - -sub zenity_open { - if (zenity_enabled()) { - $SIG{PIPE} = 'IGNORE'; - $zenity_pid = open3($zenity_in, $zenity_out, $zenity_err, - "zenity --notification --listen"); - }; -}; - -sub zenity_close { - if (zenity_enabled()) { - sleep(1); # Give Zenity a chance to show the message. - close($zenity_in); - }; -}; - -sub zenity_icon { - if (zenity_enabled()) { - my $filename = shift; - print $zenity_in "icon: $filename\n"; - }; -}; - -sub zenity_tooltip { - if (zenity_enabled()) { - my $text = shift; - print $zenity_in "tooltip: LibreOffice Build: $text\n"; - }; -}; - -sub zenity_message { - if (zenity_enabled()) { - my $text = shift; - print $zenity_in "message: $text\n"; - }; -}; - -sub are_all_dependent { - my $build_queue = shift; - my $folder = ''; - my $first_candidate = undef; - foreach my $prj (keys %$build_queue) { - $folder = find_indep_prj($projects_deps_hash{$prj}); - $first_candidate = $folder if (!defined $first_candidate); - }; - $folder = $first_candidate; - return '' if ($first_candidate); - return '1'; -}; - - -# -# Procedure defines if the local directory is a -# complete module, an image or a link -# return values: lnk link -# img incomplete (image) -# mod complete (module) -# -sub modules_classify { - my @modules = @_; - foreach my $module (sort @modules) { - if (!defined $module_paths{$module}) { - $modules_types{$module} = 'img'; - next; - }; - if (( $module_paths{$module} =~ /\.lnk$/) || ($module_paths{$module} =~ /\.link$/) - || (!defined $active_modules{$module})) { - $modules_types{$module} = 'lnk'; - next; - }; - $modules_types{$module} = 'mod'; - }; -}; - -# -# Procedure clears up module for incompatible build -# -sub ensure_clear_module { - my $module = shift; - if ($modules_types{$module} eq 'mod') { - clear_module($module); - return; - }; - if ($modules_types{$module} eq 'lnk' && (File::Basename::basename($module_paths{$module}) ne $module)) { - if(rename($module_paths{$module}, File::Basename::dirname($module_paths{$module}) ."/$module")) { - $module_paths{$module} = File::Basename::dirname($module_paths{$module}) ."/$module"; - clear_module($module); - } else { - print_error("Cannot rename link to $module. Please rename it manually"); - }; - }; -}; - -# -# Procedure removes output tree from the module (without common trees) -# -sub clear_module { - my $module = shift; - print "Removing module's $module output trees...\n"; - print "\n" and return if ($show); - opendir DIRHANDLE, $module_paths{$module}; - my @dir_content = readdir(DIRHANDLE); - closedir(DIRHANDLE); - foreach (@dir_content) { - next if (/^\.+$/); - my $dir = correct_path($module_paths{$module}.'/'.$_); - if ((!-d $dir.'/.svn') && is_output_tree($dir)) { - rmtree("$dir", 0, 1); - if (-d $dir) { - system("$remove_command $dir"); - if (-d $dir) { - push(@warnings, "Cannot delete $dir"); - } else { - print STDERR (">>> Removed $dir by force\n"); - }; - }; - }; - }; -}; - -# -# Figure out if the directory is an output tree -# -sub is_output_tree { - my $dir = shift; - $dir =~ /([\w\d\.]+)$/; - $_ = $1; - return '1' if (defined $platforms{$_}); - if ($only_common) { - return '1' if ($_ eq $only_common); - } else { - if (scalar keys %platforms < scalar keys %platforms_to_copy) { - return ''; - }; - return '1' if (/^common$/); - return '1' if (/^common\.pro$/); - }; - return ''; -}; -sub get_tmp_dir { - my $tmp_dir; - if( defined($ENV{TMPDIR}) ) { - $tmp_dir = $ENV{TMPDIR} . '/'; - } elsif( defined($ENV{TMP}) ) { - $tmp_dir = $ENV{TMP} . '/'; - } else { - $tmp_dir = '/tmp/'; - } - $tmp_dir = tempdir ( DIR => $tmp_dir ); - if (!-d $tmp_dir) { - print_error("Cannot create temporary directory for checkout in $tmp_dir") if ($@); - }; - return $tmp_dir; -}; - -sub retrieve_build_list { - my $module = shift; - my $old_fh = select(STDOUT); - - # Try to get global depencies from solver's build.lst if such exists - my $solver_inc_dir = "$ENV{SOLARVER}/$ENV{OUTPATH}"; - $solver_inc_dir .= $ENV{PROEXT} if (defined $ENV{PROEXT}); - $solver_inc_dir .= '/inc'; - $solver_inc_dir .= "/$module"; - $solver_inc_dir = correct_path($solver_inc_dir); - $dead_parents{$module}++; - print "Fetching dependencies for module $module from solver..."; - foreach my $onelist (@possible_build_lists) { - my $build_list_candidate = "$solver_inc_dir/$onelist"; - if (-e $build_list_candidate) { - print " ok\n"; - select($old_fh); - return $build_list_candidate; - }; - } - print(" failed\n"); - print_error("incomplete dependencies!\n"); - return undef; -}; - -sub fix_permissions { - my $file = $File::Find::name; - return unless -f $file; - chmod '0664', $file; -}; - -sub prepare_build_from_with_branches { - my ($full_deps_hash, $reversed_full_deps_hash) = @_; - foreach my $prerequisite (keys %$full_deps_hash) { - foreach my $dependent_module (keys %incompatibles) { - if (defined ${$$reversed_full_deps_hash{$prerequisite}}{$dependent_module}) { - remove_from_dependencies($prerequisite, $full_deps_hash); - delete $$full_deps_hash{$prerequisite}; - last; - }; - }; - }; -}; - -# -# Removes projects which it is not necessary to build -# in incompatible build -# -sub prepare_incompatible_build { - my ($prj, $deps_hash, @missing_modules); - $deps_hash = shift; - foreach my $module (keys %incompatibles) { - if (!defined $$deps_hash{$module}) { - print_error("The module $initial_module is independent from $module\n"); - } - $incompatibles{$module} = $$deps_hash{$module}; - delete $$deps_hash{$module}; - } - while ($prj = pick_prj_to_build($deps_hash)) { - remove_from_dependencies($prj, $deps_hash); - remove_from_dependencies($prj, \%incompatibles); - }; - foreach (keys %incompatibles) { - $$deps_hash{$_} = $incompatibles{$_}; - }; - if ($build_all_cont) { - prepare_build_all_cont($deps_hash); - delete $$deps_hash{$build_all_cont}; - }; - @modules_built = keys %$deps_hash; - %add_to_config = %$deps_hash; - if ($prepare) { - if (!(defined $ENV{UPDATER})) { - $source_config->add_active_modules([keys %add_to_config], 0); - } - clear_delivered(); - } - my $old_output_tree = ''; - foreach $prj (sort keys %$deps_hash) { - if ($prepare) { - ensure_clear_module($prj); - } else { - next if ($show); - if ($modules_types{$prj} ne 'mod') { - push(@missing_modules, $prj); - } elsif (-d $module_paths{$prj}. '/'. $ENV{INPATH}) { - $old_output_tree++; - }; - }; - }; - if (scalar @missing_modules) { - my $warning_string = 'Following modules are inconsistent/missing: ' . "@missing_modules"; - push(@warnings, $warning_string); - }; - if ($build_all_cont) { - $$deps_hash{$build_all_cont} = (); - $build_all_cont = ''; - }; - if ($old_output_tree) { - push(@warnings, 'Some module(s) contain old output tree(s)!'); - }; - if (!$generate_config && scalar @warnings) { - print "WARNING(S):\n"; - print STDERR "$_\n" foreach (@warnings); - print "\nATTENTION: If you are performing an incompatible build, please break the build with Ctrl+C and prepare the workspace with \"--prepare\" switch!\n\n" if (!$prepare); - sleep(5); - }; - if ($prepare) { - print "\nPreparation finished"; - if (scalar @warnings) { - print " with WARNINGS!!\n\n"; - } else {print " successfully\n\n";} - } - do_exit(0) if ($prepare); -}; - -# -# Removes projects which it is not necessary to build -# with --all:prj_name or --since switch -# -sub prepare_build_all_cont { - my ($prj, $deps_hash, $border_prj); - $deps_hash = shift; - $border_prj = $build_all_cont if ($build_all_cont); - $border_prj = $build_since if ($build_since); - while ($prj = pick_prj_to_build($deps_hash)) { - my $orig_prj = ''; - $orig_prj = $` if ($prj =~ /\.lnk$/o); - $orig_prj = $` if ($prj =~ /\.link$/o); - if (($border_prj ne $prj) && - ($border_prj ne $orig_prj)) { - remove_from_dependencies($prj, $deps_hash); - next; - } else { - if ($build_all_cont) { - $$deps_hash{$prj} = (); - } else { - remove_from_dependencies($prj, $deps_hash); - }; - return; - }; - }; -}; - -sub get_modes { - my $option = ''; - while ($option = shift @ARGV) { - if ($option =~ /^-+/) { - unshift(@ARGV, $option); - return; - } else { - if ($option =~ /,/) { - $build_modes{$`}++; - unshift(@ARGV, $') if ($'); - } else {$build_modes{$option}++;}; - }; - }; - $build_modes{$option}++; -}; - -sub get_list_of_modules { - my $option = ''; - my $hash_ref = shift; - while ($option = shift @ARGV) { - if ($option =~ /^-+/) { - unshift(@ARGV, $option); - return; - } else { - if ($option =~ /,/) { - foreach (split /,/, $option) { - next if (!$_); - $$hash_ref{$_}++; - }; - } else { - $$hash_ref{$option}++; - }; - }; - }; -}; - -sub get_modules_passed { - my $hash_ref = shift; - my $option = ''; - while ($option = shift @ARGV) { - if ($option =~ /^-+/) { - unshift(@ARGV, $option); - return; - } else { - if ($option =~ /(:)/) { - $option = $`; - print_error("\'--from\' switch collision") if ($build_all_cont); - $build_all_cont = $'; #' - }; - $$hash_ref{$option}++; - }; - }; -}; - -sub get_platforms { - my $platforms_ref = shift; - if ($only_platform) { - foreach (split(',', $only_platform)) { - $$platforms_ref{$_}++; - } - $platforms_ref = \%platforms_to_copy; - }; - - if (!scalar keys %platforms) { - # An Auses wish - fallback to INPATH for new platforms - if (defined $ENV{INPATH}) { - $$platforms_ref{$ENV{INPATH}}++; - } else { - print_error("There is no platform found!!") ; - }; - }; -}; - -# -# This procedure clears solver from delivered -# by the modules to be build -# -sub clear_delivered { - my $message = 'Clearing up delivered'; - my %backup_vars; - my $deliver_delete_switches = '-delete'; - if (scalar keys %platforms < scalar keys %platforms_to_copy) { - $message .= ' without common trees'; - $deliver_delete_switches .= ' -dontdeletecommon'; - $only_common = ''; - }; - print "$message\n"; - - foreach my $platform (keys %platforms) { - print "\nRemoving files delivered for $platform\n"; - my %solar_vars = (); - read_ssolar_vars($platform, \%solar_vars); - if (scalar keys %solar_vars) { - foreach (keys %solar_vars) { - if (!defined $backup_vars{$_}) { - $backup_vars{$_} = $ENV{$_}; - }; - $ENV{$_} = $solar_vars{$_}; - }; - }; - my $undeliver = "$deliver_command $deliver_delete_switches $nul"; - foreach my $module (sort @modules_built) { - if (chdir($module_paths{$module})) { - print "Removing delivered from module $module\n"; - next if ($show); - if (system($undeliver)) { - $ENV{$_} = $backup_vars{$_} foreach (keys %backup_vars); - print_error("Cannot run: $undeliver"); - } - } else { - push(@warnings, "Could not remove delivered files from the module $module. Your build can become inconsistent.\n"); - }; - }; - }; - $ENV{$_} = $backup_vars{$_} foreach (keys %backup_vars); -}; - -# -# Run setsolar for given platform and -# write all variables needed in %solar_vars hash -# -sub read_ssolar_vars { - my ($setsolar, $tmp_file); - $setsolar = $ENV{ENV_ROOT} . '/etools/setsolar.pl'; - my ($platform, $solar_vars) = @_; - $setsolar = '/net/jumbo2.germany/buildenv/r/etools/setsolar.pl' if ! -e $setsolar; - $tmp_file = $ENV{HOME} . "/.solar.env.$$.tmp"; - if (!-e $setsolar) { - print STDERR "There is no setsolar found. Falling back to current platform settings\n"; - return; - } - my $pro = ""; - if ($platform =~ /\.pro$/) { - $pro = "-pro"; - $platform = $`; - }; - - my ($source_root, $cwsname); - $source_root = '-sourceroot' if (defined $ENV{SOURCE_ROOT_USED}); - - my $param = "-$ENV{WORK_STAMP} $source_root $pro $platform"; - my $ss_command = "$perl $setsolar -file $tmp_file $param $nul"; - if (system($ss_command)) { - unlink $tmp_file; - print_error("Cannot run command:\n$ss_command"); - }; - get_solar_vars($solar_vars, $tmp_file); -}; - -# -# read variables to hash -# -sub get_solar_vars { - my ($solar_vars, $file) = @_; - my ($var, $value); - open SOLARTABLE, "<$file" or die "can't open solarfile $file"; - while(<SOLARTABLE>) { - s/\r\n//o; - next if(!/^\w+\s+(\w+)/o); - next if (!defined $deliver_env{$1}); - $var = $1; - /\'(\S+)\'$/o; - $value = $1; - $$solar_vars{$var} = $value; - }; - close SOLARTABLE; - unlink $file; -} - -# -# Procedure renames <module>.lnk (.link) into <module> -# -sub get_current_module { - my $module_name = shift; - my $link_name = $module_name . '.lnk'; - $link_name .= '.link' if (-e $workspace_path.$module_name . '.link'); - chdir $workspace_path; - getcwd(); - print "\nBreaking link to module $module_name"; - my $result = rename $link_name, $module_name; - if ( ! $result ) { - print_error("Cannot rename $module_name: $!\n"); - } - if ( $initial_module eq $link_name) { - $initial_module = $module_name; - } - chdir $module_name; - getcwd(); -}; - -sub check_dir { - my $start_dir = getcwd(); - my @dir_entries = split(/[\\\/]/, $ENV{PWD}); - my $current_module = $dir_entries[$#dir_entries]; - if (($current_module =~ /(\.lnk)$/) || ($current_module =~ /(\.link)$/)) { - $current_module = $`; - # we're dealing with a link => fallback to SOLARSRC under UNIX - $workspace_path = $ENV{SOLARSRC}.'/'; - get_current_module($current_module); - return; - } else { - chdir $start_dir; - getcwd(); - }; -}; - -# -# Store all available build modi in %build_modes -# -sub get_build_modes { - return if (scalar keys %build_modes); - if (defined $ENV{BUILD_TYPE}) { - if ($ENV{BUILD_TYPE} =~ /\s+/o) { - my @build_modes = split (/\s+/, $ENV{BUILD_TYPE}); - $build_modes{$_}++ foreach (@build_modes); - } else { - $build_modes{$ENV{BUILD_TYPE}}++; - }; - return; - }; -}; - -# -# pick only the modules, that should be built for -# build types from %build_modes -# -sub pick_for_build_type { - my $modules = shift; - my @mod_array = split(/\s+/, $modules); - print_error("Wrongly written dependencies string:\n $modules\n") if ($mod_array[$#mod_array] ne 'NULL'); - pop @mod_array; - my @modules_to_build; - foreach (@mod_array) { - if (/(\w+):(\S+)/o) { - push(@modules_to_build, $2) if (defined $build_modes{$1}); - next; - }; - push(@modules_to_build, $_); - }; - return @modules_to_build; -}; - -sub do_exit { - my $exit_code = shift; - $build_finished++; - generate_html_file(1); - rmtree(correct_path($tmp_dir), 0, 0) if ($tmp_dir); - print STDERR "Cannot delete $tmp_dir. Please remove it manually\n" if (-d $tmp_dir); - exit($exit_code); -}; - -# -# Procedure sorts module in user-frendly order -# -sub sort_modules_appearance { - foreach (keys %dead_parents) { - delete $build_is_finished{$_} if (defined $build_is_finished{$_}); - delete $build_in_progress{$_} if (defined $build_in_progress{$_}); - }; - foreach (keys %build_is_finished) { - delete $build_in_progress{$_} if (defined $build_in_progress{$_}); - delete $build_in_progress_shown{$_} if (defined $build_in_progress_shown{$_}); - }; - my @modules_order = sort keys %modules_with_errors; - foreach (keys %modules_with_errors) { - delete $build_in_progress{$_} if (defined $build_in_progress{$_}); - delete $build_is_finished{$_} if (defined $build_is_finished{$_}); - delete $build_in_progress_shown{$_} if (defined $build_in_progress_shown{$_}); - }; - $build_in_progress_shown{$_}++ foreach (keys %build_in_progress); - push(@modules_order, $_) foreach (sort { $build_in_progress_shown{$b} <=> $build_in_progress_shown{$a} } keys %build_in_progress_shown); - push(@modules_order, $_) foreach (sort keys %build_is_finished); - foreach(sort keys %html_info) { - next if (defined $build_is_finished{$_} || defined $build_in_progress{$_} || defined $modules_with_errors{$_}); - push(@modules_order, $_); - }; - return @modules_order; -}; - -sub generate_html_file { - return if (!$html); - my $force_update = shift; - $force_update++ if ($debug); - my @modules_order = sort_modules_appearance(); - my ($successes_percent, $errors_percent) = get_progress_percentage(scalar keys %html_info, scalar keys %build_is_finished, scalar keys %modules_with_errors); - my $build_duration = get_time_line(time - $build_time); - my $temp_html_file = File::Temp::tmpnam($tmp_dir); - my $title; - $title = $ENV{INPATH}; - die("Cannot open $temp_html_file") if (!open(HTML, ">$temp_html_file")); - print HTML '<html><head>'; - print HTML '<TITLE id=MainTitle>' . $title . '</TITLE>'; - print HTML '<script type="text/javascript">' . "\n"; - print HTML 'initFrames();' . "\n"; - print HTML 'var IntervalID;' . "\n"; - print HTML 'function loadFrame_0() {' . "\n"; - print HTML ' document.write("<html>");' . "\n"; - print HTML ' document.write("<head>");' . "\n"; - print HTML ' document.write("</head>");' . "\n"; - print HTML ' document.write("<body>");' . "\n"; - if ($build_finished) { - print HTML 'document.write("<h3 align=center style=\"color:red\">Build process is finished</h3>");' . "\n"; - print HTML ' top.frames[0].clearInterval(top.frames[0].IntervalID);' . "\n"; - } elsif ($interactive) { - print HTML 'document.write(" <div id=divContext style=\"border: 1px solid; display: none; position: absolute\">");' . "\n"; - print HTML 'document.write(" <ul style=\"margin: 0; padding: 0.3em; list-style-type: none; background-color: lightgrey;\" :li:hover {} :hr {border: 0; border-bottom: 1px solid grey; margin: 3px 0px 3px 0px; width: 10em;} :a {border: 0 !important;} >");' . "\n"; - print HTML 'document.write(" <li><a onmouseover=\"this.style.color=\'red\'\" onmouseout=\"this.style.color=\'black\'\" id=aRebuild href=\"#\">Rebuild module</a></li>");' . "\n"; - print HTML 'document.write(" <li><a onmouseover=\"this.style.color=\'red\'\" onmouseout=\"this.style.color=\'black\'\" id=aDelete href=\"#\" >Remove module</a></li>");' . "\n"; - print HTML 'document.write(" </ul>");' . "\n"; - print HTML 'document.write(" </div>");' . "\n"; - }; - if ($build_all_parents) { - print HTML 'document.write("<table valign=top cellpadding=0 hspace=0 vspace=0 cellspacing=0 border=0>");' . "\n"; - print HTML 'document.write(" <tr>");' . "\n"; - print HTML 'document.write(" <td><a id=ErroneousModules href=\"javascript:top.Error(\'\', \''; - print HTML join('<br>', sort keys %modules_with_errors); - print HTML '\', \'\')\"); title=\"'; - print HTML scalar keys %modules_with_errors; - print HTML ' module(s) with errors\">Total Progress:</a></td>");' . "\n"; - print HTML 'document.write(" <td>");' . "\n"; - print HTML 'document.write(" <table width=100px valign=top cellpadding=0 hspace=0 vspace=0 cellspacing=0 border=0>");' . "\n"; - print HTML 'document.write(" <tr>");' . "\n"; - print HTML 'document.write(" <td height=20px width='; - print HTML $successes_percent + $errors_percent; - if (scalar keys %modules_with_errors) { - print HTML '% bgcolor=red valign=top></td>");' . "\n"; - } else { - print HTML '% bgcolor=#25A528 valign=top></td>");' . "\n"; - }; - print HTML 'document.write(" <td width='; - print HTML 100 - ($successes_percent + $errors_percent); - print HTML '% bgcolor=lightgrey valign=top></td>");' . "\n"; - print HTML 'document.write(" </tr>");' . "\n"; - print HTML 'document.write(" </table>");' . "\n"; - print HTML 'document.write(" </td>");' . "\n"; - print HTML 'document.write(" <td align=right>  Build time: ' . $build_duration .'</td>");' . "\n"; - print HTML 'document.write(" </tr>");' . "\n"; - print HTML 'document.write("</table>");' . "\n"; - }; - - print HTML 'document.write("<table width=100% bgcolor=white>");' . "\n"; - print HTML 'document.write(" <tr>");' . "\n"; - print HTML 'document.write(" <td width=30% align=\"center\"><strong style=\"color:blue\">Module</strong></td>");' . "\n"; - print HTML 'document.write(" <td width=* align=\"center\"><strong style=\"color:blue\">Status</strong></td>");' . "\n"; - print HTML 'document.write(" <td width=15% align=\"center\"><strong style=\"color:blue\">CPU Time</strong></td>");' . "\n"; - print HTML 'document.write(" </tr>");' . "\n"; - - foreach (@modules_order) { - next if ($modules_types{$_} eq 'lnk'); - next if (!defined $active_modules{$_}); - my ($errors_info_line, $dirs_info_line, $errors_number, $successes_percent, $errors_percent, $time) = get_html_info($_); -#<one module> - print HTML 'document.write(" <tr>");' . "\n"; - print HTML 'document.write(" <td width=*>");' . "\n"; - - if (defined $dirs_info_line) { - print HTML 'document.write(" <a id='; - print HTML $_; - print HTML ' href=\"javascript:top.Error(\''; - print HTML $_ , '\', ' ; - print HTML $errors_info_line; - print HTML ','; - print HTML $dirs_info_line; - print HTML ')\"); title=\"'; - print HTML $errors_number; - print HTML ' error(s)\">', $_, '</a>");' . "\n"; - } else { - print HTML 'document.write(" <a target=\'infoframe\' id='; - print HTML $_; - print HTML ' href=\"javascript:void(0)\"; title=\"Remove module\">' . $_ . '</a>");' . "\n"; - }; - - - print HTML 'document.write(" </td>");' . "\n"; - print HTML 'document.write(" <td>");' . "\n"; - print HTML 'document.write(" <table width=100% valign=top cellpadding=0 hspace=0 vspace=0 cellspacing=0 border=0>");' . "\n"; - print HTML 'document.write(" <tr>");' . "\n"; - print HTML 'document.write(" <td height=15* width='; - - print HTML $successes_percent + $errors_percent; - if ($errors_number) { - print HTML '% bgcolor=red valign=top></td>");' . "\n"; - } else { - print HTML '% bgcolor=#25A528 valign=top></td>");' . "\n"; - }; - print HTML 'document.write(" <td width='; - - print HTML 100 - ($successes_percent + $errors_percent); - print HTML '% bgcolor=lightgrey valign=top></td>");' . "\n"; - print HTML 'document.write(" </tr>");' . "\n"; - print HTML 'document.write(" </table>");' . "\n"; - print HTML 'document.write(" </td>");' . "\n"; - print HTML 'document.write(" <td align=\"center\">', $time, '</td>");' . "\n"; - print HTML 'document.write(" </tr>");' . "\n"; -# </one module> - } - print HTML 'document.write(" </table>");' . "\n"; - print HTML 'document.write(" </body>");' . "\n"; - print HTML 'document.write("</html>");' . "\n"; - print HTML 'document.close();' . "\n"; - print HTML 'refreshInfoFrames();' . "\n"; - print HTML '}' . "\n"; - - - if (!$build_finished && $interactive ) { - print HTML 'var _replaceContext = false;' . "\n"; - print HTML 'var _mouseOverContext = false;' . "\n"; - print HTML 'var _noContext = false;' . "\n"; - print HTML 'var _divContext = $(\'divContext\');' . "\n"; - print HTML 'var activeElement = 0;' . "\n"; - print HTML 'function $(id) {return document.getElementById(id);}' . "\n"; - print HTML 'InitContext();' . "\n"; - print HTML 'function InitContext()' . "\n"; - print HTML '{' . "\n"; - print HTML ' $(\'aRebuild\').target = \'infoframe\';' . "\n"; - print HTML ' $(\'aDelete\').target = \'infoframe\';' . "\n"; - print HTML ' $(\'aRebuild\').style.color = \'black\';' . "\n"; - print HTML ' $(\'aDelete\').style.color = \'black\';' . "\n"; - print HTML ' _divContext.onmouseover = function() { _mouseOverContext = true; };' . "\n"; - print HTML ' _divContext.onmouseout = function() { _mouseOverContext = false; };' . "\n"; - print HTML ' _divContext.onclick = function() { _divContext.style.display = \'none\'; };' . "\n"; - print HTML ' document.body.onmousedown = ContextMouseDown;' . "\n"; - print HTML ' document.body.oncontextmenu = ContextShow;' . "\n"; - print HTML '}' . "\n"; - print HTML 'function ContextMouseDown(event) {' . "\n"; - print HTML ' if (_noContext || _mouseOverContext) return;' . "\n"; - print HTML ' if (event == null) event = window.event;' . "\n"; - print HTML ' var target = event.target != null ? event.target : event.srcElement;' . "\n"; - print HTML ' if (event.button == 2 && target.tagName.toLowerCase() == \'a\')' . "\n"; - print HTML ' _replaceContext = true;' . "\n"; - print HTML ' else if (!_mouseOverContext)' . "\n"; - print HTML ' _divContext.style.display = \'none\';' . "\n"; - print HTML '}' . "\n"; - print HTML 'function ContextShow(event) {' . "\n"; - print HTML ' if (_noContext || _mouseOverContext) return;' . "\n"; - print HTML ' if (event == null) event = window.event;' . "\n"; - print HTML ' var target = event.target != null ? event.target : event.srcElement;' . "\n"; - print HTML ' if (_replaceContext) {' . "\n"; - print HTML ' $(\'aRebuild\').href = \'http://'. $local_host_ip .':' . $html_port . '/rebuild=\' + target.id;' . "\n"; - print HTML ' $(\'aDelete\').href = \'http://'. $local_host_ip .':' . $html_port . '/delete=\' + target.id' . "\n"; - print HTML ' var scrollTop = document.body.scrollTop ? document.body.scrollTop : '; - print HTML 'document.documentElement.scrollTop;' . "\n"; - print HTML ' var scrollLeft = document.body.scrollLeft ? document.body.scrollLeft : '; - print HTML 'document.documentElement.scrollLeft;' . "\n"; - print HTML ' _divContext.style.display = \'none\';' . "\n"; - print HTML ' _divContext.style.left = event.clientX + scrollLeft + \'px\';' . "\n"; - print HTML ' _divContext.style.top = event.clientY + scrollTop + \'px\';' . "\n"; - print HTML ' _divContext.style.display = \'block\';' . "\n"; - print HTML ' _replaceContext = false;' . "\n"; - print HTML ' return false;' . "\n"; - print HTML ' }' . "\n"; - print HTML '}' . "\n"; - }; - - print HTML 'function refreshInfoFrames() { ' . "\n"; - print HTML ' var ModuleNameObj = top.innerFrame.frames[2].document.getElementById("ModuleErrors");' . "\n"; - print HTML ' if (ModuleNameObj != null) {' . "\n"; - print HTML ' var ModuleName = ModuleNameObj.getAttribute(\'name\');' . "\n"; - print HTML ' var ModuleHref = top.innerFrame.frames[0].document.getElementById(ModuleName).getAttribute(\'href\');' . "\n"; - print HTML ' eval(ModuleHref);' . "\n"; - print HTML ' } else if (top.innerFrame.frames[2].document.getElementById("ErroneousModules") != null) {' . "\n"; - print HTML ' var ModuleHref = top.innerFrame.frames[0].document.getElementById("ErroneousModules").getAttribute(\'href\');' . "\n"; - print HTML ' eval(ModuleHref);' . "\n"; - print HTML ' if (top.innerFrame.frames[1].document.getElementById("ModuleJobs") != null) {' . "\n"; - print HTML ' var ModuleName = top.innerFrame.frames[1].document.getElementById("ModuleJobs").getAttribute(\'name\');' . "\n"; - print HTML ' ModuleHref = top.innerFrame.frames[0].document.getElementById(ModuleName).getAttribute(\'href\');' . "\n"; - print HTML ' var HrefString = ModuleHref.toString();' . "\n"; - print HTML ' var RefEntries = HrefString.split(",");' . "\n"; - print HTML ' var RefreshParams = new Array();' . "\n"; - print HTML ' for (i = 0; i < RefEntries.length; i++) {' . "\n"; - print HTML ' RefreshParams[i] = RefEntries[i].substring(RefEntries[i].indexOf("\'") + 1, RefEntries[i].lastIndexOf("\'"));' . "\n"; - print HTML ' };' . "\n"; - print HTML ' FillFrame_1(RefreshParams[0], RefreshParams[1], RefreshParams[2]);' . "\n"; - print HTML ' }' . "\n"; - print HTML ' };' . "\n"; - print HTML '}' . "\n"; - print HTML 'function loadFrame_1() {' . "\n"; - print HTML ' document.write("<h3 align=center>Jobs</h3>");' . "\n"; - print HTML ' document.write("Click on the project of interest");' . "\n"; - print HTML ' document.close();' . "\n"; - print HTML '}' . "\n"; - print HTML 'function loadFrame_2() {' . "\n"; - print HTML ' document.write("<tr bgcolor=lightgrey<td><h3>Errors</h3></pre></td></tr>");' . "\n"; - print HTML ' document.write("Click on the project of interest");' . "\n"; - print HTML ' document.close();' . "\n"; - print HTML '} function getStatusInnerHTML(Status) { var StatusInnerHtml;' . "\n"; - print HTML ' if (Status == "success") {' . "\n"; - print HTML ' StatusInnerHtml = "<em style=color:green>";' . "\n"; - print HTML ' } else if (Status == "building") {' . "\n"; - print HTML ' StatusInnerHtml = "<em style=color:blue>";' . "\n"; - print HTML ' } else if (Status == "error") {' . "\n"; - print HTML ' StatusInnerHtml = "<em style=color:red>";' . "\n"; - print HTML ' } else {' . "\n"; - print HTML ' StatusInnerHtml = "<em style=color:gray>";' . "\n"; - print HTML ' };' . "\n"; - print HTML ' StatusInnerHtml += Status + "</em>";' . "\n"; - print HTML ' return StatusInnerHtml;' . "\n"; - print HTML '} ' . "\n"; - print HTML 'function ShowLog(LogFilePath, ModuleJob) {' . "\n"; - print HTML ' top.innerFrame.frames[2].document.write("<h3 id=ModuleErrors name=\"" + null + "\">Log for " + ModuleJob + "</h3>");' . "\n"; - print HTML ' top.innerFrame.frames[2].document.write("<iframe id=LogFile name=Log src="'; - if (defined $html_path) { - print HTML 'file://'; - } - print HTML '+ LogFilePath + " width=100%></iframe>");' . "\n"; - print HTML ' top.innerFrame.frames[2].document.close();' . "\n"; - print HTML '};' . "\n"; - print HTML 'function FillFrame_1(Module, Message1, Message2) {' . "\n"; - print HTML ' var FullUpdate = 1;' . "\n"; - print HTML ' if (top.innerFrame.frames[1].document.getElementById("ModuleJobs") != null) {' . "\n"; - print HTML ' var ModuleName = top.innerFrame.frames[1].document.getElementById("ModuleJobs").getAttribute(\'name\');' . "\n"; - print HTML ' if (Module == ModuleName) FullUpdate = 0;' . "\n"; - print HTML ' }' . "\n"; - print HTML ' if (FullUpdate) {' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write("<h3 align=center>Jobs in module " + Module + ":</h3>");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write("<table id=ModuleJobs name=" + Module + " width=100% bgcolor=white>");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <tr>");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <td width=* align=center><strong style=color:blue>Status</strong></td>");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <td width=* align=center><strong style=color:blue>Job</strong></td>");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <td width=* align=center><strong style=color:blue>Start Time</strong></td>");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <td width=* align=center><strong style=color:blue>Finish Time</strong></td>");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <td width=* align=center><strong style=color:blue>Client</strong></td>");' . "\n" if ($server_mode); - print HTML ' top.innerFrame.frames[1].document.write(" </tr>");' . "\n"; - print HTML ' var dir_info_strings = Message2.split("<br><br>");' . "\n"; - print HTML ' for (i = 0; i < dir_info_strings.length; i++) {' . "\n"; - print HTML ' var dir_info_array = dir_info_strings[i].split("<br>");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <tr status=" + dir_info_array[0] + ">");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <td align=center>");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write( getStatusInnerHTML(dir_info_array[0]) + " ");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" </td>");' . "\n"; - print HTML ' if (dir_info_array[4] == "@") {' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <td style=white-space:nowrap>" + dir_info_array[1] + "</td>");' . "\n"; - print HTML ' } else {' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <td><a href=\"javascript:top.ShowLog(\'" + dir_info_array[4] + "\', \'" + dir_info_array[1] + "\')\"); title=\"Show Log\">" + dir_info_array[1] + "</a></td>");' . "\n"; - print HTML ' };' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <td align=center>" + dir_info_array[2] + "</td>");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <td align=center>" + dir_info_array[3] + "</td>");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <td align=center>" + dir_info_array[5] + "</td>");' . "\n" if ($server_mode); - print HTML ' top.innerFrame.frames[1].document.write(" </tr>");' . "\n"; - print HTML ' };' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write("</table>");' . "\n"; - print HTML ' } else {' . "\n"; - print HTML ' var dir_info_strings = Message2.split("<br><br>");' . "\n"; - print HTML ' var ModuleRows = top.innerFrame.frames[1].document.getElementById("ModuleJobs").rows;' . "\n"; - print HTML ' for (i = 0; i < dir_info_strings.length; i++) {' . "\n"; - print HTML ' var dir_info_array = dir_info_strings[i].split("<br>");' . "\n"; - print HTML ' var OldStatus = ModuleRows[i + 1].getAttribute(\'status\');' . "\n"; - print HTML ' if(dir_info_array[0] != OldStatus) {' . "\n"; - print HTML ' var DirectoryInfos = ModuleRows[i + 1].cells;' . "\n"; - print HTML ' DirectoryInfos[0].innerHTML = getStatusInnerHTML(dir_info_array[0]) + " ";' . "\n"; - print HTML ' if (dir_info_array[4] != "@") {' . "\n"; - print HTML ' DirectoryInfos[1].innerHTML = "<a href=\"javascript:top.ShowLog(\'" + dir_info_array[4] + "\', \'" + dir_info_array[1] + "\')\"); title=\"Show Log\">" + dir_info_array[1] + "</a>";' . "\n"; - print HTML ' };' . "\n"; - print HTML ' DirectoryInfos[2].innerHTML = dir_info_array[2];' . "\n"; - print HTML ' DirectoryInfos[3].innerHTML = dir_info_array[3];' . "\n"; - print HTML ' DirectoryInfos[4].innerHTML = dir_info_array[5];' . "\n" if ($server_mode); - print HTML ' };' . "\n"; - print HTML ' };' . "\n"; - print HTML ' };' . "\n"; - print HTML ' top.innerFrame.frames[1].document.close();' . "\n"; - print HTML '};' . "\n"; - print HTML 'function Error(Module, Message1, Message2) {' . "\n"; - print HTML ' if (Module == \'\') {' . "\n"; - print HTML ' if (Message1 != \'\') {' . "\n"; - print HTML ' var erroneous_modules = Message1.split("<br>");' . "\n"; - print HTML ' var ErrorNumber = erroneous_modules.length;' . "\n"; - - print HTML ' top.innerFrame.frames[2].document.write("<h3 id=ErroneousModules errors=" + erroneous_modules.length + ">Modules with errors:</h3>");' . "\n"; - print HTML ' for (i = 0; i < ErrorNumber; i++) {' . "\n"; - print HTML ' var ModuleObj = top.innerFrame.frames[0].document.getElementById(erroneous_modules[i]);' . "\n"; - print HTML ' top.innerFrame.frames[2].document.write("<a href=\"");' . "\n"; - print HTML ' top.innerFrame.frames[2].document.write(ModuleObj.getAttribute(\'href\'));' . "\n"; - print HTML ' top.innerFrame.frames[2].document.write("\"); title=\"");' . "\n"; - print HTML ' top.innerFrame.frames[2].document.write("\">" + erroneous_modules[i] + "</a>  ");' . "\n"; - print HTML ' };' . "\n"; - print HTML ' top.innerFrame.frames[2].document.close();' . "\n"; - print HTML ' };' . "\n"; - print HTML ' } else {' . "\n"; - print HTML ' var ModuleNameObj = top.innerFrame.frames[2].document.getElementById("ModuleErrors");' . "\n"; - print HTML ' var OldErrors = null;' . "\n"; - print HTML ' var ErrorNumber = Message1.split("<br>").length;' . "\n"; - print HTML ' if ((ModuleNameObj != null) && (Module == ModuleNameObj.getAttribute(\'name\')) ) {' . "\n"; - print HTML ' OldErrors = ModuleNameObj.getAttribute(\'errors\');' . "\n"; - print HTML ' }' . "\n"; - print HTML ' if ((OldErrors == null) || (OldErrors != ErrorNumber)) {' . "\n"; - print HTML ' top.innerFrame.frames[2].document.write("<h3 id=ModuleErrors errors=" + ErrorNumber + " name=\"" + Module + "\">Errors in module " + Module + ":</h3>");' . "\n"; - print HTML ' top.innerFrame.frames[2].document.write(Message1);' . "\n"; - print HTML ' top.innerFrame.frames[2].document.close();' . "\n"; - print HTML ' }' . "\n"; - print HTML ' FillFrame_1(Module, Message1, Message2);' . "\n"; - print HTML ' }' . "\n"; - print HTML '}' . "\n"; - print HTML 'function updateInnerFrame() {' . "\n"; - print HTML ' top.innerFrame.frames[0].document.location.reload();' . "\n"; - print HTML ' refreshInfoFrames();' . "\n"; - print HTML '};' . "\n\n"; - - print HTML 'function setRefreshRate() {' . "\n"; - print HTML ' RefreshRate = document.Formular.rate.value;' . "\n"; - print HTML ' if (!isNaN(RefreshRate * 1)) {' . "\n"; - print HTML ' top.frames[0].clearInterval(IntervalID);' . "\n"; - print HTML ' IntervalID = top.frames[0].setInterval("updateInnerFrame()", RefreshRate * 1000);' . "\n"; - print HTML ' };' . "\n"; - print HTML '};' . "\n"; - - print HTML 'function initFrames() {' . "\n"; - print HTML ' var urlquery = location.href.split("?");' . "\n"; - print HTML ' if (urlquery.length == 1) {' . "\n"; - print HTML ' document.write("<html><head><TITLE id=MainTitle>' . $ENV{INPATH} .'</TITLE>");' . "\n"; - print HTML ' document.write(" <frameset rows=\"12%,88%\">");' . "\n"; - print HTML ' document.write(" <frame name=\"topFrame\" src=\"" + urlquery + "?initTop\"/>");' . "\n"; - print HTML ' document.write(" <frame name=\"innerFrame\" src=\"" + urlquery + "?initInnerPage\"/>");' . "\n"; - print HTML ' document.write(" </frameset>");' . "\n"; - print HTML ' document.write("</head></html>");' . "\n"; - print HTML ' } else if (urlquery[1].substring(0,7) == "initTop") {' . "\n"; - print HTML ' var urlquerycontent = urlquery[1].split("=");' . "\n"; - print HTML ' var UpdateRate = 10' . "\n"; - print HTML ' if (urlquerycontent.length > 2) {' . "\n"; - print HTML ' if (isNaN(urlquerycontent[2] * 1)) {' . "\n"; - print HTML ' alert(urlquerycontent[2] + " is not a number. Ignored.");' . "\n"; - print HTML ' } else {' . "\n"; - print HTML ' UpdateRate = urlquerycontent[2];' . "\n"; - print HTML ' };' . "\n"; - print HTML ' };' . "\n"; - print HTML ' document.write("<html><body>");' . "\n"; - print HTML ' document.write("<h3 align=center>Build process progress status</h3>");' . "\n"; - print HTML ' document.write("<div align=\"right\">");' . "\n"; - print HTML ' document.write(" <table border=\"0\"> <tr>");' . "\n"; - print HTML ' document.write("<td>Refresh rate(sec):</td>");' . "\n"; - print HTML ' document.write("<th>");' . "\n"; - print HTML ' document.write("<FORM name=\"Formular\" onsubmit=\"setRefreshRate()\">");' . "\n"; - print HTML ' document.write("<input type=\"hidden\" name=\"initTop\" value=\"\"/>");' . "\n"; - print HTML ' document.write("<input type=\"text\" id=\"RateValue\" name=\"rate\" autocomplete=\"off\" value=\"" + UpdateRate + "\" size=\"1\"/>");' . "\n"; - print HTML ' document.write("<input type=\"submit\" value=\"OK\">");' . "\n"; - print HTML ' document.write("</FORM>");' . "\n"; - print HTML ' document.write("</th></tr></table>");' . "\n"; - print HTML ' document.write("</div>");' . "\n"; - print HTML ' document.write(" </frameset>");' . "\n"; - print HTML ' document.write("</body></html>");' . "\n"; - print HTML ' top.frames[0].clearInterval(IntervalID);' . "\n"; - print HTML ' IntervalID = top.frames[0].setInterval("updateInnerFrame()", UpdateRate * 1000);' . "\n"; - print HTML ' } else if (urlquery[1] == "initInnerPage") {' . "\n"; - print HTML ' document.write("<html><head>");' . "\n"; - print HTML ' document.write(\' <frameset rows="80%,20%\">\');' . "\n"; - print HTML ' document.write(\' <frameset cols="70%,30%">\');' . "\n"; - print HTML ' document.write(\' <frame src="\');' . "\n"; - print HTML ' document.write(urlquery[0]);' . "\n"; - print HTML ' document.write(\'?initFrame0"/>\');' . "\n"; - print HTML ' document.write(\' <frame src="\');' . "\n"; - print HTML ' document.write(urlquery[0]);' . "\n"; - print HTML ' document.write(\'?initFrame1"/>\');' . "\n"; - print HTML ' document.write(\' </frameset>\');' . "\n"; - print HTML ' document.write(\' <frame src="\');' . "\n"; - print HTML ' document.write(urlquery[0]);' . "\n"; - print HTML ' document.write(\'?initFrame2" name="infoframe"/>\');' . "\n"; - print HTML ' document.write(\' </frameset>\');' . "\n"; - print HTML ' document.write("</head></html>");' . "\n"; - print HTML ' } else {' . "\n"; - print HTML ' if (urlquery[1] == "initFrame0" ) {' . "\n"; - print HTML ' loadFrame_0();' . "\n"; - print HTML ' } else if (urlquery[1] == "initFrame1" ) { ' . "\n"; - print HTML ' loadFrame_1();' . "\n"; - print HTML ' } else if (urlquery[1] == "initFrame2" ) {' . "\n"; - print HTML ' loadFrame_2();' . "\n"; - print HTML ' }' . "\n"; - print HTML ' };' . "\n"; - print HTML '};' . "\n"; - print HTML '</script><noscript>Your browser doesn\'t support JavaScript!</noscript></head></html>' . "\n"; - close HTML; - rename_file($temp_html_file, $html_file); -}; - -sub get_local_time_line { - my $epoch_time = shift; - my $local_time_line; - my @time_array; - if ($epoch_time) { - @time_array = localtime($epoch_time); - $local_time_line = sprintf("%02d:%02d:%02d", $time_array[2], $time_array[1], $time_array[0]); - } else { - $local_time_line = '-'; - }; - return $local_time_line; -}; - -sub get_dirs_info_line { - my $job = shift; - my $dirs_info_line = $jobs_hash{$job}->{STATUS} . '<br>'; - my @time_array; - my $log_path_string; - $dirs_info_line .= $jobs_hash{$job}->{SHORT_NAME} . '<br>'; - $dirs_info_line .= get_local_time_line($jobs_hash{$job}->{START_TIME}) . '<br>'; - $dirs_info_line .= get_local_time_line($jobs_hash{$job}->{FINISH_TIME}) . '<br>'; - if ($jobs_hash{$job}->{STATUS} eq 'waiting' || (!-f $jobs_hash{$job}->{LONG_LOG_PATH})) { - $dirs_info_line .= '@'; - } else { - if (defined $html_path) { - $log_path_string = $jobs_hash{$job}->{LONG_LOG_PATH}; - } else { - $log_path_string = $jobs_hash{$job}->{LOG_PATH}; - }; - $log_path_string =~ s/\\/\//g; - $dirs_info_line .= $log_path_string; - }; - $dirs_info_line .= '<br>'; - $dirs_info_line .= $jobs_hash{$job}->{CLIENT} . '<br>' if ($server_mode); - return $dirs_info_line; -}; - -sub get_html_info { - my $module = shift; - my $module_info_hash = $html_info{$module}; - my $dirs = $$module_info_hash{DIRS}; - my $dirs_number = scalar @$dirs; - my $dirs_info_line = '\''; - if ($dirs_number) { - my %dirs_sorted_by_order = (); - foreach (@$dirs) { - $dirs_sorted_by_order{$jobs_hash{$_}->{BUILD_NUMBER}} = $_; - } - foreach (sort {$a <=> $b} keys %dirs_sorted_by_order) { - $dirs_info_line .= get_dirs_info_line($dirs_sorted_by_order{$_}) . '<br>'; - } - } else { - return(undef, undef, 0, 0, 0, '-'); - }; - $dirs_info_line =~ s/(<br>)*$//o; - $dirs_info_line .= '\''; - $dirs = $$module_info_hash{SUCCESSFUL}; - my $successful_number = scalar @$dirs; - $dirs = $$module_info_hash{ERRORFUL}; - my $errorful_number = scalar @$dirs; - my $errors_info_line = '\''; - if ($errorful_number) { - $errors_info_line .= $_ . '<br>' foreach (@$dirs); - } else { - $errors_info_line .= 'No errors'; - }; - $errors_info_line .= '\''; - my $time_line = get_time_line($$module_info_hash{BUILD_TIME}); - my ($successes_percent, $errors_percent) = get_progress_percentage($dirs_number - 1, $successful_number - 1, $errorful_number); - return($errors_info_line, $dirs_info_line, $errorful_number, $successes_percent, $errors_percent, $time_line); -}; - -sub get_time_line { - use integer; - my $seconds = shift; - my $hours = $seconds/3600; - my $minits = ($seconds/60)%60; - $seconds -= ($hours*3600 + $minits*60); - return(sprintf("%02d\:%02d\:%02d" , $hours, $minits, $seconds)); -}; - -sub get_progress_percentage { - use integer; - my ($dirs_number, $successful_number, $errorful_number) = @_; - return (0 ,0) if (!$dirs_number); - my $errors_percent = ($errorful_number * 100)/ $dirs_number; - my $successes_percent; - if ($dirs_number == ($successful_number + $errorful_number)) { - $successes_percent = 100 - $errors_percent; - } else { - $successes_percent = ($successful_number * 100)/ $dirs_number; - }; - return ($successes_percent, $errors_percent); -}; - -# -# This procedure stores the dmake result in %html_info -# -sub html_store_job_info { - return if (!$html); - my ($deps_hash, $build_dir, $error_code) = @_; - my $force_update = 0; - if ($build_dir =~ /(\s)/o && (defined $error_code)) { - $force_update++ if (!children_number()); - } - my $module = $module_by_hash{$deps_hash}; - my $module_info_hash = $html_info{$module}; - my $dmake_array; - if (defined $error_code) { - $jobs_hash{$build_dir}->{FINISH_TIME} = time(); - $$module_info_hash{BUILD_TIME} += $jobs_hash{$build_dir}->{FINISH_TIME} - $jobs_hash{$build_dir}->{START_TIME}; - if ($error_code) { - $jobs_hash{$build_dir}->{STATUS} = 'error'; - $dmake_array = $$module_info_hash{ERRORFUL}; - $build_dir =~ s/\\/\//g; - $modules_with_errors{$module}++; - } else { - if ($build_dir =~ /(\s)announce/o) { - $jobs_hash{$build_dir}->{STATUS} = '-'; - } else { - $jobs_hash{$build_dir}->{STATUS} = 'success'; - }; - $dmake_array = $$module_info_hash{SUCCESSFUL}; - }; - push (@$dmake_array, $build_dir); - }; -}; - -sub start_server_on_port { - my $port = shift; - my $socket_obj = shift; - $client_timeout = 1 if (!$parent_process); - if ($ENV{GUI_FOR_BUILD} eq 'WNT') { - $$socket_obj = new IO::Socket::INET (#LocalAddr => hostname(), - LocalPort => $port, - Proto => 'tcp', - Listen => 100); # 100 clients can be on queue, I think it is enough - } else { - $$socket_obj = new IO::Socket::INET (#LocalAddr => hostname(), - LocalPort => $port, - Proto => 'tcp', - ReuseAddr => 1, - Listen => 100); # 100 clients can be on queue, I think it is enough - }; - return('Cannot create socket object') if (!defined $$socket_obj); - my $timeout = $$socket_obj->timeout($client_timeout); - $$socket_obj->autoflush(1); - if ($parent_process && $debug) { - print "SERVER started on port $port\n"; - } else { - print "html_port:$html_port html_socket_obj: $html_socket_obj\n"; - }; - return 0; -}; - -sub accept_html_connection { - my $new_socket_obj = undef; - $new_socket_obj = $html_socket_obj->accept(); - return $new_socket_obj; -}; - -sub accept_connection { - my $new_socket_obj = undef; - do { - $new_socket_obj = $server_socket_obj->accept(); - if (!$new_socket_obj) { - print "Timeout on incoming connection\n"; - check_client_jobs(); - }; - } while (!$new_socket_obj); - return $new_socket_obj; -}; - -sub check_client_jobs { - foreach (keys %clients_times) { - if (time - $clients_times{$_} > $client_timeout) { - print "Client's $_ Job: \"$clients_jobs{$_}\" apparently got lost...\n"; - print "Scheduling for rebuild...\n"; - print "You might need to check the $_\n"; - $lost_client_jobs{$clients_jobs{$_}}++; - delete $processes_hash{$_}; - delete $clients_jobs{$_}; - delete $clients_times{$_}; - }; - }; -}; - -sub get_server_ports { - # use port 7890 as default - my $default_port = 7890; - if ($ports_string) { - @server_ports = split( /:/, $ports_string); - } else { - @server_ports = ($default_port .. $default_port + 4); - }; -}; - -sub run_server { - my @build_queue = (); # array, containing queue of projects - # to build - my $error = 0; - if (scalar @server_ports) { - foreach (@server_ports) { - $error = start_server_on_port($_, \$server_socket_obj); - if ($error) { - print STDERR "port $_: $error\n"; - } else { - last; - }; - }; - print_error('Unable to start server on port(s): ' . "@server_ports\n") if ($error); - } else { - print_error('No ports for server to start'); - }; - - my $client_addr; - my $job_string_base = get_job_string_base(); - my $new_socket_obj; - while ($new_socket_obj = accept_connection()) { - check_client_jobs(); - # find out who connected - my $client_ipnum = $new_socket_obj->peerhost(); - my $client_host = gethostbyaddr(inet_aton($client_ipnum), AF_INET); - # print who is connected - # send them a message, close connection - my $client_message = <$new_socket_obj>; - chomp $client_message; - my @client_data = split(/ /, $client_message); - my %client_hash = (); - foreach (@client_data) { - /(=)/; - $client_hash{$`} = $'; #' - } - my $pid = $client_hash{pid} . '@' . $client_host; - if (defined $client_hash{platform}) { - if ($client_hash{platform} ne $ENV{OUTPATH} || (defined $client_hash{osname} && ($^O ne $client_hash{osname}))) { - print $new_socket_obj "Wrong platform"; - close($new_socket_obj); - next; - }; - } else { - if ($client_hash{result} eq "0") { - } else { - print "Error $client_hash{result}\n"; - if (store_error($pid, $client_hash{result})) { - print $new_socket_obj $job_string_base . $clients_jobs{$pid}; - close($new_socket_obj); - $clients_times{$pid} = time; - next; - }; - }; - delete $clients_times{$pid}; - clear_from_child($pid); - delete $clients_jobs{$pid}; - $verbose_mode && print 'Running processes: ', children_number(), "\n"; - # Actually, next 3 strings are only for even distribution - # of clients if there are more than one build server running - print $new_socket_obj 'No job'; - close($new_socket_obj); - next; - }; - my $job_string; - my @lost_jobs = keys %lost_client_jobs; - if (scalar @lost_jobs) { - $job_string = $lost_jobs[0]; - delete $lost_client_jobs{$lost_jobs[0]}; - } else { - $job_string = get_job_string(\@build_queue); - }; - if ($job_string) { - my $job_dir = $job_jobdir{$job_string}; - $processes_hash{$pid} = $job_dir; - $jobs_hash{$job_dir}->{CLIENT} = $pid; - print "$pid got $job_dir\n"; - print $new_socket_obj $job_string_base . $job_string; - $clients_jobs{$pid} = $job_string; - $clients_times{$pid} = time; - my $children_running = children_number(); - $verbose_mode && print 'Running processes: ', $children_running, "\n"; - $maximal_processes = $children_running if ($children_running > $maximal_processes); - } else { - print $new_socket_obj 'No job'; - }; - close($new_socket_obj); - }; -}; - -# -# Procedure returns the part of the job string that is similar for all clients -# -sub get_job_string_base { - if ($setenv_string) { - return "setenv_string=$setenv_string "; - }; - my $job_string_base = "server_pid=$$ setsolar_cmd=$ENV{SETSOLAR_CMD} "; - $job_string_base .= "source_root=$ENV{SOURCE_ROOT} " if (defined $ENV{SOURCE_ROOT}); - $job_string_base .= "updater=$ENV{UPDATER} " if (defined $ENV{UPDATER}); - return $job_string_base; -}; - -sub get_job_string { - my $build_queue = shift; - my $job = $dmake; - my ($job_dir, $dependencies_hash); - if ($build_all_parents) { - fill_modules_queue($build_queue); - do { - ($job_dir, $dependencies_hash) = pick_jobdir($build_queue); - return '' if (!$job_dir); - $jobs_hash{$job_dir}->{START_TIME} = time(); - $jobs_hash{$job_dir}->{STATUS} = 'building'; - if ($job_dir =~ /(\s)$pre_job/o) { - do_custom_job($job_dir, $dependencies_hash); - $job_dir = ''; - }; - } while (!$job_dir); - } else { - $dependencies_hash = \%local_deps_hash; - do { - $job_dir = pick_prj_to_build(\%local_deps_hash); - if (!$job_dir && !children_number()) { - cancel_build() if (scalar keys %broken_build); - mp_success_exit(); - }; - return '' if (!$job_dir); - $jobs_hash{$job_dir}->{START_TIME} = time(); - $jobs_hash{$job_dir}->{STATUS} = 'building'; - if ($job_dir =~ /(\s)$pre_job/o) { - do_custom_job($job_dir, $dependencies_hash); - $job_dir = ''; - }; - } while (!$job_dir); - }; - $running_children{$dependencies_hash}++; - $folders_hashes{$job_dir} = $dependencies_hash; - my $log_file = $jobs_hash{$job_dir}->{LONG_LOG_PATH}; - my $full_job_dir = $job_dir; - if ($job_dir =~ /(\s)/o) { - $job = $'; #' - print $echo . "determine if we need to deliver $job_dir\n"; - if ($job eq $post_job) { - if( $is_gbuild{$job_dir} ) { - print "Skip deliver for gmake-built module $job_dir\n"; - return''; - }; - $job = $deliver_command - }; - $full_job_dir = $module_paths{$`}; - } - my $log_dir = File::Basename::dirname($log_file); - if (!-d $log_dir) { - chdir $full_job_dir; - getcwd(); - system("$perl $mkout"); - }; - my $job_string = "job_dir=$full_job_dir job=$job log=$log_file"; - $job_jobdir{$job_string} = $job_dir; - return $job_string; -}; - -sub pick_jobdir { - my $build_queue = shift; - my $i = 0; - foreach (@$build_queue) { - my $prj = $$build_queue[$i]; - my $prj_deps_hash = $projects_deps_hash{$prj}; - if (defined $modules_with_errors{$prj_deps_hash} && !$ignore) { - push (@broken_modules_names, $prj); - splice (@$build_queue, $i, 1); - next; - }; - $running_children{$prj_deps_hash} = 0 if (!defined $running_children{$prj_deps_hash}); - my $child_nick = pick_prj_to_build($prj_deps_hash); - if ($child_nick) { - return ($child_nick, $prj_deps_hash); - } - if ((!scalar keys %$prj_deps_hash) && !$running_children{$prj_deps_hash}) { - if (!defined $modules_with_errors{$prj_deps_hash} || $ignore) - { - remove_from_dependencies($prj, \%global_deps_hash); - $build_is_finished{$prj}++; - splice (@$build_queue, $i, 1); - next; - }; - }; - $i++; - }; -}; - -sub fill_modules_queue { - my $build_queue = shift; - my $prj; - while ($prj = pick_prj_to_build(\%global_deps_hash)) { - push @$build_queue, $prj; - $projects_deps_hash{$prj} = {}; - get_module_dep_hash($prj, $projects_deps_hash{$prj}); - my $info_hash = $html_info{$prj}; - $$info_hash{DIRS} = check_deps_hash($projects_deps_hash{$prj}, $prj); - $module_by_hash{$projects_deps_hash{$prj}} = $prj; - }; - if (!$prj && !children_number() && (!scalar @$build_queue)) { - cancel_build() if (scalar keys %broken_build); - mp_success_exit(); - }; -}; - -sub is_gnumake_module { - my $module = shift; - my $bridgemakefile = $source_config->get_module_path($module) . "/prj/makefile.mk"; - return (-e $bridgemakefile); -} - -sub check_partial_gnumake_build { - if(!$build_all_parents && is_gnumake_module(shift)) { - print "This module has been migrated to GNU make.\n"; - print "You can only use build --all/--since here with build.pl.\n"; - print "To do the equivalent of 'build && deliver' call:\n"; - print "\t$ENV{GNUMAKE} -r\n"; - print "in the module root.\n"; - exit 1; - } -} diff --git a/solenv/bin/build_client.pl b/solenv/bin/build_client.pl deleted file mode 100755 index cd97795d0..000000000 --- a/solenv/bin/build_client.pl +++ /dev/null @@ -1,436 +0,0 @@ -: -eval 'exec perl -S $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* -# -# build_client - client for the build tool in server mode -# - -use strict; -use Socket; -use Sys::Hostname; -use File::Temp qw(tmpnam); -use POSIX; -use Cwd qw (cwd); - -$SIG{KILL} = \&handle_temp_files; -$SIG{INT} = \&handle_temp_files; - -### main ### -my $enable_multiprocessing = 1; -my $server_list_file; -my $server_list_time_stamp = 0; -my %ENV_BACKUP; -$ENV_BACKUP{$_} = $ENV{$_} foreach (keys %ENV); - -if ($^O eq 'MSWin32') { - eval { require Win32::Process; import Win32::Process; }; - $enable_multiprocessing = 0 if ($@); -} else { - use Cwd 'chdir'; -}; -my $processes_to_run = 1; - -my %hosts_ports = (); -my $default_port = 7890; -my @ARGV_COPY = @ARGV; # @ARGV BACKUP -print "arguments: @ARGV\n"; -get_options(); - -my $proto = getprotobyname('tcp'); -my $paddr; -my $host = hostname(); -my $current_server = ''; -my $got_job = 0; -my %job_temp_files = (); -my %environments = (); # hash containing all environments -my $env_alias; -my %platform_rejects = (); # hash containing paddr of server, that replied "Wrong platform" - -my $child = 0; -if ($processes_to_run > 1) { - my $started_processes = 1; - if ($^O eq 'MSWin32') { - my $process_obj = undef; - my $child_args = "perl $0"; - foreach (@ARGV_COPY) { - /^-P(\d+)$/ and next; - /^-P$/ and shift @ARGV_COPY and next; - $child_args .= " $_"; - }; - do { - my $rc = Win32::Process::Create($process_obj, $^X, - $child_args, - 0, 0, #NORMAL_PRIORITY_CLASS, - "."); - print_error("Cannot start child process") if (!$rc); - $started_processes++; - } while ($started_processes < $processes_to_run); - } else { - my $pid; - do { - if ($pid = fork) { # parent - $started_processes++; - print $started_processes . "\n"; - } elsif (defined $pid) { # child - $child++; - }; - } while (($started_processes < $processes_to_run) && !$child); - }; -}; - -run_client(); -### end of main procedure ### - -######################### -# # -# Procedures # -# # -######################### -sub handle_temp_files { - print STDERR "Got signal - clearing up...\n"; - foreach (keys %job_temp_files) { - if ($job_temp_files{$_}) { - rename($_, $job_temp_files{$_}) or system("mv", $_, $job_temp_files{$_}); - print STDERR "Could not rename $_ to $job_temp_files{$_}\n" if (-e $_); - } else { - unlink $_ or system("rm -rf $_"); - print STDERR "Could not remove $_\n" if (-e $_); - }; - }; - exit($?); -}; - -sub run_client { -# initialize host and port - if (!scalar keys %hosts_ports) { - $hosts_ports{localhost} = $default_port; - } - - print "Started client with PID $$, hostname $host\n"; - - my $message = ''; - my $current_port = ''; - my %active_servers = (); - - do { - $got_job = 0; - foreach $current_server (keys %hosts_ports) { - foreach $current_port (keys %{$hosts_ports{$current_server}}) { - - #before each "inactive" server/port connect - connect to each "active" server/port - next if (defined ${$active_servers{$current_server}}{$current_port}); - # "active" cycle - foreach my $active_server (keys %active_servers) { - foreach my $active_port (keys %{$active_servers{$active_server}}) { - my $iaddr = inet_aton($active_server); - $paddr = sockaddr_in($active_port, $iaddr); - do { - my $server_is_active = 0; - $message = request_job($message, $active_server, $active_port); - $server_is_active++ if ($message); - if (!$server_is_active) { - delete ${$active_servers{$active_server}}{$active_port}; - # throw away obsolete environments - foreach (keys %environments) { - /^\d+@/; - if ($' eq "$active_server:$active_port") { - delete $environments{$_}; - }; - }; - }; - $message = '' if ($message eq 'No job'); - } while ($message); - }; - }; - - # "inactive" cycle - my $iaddr = inet_aton($current_server); - $paddr = sockaddr_in($current_port, $iaddr); - do { - $message = request_job($message, $current_server, $current_port); - if ($message) { - if (!defined $active_servers{$current_server}) { - my %ports; - $active_servers{$current_server} = \%ports; - }; - ${$active_servers{$current_server}}{$current_port}++; - }; - $message = '' if ($message eq 'No job'); - } while ($message); - }; - }; - sleep 5 if (!$got_job); - read_server_list(); - } while(1); -}; - -sub usage { - my $error = shift; - print STDERR "\nbuild_client\n"; - print STDERR "Syntax: build_client [-PN] host1[:port1:...:portN] [host2[:port1:...:portN] ... hostN[:port1:...:portN]]|\@server_list_file\n"; - print STDERR " -P - start multiprocessing build, with number of processes passed\n"; - print STDERR "Example1: build_client myserver1 myserver2:7891:7892\n"; - print STDERR " the client will be asking for jobs on myserver1's default ports (7890-7894)\n"; - print STDERR " and on myserver2's ports 7891 and 7892\n"; - print STDERR "Example2: build_client -P2 myserver1:7990 myserver2\n"; - print STDERR " start 2 clients which will be asking for jobs myserver1's port 7990\n"; - print STDERR " and myserver2's default ports (7890-7894)\n"; - exit ($error); -}; - -sub get_options { - my $arg; - usage(1) if (!scalar @ARGV); - while ($arg = shift @ARGV) { - usage(0) if /^--help$/; - usage(0) if /^-h$/; - $arg =~ /^-P(\d+)$/ and $processes_to_run = $1 and next; - $arg =~ /^-P$/ and $processes_to_run = shift @ARGV and next; - $arg =~ /^@(\S+)$/ and $server_list_file = $1 and next; - store_server($arg); - }; - if (($processes_to_run > 1) && (!$enable_multiprocessing)) { - print_error("Cannot load Win32::Process module for multiple client start"); - }; - if ($server_list_file) { - print_error("$server_list_file is not a regular file!!") if (!-f $server_list_file); - read_server_list(); - } - print_error("No server info") if (!scalar %hosts_ports); -}; - -sub store_server { - my $server_string = shift; - my @server_params = (); - @server_params = split (/:/, $server_string); - my $host = shift @server_params; - my @names = gethostbyname($host); - my $host_full_name = $names[0]; - my %ports = (); - if (defined $hosts_ports{$host_full_name}) { - %ports = %{$hosts_ports{$host_full_name}}; - }; - # To do: implement keys in form server:port -> priority - if (defined $hosts_ports{$host_full_name}) { - if (!$server_list_time_stamp) { - print "The $host with ip address " . inet_ntoa(inet_aton($host)) . " is at least two times in the server list\n"; - }; - } else { - print "Added server $host as $host_full_name\n"; - }; - if (scalar @server_params) { - $ports{$_}++ foreach (@server_params); - } else { - $ports{$_}++ foreach ($default_port .. $default_port + 4); - }; - $hosts_ports{$host_full_name} = \%ports; -}; - -sub read_server_list { - open(SERVER_LIST, "<$server_list_file") or return; - my $current_time_stamp = (stat($server_list_file))[9]; - return if ($server_list_time_stamp >= $current_time_stamp); - my @server_array = (); - foreach my $file_string(<SERVER_LIST>) { - while ($file_string =~ /(\S+)/) { - $file_string = $'; - store_server($1); - }; - }; - close SERVER_LIST; - $server_list_time_stamp = $current_time_stamp; -}; - -sub request_job { - my ($message, $current_server, $current_port) = @_; - $message = "platform=$ENV_BACKUP{OUTPATH} pid=$$ osname=$^O" if (!$message); - # create the socket, connect to the port - socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "socket: $!"; - connect(SOCKET, $paddr) or return ''; - my $error_code = 1; - $message .= "\n"; - syswrite SOCKET, $message, length $message; - while (my $line = <SOCKET>) { - chomp $line; - if ($line eq 'No job') { - close SOCKET or die "close: $!"; - return $line; - }; - if ($line eq "Wrong platform") { - if (!defined $platform_rejects{$paddr}) { - $platform_rejects{$paddr}++; - print STDERR $line . "\n"; - } - close SOCKET or die "close: $!"; - delete $hosts_ports{$current_server}; - return ''; - } elsif (defined $platform_rejects{$paddr}) { - delete $platform_rejects{$paddr}; - }; - $got_job++; - $error_code = do_job($line . " server=$current_server port=$current_port"); - } - close SOCKET or die "close: $!"; - return("result=$error_code pid=$$"); -} - -sub do_job { - my @job_parameters = split(/ /, shift); - my %job_hash = (); - my $last_param; - my $error_code; - print "Client $$@" . "$host\n"; - foreach (@job_parameters) { - if (/(=)/) { - $job_hash{$`} = $'; - $last_param = $`; - } else { - $job_hash{$last_param} .= " $_"; - }; - }; - $env_alias = $job_hash{server_pid} . '@' . $job_hash{server} . ':' . $job_hash{port}; - my $result = "1"; # default value - my $cmd_file = File::Temp::tmpnam($ENV_BACKUP{TMP}); - my $tmp_log_file = File::Temp::tmpnam($ENV_BACKUP{TMP}); - $job_temp_files{$tmp_log_file} = $job_hash{log}; - my $setenv_string = ''; - if (defined $job_hash{setenv_string}) { - # use configuration string from server - $setenv_string .= $job_hash{setenv_string}; - print "Environment: $setenv_string\n"; - - my $directory = $job_hash{job_dir}; - open (COMMAND_FILE, ">$cmd_file"); - print COMMAND_FILE "$setenv_string\n"; - if (!defined $job_hash{job_dir}) { - close COMMAND_FILE; - print "No job_dir, cmd file: $cmd_file\n"; - foreach (keys %job_hash) { - print "key: $_ $job_hash{$_}\n"; - }; - exit (1); - }; - - print COMMAND_FILE "pushd $job_hash{job_dir} && "; - print COMMAND_FILE $job_hash{job} ." >& $tmp_log_file\n"; - print COMMAND_FILE "exit \$?\n"; - close COMMAND_FILE; - $job_temp_files{$cmd_file} = 0; - $job_temp_files{$tmp_log_file} = $job_hash{log}; - $error_code = system($ENV{SHELL}, $cmd_file); - unlink $cmd_file or system("rm -rf $cmd_file"); - delete $job_temp_files{$cmd_file}; - } else { - # generate setsolar string - if (!defined $environments{$env_alias}) { - $error_code = get_setsolar_environment(\%job_hash); - return($error_code) if ($error_code); - }; - my $solar_vars = $environments{$env_alias}; - - delete $ENV{$_} foreach (keys %ENV); - $ENV{$_} = $$solar_vars{$_} foreach (keys %$solar_vars); - print 'Workspace: '; - print $ENV{SOLARSRC}; - - print "\nplatform: $ENV{INPATH} $^O"; - print "\ndir: $job_hash{job_dir}\n"; - print "job: $job_hash{job}\n"; - chdir $job_hash{job_dir}; - getcwd(); - my $job_string = $job_hash{job} . ' > ' . $tmp_log_file . ' 2>&1'; - $error_code = system($job_string); - }; - rename($tmp_log_file, $job_hash{log}) or system("mv", $tmp_log_file, $job_hash{log}); - delete $job_temp_files{$tmp_log_file}; - - if ($error_code) { - print "Error code = $error_code\n\n"; - } else { - print "Success!!\n\n"; - }; - return $error_code; -}; - -sub get_setsolar_environment { - my $job_hash = shift; - my $server_pid = $$job_hash{server_pid}; - my $setsolar_string = $$job_hash{setsolar_cmd}; - # Prepare the string for the client - $setsolar_string =~ s/\s-file\s\S+//g; - my $error_code = 0; - my $cmd_file = File::Temp::tmpnam($ENV_BACKUP{TMP}); - my $tmp_log_file = File::Temp::tmpnam($ENV_BACKUP{TMP}); - if (defined $$job_hash{updater}) { - $ENV{UPDATER} = $$job_hash{updater}; - } else { - undef $ENV{UPDATER} if (defined $ENV{UPDATER}); - }; - if (defined $$job_hash{source_root}) { - $ENV{SOURCE_ROOT} = $$job_hash{source_root}; - } else { - undef $ENV{SOURCE_ROOT} if (defined $ENV{SOURCE_ROOT}); - }; - $error_code = system("$setsolar_string -file $cmd_file"); - store_env_hash($cmd_file); - return $error_code; -}; - -sub print_error { - my $message = shift; - print STDERR "\nERROR: $message\n"; - exit(1); -}; -sub store_env_hash { - my $ss_setenv_file = shift; - my %solar_vars = (); - my $cmd_file = File::Temp::tmpnam($ENV_BACKUP{TMP}); - my $env_vars_file = File::Temp::tmpnam($ENV_BACKUP{TMP}); - print "$cmd_file $env_vars_file\n"; - #get all env variables in $env_vars_file - open (COMMAND_FILE, ">$cmd_file"); - print COMMAND_FILE "source $ss_setenv_file\n"; - print COMMAND_FILE "env > $env_vars_file\n"; - close COMMAND_FILE; - system($ENV{SHELL}, $cmd_file); - print_error($?) if ($?); - unlink $cmd_file or system("rm -rf $cmd_file"); - unlink $ss_setenv_file or system("rm -rf $ss_setenv_file"); - - open SOLARTABLE, "<$env_vars_file" or die "can´t open solarfile $env_vars_file"; - while(<SOLARTABLE>) { - chomp; - s/\r\n//o; - /(=)/; - $solar_vars{$`} = $'; - }; - close SOLARTABLE; - unlink $env_vars_file or system("rm -rf $env_vars_file"); - $environments{$env_alias} = \%solar_vars; -}; diff --git a/solenv/bin/buildalyzer b/solenv/bin/buildalyzer deleted file mode 100644 index 8b278e66b..000000000 --- a/solenv/bin/buildalyzer +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env python -import sys -import os - -class CxxTarget: - def __init__(self, line): - self.directory = '' - self.outputfile = '' - self.includeflags = [] - self.cxxflags = [] - self.inputfiles = [] - self.nolink = False - options = line[:-1].split(' ') - self.directory = options.pop(0) - parsing_outputfile = False - for option in options: - if parsing_outputfile: - self.outputfile = option - parsing_outputfile = False - elif option == '-o': - parsing_outputfile = True - elif option == '-c': - self.nolink = True - elif option.startswith('-I'): - self.includeflags.append(CxxFlag(option)) - elif option.startswith('-'): - self.cxxflags.append(CxxFlag(option)) - else: - self.inputfiles.append(option) - self.cxxflags.sort() - self.includeflags.sort() - cxxflags_tmp = dict() - for flag in self.cxxflags: - cxxflags_tmp[flag.name] = flag - self.cxxflags = cxxflags_tmp.values() - includeflags_tmp = dict() - for flag in self.includeflags: - includeflags_tmp[flag.name] = flag - self.includeflags = includeflags_tmp.values() - CxxTargets.by_name[self.getFullOutputname()] = self - def __str__(self): - return '%s' % (self.getFullOutputname()) - def getFullOutputname(self): - return self.directory + '/' + self.outputfile - def __cmp__(self, other): - return cmp(self.getFullOutputname(), other.getFullOutputname()) - -class CxxFlag: - def __init__(self, name): - self.name = name - CxxFlags.by_name[self.name] = self - def __str__(self): - return 'Flag %s' % (self.name) - def __cmp__(self, other): - return cmp(self.name, other.name) - -class CxxFlags: - by_name = dict() - -class CxxTargets: - by_name = dict() - -if __name__ == '__main__': - [CxxTarget(line) for line in sys.stdin.readlines()] - compile_targets = [target for target in CxxTargets.by_name.values() if target.nolink] - link_targets = [target for target in CxxTargets.by_name.values() if not target.nolink] - common_compile_flags = [] - for flag in CxxFlags.by_name.values(): - if sum((flag in target.cxxflags for target in compile_targets)) == len(compile_targets): - common_compile_flags.append(flag) - common_link_flags = [] - for flag in CxxFlags.by_name.values(): - if sum((flag in target.cxxflags for target in compile_targets)) == len(compile_targets): - common_link_flags.append(flag) - - for target in compile_targets: - target.cxxflags = [flag for flag in target.cxxflags if flag not in common_compile_flags] - target.cxxflags.sort() - for target in link_targets: - target.cxxflags = [flag for flag in target.cxxflags if flag not in common_link_flags] - target.cxxflags.sort() - - common_compile_flags.sort() - common_link_flags.sort() - print 'common compile flags: %s' % (' '.join(flag.name for flag in common_compile_flags)) - print 'common link flags: %s' % (' '.join(flag.name for flag in common_link_flags)) - - by_flagset = dict() - for target in CxxTargets.by_name.values(): - flagset = ' '.join((flag.name for flag in target.cxxflags)) - if flagset not in by_flagset: - by_flagset[flagset] = list() - by_flagset[flagset].append(target) - for targetlist in by_flagset.values(): - targetlist.sort() - flagsets = by_flagset.keys() - flagsets.sort() - print '%d compilerflag groups:' % (len(flagsets)) - for flagset in flagsets: - print flagset - for target in by_flagset[flagset]: - print '%s' % (target) - print - - by_flagset = dict() - for target in CxxTargets.by_name.values(): - flagset = ' '.join((flag.name for flag in target.includeflags)) - if flagset not in by_flagset: - by_flagset[flagset] = list() - by_flagset[flagset].append(target) - for targetlist in by_flagset.values(): - targetlist.sort() - flagsets = by_flagset.keys() - flagsets.sort() - print '%d include flag groups:' % (len(flagsets)) - for flagset in flagsets: - print flagset - for target in by_flagset[flagset]: - print '%s' % (target) - print - - print 'sources:' - by_name = dict() - for target in CxxTargets.by_name.values(): - by_name[os.path.basename(target.outputfile)] = target - names = by_name.keys() - names.sort() - for target in CxxTargets.by_name.values(): - if len(target.inputfiles) > 1: - objects = [os.path.basename(object) for object in target.inputfiles] - sources = list() - for object in objects: - if object in by_name: - sources.append(by_name[object].inputfiles[0]) - else: - sources.append('!!!!' + object) - sources.sort() - print '%s %s' % (target.getFullOutputname(), ' '.join(sources)) diff --git a/solenv/bin/checkdll.sh b/solenv/bin/checkdll.sh deleted file mode 100755 index 1cdf498c3..000000000 --- a/solenv/bin/checkdll.sh +++ /dev/null @@ -1,96 +0,0 @@ -#! /bin/sh -#************************************************************************* -# -# 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. -# -#************************************************************************* -# checkdll.sh - execute checkdll with all -L arguments to this script -# prepended to LD_LIBRARY_PATH - -set -- `getopt "L:" "$@"` || { - echo "Usage: `basename $0` [-L library_path] <shared_library>" 1>&2 - exit 1 -} - -checkdll="$SOLARVERSION/$INPATH/bin/checkdll" - -if [ -x $checkdll ]; then - while : - do - case $1 in - -L) shift; option=$1;; - --) break;; - esac - case "${libpath:+X}" in - X) libpath=$libpath:$option;; - *) libpath=$option;; - esac - shift - done - shift # remove the trailing --- - - case `uname -s` in - Darwin) case "${DYLD_LIBRARY_PATH:+X}" in - X) DYLD_LIBRARY_PATH=$libpath:$DYLD_LIBRARY_PATH;; - *) DYLD_LIBRARY_PATH=$libpath;; - esac - export DYLD_LIBRARY_PATH;; - AIX) case "${LIBPATH:+X}" in - X) LIBPATH=$libpath:$LIBPATH;; - *) LIBPATH=$libpath;; - esac - export LIBPATH;; - *) case "${LD_LIBRARY_PATH:+X}" in - X) LD_LIBRARY_PATH=$libpath:$LD_LIBRARY_PATH;; - *) LD_LIBRARY_PATH=$libpath;; - esac - export LD_LIBRARY_PATH;; - esac - - $checkdll "$@" - if [ $? -ne 0 ]; then exit 1 ; fi - - for parameter in $*; do - library=$parameter; - done - realname=`echo $library | sed "s/check_//"` - if [ $library != $realname ]; then - LD_LIBRARY_PATH= - export LD_LIBRARY_PATH - mv $library $realname - fi -else - echo "WARNING: checkdll not found!" 1>&2 - - for parameter in $*; do - library=$parameter; - done - realname=`echo $library | sed "s/check_//"` - if [ $library != $realname ]; then - mv $library $realname - fi -fi - -exit 0 - diff --git a/solenv/bin/chrel.sed b/solenv/bin/chrel.sed deleted file mode 100644 index 19455b00c..000000000 --- a/solenv/bin/chrel.sed +++ /dev/null @@ -1,2 +0,0 @@ -s/\(\.\.\/\)\{2,4\}/..\//g -s/\(\.\.\\\)\{2,4\}/..\\/g diff --git a/solenv/bin/cleandiff.pl b/solenv/bin/cleandiff.pl deleted file mode 100644 index 892ea1e65..000000000 --- a/solenv/bin/cleandiff.pl +++ /dev/null @@ -1,45 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - -while (<>) -{ - next if /^Only in/ ; - next if /^diff -rc / ; - next if /^diff -ru / ; - next if /^Common sub/ ; - - if ( /^---/ || /^\*\*\*/ || /^\+\+\+/ ) - { - s/\\/\//g; - } - - print ; -} - diff --git a/solenv/bin/cleanzip.pl b/solenv/bin/cleanzip.pl deleted file mode 100755 index 683edaec4..000000000 --- a/solenv/bin/cleanzip.pl +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/perl -w -#************************************************************************* -# -# 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. -# -#************************************************************************* - -sub usage -{ - print "Cleanup unwanted unix attributes in zip archives\n\n"; - print "Usage:\n"; - print "$0 archive\n\n"; - exit(1); -} - -usage() if ! defined $ARGV[0]; - -my $filename = $ARGV[0]; -use Archive::Zip qw(:ERROR_CODES :CONSTANTS); -my $zip = Archive::Zip->new(); - -unless ( $zip->read( $filename ) == AZ_OK ) { - die "$0: ERROR reading $filename\n"; -} -my @members = $zip ->members(); - -foreach my $member ( @members ) { - my $attribs = $member->unixFileAttributes(); - if ( $member->isDirectory ) { - $attribs = $attribs & 0b101111111111; - $member->unixFileAttributes($attribs) - } -} -unless ( $zip->writeToFileNamed( ${filename}."_new" ) == AZ_OK ) { - die "$0: ERROR reading ${filename}_new\n"; -} -rename($filename."_new", $filename); - diff --git a/solenv/bin/clipatchconfig.pl b/solenv/bin/clipatchconfig.pl deleted file mode 100644 index a84565742..000000000 --- a/solenv/bin/clipatchconfig.pl +++ /dev/null @@ -1,131 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -use warnings; -use strict; - -sub trim; -sub readRedirectionValues($); - -my $usage = - "Usage is: \n clipatchconfig.pl configTemplate redirections policyConfig - - configTemplate: The config file which is used for the policy assembly. It - contains place holders for the binding redirection. - - redirections: file containing the values for oldVersion and newVersion tags - which are used in the BindingRedirect element of the config files. - - policyConfig: Name of the file in which we want to write the config file. -"; - - -if (scalar @ARGV < 3) { - print $usage; - exit -1; -} - - -my %redirectionValue = readRedirectionValues($ARGV[1]); - - -#Read config file in which we will replace the versions -$/ = undef; -open TEMPLATE, $ARGV[0] or die $!; -my $templ = <TEMPLATE>; - -#Open the config file we are goint to write to -open CONFIG, "> $ARGV[2]" or die "Cannot write to $ARGV[2] $!"; - -#No substitute the place holders for oldVersion and new Version in the config template with -#the values obtained from the redirections file -for (keys %redirectionValue) { - $templ=~ s/\b$_\b/$redirectionValue{$_}/; -} -#Write the config file -print CONFIG $templ; - -#Reads the key value pairs from the files, which name must be passed in -#the parameter. The file contains lines of the form name=value, for example -#CLI_URETYPES_OLD_VERSION=1.1.0.0-1.1.1.0 -sub readRedirectionValues($) -{ - #Read in the values for the version redirection - open REDIR, $_[0] or die $!; - - my %redirectionValues; - - while (<REDIR>) - { - chomp; - my $trimmed; - #Skip empty lines - if (length($trimmed = trim($_)) == 0) { - next; - } - - #Skip comment symbol: # - if ($trimmed =~ /^#/) { - next; - } - - my @lineParts = split /=/,$_; - - #Check if we have valid name value pairs. - if (scalar @lineParts != 2) { - print "Error: Values in $ARGV[1] are not correct (Entries must have the form name=value). Invalid line: \n$_\n"; - exit -1; - } - - #Trim the strings and check if they still contain characters - my $name = trim($lineParts[0]); - my $value = trim($lineParts[1]); - if (length($name) == 0 || length($value) == 0) { - print "Error: Values in $ARGV[1] are not correct. Invalid line: \n$_\n"; - exit -1; - } - - #Check if we have duplicate key names - for (keys %redirectionValues) { - if ( $name eq $_) { - print "Error: Values in $ARGV[1] are not correct. The name $_ is not unique.\n"; - exit -1; - } - } - - $redirectionValues{$name} = $value; - } - return %redirectionValues; -} - -sub trim($) -{ - my $string = shift; - $string =~ s/^\s+//; - $string =~ s/\s+$//; - return $string; -}
\ No newline at end of file diff --git a/solenv/bin/convertlinks.pl b/solenv/bin/convertlinks.pl deleted file mode 100644 index 76b1a02c2..000000000 --- a/solenv/bin/convertlinks.pl +++ /dev/null @@ -1,122 +0,0 @@ -# -# convertlinks - a perl script to make hrefs to -# http://api.openoffice.org/common/ref relativ. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# - -use File::Find; - -# for the convenience of &wanted calls, including -eval statements: -use vars qw/*name *dir/; -*name = *File::Find::name; -*dir = *File::Find::dir; -@files = (); - -if($#ARGV == 1) -{ - $pattern = "www"; -} else -{ - $pattern = $ARGV[2]; -} - -find(\&wanted, "$ARGV[0]"); - -$return = 1; - -foreach $i (@files) -{ - next if( $i->{directory} =~ /.*common((\/|\\)ref(.*))/ || - $i->{directory} =~ /.*cpp((\/|\\)ref(.*))/ || - $i->{directory} =~ /.*java((\/|\\)ref(.*))/ ); - - open ( FILEIN, $i->{filename} ) || die "could not open $i->{filename} for reading"; - - $relPath = "."; - $relToSource = "."; - if( $i->{directory} =~ /.*$pattern((\/|\\)(.*))/ ) - { - $relPath = $3; - $relPath =~ s#\w+#\.\.#go; - if($pattern eq "examples") - { - $relPath = "\.\.\/$relPath"; - } - if($pattern eq "www") - { - $relToSource = "\.\.\/$relPath"; - } else - { - $relToSource = $relPath; - } - } else - { - if($pattern eq "examples") - { - $relPath = "\.\."; - } - if($pattern eq "www") - { - $relToSource = "\.\."; - } else - { - $relToSource = $relPath; - } - } - - @lines = <FILEIN>; - close( FILEIN ); - open( FILEOUT, ">$i->{filename}.tmp" ) || die "could not open $i->{filename} for writing"; - foreach $_ (@lines) - { - # change the refenreces to the index in dependency of UDK or ODK - if("$ARGV[1]" eq "udk_" | "$ARGV[1]" eq "odk_") - { - s#((\")(index.html\"))#$2$ARGV[1]$3#go; - s#((\/|\")(faq.html\"))#$2$ARGV[1]$3#go; - s#((\/|\")(bylaws.html\"))#$2$ARGV[1]$3#go; - } - - s#((http:\/\/api\.openoffice\.org\/)(common\/ref[^\"]+))#$relPath\/$3#go; - s#((http:\/\/api\.openoffice\.org\/unbranded-source\/)(.*)(examples\/examples.html))#$relToSource\/$4#go; - - if($pattern eq "examples") - { - # change the links for the C++/Java examples in the ODK - s#((http:\/\/api\.openoffice\.org\/source\/browse\/api\/odk\/examples\/)(java\/*))#$3#go; - s#((http:\/\/api\.openoffice\.org\/source\/browse\/api\/odk\/examples\/)(cpp\/*))#$3#go; - s#((http:\/\/api\.openoffice\.org\/source\/browse\/api\/odk\/examples\/)(basic\/*))#$3#go; - s#((http:\/\/api\.openoffice\.org\/source\/browse\/api\/odk\/examples\/)(OLE\/*))#$3#go; - - # change link api specific stuff - s#((http:\/\/api\.openoffice\.org\/)(design_guide.html))#$relPath\/www\/$3#go; - s#(http:\/\/api\.openoffice\.org\/index.html)#$relPath\/www\/odk_index.html#go; - - # change the links for the C++ examples in the UDK - s#((http:\/\/udk\.openoffice\.org\/source\/browse\/udk\/product\/examples\/)(cpp\/*))#$3#go; - - # change the links to udk.openoffice.org to relativ links - s#(http:\/\/udk\.openoffice\.org\/index.html)#$relPath\/www\/udk_index.html#go; - s#((http:\/\/udk\.openoffice\.org)(\/*))#$relPath\/www$3#go; - - # change the link to tutorial - s#((http:\/\/api\.openoffice\.org\/)(basic\/man\/tutorial\/tutorial.pdf))#$relPath\/www\/$3#go; - } - print FILEOUT $_; - } - close FILEOUT; - chmod 0666, $i->{filename}; - rename "$i->{filename}.tmp", $i->{filename} || die "could not rename $i->{filename}.tmp to $i->{filename}"; - $return = 0; -} - -exit $return; - -sub wanted { - %file = ( - directory => $dir, - filename => $name - ); - push @files, {%file} if /^.*\.html\z/s; -} diff --git a/solenv/bin/create-ids b/solenv/bin/create-ids deleted file mode 100755 index 7567e857f..000000000 --- a/solenv/bin/create-ids +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -# create ID file for the whole LibO tree. run it in toplevel dir - -. ./Env.Host.sh - -dirs="*/$INPATH/inc */$INPATH/misc/build `ls -d */* | sed -e '/\(clone\/\|\/\(common\|unxlng\|unxsol\|unxmac\|wntmsc\|Jamfile\|cscope\.\|tags\|ID\)\)\|^solver\//d'`" -mkid --lang-map=`dirname $0`/id-lang.map --include='C C++ asm perl make' --statistics $dirs diff --git a/solenv/bin/create-tags b/solenv/bin/create-tags deleted file mode 100755 index c93bcd9bf..000000000 --- a/solenv/bin/create-tags +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env sh - -. ./Env.Host.sh - -omnicppoptions="--c++-kinds=+p --fields=+iaS --extra=+q" -ctags -h "+.hdl.hrc" --langmap=c:+.hdl.hrc.src $omnicppoptions \ - --languages=-HTML,Java \ - -R --exclude=`echo ${INPATH} | sed 's/\./\\\./g'` --exclude=binfilter --exclude=solver \ - --exclude=clone --exclude=install --totals=yes --sort=foldcase * diff --git a/solenv/bin/createcomponent.xslt b/solenv/bin/createcomponent.xslt deleted file mode 100644 index 7f7695d53..000000000 --- a/solenv/bin/createcomponent.xslt +++ /dev/null @@ -1,51 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!--********************************************************************** -* -* 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. -* -**********************************************************************--> - -<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - xmlns:uc="http://openoffice.org/2010/uno-components"> - <xsl:param name="uri"/> - <xsl:strip-space elements="*"/> - <xsl:template match="uc:component"> - <xsl:copy> - <xsl:apply-templates select="@*"/> - <xsl:attribute name="uri"> - <xsl:value-of select="$uri"/> - </xsl:attribute> - <xsl:apply-templates/> - </xsl:copy> - </xsl:template> - <xsl:template match="*"> - <xsl:copy> - <xsl:apply-templates select="@*"/> - <xsl:apply-templates/> - </xsl:copy> - </xsl:template> - <xsl:template match="@*"> - <xsl:copy/> - </xsl:template> -</xsl:stylesheet> diff --git a/solenv/bin/createpdbrelocators b/solenv/bin/createpdbrelocators deleted file mode 100755 index 40a44e8f2..000000000 --- a/solenv/bin/createpdbrelocators +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -if [ x${SOLARENV}x = xx ]; then - echo createpdbrelocators: no environment found! - exit 1 -fi -exec perl -w $SOLARENV/bin/createpdbrelocators.pl - diff --git a/solenv/bin/createpdbrelocators.btm b/solenv/bin/createpdbrelocators.btm deleted file mode 100644 index fe68d5572..000000000 --- a/solenv/bin/createpdbrelocators.btm +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -iff "%SOLARENV%" == "" then - echo Please configure environment with setsolar -endiff -iff "%PERL%" == "" then - call perl5 -I%SOLARENV%\bin\modules %SOLARENV%\bin\createpdbrelocators.pl %1& -else - call %PERL% -I%SOLARENV%\bin\modules %SOLARENV%\bin\createpdbrelocators.pl %1& -endiff diff --git a/solenv/bin/createpdbrelocators.pl b/solenv/bin/createpdbrelocators.pl deleted file mode 100755 index 213de9053..000000000 --- a/solenv/bin/createpdbrelocators.pl +++ /dev/null @@ -1,73 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - -#************************************************************************* -# -# createpdbrelocators - create for pdb relocator files -# PDB relocator files are used to find debug infos -# for analysis of creash reports -# -# usage: createpdbrelocators; -# -#************************************************************************* - -use strict; - -#### module lookup - -use lib ("$ENV{SOLARENV}/bin/modules"); -use CreatePDBRelocators; - -#### script id ##### - -( my $script_name = $0 ) =~ s/^.*\b(\w+)\.pl$/$1/; - -my $script_rev; -my $id_str = ' $Revision: 1.5 $ '; -$id_str =~ /Revision:\s+(\S+)\s+\$/ - ? ($script_rev = $1) : ($script_rev = "-"); - -print "$script_name -- version: $script_rev\n"; - -my $inpath = $ENV{INPATH}; - -if ( !$inpath ) { - print STDERR "$script_name: INAPTH not set!\n"; - exit(1); -} -my $relocators = CreatePDBRelocators->new(); -my $rc = $relocators->create_pdb_relocators($inpath, "", ""); - -if ( !$rc ) { - print STDERR "$script_name: creating PDB relocators failed!\n"; - exit(2); -} - -exit(0); diff --git a/solenv/bin/dbgsv.ini b/solenv/bin/dbgsv.ini deleted file mode 100644 index 006dadf98..000000000 --- a/solenv/bin/dbgsv.ini +++ /dev/null @@ -1,29 +0,0 @@ -=************************************************************************* -= -= 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. -= -=***********************************************************************/ - -[output] -error=shell diff --git a/solenv/bin/deliver.pl b/solenv/bin/deliver.pl deleted file mode 100755 index d4080b6e0..000000000 --- a/solenv/bin/deliver.pl +++ /dev/null @@ -1,1457 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - -# -# deliver.pl - copy from module output tree to solver -# - -use Cwd; -use File::Basename; -use File::Copy; -use File::DosGlob 'glob'; -use File::Path; -use File::Spec; - -#### script id ##### - -( $script_name = $0 ) =~ s/^.*\b(\w+)\.pl$/$1/; - -#### globals #### - -### valid actions ### -# if you add a action 'foo', than add 'foo' to this list and -# implement 'do_foo()' in the implemented actions area -@action_list = ( # valid actions - 'copy', - 'dos', - 'addincpath', - 'linklib', - 'mkdir', - 'symlink', - 'touch' - ); - -# copy filter: files matching these patterns won't be copied by -# the copy action -@copy_filter_patterns = ( - ); - -$strip = ''; -$is_debug = 0; - -$error = 0; -$module = 0; # module name -$repository = 0; # parent directory of this module -$base_dir = 0; # path to module base directory -$dlst_file = 0; # path to d.lst -$ilst_ext = 'ilst'; # extension of image lists -$umask = 22; # default file/directory creation mask -$dest = 0; # optional destination path -$common_build = 0; # do we have common trees? -$common_dest = 0; # common tree on solver - -@action_data = (); # LoL with all action data -@macros = (); # d.lst macros -@addincpath_list = (); # files which have to be filtered through addincpath -@dirlist = (); # List of 'mkdir' targets -@zip_list = (); # files which have to be zipped -@common_zip_list = (); # common files which have to be zipped -@log_list = (); # LoL for logging all copy and link actions -@common_log_list = (); # LoL for logging all copy and link actions in common_dest -$logfiledate = 0; # Make log file as old as newest delivered file -$commonlogfiledate = 0; # Make log file as old as newest delivered file - -$files_copied = 0; # statistics -$files_unchanged = 0; # statistics - -$opt_force = 0; # option force copy -$opt_check = 0; # do actually execute any action -$opt_zip = 0; # create an additional zip file -$opt_silent = 0; # be silent, only report errors -$opt_verbose = 0; # be verbose (former default behaviour) -$opt_log = 1; # create an additional log file -$opt_link = 0; # hard link files into the solver to save disk space -$opt_deloutput = 0; # delete the output tree for the project once successfully delivered -$opt_checkdlst = 0; -$delete_common = 1; # for "-delete": if defined delete files from common tree also - -if ($^O ne 'cygwin') { # iz59477 - cygwin needes a dot "." at the end of filenames to disable - $maybedot = ''; # some .exe transformation magic. -} else { - my $cygvernum = `uname -r`; - my @cygvernum = split( /\./, $cygvernum); - $cygvernum = shift @cygvernum; - $cygvernum .= shift @cygvernum; - if ( $cygvernum < 17 ) { - $maybedot = '.'; - } else { - $maybedot = ''; # no longer works with cygwin 1.7. other magic below. - } -} - -($gui = lc($ENV{GUI})) || die "Can't determine 'GUI'. Please set environment.\n"; -$tempcounter = 0; - -# zip is default for RE master builds -$opt_zip = 1 if ( defined($ENV{DELIVER_TO_ZIP}) && uc($ENV{DELIVER_TO_ZIP}) eq 'TRUE'); - -$has_symlinks = 0; # system supports symlinks - -for (@action_list) { - $action_hash{$_}++; -} - -# trap normal signals (HUP, INT, PIPE, TERM) -# for clean up on unexpected termination -use sigtrap 'handler' => \&cleanup_and_die, 'normal-signals'; - -#### main #### - -parse_options(); - -if ( ! $opt_delete ) { - if ( $ENV{GUI} eq 'WNT' ) { - if ($ENV{COM} eq 'GCC') { - initialize_strip() ; - }; - } else { - initialize_strip(); - } -} - -init_globals(); -push_default_actions(); -parse_dlst(); -check_dlst() if $opt_checkdlst; -walk_action_data(); -walk_addincpath_list(); -write_log() if $opt_log; -zip_files() if $opt_zip; -cleanup() if $opt_delete; -delete_output() if $opt_deloutput; -print_stats(); - -exit($error); - -#### implemented actions ##### - -sub do_copy -{ - # We need to copy two times: - # from the platform dependent output tree - # and from the common output tree - my ($dependent, $common, $from, $to, $file_list); - my $line = shift; - my $touch = 0; - - $dependent = expand_macros($line); - ($from, $to) = split(' ', $dependent); - print "copy dependent: from: $from, to: $to\n" if $is_debug; - glob_and_copy($from, $to, $touch); - - if ($delete_common && $common_build && ( $line !~ /%COMMON_OUTDIR%/ ) ) { - $line =~ s/%__SRC%/%COMMON_OUTDIR%/ig; - if ( $line =~ /%COMMON_OUTDIR%/ ) { - $line =~ s/%_DEST%/%COMMON_DEST%/ig; - $common = expand_macros($line); - ($from, $to) = split(' ', $common); - print "copy common: from: $from, to: $to\n" if $is_debug; - glob_and_copy($from, $to, $touch); - } - } -} - -sub do_dos -{ - my $line = shift; - - my $command = expand_macros($line); - if ( $opt_check ) { - print "DOS: $command\n"; - } - else { - # HACK: remove MACOSX stuff which is wrongly labled with dos - # better: fix broken d.lst - return if ( $command =~ /MACOSX/ ); - $command =~ s#/#\\#g if $^O eq 'MSWin32'; - system($command); - } -} - -sub do_addincpath -{ - # just collect all addincpath files, actual filtering is done later - my $line = shift; - my ($from, $to); - my @globbed_files = (); - - $line = expand_macros($line); - ($from, $to) = split(' ', $line); - - push( @addincpath_list, @{glob_line($from, $to)}); -} - -sub do_linklib -{ - my ($lib_base, $lib_major,$from_dir, $to_dir); - my $lib = shift; - my @globbed_files = (); - my %globbed_hash = (); - - print "linklib: $lib\n" if $is_debug; - print "has symlinks\n" if ( $has_symlinks && $is_debug ); - - return unless $has_symlinks; - - $from_dir = expand_macros('../%__SRC%/lib'); - $to_dir = expand_macros('%_DEST%/lib'); - - @globbed_files = glob("$from_dir/$lib"); - - if ( $#globbed_files == -1 ) { - return; - } - - foreach $lib (@globbed_files) { - $lib = basename($lib); - if ( $lib =~ /^(lib\S+(\.so|\.dylib))\.(\d+)\.(\d+)(\.(\d+))?$/ - || $lib =~ /^(lib\S+(\.so|\.dylib))\.(\d+)$/ ) - { - push(@{$globbed_hash{$1}}, $lib); - } - else { - print_warning("invalid library name: $lib"); - } - } - - foreach $lib_base ( sort keys %globbed_hash ) { - $lib = get_latest_patchlevel(@{$globbed_hash{$lib_base}}); - - if ( $lib =~ /^(lib\S+(\.so|\.dylib))\.(\d+)\.(\d+)(\.(\d+))?$/ ) - { - $lib_major = "$lib_base.$3"; - $long = 1; - } - else - { - $long = 0; - } - - if ( $opt_check ) { - if ( $opt_delete ) { - print "REMOVE: $to_dir/$lib_major\n" if $long; - print "REMOVE: $to_dir/$lib_base\n"; - } - else { - print "LINKLIB: $to_dir/$lib -> $to_dir/$lib_major\n" if $long; - print "LINKLIB: $to_dir/$lib -> $to_dir/$lib_base\n"; - } - } - else { - if ( $opt_delete ) { - print "REMOVE: $to_dir/$lib_major\n" if ($long && $opt_verbose); - print "REMOVE: $to_dir/$lib_base\n" if $opt_verbose; - unlink "$to_dir/$lib_major" if $long; - unlink "$to_dir/$lib_base"; - if ( $opt_zip ) { - push_on_ziplist("$to_dir/$lib_major") if $long; - push_on_ziplist("$to_dir/$lib_base"); - } - return; - } - my $symlib; - my @symlibs; - if ($long) - { - @symlibs = ("$to_dir/$lib_major", "$to_dir/$lib_base"); - } - else - { - @symlibs = ("$to_dir/$lib_base"); - } - # remove old symlinks - unlink(@symlibs); - foreach $symlib (@symlibs) { - print "LINKLIB: $lib -> $symlib\n" if $opt_verbose; - if ( !symlink("$lib", "$symlib") ) { - print_error("can't symlink $lib -> $symlib: $!",0); - } - else { - push_on_ziplist($symlib) if $opt_zip; - push_on_loglist("LINK", "$lib", "$symlib") if $opt_log; - } - } - } - } -} - -sub do_mkdir -{ - my $path = expand_macros(shift); - # strip whitespaces from path name - $path =~ s/\s$//; - if (( ! $opt_delete ) && ( ! -d $path )) { - if ( $opt_check ) { - print "MKDIR: $path\n"; - } else { - mkpath($path, 0, 0777-$umask); - if ( ! -d $path ) { - print_error("mkdir: could not create directory '$path'", 0); - } - } - } -} - -sub do_symlink -{ - my $line = shift; - - $line = expand_macros($line); - ($from, $to) = split(' ',$line); - my $fullfrom = $from; - if ( dirname($from) eq dirname($to) ) { - $from = basename($from); - } - elsif ( dirname($from) eq '.' ) { - # nothing to do - } - else { - print_error("symlink: link must be in the same directory as file",0); - return 0; - } - - print "symlink: $from, to: $to\n" if $is_debug; - - return unless $has_symlinks; - - if ( $opt_check ) { - if ( $opt_delete ) { - print "REMOVE: $to\n"; - } - else { - print "SYMLINK $from -> $to\n"; - } - } - else { - return unless -e $fullfrom; - print "REMOVE: $to\n" if $opt_verbose; - unlink $to; - if ( $opt_delete ) { - push_on_ziplist($to) if $opt_zip; - return; - } - print "SYMLIB: $from -> $to\n" if $opt_verbose; - if ( !symlink("$from", "$to") ) { - print_error("can't symlink $from -> $to: $!",0); - } - else { - push_on_ziplist($to) if $opt_zip; - push_on_loglist("LINK", "$from", "$to") if $opt_log; - } - } -} - -sub do_touch -{ - my ($from, $to); - my $line = shift; - my $touch = 1; - - $line = expand_macros($line); - ($from, $to) = split(' ', $line); - print "touch: $from, to: $to\n" if $is_debug; - glob_and_copy($from, $to, $touch); -} - -#### subroutines ##### - -sub parse_options -{ - my $arg; - my $dontdeletecommon = 0; - $opt_silent = 1 if ( defined $ENV{VERBOSE} && $ENV{VERBOSE} eq 'FALSE'); - $opt_verbose = 1 if ( defined $ENV{VERBOSE} && $ENV{VERBOSE} eq 'TRUE'); - while ( $arg = shift @ARGV ) { - $arg =~ /^-force$/ and $opt_force = 1 and next; - $arg =~ /^-check$/ and $opt_check = 1 and $opt_verbose = 1 and next; - $arg =~ /^-quiet$/ and $opt_silent = 1 and next; - $arg =~ /^-verbose$/ and $opt_verbose = 1 and next; - $arg =~ /^-zip$/ and $opt_zip = 1 and next; - $arg =~ /^-delete$/ and $opt_delete = 1 and next; - $arg =~ /^-dontdeletecommon$/ and $dontdeletecommon = 1 and next; - $arg =~ /^-help$/ and $opt_help = 1 and $arg = ''; - $arg =~ /^-link$/ and $ENV{GUI} ne 'WNT' and $opt_link = 1 and next; - $arg =~ /^-deloutput$/ and $opt_deloutput = 1 and next; - $arg =~ /^-debug$/ and $is_debug = 1 and next; - $arg =~ /^-checkdlst$/ and $opt_checkdlst = 1 and next; - print_error("invalid option $arg") if ( $arg =~ /^-/ ); - if ( $arg =~ /^-/ || $opt_help || $#ARGV > -1 ) { - usage(1); - } - $dest = $arg; - } - # $dest and $opt_zip or $opt_delete are mutually exclusive - if ( $dest and ($opt_zip || $opt_delete) ) { - usage(1); - } - # $opt_silent and $opt_check or $opt_verbose are mutually exclusive - if ( ($opt_check or $opt_verbose) and $opt_silent ) { - print STDERR "Error on command line: options '-check' and '-quiet' are mutually exclusive.\n"; - usage(1); - } - if ($dontdeletecommon) { - if (!$opt_delete) { - usage(1); - } - $delete_common = 0; - }; - # $opt_delete implies $opt_force - $opt_force = 1 if $opt_delete; -} - -sub init_globals -{ - ($module, $repository, $base_dir, $dlst_file) = get_base(); - - # for CWS: - $module =~ s/\.lnk$//; - - print "Module=$module, Base_Dir=$base_dir, d.lst=$dlst_file\n" if $is_debug; - - $umask = umask(); - if ( !defined($umask) ) { - $umask = 22; - } - - my $common_outdir = $ENV{'COMMON_OUTDIR'}; - my $inpath = $ENV{'INPATH'}; - my $solarversion = $ENV{'SOLARVERSION'}; - my $updater = $ENV{'UPDATER'}; - my $work_stamp = $ENV{'WORK_STAMP'}; - - # do we have a valid environment? - if ( !defined($inpath) ) { - print_error("no environment", 0); - exit(3); - } - - # Do we have common trees? - if ( defined($ENV{'common_build'}) && $ENV{'common_build'} eq 'TRUE' ) { - $common_build = 1; - if ((defined $common_outdir) && ($common_outdir ne "")) { - $common_outdir = $common_outdir . ".pro" if $inpath =~ /\.pro$/; - if ( $dest ) { - $common_dest = $dest; - } else { - $common_dest = "$solarversion/$common_outdir"; - $dest = "$solarversion/$inpath"; - } - } else { - print_error("common_build defined without common_outdir", 0); - exit(6); - } - } else { - $common_outdir = $inpath; - $dest = "$solarversion/$inpath" if ( !$dest ); - $common_dest = $dest; - } - $dest =~ s#\\#/#g; - $common_dest =~ s#\\#/#g; - - # the following macros are obsolete, will be flagged as error - # %__WORKSTAMP% - # %GUIBASE% - # %SDK% - # %SOLARVER% - # %__OFFENV% - # %DLLSUFFIX%' - # %OUTPATH% - # %L10N_FRAMEWORK% - # %UPD% - - # valid macros - @macros = ( - [ '%__PRJROOT%', $base_dir ], - [ '%__SRC%', $inpath ], - [ '%_DEST%', $dest ], - [ '%COMMON_OUTDIR%', $common_outdir ], - [ '%COMMON_DEST%', $common_dest ], - [ '%GUI%', $gui ] - ); - - # find out if the *HOST* system supports symlinks. They all do except Windows - $has_symlinks = $ENV{GUI} ne 'WNT'; -} - -sub get_base -{ - # a module base dir contains a subdir 'prj' - # which in turn contains a file 'd.lst' - my (@field, $repo, $base, $dlst); - my $path = getcwd(); - - @field = split(/\//, $path); - - while ( $#field != -1 ) { - $base = join('/', @field); - $dlst = $base . '/prj/d.lst'; - last if -e $dlst; - pop @field; - } - - if ( $#field == -1 ) { - print_error("can't find d.lst"); - exit(2); - } - else { - if ( defined $field[-2] ) { - $repo = $field[-2]; - } else { - print_error("Internal error: cannot determine module's parent directory"); - } - return ($field[-1], $repo, $base, $dlst); - } -} - -sub parse_dlst -{ - my $line_cnt = 0; - open(DLST, "<$dlst_file") or die "can't open d.lst"; - while(<DLST>) { - $line_cnt++; - tr/\r\n//d; - next if /^#/; - next if /^\s*$/; - if (!$delete_common && /%COMMON_DEST%/) { - # Just ignore all lines with %COMMON_DEST% - next; - }; - if ( /^\s*(\w+?):\s+(.*)$/ ) { - if ( !exists $action_hash{$1} ) { - print_error("unknown action: \'$1\'", $line_cnt); - exit(4); - } - push(@action_data, [$1, $2]); - } - else { - if ( /^\s*%(COMMON)?_DEST%\\/ ) { - # only copy from source dir to solver, not from solver to solver - print_warning("illegal copy action, ignored: \'$_\'", $line_cnt); - next; - } - push(@action_data, ['copy', $_]); - # for each ressource file (.res) copy its image list (.ilst) - if ( /\.res\s/ ) { - my $imagelist = $_; - $imagelist =~ s/\.res/\.$ilst_ext/g; - $imagelist =~ s/DEST%\\bin\\/DEST%\\res\\img\\/; - push(@action_data, ['copy', $imagelist]); - } - } - # call expand_macros()just to find any undefined macros early - # real expansion is done later - expand_macros($_, $line_cnt); - } - close(DLST); -} - -sub expand_macros -{ - # expand all macros and change backslashes to slashes - my $line = shift; - my $line_cnt = shift; - my $i; - - for ($i=0; $i<=$#macros; $i++) { - $line =~ s/$macros[$i][0]/$macros[$i][1]/gi - } - if ( $line =~ /(%\w+%)/ ) { - if ( $1 ne '%OS%' ) { # %OS% looks like a macro but is not ... - print_error("unknown/obsolete macro: \'$1\'", $line_cnt); - } - } - $line =~ s#\\#/#g; - return $line; -} - -sub walk_action_data -{ - # all actions have to be excuted relative to the prj directory - chdir("$base_dir/prj"); - # dispatch depending on action type - for (my $i=0; $i <= $#action_data; $i++) { - &{"do_".$action_data[$i][0]}($action_data[$i][1]); - if ( $action_data[$i][0] eq 'mkdir' ) { - # fill array with (possibly) created directories in - # revers order for removal in 'cleanup' - unshift @dirlist, $action_data[$i][1]; - } - } -} - -sub glob_line -{ - my $from = shift; - my $to = shift; - my $to_dir = shift; - my $replace = 0; - my @globbed_files = (); - - if ( ! ( $from && $to ) ) { - print_warning("Error in d.lst? source: '$from' destination: '$to'"); - return \@globbed_files; - } - - if ( $to =~ /[\*\?\[\]]/ ) { - my $to_fname; - ($to_fname, $to_dir) = fileparse($to); - $replace = 1; - } - - if ( $from =~ /[\*\?\[\]]/ ) { - # globbing necessary, no renaming possible - my $file; - my @file_list = glob($from); - - foreach $file ( @file_list ) { - next if ( -d $file); # we only copy files, not directories - my ($fname, $dir) = fileparse($file); - my $copy = ($replace) ? $to_dir . $fname : $to . '/' . $fname; - push(@globbed_files, [$file, $copy]); - } - } - else { - # no globbing but renaming possible - # #i89066# - if (-d $to && -f $from) { - my $filename = File::Basename::basename($from); - $to .= '/' if ($to !~ /[\\|\/]$/); - $to .= $filename; - }; - push(@globbed_files, [$from, $to]); - } - if ( $opt_checkdlst ) { - my $outtree = expand_macros("%__SRC%"); - my $commonouttree = expand_macros("%COMMON_OUTDIR%"); - if (( $from !~ /\Q$outtree\E/ ) && ( $from !~ /\Q$commonouttree\E/ )) { - print_warning("'$from' does not match any file") if ( $#globbed_files == -1 ); - } - } - return \@globbed_files; -} - - -sub glob_and_copy -{ - my $from = shift; - my $to = shift; - my $touch = shift; - - my @copy_files = @{glob_line($from, $to)}; - - for (my $i = 0; $i <= $#copy_files; $i++) { - next if filter_out($copy_files[$i][0]); # apply copy filter - copy_if_newer($copy_files[$i][0], $copy_files[$i][1], $touch) - ? $files_copied++ : $files_unchanged++; - } -} - -sub is_unstripped { - my $file_name = shift; - my $nm_output; - - if (-f $file_name.$maybedot) { - my $file_type = `file $file_name`; - # OS X file command doesn't know if a file is stripped or not - if (($file_type =~ /not stripped/o) || ($file_type =~ /Mach-O/o) || - (($file_type =~ /PE/o) && ($ENV{GUI} eq 'WNT') && - ($nm_output = `nm $file_name 2>&1`) && $nm_output && - !($nm_output =~ /no symbols/i) && !($nm_output =~ /not recognized/i))) { - return '1' if ($file_name =~ /\.bin$/o); - return '1' if ($file_name =~ /\.so\.*/o); - return '1' if ($file_name =~ /\.dylib\.*/o); - return '1' if ($file_name =~ /\.com\.*/o); - return '1' if ($file_name =~ /\.dll\.*/o); - return '1' if ($file_name =~ /\.exe\.*/o); - return '1' if (basename($file_name) !~ /\./o); - } - }; - return ''; -} - -sub initialize_strip { - if ((!defined $ENV{DISABLE_STRIP}) || ($ENV{DISABLE_STRIP} eq "")) { - $strip .= 'guw ' if ($^O eq 'cygwin'); - $strip .= 'strip'; - $strip .= " -x" if ($ENV{OS} eq 'MACOSX'); - $strip .= " -R '.comment' -s" if ($ENV{OS} eq 'LINUX'); - }; -}; - -sub is_jar { - my $file_name = shift; - - if (-f $file_name && (( `file $file_name` ) =~ /Zip archive/o)) { - return '1' if ($file_name =~ /\.jar\.*/o); - }; - return ''; -} - -sub execute_system { - my $command = shift; - if (system($command)) { - print_error("Failed to execute $command"); - exit($?); - }; -}; - -sub strip_target { - my $file = shift; - my $temp_file = shift; - $temp_file =~ s/\/{2,}/\//g; - my $rc = copy($file, $temp_file); - execute_system("$strip $temp_file"); - return $rc; -}; - -sub copy_if_newer -{ - # return 0 if file is unchanged ( for whatever reason ) - # return 1 if file has been copied - my $from = shift; - my $to = shift; - my $touch = shift; - my $from_stat_ref; - my $rc = 0; - - print "testing $from, $to\n" if $is_debug; - push_on_ziplist($to) if $opt_zip; - push_on_loglist("COPY", "$from", "$to") if $opt_log; - return 0 unless ($from_stat_ref = is_newer($from, $to, $touch)); - - if ( $opt_delete ) { - print "REMOVE: $to\n" if $opt_verbose; - $rc = unlink($to) unless $opt_check; - return 1 if $opt_check; - return $rc; - } - - if( !$opt_check && $opt_link ) { - # hard link if possible - if( link($from, $to) ){ - print "LINK: $from -> $to\n" if $opt_verbose; - return 1; - } - } - - if( $touch ) { - print "TOUCH: $from -> $to\n" if $opt_verbose; - } - else { - print "COPY: $from -> $to\n" if $opt_verbose; - } - - return 1 if( $opt_check ); - - # - # copy to temporary file first and rename later - # to minimize the possibility for race conditions - local $temp_file = sprintf('%s.%d-%d', $to, $$, time()); - $rc = ''; - if (($strip ne '') && (defined $ENV{PROEXT}) && (is_unstripped($from))) { - $rc = strip_target($from, $temp_file); - } else { - $rc = copy($from, $temp_file); - }; - if ( $rc) { - if ( is_newer($temp_file, $from, 0) ) { - $rc = utime($$from_stat_ref[9], $$from_stat_ref[9], $temp_file); - if ( !$rc ) { - print_warning("can't update temporary file modification time '$temp_file': $!\n - Check file permissions of '$from'.",0); - } - } - fix_file_permissions($$from_stat_ref[2], $temp_file); - # Ugly hack: on windows file locking(?) sometimes prevents renaming. - # Until we've found and fixed the real reason try it repeatedly :-( - my $try = 0; - my $maxtries = 1; - $maxtries = 5 if ( $^O eq 'MSWin32' ); - my $success = 0; - while ( $try < $maxtries && ! $success ) { - sleep $try; - $try ++; - $success = rename($temp_file, $to); - if ( $^O eq 'cygwin' && $to =~ /\.bin$/) { - # hack to survive automatically added .exe for executables renamed to - # *.bin - will break if there is intentionally a .bin _and_ .bin.exe file. - $success = rename( "$to.exe", $to ) if -f "$to.exe"; - } - } - if ( $success ) { - # handle special packaging of *.dylib files for Mac OS X - if ( $^O eq 'darwin' ) - { - system("macosx-create-bundle", "$to=$from.app") if ( -d "$from.app" ); - system("ranlib", "$to" ) if ( $to =~ /\.a/ ); - } - if ( $try > 1 ) { - print_warning("File '$to' temporarily locked. Dependency bug?"); - } - return 1; - } - else { - print_error("can't rename temporary file to $to: $!",0); - } - } - else { - print_error("can't copy $from: $!",0); - my $destdir = dirname($to); - if ( ! -d $destdir ) { - print_error("directory '$destdir' does not exist", 0); - } - } - unlink($temp_file); - return 0; -} - -sub is_newer -{ - # returns whole stat buffer if newer - my $from = shift; - my $to = shift; - my $touch = shift; - my (@from_stat, @to_stat); - - @from_stat = stat($from.$maybedot); - if ( $opt_checkdlst ) { - my $outtree = expand_macros("%__SRC%"); - my $commonouttree = expand_macros("%COMMON_OUTDIR%"); - if ( $from !~ /$outtree/ ) { - if ( $from !~ /$commonouttree/ ) { - print_warning("'$from' does not exist") unless -e _; - } - } - } - return 0 unless -f _; - - if ( $touch ) { - $from_stat[9] = time(); - } - # adjust timestamps to even seconds - # this is necessary since NT platforms have a - # 2s modified time granularity while the timestamps - # on Samba volumes have a 1s granularity - - $from_stat[9]-- if $from_stat[9] % 2; - - if ( $to =~ /^\Q$dest\E/ ) { - if ( $from_stat[9] > $logfiledate ) { - $logfiledate = $from_stat[9]; - } - } elsif ( $common_build && ( $to =~ /^\Q$common_dest\E/ ) ) { - if ( $from_stat[9] > $commonlogfiledate ) { - $commonlogfiledate = $from_stat[9]; - } - } - - @to_stat = stat($to.$maybedot); - return \@from_stat unless -f _; - - if ( $opt_force ) { - return \@from_stat; - } - else { - return ($from_stat[9] > $to_stat[9]) ? \@from_stat : 0; - } -} - -sub filter_out -{ - my $file = shift; - - foreach my $pattern ( @copy_filter_patterns ) { - if ( $file =~ /$pattern/ ) { - print "filter out: $file\n" if $is_debug; - return 1; - } - } - - return 0; -} - -sub fix_file_permissions -{ - my $mode = shift; - my $file = shift; - - if ( ($mode >> 6) % 2 == 1 ) { - $mode = 0777 & ~$umask; - } - else { - $mode = 0666 & ~$umask; - } - chmod($mode, $file); -} - -sub get_latest_patchlevel -{ - # note: feed only well formed library names to this function - # of the form libfoo.so.x.y.z with x,y,z numbers - - my @sorted_files = sort by_rev @_; - return $sorted_files[-1]; - - sub by_rev { - # comparison function for sorting - my (@field_a, @field_b, $i); - - $a =~ /^(lib[\w-]+(\.so|\.dylib))\.(\d+)\.(\d+)\.(\d+)$/; - @field_a = ($3, $4, $5); - $b =~ /^(lib[\w-]+(\.so|\.dylib))\.(\d+)\.(\d+)\.(\d+)$/; - @field_b = ($3, $4, $5); - - for ($i = 0; $i < 3; $i++) - { - if ( ($field_a[$i] < $field_b[$i]) ) { - return -1; - } - if ( ($field_a[$i] > $field_b[$i]) ) { - return 1; - } - } - - # can't happen - return 0; - } - -} - -sub push_default_actions -{ - # any default action (that is an action which must be done even without - # a corresponding d.lst entry) should be pushed here on the - # @action_data list. - my $subdir; - my @subdirs = ( - 'bin', - 'doc', - 'inc', - 'lib', - 'par', - 'pck', - 'rdb', - 'res', - 'xml' - ); - push(@subdirs, 'zip') if $opt_zip; - push(@subdirs, 'idl') if ! $common_build; - push(@subdirs, 'pus') if ! $common_build; - my @common_subdirs = ( - 'bin', - 'idl', - 'inc', - 'pck', - 'pus', - 'res' - ); - push(@common_subdirs, 'zip') if $opt_zip; - - if ( ! $opt_delete ) { - # create all the subdirectories on solver - foreach $subdir (@subdirs) { - push(@action_data, ['mkdir', "%_DEST%/$subdir"]); - } - if ( $common_build ) { - foreach $subdir (@common_subdirs) { - push(@action_data, ['mkdir', "%COMMON_DEST%/$subdir"]); - } - } - } - push(@action_data, ['mkdir', "%_DEST%/inc/$module"]); - if ( $common_build ) { - push(@action_data, ['mkdir', "%COMMON_DEST%/inc/$module"]); - push(@action_data, ['mkdir', "%COMMON_DEST%/res/img"]); - } else { - push(@action_data, ['mkdir', "%_DEST%/res/img"]); - } - - # deliver build.lst to $dest/inc/$module - push(@action_data, ['copy', "build.lst %_DEST%/inc/$module/build.lst"]); - if ( $common_build ) { - # ... and to $common_dest/inc/$module - push(@action_data, ['copy', "build.lst %COMMON_DEST%/inc/$module/build.lst"]); - } - - # need to copy libstaticmxp.dylib for Mac OS X - if ( $^O eq 'darwin' ) - { - push(@action_data, ['copy', "../%__SRC%/lib/lib*static*.dylib %_DEST%/lib/lib*static*.dylib"]); - } -} - -sub walk_addincpath_list -{ - my (@addincpath_headers); - return if $#addincpath_list == -1; - - # create hash with all addincpath header names - for (my $i = 0; $i <= $#addincpath_list; $i++) { - my @field = split('/', $addincpath_list[$i][0]); - push (@addincpath_headers, $field[-1]); - } - - # now stream all addincpath headers through addincpath filter - for (my $i = 0; $i <= $#addincpath_list; $i++) { - add_incpath_if_newer($addincpath_list[$i][0], $addincpath_list[$i][1], \@addincpath_headers) - ? $files_copied++ : $files_unchanged++; - } -} - -sub add_incpath_if_newer -{ - my $from = shift; - my $to = shift; - my $modify_headers_ref = shift; - my ($from_stat_ref, $header); - - push_on_ziplist($to) if $opt_zip; - push_on_loglist("ADDINCPATH", "$from", "$to") if $opt_log; - - if ( $opt_delete ) { - print "REMOVE: $to\n" if $opt_verbose; - my $rc = unlink($to); - return 1 if $rc; - return 0; - } - - if ( $from_stat_ref = is_newer($from, $to) ) { - print "ADDINCPATH: $from -> $to\n" if $opt_verbose; - - return 1 if $opt_check; - - my $save = $/; - undef $/; - open(FROM, "<$from"); - # slurp whole file in one big string - my $content = <FROM>; - close(FROM); - $/ = $save; - - foreach $header (@$modify_headers_ref) { - $content =~ s/#include [<"]$header[>"]/#include <$module\/$header>/g; - } - - open(TO, ">$to"); - print TO $content; - close(TO); - - utime($$from_stat_ref[9], $$from_stat_ref[9], $to); - fix_file_permissions($$from_stat_ref[2], $to); - return 1; - } - return 0; -} - -sub push_on_ziplist -{ - my $file = shift; - return if ( $opt_check ); - # strip $dest from path since we don't want to record it in zip file - if ( $file =~ s#^\Q$dest\E/##o ) { - push(@zip_list, $file); - } elsif ( $file =~ s#^\Q$common_dest\E/##o ) { - push(@common_zip_list, $file); - } -} - -sub push_on_loglist -{ - my @entry = @_; - return 0 if ( $opt_check ); - return -1 if ( $#entry != 2 ); - if (( $entry[0] eq "COPY" ) || ( $entry[0] eq "ADDINCPATH" )) { - return 0 if ( ! -e $entry[1].$maybedot ); - # make 'from' relative to source root - $entry[1] = $repository ."/" . $module . "/prj/" . $entry[1]; - $entry[1] =~ s/$module\/prj\/\.\./$module/; - } - # platform or common tree? - my $common; - if ( $entry[2] =~ /^\Q$dest\E/ ) { - $common = 0; - } elsif ( $common_build && ( $entry[2] =~ /^\Q$common_dest\E/ )) { - $common = 1; - } else { - warn "Neither common nor platform tree?"; - return; - } - # make 'to' relative to SOLARVERSION - my $solarversion = $ENV{'SOLARVERSION'}; - $solarversion =~ s#\\#/#g; - $entry[2] =~ s/^\Q$solarversion\E\///; - - if ( $common ) { - push @common_log_list, [@entry]; - } else { - push @log_list, [@entry]; - } - return 1; -} - -sub zip_files -{ - my $zipexe = 'zip'; - $zipexe .= ' -y' unless $^O eq 'MSWin32'; - - my ($platform_zip_file, $common_zip_file); - $platform_zip_file = "%_DEST%/zip/$module.zip"; - $platform_zip_file = expand_macros($platform_zip_file); - my (%dest_dir, %list_ref); - $dest_dir{$platform_zip_file} = $dest; - $list_ref{$platform_zip_file} = \@zip_list; - if ( $common_build ) { - $common_zip_file = "%COMMON_DEST%/zip/$module.zip"; - $common_zip_file = expand_macros($common_zip_file); - $dest_dir{$common_zip_file} = $common_dest; - $list_ref{$common_zip_file} = \@common_zip_list; - } - - my @zipfiles; - $zipfiles[0] = $platform_zip_file; - if ( $common_build ) { - push @zipfiles, ($common_zip_file); - } - foreach my $zip_file ( @zipfiles ) { - print "ZIP: updating $zip_file\n" if $opt_verbose; - next if ( $opt_check ); - - if ( $opt_delete ) { - if ( -e $zip_file ) { - unlink $zip_file or die "Error: can't remove file '$zip_file': $!"; - } - next; - } - - local $work_file = ""; - if ( $zip_file eq $common_zip_file) { - # Zip file in common tree: work on uniq copy to avoid collisions - $work_file = $zip_file; - $work_file =~ s/\.zip$//; - $work_file .= (sprintf('.%d-%d', $$, time())) . ".zip"; - die "Error: temp file $work_file already exists" if ( -e $work_file); - if ( -e $zip_file ) { - if ( -z $zip_file) { - # sometimes there are files of 0 byte size - remove them - unlink $zip_file or print_error("can't remove empty file '$zip_file': $!",0); - } else { - if ( ! copy($zip_file, $work_file)) { - # give a warning, not an error: - # we can zip from scratch instead of just updating the old zip file - print_warning("can't copy'$zip_file' into '$work_file': $!", 0); - unlink $work_file; - } - } - } - } else { - # No pre processing necessary, working directly on solver. - $work_file = $zip_file; - } - - # zip content has to be relative to $dest_dir - chdir($dest_dir{$zip_file}) or die "Error: cannot chdir into $dest_dir{$zip_file}"; - my $this_ref = $list_ref{$zip_file}; - open(ZIP, "| $zipexe -q -o -u -@ $work_file") or die "error opening zip file"; - foreach $file ( @$this_ref ) { - print "ZIP: adding $file to $zip_file\n" if $is_debug; - print ZIP "$file\n"; - } - close(ZIP); - fix_broken_cygwin_created_zips($work_file) if $^O eq "cygwin"; - - if ( $zip_file eq $common_zip_file) { - # rename work file back - if ( -e $work_file ) { - if ( -e $zip_file) { - # do some tricks to be fast. otherwise we may disturb other platforms - # by unlinking a file which just gets copied -> stale file handle. - my $buffer_file=$work_file . '_rm'; - rename($zip_file, $buffer_file) or warn "Warning: can't rename old zip file '$zip_file': $!"; - if (! rename($work_file, $zip_file)) { - print_error("can't rename temporary file to $zip_file: $!",0); - unlink $work_file; - } - unlink $buffer_file; - } else { - if (! rename($work_file, $zip_file)) { - print_error("can't rename temporary file to $zip_file: $!",0); - unlink $work_file; - } - } - } - } - } -} - -sub fix_broken_cygwin_created_zips -# add given extension to or strip it from stored path -{ - require Archive::Zip; import Archive::Zip; - my $zip_file = shift; - - $zip = Archive::Zip->new(); - unless ( $zip->read($work_file) == AZ_OK ) { - die "Error: can't open zip file '$zip_file' to fix broken cygwin file permissions"; - } - my $latest_member_mod_time = 0; - foreach $member ( $zip->members() ) { - my $attributes = $member->unixFileAttributes(); - $attributes &= ~0xFE00; - print $member->fileName() . ": " . sprintf("%lo", $attributes) if $is_debug; - $attributes |= 0x10; # add group write permission - print "-> " . sprintf("%lo", $attributes) . "\n" if $is_debug; - $member->unixFileAttributes($attributes); - if ( $latest_member_mod_time < $member->lastModTime() ) { - $latest_member_mod_time = $member->lastModTime(); - } - } - die "Error: can't overwrite zip file '$zip_file' for fixing permissions" unless $zip->overwrite() == AZ_OK; - utime($latest_member_mod_time, $latest_member_mod_time, $zip_file); -} - -sub get_tempfilename -{ - my $temp_dir = shift; - $temp_dir = ( -d '/tmp' ? '/tmp' : $ENV{TMPDIR} || $ENV{TEMP} || '.' ) - unless defined($temp_dir); - if ( ! -d $temp_dir ) { - die "no temp directory $temp_dir\n"; - } - my $base_name = sprintf( "%d-%di-%d", $$, time(), $tempcounter++ ); - return "$temp_dir/$base_name"; -} - -sub write_log -{ - my (%log_file, %file_date); - $log_file{\@log_list} = "%_DEST%/inc/$module/deliver.log"; - $log_file{\@common_log_list} = "%COMMON_DEST%/inc/$module/deliver.log"; - $file_date{\@log_list} = $logfiledate; - $file_date{\@common_log_list} = $commonlogfiledate; - - my @logs = ( \@log_list ); - push @logs, ( \@common_log_list ) if ( $common_build ); - foreach my $log ( @logs ) { - $log_file{$log} = expand_macros( $log_file{$log} ); - if ( $opt_delete ) { - print "LOG: removing $log_file{$log}\n" if $opt_verbose; - next if ( $opt_check ); - unlink $log_file{$log}; - } else { - print "LOG: writing $log_file{$log}\n" if $opt_verbose; - next if ( $opt_check ); - open( LOGFILE, "> $log_file{$log}" ) or warn "Error: could not open log file."; - foreach my $item ( @$log ) { - print LOGFILE "@$item\n"; - } - close( LOGFILE ); - utime($file_date{$log}, $file_date{$log}, $log_file{$log}); - } - push_on_ziplist( $log_file{$log} ) if $opt_zip; - } - return; -} - -sub check_dlst -{ - my %createddir; - my %destdir; - my %destfile; - # get all checkable actions to perform - foreach my $action ( @action_data ) { - my $path = expand_macros( $$action[1] ); - if ( $$action[0] eq 'mkdir' ) { - $createddir{$path} ++; - } elsif (( $$action[0] eq 'copy' ) || ( $$action[0] eq 'addincpath' )) { - my ($from, $to) = split(' ', $path); - my ($to_fname, $to_dir); - my $withwildcard = 0; - if ( $from =~ /[\*\?\[\]]/ ) { - $withwildcard = 1; - } - ($to_fname, $to_dir) = fileparse($to); - if ( $withwildcard ) { - if ( $to !~ /[\*\?\[\]]/ ) { - $to_dir = $to; - $to_fname =''; - } - } - $to_dir =~ s/[\\\/\s]$//; - $destdir{$to_dir} ++; - # Check: copy into non existing directory? - if ( ! $createddir{$to_dir} ) { - # unfortunately it is not so easy: it's OK if a subdirectory of $to_dir - # gets created, because mkpath creates the whole tree - foreach my $directory ( keys %createddir ) { - if ( $directory =~ /^\Q$to_dir\E[\\\/]/ ) { - $createddir{$to_dir} ++; - last; - } - } - print_warning("Possibly copying into directory without creating in before: '$to_dir'") - unless $createddir{$to_dir}; - } - # Check: overwrite file? - if ( ! $to ) { - if ( $destfile{$to} ) { - print_warning("Multiple entries copying to '$to'"); - } - $destfile{$to} ++; - } - } - } -} - -sub cleanup -{ - # remove empty directories - foreach my $path ( @dirlist ) { - $path = expand_macros($path); - if ( $opt_check ) { - print "RMDIR: $path\n" if $opt_verbose; - } else { - rmdir $path; - } - } -} - -sub delete_output -{ - my $output_path = expand_macros("../%__SRC%"); - if ( "$output_path" ne "../" ) { - if ( rmtree([$output_path], 0, 1) ) { - print "Deleted output tree.\n" if $opt_verbose; - } - else { - print_error("Error deleting output tree $output_path: $!",0); - } - } - else { - print_error("Output not deleted - INPATH is not set"); - } -} - -sub print_warning -{ - my $message = shift; - my $line = shift; - - print STDERR "$script_name: "; - if ( $dlst_file ) { - print STDERR "$dlst_file: "; - } - if ( $line ) { - print STDERR "line $line: "; - } - print STDERR "WARNING: $message\n"; -} - -sub print_error -{ - my $message = shift; - my $line = shift; - - print STDERR "$script_name: "; - if ( $dlst_file ) { - print STDERR "$dlst_file: "; - } - if ( $line ) { - print STDERR "line $line: "; - } - print STDERR "ERROR: $message\n"; - $error ++; -} - -sub print_stats -{ - print "Module '$module' delivered "; - if ( $error ) { - print "with errors\n"; - } else { - print "successfully."; - if ( $opt_delete ) { - print " $files_copied files removed,"; - } - else { - print " $files_copied files copied,"; - } - print " $files_unchanged files unchanged\n"; - } -} - -sub cleanup_and_die -{ - # clean up on unexpected termination - my $sig = shift; - if ( defined($temp_file) && -e $temp_file ) { - unlink($temp_file); - } - if ( defined($work_file) && -e $work_file ) { - unlink($work_file); - print STDERR "$work_file removed\n"; - } - - die "caught unexpected signal $sig, terminating ..."; -} - -sub usage -{ - my $exit_code = shift; - print STDERR "Usage:\ndeliver [OPTIONS] [DESTINATION-PATH]\n"; - print STDERR "Options:\n"; - print STDERR " -check just print what would happen, no actual copying of files\n"; - print STDERR " -checkdlst be verbose about (possible) d.lst bugs\n"; - print STDERR " -delete delete files (undeliver), use with care\n"; - print STDERR " -deloutput remove the output tree after copying\n"; - print STDERR " -dontdeletecommon do not delete common files (for -delete option)\n"; - print STDERR " -force copy even if not newer\n"; - print STDERR " -help print this message\n"; - if ( !defined($ENV{GUI}) || $ENV{GUI} ne 'WNT' ) { - print STDERR " -link hard link files into the solver to save disk space\n"; - } - print STDERR " -quiet be quiet, only report errors\n"; - print STDERR " -verbose be verbose\n"; - print STDERR " -zip additionally create zip files of delivered content\n"; - print STDERR "Options '-zip' and a destination-path are mutually exclusive.\n"; - print STDERR "Options '-check' and '-quiet' are mutually exclusive.\n"; - exit($exit_code); -} - -# vim: set ts=4 shiftwidth=4 expandtab syntax=perl: diff --git a/solenv/bin/diffmv.pl b/solenv/bin/diffmv.pl deleted file mode 100755 index ba401d7aa..000000000 --- a/solenv/bin/diffmv.pl +++ /dev/null @@ -1,76 +0,0 @@ -: - eval 'exec perl -S $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - - -my ( $srcfile, $destfile ) = @ARGV; -my ( @srclines, @destlines ); -my $dest_existing = 0; -@destlines = (); - -usage() if ( ! defined $srcfile || ! defined $destfile); - -open(SRCFILE, "$srcfile") or die "ERROR: Can't open $srcfile\n"; -@srclines = <SRCFILE>; -close SRCFILE; - -if ( -f $destfile ) { - open(DESTFILE, "$destfile") or die "ERROR: Can't open $destfile\n"; - @destlines = <DESTFILE>; - close DESTFILE; - $dest_existing = 1; -} - -if ( ! check_if_lists_equal(\@srclines, \@destlines) ) { - print STDERR "Updating \"$destfile\".\n"; - unlink "$destfile" or die "ERROR: Can't remove old $destfile\n" if ( $dest_existing ); - rename "$srcfile", "$destfile" or die "ERROR: Can't rename $srcfile to $destfile\n"; -} else { - print STDERR "\"$destfile\" unchanged.\n"; -} - -sub check_if_lists_equal -{ - my ( $srclist_ref, $destlist_ref ) = @_; - my @srclist = @{ $srclist_ref }; - my @destlist = @{ $destlist_ref }; - return 0 if ( $#srclist != $#destlist ); - for ( my $i = 0; $i < $#srclist; $i++ ) { - return 0 if ( $srclist[$i] ne $destlist[$i]); - } - return 1; -} - -sub usage -{ - print STDERR "Usage: diffmv sourcefile destfile\n"; - print STDERR "Do move diffing file only\n"; - exit 1; -} - diff --git a/solenv/bin/exectest.pl b/solenv/bin/exectest.pl deleted file mode 100644 index dc6f0e66c..000000000 --- a/solenv/bin/exectest.pl +++ /dev/null @@ -1,98 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -$#ARGV >= 1 - or die "Usage: $0 <input file>|-SUCCESS|-FAILURE <command> <arguments...>"; -if ($ARGV[0] eq "-SUCCESS") -{ - $expect = "SUCCESS"; - $input = 0; -} -elsif ($ARGV[0] eq "-FAILURE") -{ - $expect = "FAILURE"; - $input = 0; -} -else -{ - open INPUT, $ARGV[0] or die "cannot open $ARGV[0]: $!"; - $input = 1; -} -shift @ARGV; -$failed = 0; -$open = 0; -while (1) { - $eof = $input ? eof INPUT : $open; - $in = <INPUT> if $input && !$eof; - if (!$input || $eof - || $in =~ /^EXPECT (SUCCESS|FAILURE|\d+)( "([^"]*)")?:\n$/) - { - if ($open) - { - close PIPE; - if ($? % 256 == 0) - { - $exit = $? / 256; - $ok = $expect eq "SUCCESS" ? $exit == 0 - : $expect eq "FAILURE" ? $exit != 0 : $exit == $expect; - } - else - { - $exit = "signal"; - $ok = 0; - } - print "\"$title\", " if defined $title; - print "expected $expect, got $exit ($?): "; - if ($ok) - { - print "ok\n"; - } - else - { - print "FAILED!\n"; - $failed = 1; - } - } - last if $eof; - $expect = $1 if $input; - if (defined $3) - { - $title = $3; - } - else - { - undef $title; - } - open PIPE, "| @ARGV" or die "cannot start process: $!"; - $open = 1; - } - elsif ($open && $input) - { - print PIPE $in or die "cannot write to pipe: $!"; - } -} -exit $failed; diff --git a/solenv/bin/gccinstlib.pl b/solenv/bin/gccinstlib.pl deleted file mode 100755 index 4d81021ed..000000000 --- a/solenv/bin/gccinstlib.pl +++ /dev/null @@ -1,78 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - -$ENV{'LC_MESSAGES'} = 'C'; - -$Dest = pop(@ARGV) || die "No destination to copy to"; - -$cc = $ENV{'CC'} || die "No CC environment set"; - -if ($Dest =~ /--help/ || @ARGV < 1) { - print "Syntax:\n gcc-instlib <library-in-libpath ...> <destination-dir>\n"; - exit (0); -} - -%SrcAndDest = (); - -foreach $File (@ARGV) { - my $string; - - my $NormFile = $File; - $NormFile =~ s/\.so\.\d+/.so/; - @search = ($File, $NormFile); - - foreach $entry (@search) { - open (GCCOut, "LANGUAGE=C LC_ALL=C $cc -print-file-name=$entry|") || - next; - $string=<GCCOut>; - chomp ($string); - close (GCCOut); - if (-e $string) { - $SrcAndDest{$string} = "$Dest/$File"; - last; - } - } -} - -while (($Src, $FullDest) = each %SrcAndDest) { - printf "copy $Src to $FullDest\n"; - system ("/bin/cp $Src $FullDest") && die "copy failed: $!"; -} - - -foreach $File (@ARGV) { - #https://bugzilla.redhat.com/show_bug.cgi?id=149465 - printf "unprelinking $Dest/$File\n"; - #If it's already unprelinked .i.e. no .gnu.prelink_undo section, that's fine - #If prelink is not installed, it's massively unlikely that it's prelinked - system ("prelink -u $Dest/$File > /dev/null 2>&1"); -} - -exit (0); diff --git a/solenv/bin/gdb_cxa-atexit_trace-stdout b/solenv/bin/gdb_cxa-atexit_trace-stdout deleted file mode 100644 index 25cfe9897..000000000 --- a/solenv/bin/gdb_cxa-atexit_trace-stdout +++ /dev/null @@ -1,8 +0,0 @@ -set pagination off -break __cxa_atexit -commands - bt - cont -end -run -quit diff --git a/solenv/bin/gdbtrycatchtrace b/solenv/bin/gdbtrycatchtrace deleted file mode 100644 index 636985a14..000000000 --- a/solenv/bin/gdbtrycatchtrace +++ /dev/null @@ -1,21 +0,0 @@ -set pagination off -catch throw -commands - bt - cont -end -catch catch -commands - bt - cont -end -echo log will be saved as gdbtrace.log, this will take some time, patience...\n -set logging redirect on -set logging file gdbtrace.log -set logging on -set logging overwrite on -run -bt -quit -set logging off -echo log is saved as gdbtrace.log\n diff --git a/solenv/bin/gdbtrycatchtrace-stdout b/solenv/bin/gdbtrycatchtrace-stdout deleted file mode 100644 index e606a4f12..000000000 --- a/solenv/bin/gdbtrycatchtrace-stdout +++ /dev/null @@ -1,14 +0,0 @@ -set pagination off -catch throw -commands - bt - cont -end -catch catch -commands - bt - cont -end -run -bt -quit diff --git a/solenv/bin/gen_update_info.pl b/solenv/bin/gen_update_info.pl deleted file mode 100644 index 161e50a7a..000000000 --- a/solenv/bin/gen_update_info.pl +++ /dev/null @@ -1,176 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; - -#************************************************************************* -# -# 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. -# -#************************************************************************* - - -#********************************************************************* -# -# main -# - -my($product, $buildid, $id, $os, $arch, $lstfile, $languages, $productname, $productversion, $productedition); - -while ($_ = $ARGV[0], /^-/) { - shift; - last if /^--$/; - if (/^--product/) { - $product= $ARGV[0]; - shift; - } - if (/^--buildid/) { - $buildid = $ARGV[0]; - shift; - } - if (/^--os/) { - $os = $ARGV[0]; - shift; - } - if (/^--arch/) { - $arch = $ARGV[0]; - shift; - } - if (/^--lstfile/) { - $lstfile = $ARGV[0]; - shift; - } - if (/^--languages/) { - $languages = $ARGV[0]; - shift; - } -} - -$sourcefile = $ARGV[0]; - -if( $^O =~ /cygwin/i ) { - # We might get paths with backslashes, fix that. - $lstfile =~ s/\\/\//g; - $sourcefile =~ s/\\/\//g; -} - -# read openoffice.lst -# reading Globals section -unless(open(LSTFILE, "sed -n \"/^Globals\$/,/^}\$/ p\" $lstfile |")) { - print STDERR "Can't open $lstfile file: $!\n"; - return; -} - -while (<LSTFILE>) { - if( /\bPRODUCTNAME / ) { - chomp; - s/.*PRODUCTNAME //; - $productname = $_; - } - if( /\bPACKAGEVERSION / ) { - chomp; - s/.*PACKAGEVERSION //; - $productversion = $_; - } - if( /\bPRODUCTEDITION / ) { - chomp; - s/.*PRODUCTEDITION //; - $productedition = $_; - } -} - -close(LSTFILE); - -### may be hierarchical ... -if(open(LSTFILE, "sed -n \"/^$product:/,/^}\$/ p\" $lstfile |")) { - while (<LSTFILE>) { - if ( /^$product\s?:\s?(\w+)$/ ) { - $product = $1; - } - if( /\bPRODUCTEDITION / ) { - chomp; - s/.*PRODUCTEDITION //; - $productedition = $_; - } - } -} -close(LSTFILE); - -# Reading product specific settings - -unless(open(LSTFILE, "sed -n \"/^$product\$/,/^}\$/ p\" $lstfile |")) { - print STDERR "Can't open $lstfile file: $!\n"; - return; -} - -while (<LSTFILE>) { - if( /\bPRODUCTNAME / ) { - chomp; - s/.*PRODUCTNAME //; - $productname = $_; - } - if( /\bPACKAGEVERSION / ) { - chomp; - s/.*PACKAGEVERSION //; - $productversion = $_; - } - if( /\bPRODUCTEDITION / ) { - chomp; - s/.*PRODUCTEDITION //; - $productedition = $_; - } -} - -close(LSTFILE); - -# simulate the behavior of make_installer.pl when writing versionrc -unless( "$os" eq "Windows" ) { - $languages =~ s/_.*//; -} - -$id = $productversion; -$id =~ s/\..*//; -$id = $productname . "_" . $id . "_" . $languages; - -# open input file -unless (open(SOURCE, $sourcefile)) { - print STDERR "Can't open $sourcefile file: $!\n"; - return; -} - -while (<SOURCE>) { - s/:id></:id>$id</; - s/buildid></buildid>$buildid</; - s/os></os>$os</; - s/arch></arch>$arch</; - if ( $productedition ) { - s/edition></edition>$productedition</; - } else { - next if ( /edition></ ); - } - s/version></version>$productversion</; - s/name></name>$productname</; - print; -} - -close(SOURCE); diff --git a/solenv/bin/gen_userfeedback_VCL_names.pl b/solenv/bin/gen_userfeedback_VCL_names.pl deleted file mode 100755 index 1ef396596..000000000 --- a/solenv/bin/gen_userfeedback_VCL_names.pl +++ /dev/null @@ -1,195 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* -# -# pushids - push HID.LST and *.win files for userexperience feedback -# - -use lib ("$ENV{SOLARENV}/bin/modules", "$ENV{COMMON_ENV_TOOLS}/modules"); - -use Carp; - -sub parse_info($$); - -if ( @ARGV != 3 ) -{ - print "usage: $ARGV[0] <path tp hid.lst> <path to *.win files> <output file>\n"; - print "example: $ARGV[0] ./hid.lst global/win common/misc/UserFeedbackNames.csv\n\n"; - die "invalid params"; -} - -my ($hid, $winpath, $outfile) = @ARGV; - -my @names; - -open HID, "<$hid" or die "can't open file $filename $! $^E"; -for (<HID>) { - chop; - my ($longname, $ID) = split " +"; - next if ( ! $ID ); - $upperlongname = $longname; - $upperlongname =~ tr/a-z/A-Z/; - $undeclared_hids{$upperlongname} = $longname; - - if ( exists $hids{$upperlongname} && ( $hids{$upperlongname} != $ID ) ) - { - print STDERR "warn: unclear definition of longname: $longname = $hids{$upperlongname} or $ID\n"; - } - $hids{$upperlongname} = $ID; - - if ( exists $revhids{ $ID } && ( $revhids{ $ID } ne $upperlongname ) ) - { - print STDERR "warn: two longnames have the same ID: $longname and $revhids{$ID} share ID $ID\n"; - } - $revhids{$ID} = $upperlongname; -} - -close HID; - -undef @revhids; - -#Add Active -$hids{"ACTIVE"} = 0; - -my %dialogs = (); - -foreach ( glob("$winpath/*win") ) { - $filename = $_; - open WIN, "< $filename" or die "can't open file $filename $! $^E"; - my $parentinfo = ""; - my @dialog = (); - my $parentshortname = ""; - - for ( <WIN> ) { - chop; - - s/^ +//; - s/ +/ /g; - - next if /^ *'/; - next if /^ *$/; - - my $ID = ""; - my $iteminfo; - my ($shortname, $longname) = split " +"; - - $shortname = "" if ( !$shortname ); - $longname = "" if ( !$longname ); - - # fake a correct entry if only *active is given and overwrite the attempt to declare it differently - if ( $shortname =~ /\*active/i ) - { - $longname = "Active"; - } - - -# find UNO Names - if ( $longname =~ /^(.uno:|http|private:factory|service:|macro:|.HelpId:)/i || $longname =~ s/^sym://i ) - { - $ID = $longname; - $longname = ""; - } - else - { - my $upperlongname = $longname; - $upperlongname =~ tr/a-z/A-Z/; - if ( $shortname !~ /^[\+\*]/ && !exists $hids{$upperlongname} ) - { - print STDERR "warn: Longname not in hid.lst: $filename $longname\n"; - } - if ( exists $hids{$upperlongname} ) - { - $ID = $hids{$upperlongname}; - } - delete $undeclared_hids{$upperlongname}; - } - - $iteminfo = "$shortname $longname $ID"; - $iteminfo =~ s/^\*//; - $iteminfo =~ s/^\+//; - -# find start of deklaration - if ( $shortname =~ s/^\+// ) - { - # copy existing dialog - if ( exists $dialogs{ $longname } ) - { - my @old = @{$dialogs{ $longname }}; - my ($oldshort, $oldlong, $oldID ) = split ( " ", shift @old ); - $iteminfo = "$shortname $oldlong $oldID"; - - $parentinfo = $iteminfo; - $parentshortname = $shortname; - $dialogs{ $parentshortname } = \@dialog; - @dialog = (); # break the link - push ( @{$dialogs{ $parentshortname }}, $iteminfo ); - push @names, " $parentinfo"; - - for ( @old ) - { - push @names, "$parentinfo $_"; - } - } - else - { # fake new dialog instead - $shortname = "*".$shortname; - } - } - if ( $shortname =~ s/^\*// ) - { - $parentinfo = $iteminfo; - $parentshortname = $shortname; - $dialogs{ $parentshortname } = \@dialog; - @dialog = (); # break the link - push ( @{$dialogs{ $parentshortname }}, $iteminfo ); - push @names, " $parentinfo"; - } - else - { - push ( @{$dialogs{ $parentshortname }}, $iteminfo ); - push @names, "$parentinfo $iteminfo"; - } - - } - close WIN; -} - -for ( keys %undeclared_hids ) { - $iteminfo = "$undeclared_hids{$_} $undeclared_hids{$_} $hids{$_}"; - push @names, " $iteminfo"; -} - -#---------------------------------------------------------------------------- -# write to files - -open HIDS, ">$outfile" or die "can't open file $filename $! $^E"; -print HIDS join "\n", @names; -print HIDS "\n"; -close HIDS; - diff --git a/solenv/bin/genmap b/solenv/bin/genmap deleted file mode 100755 index 78d67bf6f..000000000 --- a/solenv/bin/genmap +++ /dev/null @@ -1 +0,0 @@ -less $2 diff --git a/solenv/bin/getcompver.awk b/solenv/bin/getcompver.awk deleted file mode 100644 index 124e915b7..000000000 --- a/solenv/bin/getcompver.awk +++ /dev/null @@ -1,79 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* -BEGIN { - CCversion = 0 - compiler_matched = 0 -} -# Sun c++ compiler -/Sun WorkShop/ || /Forte Developer/ || /Sun/{ - compiler_matched = 1 - # version number right after "C++" - x = match( $0, /C\+\+ .*/ ) - btwn = substr( $0, RSTART, RLENGTH) - # extract version, whitespaces get striped later - x = match( btwn, / .*\..*[ $\t]/) - CCversion = substr( btwn, RSTART, RLENGTH) -} -# Microsoft c++ compiler -/Microsoft/ && /..\...\...../ { - compiler_matched = 1 - # match on the format of the ms versions ( dd.dd.dddd ) - x = match( $0, /..\...\...../ ) - CCversion = substr( $0, RSTART, RLENGTH) -} -# Java -/java version/ || /openjdk version/ { - compiler_matched = 1 - # match on the format of the java versions ( d[d].d[d].d[d] ) - x = match( $0, /[0-9]*\.[0-9]*\.[0-9]*/ ) - CCversion = substr( $0, RSTART, RLENGTH) -} -/^[0-9]*[.][0-9]*\r*$/ { - if ( compiler_matched == 0 ) { -# need to blow to x.xx.xx for comparing - CCversion = $0 ".0" - } -} -/^[0-9]*[.][0-9]*[.][0-9]*\r*$/ { - if ( compiler_matched == 0 ) { - CCversion = $0 - } -} -/^[0-9]*[.][0-9]*[.][0-9]*-[0-9a-z]*$/ { - if ( compiler_matched == 0 ) { - CCversion = substr($0, 0, index($0, "-") - 1) - } -} -END { - if ( num == "true" ) { - tokencount = split (CCversion,vertoken,".") - for ( i = 1 ; i <= tokencount ; i++ ) { - printf ("%04d",vertoken[i] ) - } - } else - print CCversion -} diff --git a/solenv/bin/getcsym.awk b/solenv/bin/getcsym.awk deleted file mode 100644 index 9490a06b3..000000000 --- a/solenv/bin/getcsym.awk +++ /dev/null @@ -1,34 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -BEGIN { global_found = "false" } -/[ \t]*#/ { sub( substr( $0, index($0, "#")),"" ) } -/[ \t]*local:/ { global_found = "false" } -/[ \t]*}/ { global_found = "false" } -/^[ \t]*$/ { next } -global_found == "true" { print $0 } -/[ \t]*global:/ { global_found = "true" } diff --git a/solenv/bin/gsicheck b/solenv/bin/gsicheck deleted file mode 100755 index 5a09880b9..000000000 --- a/solenv/bin/gsicheck +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -if [ x${SOLARENV}x = xx ]; then - echo No environment found, please use 'setsolar' -exit 1 -fi - -if [ "${OS?}" = MACOSX ]; then - export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH:+${DYLD_LIBRARY_PATH}:}${SOLARVERSION?}/${INPATH?}/lib -else - export LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}${SOLARVERSION?}/${INPATH?}/lib -fi - -exec $SOLARVERSION/$INPATH/bin/gsicheck "$@" diff --git a/solenv/bin/guw.pl b/solenv/bin/guw.pl deleted file mode 100755 index ce91ee8d5..000000000 --- a/solenv/bin/guw.pl +++ /dev/null @@ -1,339 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* -# Description: ?? - -#--------------------------------------------------------------------------- -# external modules -use Text::ParseWords; - -# global vars -@params = (); - -# set debug mode here: -#$debug="true"; -#$debug_light="true"; - -#--------------------------------------------------------------------------- -# Define known parameter exceptions -%knownpara = ( 'echo', [ '/TEST', 'QQQ', 'CCC', 'uno:' ], - 'cl', [ '-clr:', '-Z' ], - 'csc', [ '-target:' ], - 'lib', [ 'OUT:', 'EXTRACT:','out:', 'def:', 'machine:' ], - 'link', [ 'BASE:', 'DEBUG', 'DLL', 'LIBPATH', 'MACHINE:', - 'MAP', 'NODEFAULTLIB', 'OPT', 'PDB', 'RELEASE', - 'SUBSYSTEM', 'STACK', 'out:', 'map:', 'ENTRY:', - 'implib:', 'delayload:', 'def', 'COMMENT:' ], - 'regcomp', [ '-env:', 'vnd.sun.star.expand:' , 'vnd.openoffice.pymodule' ], - 'regmerge', [ '/UCR' ], - 'rc', [ '-D' ], - 'rsc', [ '-DOOO_' ] ); - -#--------------------------------------------------------------------------- -# procedures - - -#---------------------------------------------------------- -# Function name: myCygpath -# Description: Transform POSIX path to DOS path -# Arguments: 1. Variable (string) with one token -# 2. optional - if set remove spaces and shorten to 8.3 -# representation. -# Return value: Reformatted String -#---------------------------------------------------------- -sub myCygpath { - my $posixpath = shift; - my $shortenpath = shift || ''; - - my $dospath; - - if ( $posixpath =~ / / and $shortenpath ) { - chomp( $dospath = qx{cygpath -d "$posixpath"} ); - # "cygpath -d" returns "" if the file doesn't exist. - if ($dospath eq "") { - $dospath = "."; - print(STDERR "Error: guw.pl: Path: $posixpath:\nhas a problem! Probably nonexistent filename with space.\n"); - if ( (defined $debug_light) or (defined $debug) ) { - die "exiting ...\n"; - } - } - } else { - if ( $posixpath =~ /^\// ) { - chomp( $dospath = qx{cygpath -w "$posixpath"} ); - } else { - $dospath = $posixpath; - $dospath =~ s/\//\\/g; - } - } - return $dospath; -} - -#---------------------------------------------------------- -# Function name: WinFormat -# Description: Format variables to Windows Format. -# Arguments: 1. Variable (string) with one token -# Return value: Reformatted String -#---------------------------------------------------------- -sub WinFormat { - my $variable = shift @_; - my( $d1, $d1_prefix, $d2 ); - - $variable =~ s/(\$\w+)/$1/eeg ; # expand the variables - $variable =~ s/(\$\w+)/$1/eeg ; # expand the variables twice! - - # Include paths or parameters with filenames - if ( $variable =~ /\A(-D[\w\.]*=)[\'\"]?((?:\/?[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { - # This regex evaluates -D<something>=<path>, sometimes with quotes or "/" at the end - # option -> $1, filename without quotes -> $2 - if ( defined $debug ) { print(STDERR "WinFormat:\ninclude (-D<something>=<path>) path:\n$variable\n"); } - $d1_prefix = $1; - $d1 = $2; - $d2 = myCygpath($2,1); - if ( $d2 ne "" ) { - $d2 =~ s/\\/\\\\/g ; - } - } elsif ( $variable =~ /\A(-?\w[\w\.]*=)[\'\"]?((?:\/?[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { - # This regex evaluates [-]X<something>=<path>, sometimes with quotes or "/" at the end - # option -> $1, filename without quotes -> $2 - if ( defined $debug ) { print(STDERR "WinFormat:\ninclude ([-]<something>=<path>) path:\n$variable\n"); } - $d1_prefix = $1; - $d1 = $2; - $d2 = myCygpath($2,1); - } elsif ( $variable =~ /\A(--\w[\w\.\-]*=)[\'\"]?((?:\/?[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { - # This regex evaluates --<something>=<path>, sometimes with quotes or "/" at the end - # option -> $1, filename without quotes -> $2 - if ( defined $debug ) { print(STDERR "WinFormat:\ninclude (--<something>=<path>) path:\n$variable\n"); } - $d1_prefix = $1; - $d1 = $2; - $d2 = myCygpath($2,1); - } elsif ( $variable =~ /\A(-\w[\w\.]*:)[\'\"]?((?:\/?[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { - # This regex evaluates -X<something>:<path>, sometimes with quotes or "/" at the end - # option -> $1, filename without quotes -> $2 - if ( defined $debug ) { print(STDERR "WinFormat:\nFound (-<something>:<path>):\n$variable\n"); } - $d1_prefix = $1; - $d1 = $2; - $d2 = myCygpath($2,1); - } elsif ( $variable =~ /\A(-\w+:)(.*)\Z/ ) { - # This regex evaluates -X<something>:<NO-path>, and prevents translating of these. - # option -> $1, rest -> $2 - if ( defined $debug ) { print(STDERR "WinFormat:\nFound (-<something>:<no-path>):\n$variable\n"); } - $d1_prefix = $1; - $d1 = $2; - $d2 = myCygpath($2,1); - } elsif ( $variable =~ /\A(\w+:)[\'\"]?\/\/\/((?:\/?[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { - # See iz35982 for the reason for the special treatment of this switch. - # This regex evaluates <something>:///<path>, sometimes with quotes or "/" at the end - # option -> $1, filename without quotes -> $2 - if ( defined $debug ) { print(STDERR "WinFormat:\nFound (<something>:///<path>):\n$variable\n"); } - $d1_prefix = $1."///"; - $d1 = $2; - $d2 = myCygpath($2,1); - $d2 =~ s/\\/\//g ; - } elsif ( $variable =~ /\A(-\w)[\'\"]?((?:\/[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { - # This regex evaluates -X<path>, sometimes with quotes or "/" at the end - # option -> $1, filename without quotes -> $2 - if ( defined $debug ) { print(STDERR "WinFormat:\ninclude (-X<absolute path>) path:\n$variable\n"); } - $d1_prefix = $1; - $d1 = $2; - $d2 = myCygpath($2,1); - } elsif ( $variable =~ /\A(-F[ARdemopr])[\'\"]?((?:\/[\w\.\-\+ ~]+)+\/?)[\'\"]?\Z/ ) { - # This regex evaluates -FX<path> (MSVC switches for output naming), sometimes with quotes or "/" at the end - # option -> $1, filename without quotes -> $2 - if ( defined $debug ) { print(STDERR "WinFormat:\ncompiler naming (-FX<absolute path>) path:\n$variable\n"); } - $d1_prefix = $1; - $d1 = $2; - $d2 = myCygpath($2,1); - } else { - $d2 = ""; - } - if ( $d2 ne "" ) { - # Found a parameter - $d1 =~ s/\+/\\\+/ ; - $d1 =~ s/\./\\\./ ; - $variable =~ s/$d1/$d2/ ; - } else { - # Found no parameter, assume a path - $variable =~ s/:/;/g; - $variable =~ s/([;]|\A)(\w);/$1$2:/g; # get back the drives - - # Search for posix path ;entry; (The regex accepts valid paths with at least one /) - # and replace with DOS path, accept quotes. - # iz28717 Accept ',' as path seperator. - while ( $variable =~ /(?:[;,]|\A)[\'\"]?([\w\.\-\+ ~]*(?:\/[\w\.\-\+ ~]+)+\/?)[\'\"]?(?:[;,]|\Z)/ ) { - # Normal paths - $d1 = $1; - $d2 = myCygpath($d1); - if ( defined $debug ) { - print(STDERR "WinFormat:\nFull path:\n$variable\nTranslated part:$d2\n"); - } - $d1 =~ s/\+/\\\+/ ; - $variable =~ s/$d1/$d2/ ; - } - } - - # Sanity check for -X<path> - if ( $variable =~ /-\w[\'\"]?(?:(?:\/[\w\.\-\+ ~]+)+)/ ) { - print(STDERR "Error: guw.pl: WinFormat: Not converted -X/... type switch in :$variable:.\n"); - if ( (defined $debug_light) or (defined $debug) ) { die "\nNot processed -X/...\n"; } - } - # Sanity check for [-]X<something>(:|=)<path> case - if ( $variable =~ /\A-?\w[\w\.]*[=:][\'\"]?(?:\/[\w\.\-\+ ~]+)+/ ) { - print(STDERR "Error: guw.pl: WinFormat: Not converted [-]X<something>(=|:)/<path> type switch in :$variable:.\n"); - if ( (defined $debug_light) or (defined $debug) ) { die "\nNot processed [-]X<something>(=|:)/...\n"; } - } - - if ( defined $debug ) { print(STDERR "WinFormat:\nresult:$variable\n");}; - return $variable; -} - -#---------------------------------------------------------- -# Function name: replace_cyg -# Description: Process all arguments and change them to Windows Format. -# Arguments: Reference to array with arguments -# Return value: - -#---------------------------------------------------------- -sub replace_cyg { - my $args = shift; - my( @cmd_file, @cmd_temp ); - my $atchars; - foreach my $para ( @$args ) - { - if ( $para =~ "^@" ) { - # it's a command file - if ( defined $debug ) { print(STDERR "----------------------------\n");}; - # Workaround, iz28717, keep number of @'s. - $para =~ s/(^\@+)//; - $atchars = $1; - $filename = $para; - if ( defined $debug ) { print(STDERR "filename = $filename \n");}; - # open this command file for reading - open(CMD, "$filename"); - while ( <CMD> ) { - # Remove DOS lineendings. Bug in Cygwin / Perl? - $_ =~ s/\r//g; - # Remove lineendings and trailing spaces. ( Needed by &parse_line ) - $_ =~ s/\n$//g; - $_ =~ s/\s+$//g; - # Fill all tokens into array - @cmd_temp = &parse_line('\s+', 1, $_ ); - if ( $#cmd_temp > -1 ) { - push( @cmd_file, @cmd_temp); - } - } - close(CMD); - # reformat all tokens - replace_cyg(\@cmd_file); - if ( defined $debug ) { print(STDERR "Tokens processed:\n");}; - foreach $i (@cmd_file) { - if ( defined $debug ) { print(STDERR "!".$i."!\n");}; - } - # open this filename for writing (truncate) Textmode? - open(CMD, '>', $filename); - # write all tokens back into this file - print(CMD join(' ', @cmd_file)); - close(CMD); - # convert '@filename' to dos style - $para = WinFormat( $para ); - if ( defined $debug ) { print(STDERR "----------------------------\n");}; - if ( (defined $debug_light) or (defined $debug) ) { print(STDERR "\nParameter in File:".join(' ', @cmd_file).":\n");} - $para = $atchars.$para; - } else { - # it's just a parameter - if ( defined $debug ) { print(STDERR "\nParameter:---${para}---\n");}; - # If $tmp1 is empty then $para is a parameter. - my $is_no_para = 1; - # remove .exe and convert to lower case - $shortcommand = lc $command ; - $shortcommand =~ s/\.exe$//; - $shortcommand =~ /([^\/]+$)/; - $shortcommand = $1; - foreach $i (@{$knownpara{$shortcommand}}) { - if( $para =~ /$i/ ) { - $is_no_para = 0; - if ( defined $debug ) { print(STDERR "Is parameter exception for ${shortcommand}: ${para}:\n" );}; - last; - } - } - if( $is_no_para ) { - $para = WinFormat($para); - } - if ( defined $debug ) { print(STDERR "Converted line:${para}:\n" );}; - } # else - } # foreach loop -} - -#---------------------------------------------------------- -# Function name: replace_cyg_env -# Description: Process selected environment variables and change -# them to Windows Format. -# Arguments: - -# Return value: - -#---------------------------------------------------------- -sub replace_cyg_env { - @affected_vars = ( - 'SOLAR_VERSION', - 'SOLARVERSION', - 'SOLARVER', - 'SRC_ROOT', - 'SOLARENV', - 'CLASSPATH', - 'JAVA_HOME' - ); - foreach my $one_var ( @affected_vars ) - { - my $this_var = $ENV{ $one_var }; - if ( defined $this_var ) - { - if ( defined $debug ) { print(STDERR "ENV $one_var before: ".$ENV{ $one_var}."\n" );}; - $ENV{ $one_var } = WinFormat( $this_var ); - if ( defined $debug ) { print(STDERR "ENV $one_var after : ".$ENV{ $one_var}."\n" );}; - } - } - -} -#--------------------------------------------------------------------------- -# main -@params = @ARGV; - -$command = shift(@params); -while ( $command =~ /^-/ ) -{ - if ( $command eq "-env" ) - { - replace_cyg_env; - } - - $command = shift(@params); -} -if ( (defined $debug_light) or (defined $debug) ) { print( STDERR "Command: $command\n" ); } - -replace_cyg(\@params); -if ( (defined $debug_light) or (defined $debug) ) { print(STDERR "\n---------------------\nExecute: $command @params\n----------------\n");}; -exec( "$command", @params) or die( "\nError: guw.pl: executing $command failed!\n" ); - diff --git a/solenv/bin/id-lang.map b/solenv/bin/id-lang.map deleted file mode 100644 index acc5afc0c..000000000 --- a/solenv/bin/id-lang.map +++ /dev/null @@ -1,105 +0,0 @@ -# Welcome to the mkid language mapper. -# -# The format of each line is: -# -# <pattern> <language> [options] -# -# Filenames are matched top-to-bottom against the patterns, and the -# first match is chosen. The special language `IGNORE' means that -# this file should be ignored by mkid. The options are -# language-specific command-line options to mkid. -# -# If a file name doesn't match any pattern, it is assigned the default -# language. The default language may be specified here with the -# special pattern `**', or overridden from the mkid command-line with -# the `--default-lang=LANG' option. -# -# The special pattern `***' means to include the named file that -# immediately follows. If no file is named, then the default system -# language mapper file (i.e., this file) is included. - -# Default language -** IGNORE # Although this is listed first, - # the default language pattern is - # logically matched last. - -# Backup files -*~ IGNORE -*.bak IGNORE -*.bk[0-9] IGNORE - -# SCCS files -[sp].* IGNORE - -# C dependencies created by automake -*/.deps/* IGNORE - -*.h C -*.h.in C -*.H C++ -*.hh C++ -*.hpp C++ -*.hxx C++ - -*.l C -*.lex C -*.y C -*.yacc C - -*.c C -*.C C++ -*.cc C++ -*.cpp C++ -*.cxx C++ - -*.java Java - -ChangeLog* Cdoc - -*.[sS] asm --comment=; -*.asm asm --comment=; - -# [nt]roff -*.[0-9] roff -*.ms roff -*.me roff -*.mm roff - -*.tex TeX -*.ltx TeX -*.texi texinfo -*.texinfo texinfo - -# portable object (i18n) -*.po po - -*.el lisp -*.elc lisp -*.lisp lisp -*.scm lisp - -*.am make -Makefile make -Makefile.* make - -*.doc text -*.txt text - -*.m4 m4 - -*.pl perl -*.pm perl - -*.gz FILTER gzip -d <%s -*.Z FILTER gzip -d <%s - -######### OOo-specific stuff ####################################### - -# Treat OOo resource header files as C files -*.hrc C -# Treat OOo header files generated from *.idl as C++ files -*.hdl C++ -# Treat OOo resource files as C files -*.src C -# Treat OOo *.mk files as makefiles -*.mk make diff --git a/solenv/bin/image-sort.pl b/solenv/bin/image-sort.pl deleted file mode 100755 index caf699fbf..000000000 --- a/solenv/bin/image-sort.pl +++ /dev/null @@ -1,149 +0,0 @@ -#!/usr/bin/perl -w - -my @global_list = (); -my %global_hash = (); -my $base_path; - -sub read_icons($) -{ - my $fname = shift; - my $fileh; - my @images; - open ($fileh, "$base_path/$fname") || die "Can't open $base_path/$fname: $!"; - while (<$fileh>) { - m/xlink:href=\"\.uno:(\S+)\"\s+/ || next; - push @images, lc($1); - } - close ($fileh); - - return @images; -} - -# filter out already seen icons & do prefixing -sub read_new_icons($$) -{ - my $fname = shift; - my $prefix = shift; - my @images = read_icons ($fname); - my @new_icons; - my %new_icons; - for my $icon (@images) { - my $iname = "cmd/" . $prefix . $icon . ".png"; - if (!defined $global_hash{$iname} && - !defined $new_icons{$iname}) { - push @new_icons, $iname; - $new_icons{$iname} = 1; - } - } - return @new_icons; -} - -sub process_group($@) -{ - my $prefix = shift; - my @uiconfigs = @_; - my %group; - my $cur_max = 1.0; - -# a very noddy sorting algorithm - for my $uiconfig (@uiconfigs) { - my @images = read_new_icons ($uiconfig, $prefix); - my $prev = ''; - for my $icon (@images) { - if (!defined $group{$icon}) { - if (!defined $group{$prev}) { - $group{$icon} = $cur_max; - $cur_max += 1.0; - } else { - $group{$icon} = $group{$prev} + (1.0 - 0.5 / $cur_max); - } - } # else a duplicate - } - } - for my $icon (sort { $group{$a} <=> $group{$b} } keys %group) { - push @global_list, $icon; - $global_hash{$icon} = 1; - } -} - -sub process_file($$) -{ - my @images = read_new_icons (shift, shift); - - for my $icon (@images) { - push @global_list, $icon; - $global_hash{$icon} = 1; - } -} - -sub chew_controlfile($) -{ - my $fname = shift; - my $fileh; - my @list; - open ($fileh, $fname) || die "Can't open $fname: $!"; - while (<$fileh>) { - /^\#/ && next; - s/[\r\n]*$//; - /^\s*$/ && next; - - my $line = $_; - if ($line =~ s/^-- (\S+)\s*//) { - # control code - my $code = $1; - my $small = (lc ($line) eq 'small'); - if (lc($code) eq 'group') { - if (!$small) { process_group ("lc_", @list); } - process_group ("sc_", @list); - } elsif (lc ($code) eq 'ordered') { - if (!$small) { - for my $file (@list) { process_file ($file, "lc_"); } - } - for my $file (@list) { process_file ($file, "sc_"); } - } elsif (lc ($code) eq 'literal') { - for my $file (@list) { - if (!defined $global_hash{$file}) { - push @global_list, $file; - $global_hash{$file} = 1; - } - } - } else { - die ("Unknown code '$code'"); - } - @list = (); - } else { - push @list, $line; - } - } - close ($fileh); -} - -if (!@ARGV) { - print "image-sort <image-sort.lst> /path/to/OOOo/source/root\n"; - exit 1; -} - -# where the control file lives -my $control = shift @ARGV; -# where the uiconfigs live -$base_path = shift @ARGV; -# output -if (@ARGV) { - my $outf = shift @ARGV; - open ($output, ">$outf") || die "Can't open $outf: $!"; - $stdout_out = 0; -} else { - $output = STDOUT; - $stdout_out = 1; -} - -chew_controlfile ($control); - -for my $icon (@global_list) { - print $output $icon . "\n" if (!($icon =~ /^sc_/)); -} -for my $icon (@global_list) { - print $output $icon . "\n" if ($icon =~ /^sc_/); -} - -close $output if (!$stdout_out); diff --git a/solenv/bin/install-sh b/solenv/bin/install-sh deleted file mode 100755 index fb942ef71..000000000 --- a/solenv/bin/install-sh +++ /dev/null @@ -1,3 +0,0 @@ -;; This file is automatically created by diff_all_filter.pl -;; Fri Mar 27 08:02:00 2009 - diff --git a/solenv/bin/installoffice.oxt b/solenv/bin/installoffice.oxt Binary files differdeleted file mode 100644 index feb1d8723..000000000 --- a/solenv/bin/installoffice.oxt +++ /dev/null diff --git a/solenv/bin/installoffice_impress.oxt b/solenv/bin/installoffice_impress.oxt Binary files differdeleted file mode 100755 index 31c7bfa45..000000000 --- a/solenv/bin/installoffice_impress.oxt +++ /dev/null diff --git a/solenv/bin/langwrap b/solenv/bin/langwrap deleted file mode 100755 index 97a50f176..000000000 --- a/solenv/bin/langwrap +++ /dev/null @@ -1,131 +0,0 @@ -#!/usr/bin/perl -w -# -# langwrap - language wrapper for building resources -# -# $Id: langwrap,v 1.2 2008-08-18 13:10:41 vg Exp $ - -use Getopt::Std; - -###### globals ###### - -$is_debug = 0; -$nfield = 0; -@LoL = (); -@command = (); - -###### main ###### - -# Version -$idStr = ' $Revision: 1.2 $ '; -$idStr =~ /Revision:\s+(\S+)\s+\$/ - ? ($langwrapRev = $1) : ($langwrapRev = "-"); - -print "langwrap -- Version: $langwrapRev\n"; - -# Options -&check_options(); - -# parse command file -&parse_commandfile($opt_c); - -# create list with command lines -&create_commands(); - -# finally execute commands -foreach $cmd (@command) { - if ($is_debug) { - print $cmd . "\n"; - } else { - system($cmd); - $res = $? >> 8; - if ($res) { - print "langwrap: command execution failed with exitcode $res.\n"; - exit($res); - } - } -} - -exit(0); - -###### routines ###### - -### parse_commandfile() -sub parse_commandfile { - my($file) = shift; - my(@field); - - open(COMMAND, "<$file") or die "can´t open $file"; - - while (<COMMAND>) { - $line = $_; - chomp($line); - if ( ($line =~ //) || ($line =~ /^\r/) || ($line =~ /^#/) ) { - next; - } - - @field = split " ", $line; - push @LoL, [@field]; - if (!$nfield) { - $nfield = $#field + 1; - } else { - if ( $nfield != ($#field + 1) ) { - print "langwrap: error in <cmdfile>: every row must "; - print "have the same # of columns.\n"; - exit(3); - } - } - } - - close(COMMAND); -} - -### create_command() -sub create_commands() { - my($cmd, $cmdline, $arg_string, $ntempl); - - $cmd = shift @ARGV; - $arg_string = join(" ", @ARGV); - # just count the number of templates - $ntempl = ($arg_string =~ s/@\d+@/$&/eg); - if ( $ntempl >= $nfield ) { - print "lnagwrap: # of templates > # of fields in <cmdfile>.\n"; - exit(4); - } - - # create command lines - for $i (0..$#LoL) { - $cmdline = $arg_string; - $cmdline =~ s/@(\d+)@/$LoL[$i][$1]/eg; - push @command, $cmd . " " . $cmdline; - } -} - -### check_options() -sub check_options { - - if ( !getopts('c:') ) { - &usage(); - } - - if ( !$opt_c ) { - &usage(); - } - - if ( ! -r $opt_c ) { - print "langwrap: $opt_c is not a readable file.\n"; - exit(2); - } - - if ( $#ARGV < 1 ) { - print "langwrap: empty <template_string>.\n"; - &usage(); - } -} - -### usage() -sub usage { - print "Usage: langwrap -c cmdfile tool <template_string>\n"; - print "<template_string> is of form: ...\@1\@ .... \@2\@...\n"; - print "with \@<n>\@ template #n\n"; - exit(1); -} diff --git a/solenv/bin/leconvert.pl b/solenv/bin/leconvert.pl deleted file mode 100755 index 24da8f9cf..000000000 --- a/solenv/bin/leconvert.pl +++ /dev/null @@ -1,91 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* -my $target_format = ""; -my @filelist; -#my $debug=1; -my $debug=0; - -parameter_parse(@ARGV); -print "@filelist\n" if ( $debug ); -foreach my $onefile ( @filelist ) { - convert_file( $onefile ); -} - - -sub convert_file -{ - my $filename = shift; - if ( $target_format eq "dos" ) { - $lineend = "\r\n"; - } else { - $lineend = "\n"; - } - open INFILE, "$filename"or die "ERROR: Couldn\'t open $filename for reading.\n"; - my @lines = <INFILE>; - close INFILE; - - foreach my $oneline ( @lines ) { - $oneline =~ s/\r*\n*$/$lineend/; - } - - open OUTFILE, ">$filename" or die "ERROR: Couldn\'t open $filename for writing.\n"; - syswrite OUTFILE, join "", @lines; - close OUTFILE; - -} - -sub parameter_parse -{ - if ( $target_format eq "" ) { - $target_format = shift ; - usage() if ( $target_format ne "unix" && $target_format ne "dos" ); - usage() if ( $#_ == -1 ); - } - foreach my $param ( @_ ) { - if ( $param =~ "^@" ) { - my $filename = $param; - $filename =~ s/^@//; - open CMDFILE, "$filename" or die "ERROR: Couldn\'t open $filename for reading.\n"; - my @filelist = <CMDFILE>; - close CMDFILE; - parameter_parse( @filelist ); - } else { - push @filelist, $param; - } - } -} - -sub usage -{ - print "Convert text files to the desired lineend convention:\n"; - print "$0 <unix|dos> <FILE|\@filelist> [more files/lists]\n"; - exit 1; -} - diff --git a/solenv/bin/licinserter.pl b/solenv/bin/licinserter.pl deleted file mode 100644 index 2626d6afb..000000000 --- a/solenv/bin/licinserter.pl +++ /dev/null @@ -1,138 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - -# -# licinserter.pl - create license entries in extension description.xml -# - -use File::Basename; - -my $langswitch; - -sub usage() -{ - print STDERR "\nCreate extension descriptions with license-text entries\n"; - print STDERR "matching the language activated.\n"; - print STDERR "\nUsage:\n"; - print STDERR "\t$0 [--langsplit] infile \"naming pattern\" destination\n\n"; - print STDERR "\nExample:\n\n"; - print STDERR "$0 description.xml dir/license_xxx.txt outdir/description.xml\n\n"; - print STDERR "Creates \"someoutdir/description.xml\" with the license file entries like\n\"dir/license_en.US.txt\" "; - print STDERR "for all languages found in the WITH_LANG environment\nvariable\n\n\n"; - print STDERR "Example2:\n\n"; - print STDERR "$0 --langsplit description.xml dir/license_xxx.txt someoutdir\n\n"; - print STDERR "Creates \"someoutdir/<language>/description.xml\" with one license file entry\n\"somedir/license_<language>.txt\" "; - print STDERR "for all languages found in the WITH_LANG\nenvironment variable.\n\nNOTE: when using --langsplit \"destination\" needs to be a directory\n"; -} - -if ( $ARGV[0] =~ /^-/ ) { - $langswitch = shift @ARGV; - if ( $langswitch ne "--langsplit" ) { - usage(); - exit 1; - } - if ( ! -d $ARGV[2] ) { - print STDERR "\nERROR - $ARGV[2] is not directory\n"; - usage(); - exit 2; - } -} - -if ( $#ARGV != 2 ) { - print "zzz\n"; - usage(); - exit 1; -} - -open INFILE,$ARGV[0] or die "oops - no such file $ARGV[0]!\n"; - -my @inlines = <INFILE>; -close INFILE; - -chomp @inlines; - -# Empty or unset WITH_LANG environment variable is set to default en-US. -# When WITH_LANG is set but does not contain en-US then that is prepended. -my $WithLang = $ENV{WITH_LANG}; -if ( ! defined $WithLang || $WithLang eq "") -{ - $WithLang = "en-US"; -} -elsif ($WithLang !~ /\ben-US\b/) -{ - $WithLang = "en-US " . $WithLang; -} - - -if ( $langswitch eq "" ) { - my @outlines; - foreach my $i (@inlines) { - if ( $i =~ /license-text/ ) { - my $ii; - my $name; - foreach my $code ( split(/\s+/,$WithLang) ) { - $ii = $i; - $name = $ARGV[1]; - $name =~ s/xxx/$code/; - $ii =~ s/isocode/$code/g; - $ii =~ s?licensefile?$name?g; - push @outlines, "$ii\n"; - } - } else { - push @outlines, "$i\n"; - } - } - open OUTFILE, ">$ARGV[2]" or die "ooops - can't open $ARGV[2] for writing\n"; - print OUTFILE @outlines; - close OUTFILE or die "ooops - can't write to $ARGV[2]\n"; -} else { - my @outlines; - my $outname = basename($ARGV[0],()); - foreach my $code ( split(/\s+/,$ENV{WITH_LANG}) ) { - @outlines=(); - foreach my $i (@inlines) { - if ( $i =~ /license-text/ ) { - my $name; - my $ii = $i; - $name = $ARGV[1]; - $name =~ s/xxx/$code/; - $ii =~ s/isocode/$code/g; - $ii =~ s?licensefile?$name?g; - push @outlines, "$ii\n"; - } else { - push @outlines, "$i\n"; - } - } - mkdir "$ARGV[2]/$code"; - open OUTFILE, ">$ARGV[2]/$code/$outname" or die "ooops - can't open $ARGV[2]/$code/$outname for writing\n"; - print OUTFILE @outlines; - close OUTFILE or die "ooops - can't write to $ARGV[2]/$code/$outname\n"; - } -} diff --git a/solenv/bin/linkoo b/solenv/bin/linkoo deleted file mode 100755 index ae6a7f27f..000000000 --- a/solenv/bin/linkoo +++ /dev/null @@ -1,376 +0,0 @@ -: - eval 'exec perl -S $0 ${1+"$@"}' - if 0; - -use strict; - -#************************************************************************* -# -# This app makes it easy to link a live build -# set into an install set. Then your devel iteration -# is: 'build', execute. -# -#************************************************************************* -# -# 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. -# -# This file substantially, if not wholely written by volunteers, not Oracle -# -#************************************************************************* - -# ends up in program/ooenv -( my $moz_lib = `pkg-config --variable=libdir mozilla-nss` ) =~ tr/\n/:/; -my $env_script = ' -java_path=`$thisdir/../basis-link/ure-link/bin/javaldx 2>/dev/null` -export LD_LIBRARY_PATH="$thisdir:$java_path:' . $moz_lib . '$LD_LIBRARY_PATH" -ulimit -c unlimited -export PATH="$thisdir/:$thisdir/../basis-link/program:$thisdir/../basis-link/ure-link/bin:$PATH" -export GNOME_DISABLE_CRASH_DIALOG=1 -export STAR_RESOURCEPATH=$thisdir/../basis-link/program/resource -# debugging assistance -export SAL_DISABLE_FLOATGRAB=1 -export G_SLICE=always-malloc -export MALLOC_CHECK_=2 -export OOO_DISABLE_RECOVERY=1 -export SAL_ALLOW_LINKOO_SYMLINKS=1 -'; - -my $dry_run = 0; -my $usage = 0; -my $LANG; -my $TARGET; -my $LIBVER; -my $OOO_BUILD; -my $OOO_INSTALL; - -my $program_dir = 'basis-link/program'; -my $brand_program_dir = 'program'; -my $ure_misc_dir = 'basis-link/ure-link/share/misc'; -my $ure_java_dir = 'basis-link/ure-link/share/java'; -my $ure_lib_dir = 'basis-link/ure-link/lib'; - -$program_dir = 'openoffice.org/basis-link/MacOS' if ($ENV{OS} eq 'MACOSX'); # FIXME probably wrong - -my @exceptions = ( 'cppuhelper', 'sunjavaplugin', 'libjvmfwk' ); - -my $dllre = '\.so$'; -$dllre = '\.dylib$' if ($ENV{OS} eq 'MACOSX'); - -my %replaceable = ( - $program_dir => "($dllre|\.rdb)", - $ure_lib_dir => "$dllre", - $program_dir . '/resource' => '\.res$', - $program_dir . '/classes' => '\.jar$', - 'basis-link/share/config' => '\.zip$', - 'ure/share/misc' => '\.rdb' -# 'share/uno_packages' => '\.zip$' -); - -my @search_dirs = ( 'lib', 'bin', 'class' ); - -my @known_duplicates = ( 'db.jar', 'libi18n' ); - -sub sniff_target($) -{ - my $build_dir = shift; - my ($dirhandle, $fname); - my ($target, $libver, $lang) = ( 'unxlngi6.pro', '680', 'en-US' ); # defaults - - opendir ($dirhandle, $build_dir) || die "Can't open $build_dir"; - while ($fname = readdir ($dirhandle)) { - $fname =~ /Host.sh$/ || next; - - my $file; - open ($file, "$build_dir/$fname") || die "Can't open $build_dir/$fname"; - while (<$file>) { - /\s*(\S+)\s*=\s*\"(\S+)\"/ || next; - if ($1 eq 'INPATH') { - $target = $2; - } - if ($1 eq 'UPD') { - $libver = $2; - } - } - close ($file); - } - - closedir ($dirhandle); - - print "Sniffed target: $target, $libver\n"; - - return ($target, $libver, $lang); -} - -sub build_installed_list($) -{ - my $path = shift; - my %files = (); - - for my $suffix (keys %replaceable) { - my $dirname = "$path/$suffix"; - my $dirhandle; - my $pattern = $replaceable{$suffix}; - if (opendir ($dirhandle, $dirname)) { - while (my $fname = readdir ($dirhandle)) { - $fname =~ m/$pattern/ || next; - - my $skip = 0; - for $pattern (@exceptions) { - $fname =~ /$pattern/ || next; - $skip = 1; - } - $files{$fname} = $dirname if !$skip; - } - closedir ($dirhandle); - } else { - print "Couldn't find '$dirname': skipping\n"; - } - } - return \%files; -} - -sub check_create_linked($) -{ - my $path = shift; - my $linked_dir = "$path/linked"; - if (! -d $linked_dir) { - mkdir $linked_dir || die "Can't make $linked_dir: $!"; - } -} - -sub do_link($$$$@) -{ - my $src = shift; - my $dest = shift; - my $src_name = shift; - my $dest_name = shift; - my $dont_check_link = shift; - - if (-l "$dest/$dest_name" ) { - my $link = readlink ("$dest/$dest_name"); - if ($link =~ /^\//) { # Absolute path - if (!$dry_run) { - # re-write the link - unlink ("$dest/$dest_name"); - symlink ("$src/$src_name", "$dest/$dest_name") || die "Failed to symlink: $!"; - print " [$dest_name]"; - } else { - print "re-make link $src/$src_name => $dest/$dest_name\n"; - } - } elsif ($dry_run) { - print "skipping symbolic link $dest/$dest_name -> $link\n"; - } - } else { - check_create_linked ($dest); - if (!$dry_run) { - # move / write the link - rename ("$dest/$dest_name", "$dest/linked/$dest_name") || - defined $dont_check_link || die "Failed rename of $dest/$dest_name: $!"; - - symlink ("$src/$src_name", "$dest/$dest_name") || die "Failed to symlink: $!"; - print " $dest_name"; - } else { - print "move / symlink $src/$src_name => $dest/$dest_name\n"; - } - } -} - -sub scan_one_dir($$$$) -{ - my ($installed_files, $build_files, $path, $solver) = @_; - - for my $elem (@search_dirs) { - my $dirh_module; - my $module_path = "$path/$elem"; - if (opendir ($dirh_module, $module_path)) { - while (my $file = readdir ($dirh_module)) { - if (defined $installed_files->{$file}) { - if (defined $build_files->{$file}) { - my $known = 0; - for my $regexp (@known_duplicates) { - if ($file =~ m/$regexp/) { - $known = 1; - } - } - if (!$known && !$solver) { - print STDERR "\nlinkoo:: Unknown duplicate file '$file' in: '" . - $build_files->{$file} . "' vs '" . - $module_path . "' in module $path\n"; - exit (1); - } - } else { - $build_files->{$file} = $module_path; - } - } - } - } - closedir ($dirh_module); - } -} - -sub scan_and_link_files($$$) -{ - my $build_path = shift; - my $installed_files = shift; - my $target = shift; - - my @modules = (); - my $dirh_toplevel; - opendir ($dirh_toplevel, $build_path) || die "Can't open '$build_path': $!"; - while (my $subdir = readdir ($dirh_toplevel)) { - $subdir =~ m/\./ && next; # eg. vcl.old, - my $test = "$build_path/$subdir/$target"; - -d $test || next; - push @modules, $test; - } - closedir ($dirh_toplevel); - - # Scan the old-style module/$target/lib directories ... - my %build_files; - for my $module (@modules) { - scan_one_dir ($installed_files, \%build_files, $module, 0); - } - - # Now scan the solver - my $upd = 300; - $upd = $ENV{UPD} if (defined $ENV{UPD}); - scan_one_dir ($installed_files, \%build_files, "$build_path/solver/$upd/$target", 1); - - for my $file (keys %build_files) { - my $src = $build_files{$file}; - my $dest = $installed_files->{$file}; - - do_link ($src, $dest, $file, $file); - } - print "\n"; -} - -sub evilness($) -{ - my $doit = shift; - my $name = 'librecentfile.so'; - my $src = "$OOO_BUILD/shell/$TARGET/lib/$name"; - my $dest = "$OOO_BUILD/sfx2/$TARGET/lib/$name"; - - if ($doit eq 'undo') { - if (-l $dest) { - print " unlink $name\n"; - unlink $dest; - } - } else { - $doit eq 'do' || die; - if (-f $src) { - print " link $name\n"; - symlink $src, $dest; - } - } -} - -sub link_iso_res() -{ - print "Special iso.res case: "; - my $ooo_res="$OOO_INSTALL/" . $brand_program_dir . "/resource/ooo".$LIBVER.$LANG.".res"; - my $star_res="$OOO_INSTALL/" . $brand_program_dir . "/resource/iso".$LIBVER.$LANG.".res"; - if (-l $ooo_res && -l $star_res) { - if ($dry_run) { - print "link $ooo_res to $star_res"; - } else { - unlink ($star_res); - symlink ($ooo_res, $star_res); - print "clobbered"; - } - } - print "\n"; -} - -sub link_pagein_files() -{ - print "pagein case:"; - my $src = "$OOO_BUILD/desktop/$TARGET/misc"; - my $dest = "$OOO_INSTALL/" . $program_dir; - for my $c ('calc', 'draw', 'impress', 'writer', 'common') { - do_link ($src, $dest, "pagein-$c", "pagein-$c"); - } - print "\n"; -} - -for my $a (@ARGV) { - -# options - if ($a =~ /--dry-run/) { - $dry_run = 1; - } elsif (($a eq '--help') || ($a eq '-h')) { - $usage = 1; - -# ordered arguments - } elsif (!defined $OOO_INSTALL) { - $OOO_INSTALL = $a; - } elsif (!defined $OOO_BUILD) { - $OOO_BUILD = $a; - } else { - print "Unknown argument '$a'\n"; - $usage = 1; - } -} - -if (!defined $OOO_BUILD && defined $ENV{SRC_ROOT}) { - $OOO_BUILD = $ENV{SRC_ROOT}; -} - -if ($usage || !defined $OOO_INSTALL || !defined $OOO_BUILD) { - printf "Usage: linkoo </path/to/ooo/install> [</path/to/ooo/build/tree>] [--dry-run]\n"; - exit (1); -} - -substr ($OOO_INSTALL, 0, 1) eq '/' || die "linkoo requires absolute paths ($OOO_INSTALL does not qualify)"; -substr ($OOO_BUILD, 0, 1) eq '/' || die "linkoo requires absolute paths ($OOO_BUILD does not qualify)"; - --d $OOO_INSTALL || die "No such directory $OOO_INSTALL"; --w $OOO_INSTALL || die "You need write access to $OOO_INSTALL"; --d $OOO_BUILD || die "No such directory $OOO_BUILD"; --d "$OOO_INSTALL/" . $program_dir . "/resource" || die "$OOO_INSTALL doesn't look like an OO install"; - -($TARGET, $LIBVER, $LANG) = sniff_target ($OOO_BUILD); - -evilness ('undo'); - -my $installed_files = build_installed_list ($OOO_INSTALL); - -scan_and_link_files ($OOO_BUILD, $installed_files, $TARGET); -link_iso_res(); -link_pagein_files(); - -if (!-f "$OOO_INSTALL/" . $brand_program_dir . "/ooenv") { - my $ooenv; - print "Creating '$OOO_INSTALL/", $brand_program_dir, "/ooenv'\n"; - open ($ooenv, ">$OOO_INSTALL/" . $brand_program_dir . "/ooenv") || die "Can't open $OOO_INSTALL/" . $brand_program_dir . "/ooenv: $!"; - print $ooenv "thisdir=$OOO_INSTALL/" . $brand_program_dir . "/\n"; - print $ooenv $env_script; - print $ooenv "# testtool\nexport SRC_ROOT=$OOO_BUILD\n"; - close ($ooenv); -} - -evilness ('do'); - -print "\nlinkoo finished, please don't forget to source ooenv before ./soffice.\n"; diff --git a/solenv/bin/localize b/solenv/bin/localize deleted file mode 100755 index 9504e8ee3..000000000 --- a/solenv/bin/localize +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -if [ x${SOLARENV}x = xx ]; then - echo No environment found, please use 'setsolar' -exit 1 -fi - -# localize.pl calls localize_sl in solver bin directory which depends on dynamic -# libraries in solver lib directory but has no correct RPATH (or equivalent): -if [ "${OS?}" = MACOSX ]; then - export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH:+${DYLD_LIBRARY_PATH}:}${SOLARVERSION?}/${INPATH?}/lib -else - export LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}${SOLARVERSION?}/${INPATH?}/lib -fi - -exec perl -w $SOLARVERSION/$INPATH/bin/localize.pl "$@" diff --git a/solenv/bin/localize_sl b/solenv/bin/localize_sl deleted file mode 100755 index d0db56084..000000000 --- a/solenv/bin/localize_sl +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -if [ x${SOLARENV}x = xx ]; then - echo No environment found, please use 'setsolar' -exit 1 -fi - -if [ "${OS?}" = MACOSX ]; then - export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH:+${DYLD_LIBRARY_PATH}:}${SOLARVERSION?}/${INPATH?}/lib -else - export LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}${SOLARVERSION?}/${INPATH?}/lib -fi - -exec $SOLARVERSION/$INPATH/bin/localize_sl "$@" diff --git a/solenv/bin/macosx-change-install-names.pl b/solenv/bin/macosx-change-install-names.pl deleted file mode 100644 index 29bf64de2..000000000 --- a/solenv/bin/macosx-change-install-names.pl +++ /dev/null @@ -1,124 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -use lib ("$ENV{SOLARENV}/bin/modules"); -use macosxotoolhelper; - -sub action($$$) -{ - my %action = - ('app/UREBIN/URELIB' => '@executable_path/../lib', - 'app/OOO/URELIB' => '@executable_path/../ure-link/lib', - 'app/OOO/OOO' => '@executable_path', - 'app/SDK/URELIB' => '@executable_path/../../ure-link/lib', - 'app/BRAND/URELIB' => '@executable_path/../basis-link/ure-link/lib', - 'app/BRAND/OOO' => '@executable_path/../basis-link/program', - 'app/NONE/URELIB' => '@__VIA_LIBRARY_PATH__', - 'app/NONE/OOO' => '@__VIA_LIBRARY_PATH__', - 'app/NONE/NONE' => '@__VIA_LIBRARY_PATH__', - 'shl/URELIB/URELIB' => '@loader_path', - 'shl/OOO/URELIB' => '@loader_path/../ure-link/lib', - 'shl/OOO/OOO' => '@loader_path', - 'shl/LOADER/LOADER' => '@loader_path', - 'shl/OXT/URELIB' => '@executable_path/urelibs', - 'shl/BOXT/URELIB' => '@executable_path/urelibs', - 'shl/BOXT/OOO' => '@loader_path/../../../basis-link/program', - 'shl/NONE/URELIB' => '@__VIA_LIBRARY_PATH__', - 'shl/OOO/NONE' => '@__VIA_LIBRARY_PATH__', - 'shl/NONE/OOO' => '@__VIA_LIBRARY_PATH__', - 'shl/NONE/NONE' => '@__VIA_LIBRARY_PATH__'); - my ($type, $loc1, $loc2) = @_; - my $act = $action{"$type/$loc1/$loc2"}; - die "illegal combination $type/$loc1/$loc2" unless defined $act; - return $act; -} - -@ARGV == 3 || @ARGV >= 2 && $ARGV[0] eq "extshl" or die - 'Usage: app|shl|extshl UREBIN|URELIB|OOO|SDK|BRAND|OXT|BOXT|NONE|LOADER <filepath>*'; -$type = shift @ARGV; -$loc = shift @ARGV; -if ($type eq "SharedLibrary") -{ - $type = "shl"; -} -if ($type eq "Executable") -{ - $type = "app" -} -if ($type eq "Library") -{ - $type = "shl" -} -if ($type eq "extshl") -{ - $type = "shl"; - my $change = ""; - my %inames; - foreach $file (@ARGV) - { - my $iname = otoolD($file); - (defined $iname ? $iname : $file . "\n") =~ m'^(.*?([^/]+))\n$' or - die "unexpected otool -D output"; - $change .= " -change $1 " . action($type, $loc, $loc) . "/$2"; - $inames{$file} = $2; - } - if( $loc eq "LOADER" ) - { - foreach $file (@ARGV) - { - my $call = "install_name_tool$change -id \@loader_path/$inames{$file} $file"; - system($call) == 0 or die "cannot $call"; - } - } - else - { - foreach $file (@ARGV) - { - my $call = "install_name_tool$change -id \@__________________________________________________$loc/$inames{$file} $file"; - system($call) == 0 or die "cannot $call"; - } - } -} -foreach $file (@ARGV) -{ - my $call = "otool -L $file"; - open(IN, "-|", $call) or die "cannot $call"; - my $change = ""; - while (<IN>) - { - $change .= " -change $1 " . action($type, $loc, $2) . "$3" - if m'^\s*(@_{50}([^/]+)(/.+)) \(compatibility version \d+\.\d+\.\d+, current version \d+\.\d+\.\d+\)\n$'; - $change .= ' -change '.$1.' @loader_path/'.$2 - if m'^\s*(/python-inst/(OOoPython.framework/Versions/[^/]+/OOoPython))'; - } - close(IN); - if ($change ne "") - { - $call = "install_name_tool$change $file"; - system($call) == 0 or die "cannot $call"; - } -} diff --git a/solenv/bin/macosx-create-bundle b/solenv/bin/macosx-create-bundle deleted file mode 100755 index 4b03e076f..000000000 --- a/solenv/bin/macosx-create-bundle +++ /dev/null @@ -1,105 +0,0 @@ -#!/bin/sh -#************************************************************************* -# -# 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. -# -#************************************************************************* - -# Documentation -# ------------- -# -# The purpose of this script to take Mac OS X executables and shared libraries -# and package them into the required Mac OS X bundle format. -# -# This script has the following usage: -# macosx-create-bundle file1 [file2] ... [fileN] -# -# Note that file1 through fileN can in either of the following formats: -# - A file name -# - A file name and a directory to look for missing files. To use this option, -# use the following format: -# filename=directory -# -# The file argument is the file that you want to package into a Mac OS X -# bundle. Currently, this script will only package executables and shared -# libraries. -# -# The output for each executable will be a bundle named <file>.app and -# the output for each shared library will be a symlink from libfoo.jnilib -# back to libfoo.dylib. -# These output directories will be in the same directory as the executable or -# shared library. - -# Code -# ---- - -# Parse command line arguments -if [ $# = 0 ]; then - printf "macosx-create-bundle: error: incorrect number of arguments\n" >&2 - printf "Usage: macosx-create-bundle file1 [file2] ... [fileN]\n" >&2 - exit 1 -fi - -while [ $# != 0 ]; do - inputfile=`echo "$1" | awk -F= '{print $1}'` - sourcedir=`echo "$1" | awk -F= '{print $2}'` - - shift - - inputfilename=`basename "$inputfile"` - outputdir=`dirname "$inputfile"` - - solverlibdir="$SOLARVERSION/$INPATH/lib" - locallibdir="../../../../lib" - - solverbindir="$SOLARVERSION/$INPATH/bin" - localbindir="../../.." - - # Determine file type - filetype=`file -L "$inputfile"` - - # Create bundle based on file type - if printf "$filetype" | grep -q 'Mach-O executable'; then - - # Do nothing as this step is obsolete - : - - elif printf "$filetype" | grep -q 'Mach-O dynamically linked shared library'; then - # Screen out lib\w+static libraries as they are not used directly - if ! printf "$inputfilename" | grep -q -x -E 'lib\w+static.*\.dylib'; then - # Create jnilib link - inputjnilibname="`basename $inputfilename .dylib`.jnilib" - if [ ! -L "$outputdir/$inputjnilibname" ]; then - rm -Rf "$outputdir/$inputjnilibname" - fi - # Link jnilib - ln -sf "$inputfilename" "$outputdir/$inputjnilibname" - - #printf "macosx-create-bundle: $outputdir/$inputjnilibname successfully created\n" - fi - else - printf "macosx-create-bundle: error: file is not an executable or shared library.\n" >&2 - exit 1 - fi -done diff --git a/solenv/bin/macosx-dylib-link-list.pl b/solenv/bin/macosx-dylib-link-list.pl deleted file mode 100644 index bf1d4da40..000000000 --- a/solenv/bin/macosx-dylib-link-list.pl +++ /dev/null @@ -1,92 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -use lib ("$ENV{SOLARENV}/bin/modules"); -use macosxotoolhelper; - -sub locate($) -{ - my ($lib) = @_; - my $dir; - foreach $dir (@dirs) - { - my $path = "$dir/$lib"; - if (-e $path) - { - return $path; - } - } - return; -} - -sub handle($$) -{ - my ($from, $to) = @_; - # wrap -dylib_file in -Wl so that hopefully any used tool whatsoever (e.g., - # libtool generated from xmlsec1-1.2.6/configure included in - # libxmlsec/download/xmlsec1-1.2.6.tar.gz:1.3) passes it through to the - # linker: - !($from =~ /,/ || $to =~ /,/) or - die "$from:$to contains commas and cannot go into -Wl"; - print " -Wl,-dylib_file,$from:$to"; - $done{$from} = 1; - push(@todo, $to) if (grep {$_ eq $to} @todo) == 0; -} - -foreach (@ARGV) { push(@dirs, $1) if /^-L(.*)$/; } -foreach (@ARGV) -{ - if (/^-l(.*)$/) - { - my $loc = locate("lib$1.dylib"); - handle($1, $loc) if defined $loc && otoolD($loc) =~ m'^(@.+/.+)\n$'; - } -} -foreach $file (@todo) -{ - my $call = "otool -L $file"; - open(IN, "-|", $call) or die "cannot $call"; - while (<IN>) - { - if (m'^\s*(@.+/([^/]+)) \(compatibility version \d+\.\d+\.\d+, current version \d+\.\d+\.\d+\)\n$') - { - my $full = $1; - my $loc = locate($2); - $loc = locate($1) if $full =~ m'^\s*@loader_path/(OOoPython.framework/Versions/[^/]+/OOoPython)'; - if (defined $loc) - { - handle($full, $loc) unless defined $done{$full}; - } - else - { - die "unknown $full (from $file)"; - } - } - } - close(IN); -} -print "\n"; diff --git a/solenv/bin/make_download.pl b/solenv/bin/make_download.pl deleted file mode 100644 index 0aeb060ce..000000000 --- a/solenv/bin/make_download.pl +++ /dev/null @@ -1,126 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -################# -# use -################# - -use lib ("$ENV{SOLARENV}/bin/modules"); - -use Cwd; -use File::Copy; -use installer::download; -use installer::downloadsigner; -use installer::exiter; -use installer::followme; -use installer::globals; -use installer::logger; -use installer::windows::sign; - -################################################# -# Main program -################################################# - -installer::downloadsigner::getparameter(); -installer::downloadsigner::checkparameter(); - -my $temppath = installer::downloadsigner::set_temp_path(); -my $infofilelist = installer::downloadsigner::createproductlist(); -installer::downloadsigner::publishproductlist($infofilelist); - -foreach my $infofilename ( @{$infofilelist} ) -{ - installer::logger::starttime(); - - my $success = 1; - my $do_copy = 1; - my $followmeinfohash = installer::followme::read_followme_info($infofilename); - installer::downloadsigner::setlogfilename(); # Successful after reading followme file, resetting log file - if ( $installer::globals::writetotemp ) { installer::downloadsigner::set_output_pathes_to_temp($followmeinfohash, $temppath); } - if ( $installer::globals::useminor ) { installer::downloadsigner::set_minor_into_pathes($followmeinfohash, $temppath); } - - if (( ! $installer::globals::iswindowsbuild ) && ( $installer::globals::dosign )) - { - installer::logger::print_message( "... WARNING: Signing only for Windows platforms active ...\n" ); - } - - if (( $installer::globals::iswindowsbuild ) && ( $installer::globals::dosign )) - { - $followmeinfohash->{'finalinstalldir'} = installer::windows::sign::sign_install_set($followmeinfohash, $do_copy, $temppath); - - ($success, $followmeinfohash->{'finalinstalldir'}) = installer::worker::analyze_and_save_logfile($followmeinfohash->{'loggingdir'}, - $followmeinfohash->{'finalinstalldir'}, - $followmeinfohash->{'installlogdir'}, - "", - \$followmeinfohash->{'languagestring'}, - $followmeinfohash->{'currentinstallnumber'}); - - if ( ! $success ) { installer::exiter::exit_program("ERROR: Signing installation set failed: $followmeinfohash->{'finalinstalldir'}", "Main"); } - } - - if ( ! $installer::globals::nodownload ) - { - $followmeinfohash->{'finalinstalldir'} = installer::download::create_download_sets($followmeinfohash->{'finalinstalldir'}, - $followmeinfohash->{'includepatharray'}, - $followmeinfohash->{'allvariableshash'}, - $followmeinfohash->{'downloadname'}, - \$followmeinfohash->{'languagestring'}, - $followmeinfohash->{'languagesarray'}); - - ($success, $followmeinfohash->{'finalinstalldir'}) = installer::worker::analyze_and_save_logfile($followmeinfohash->{'loggingdir'}, - $followmeinfohash->{'finalinstalldir'}, - $followmeinfohash->{'installlogdir'}, - "", - \$followmeinfohash->{'languagestring'}, - $followmeinfohash->{'currentinstallnumber'}); - - if (( $success ) && ( $installer::globals::iswindowsbuild ) && ( $installer::globals::dosign )) - { - $do_copy = 0; - $followmeinfohash->{'finalinstalldir'} = installer::windows::sign::sign_install_set($followmeinfohash, $do_copy, $temppath); - - ($success, $followmeinfohash->{'finalinstalldir'}) = installer::worker::analyze_and_save_logfile($followmeinfohash->{'loggingdir'}, - $followmeinfohash->{'finalinstalldir'}, - $followmeinfohash->{'installlogdir'}, - "", - \$followmeinfohash->{'languagestring'}, - $followmeinfohash->{'currentinstallnumber'}); - } - } - - if ( $success ) - { - installer::worker::clean_output_tree(); - if ( $installer::globals::followme_from_directory ) { installer::downloadsigner::rename_followme_infofile($infofilename); } - } - - installer::logger::stoptime(); -} - -#################################### -# Main program end -#################################### diff --git a/solenv/bin/make_ext_update_info.pl b/solenv/bin/make_ext_update_info.pl deleted file mode 100755 index c3e3b50cf..000000000 --- a/solenv/bin/make_ext_update_info.pl +++ /dev/null @@ -1,613 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - -#here the definition for d would be written into dependencies. The reason is that when the event handler -#for the element is called, we can only find out the namespace but not the prefix. So we cannot -#distinguish if the namespace is used because the element was prefixed or because it uses the default -#namespace. -use warnings; -use strict; - -use XML::Parser; -use Getopt::Long; -use Carp; - -sub getUpdateInfoFileName($); -sub writeUpdateInformationData($); -sub findAttribute($$); -sub getNotDefPrefs($$$); -sub collectPrefixes($$$$); -sub determineNsDefinitions($$$); -sub determineNsDefinitionForItem($$$); - -my $inDescription = 0; -my $inDependencies = 0; -my $inIdentifier = 0; -my $inVersion = 0; -my $descNS = "http://openoffice.org/extensions/description/2006"; - my $indent; -my $identifier; -my $version; - -#contains prefixes and the corresponding namespaces which are used in the <dependencies> -#element and all children of the description.xml -my @usedNsInDependencies; - -#Maps prefix to namespaces which are valid in <dependencies>. That is, they are -#either defined in <dependencies> or in the hirarchy above <dependencies> -my %validPrefsInDep; -#Contains the prefixes which are defined in <dependencies> -my @newPrefsInDep; -#Contains the prefixes/namespaces which need to be defined in <dependencies> but which are currently -#not. For example a prefix is defined in the parent and is used in a child of <dependencies> -my %notDefInDep; - -#prefix used in start and end element -my $prefix; - -#The default namespace valid in <dependencies> -my $defNsInDep; -#The prefix which we use for the default namespace used in <dependencies> -my $generatedPrefix; - -my $helptext = -"make_ext_update_info.pl produces an update information file for an extension. ". -"It will use a dummy URL as URL for the extension update unless a URL has been ". -"provided with the --update_url option. The name of the update ". -"information file, which must be provided with the --out switch, should be formed ". -"according to this scheme: \n\n". -"extension_identifier.update.xml\n\n". -"extension_identifier should correspond to the extension identifier. In some cases ". -"this may not be possible because the identifier may contain characters which are not ". -"allowd in file names.\n\n". -"usage:\n". -"perl make_ext_update_info.pl [--help][--update_url url] --out update_information_file description.xml \n\n". -"Options: \n". -"--help - prints the help message and exits \n". -"--out file - the update information file to be written including the path \n". -"--update-url url - inserts the url under the <update-download> element. It may be necessary to enclose the urls in quotes in case they contain characters such as \"?\". ". -"It can be used multiple times\n\n"; - -#handling of arguments -my $help = 0; -my $out; -my @update_urls; -if (!GetOptions('help|?' => \$help, - 'out=s' => \$out, - 'update-url=s'=> \@update_urls)) -{ - print $helptext; - exit -1; -} -my $cArgs = scalar @ARGV; -die "You need to provide a description.xml\n\n$helptext" if $cArgs ==0; -die "You need to provide the name of the update information file ". - "with the --out switch.\n" unless ($out); -die "Too many arguments. \n\n$helptext" if $cArgs > 1; -print $helptext if $help; - - -#open the update information file for writing -my $FH; -open $FH, "> $out" or die $!; - -#write the xml header and root element -print $FH '<?xml version="1.0" encoding="UTF-8"?>', "\n"; -print $FH '<description xmlns="http://openoffice.org/extensions/update/2006"', "\n"; -print $FH ' xmlns:xlink="http://www.w3.org/1999/xlink">', "\n"; - -#obtain from description.xml the data for the update information -writeUpdateInformationData($ARGV[0]); -#We will die if there is no <version> or <identifier> in the description.xml -die "Error: The description.xml does not contain a <identifier> element.\n" unless $identifier; -die "Error: The description.xml does not contain a <version> element. \n" unless $version; - -#write the write the update-download element and the children. -#the indention of <update-download> corresponds to that of <version> -print $FH ' 'x$indent, '<update-download>', "\n"; -#check if update-urls have been provided through --update-url option -if (scalar @update_urls) -{ - my $urlIndent = $indent > 8 ? 8 : 2 * $indent; - #use provided urls - for (@update_urls) - { - print $FH ' 'x$urlIndent, '<src xlink:href="'.$_.'" />', "\n"; - } -} -else -{ - #use dummy update url - print $FH ' 'x8, '<src xlink:href="http://extensions.openoffice.org/testarea/dummy.oxt" />', "\n"; -} -print $FH ' 'x$indent, '</update-download>', "\n"; - -print $FH '</description>', "\n"; -close $FH; - -exit 0; - - - -sub start_handler -{ - my $parser = shift; - my $name = shift; - - if ($name eq "description" - && $descNS eq $parser->namespace($name)) - { - $inDescription = 1; - } - elsif ($inDescription - && $name eq "version" - && $descNS eq $parser->namespace($name)) - { - $inVersion = 1; - $version = 1; - $indent = $parser->current_column(); - print $FH " "x$indent, $parser->original_string(); - } - elsif ($inDescription - && $name eq "identifier" - && $descNS eq $parser->namespace($name)) - { - $inIdentifier = 1; - $identifier = 1; - print $FH " "x$parser->current_column(), $parser->original_string(); - } - elsif ($inDescription - && $name eq "dependencies" - && $descNS eq $parser->namespace($name)) - { - $inDependencies = 1; - my $dep = $parser->original_string(); - #add the additional namespace definitions, which we have discovered during the first - #parsing - #cut of the closing > or /> from the start element, so we can append the namespace definitions - $dep =~ /(\s*<.*) ((\s*\/>)|(\s*>))/x; - my $dep1 = $1; - $dep1.= " xmlns:".$_.'="'.$notDefInDep{$_}.'"' for (keys %notDefInDep); - $dep1.= $2; - print $FH " "x$parser->current_column(), $dep1; - } - elsif ($inDependencies) - { - #$prefix is global because we need to use it in the end element as well. - $prefix = ""; - my $fullString; - my $orig = $parser->original_string(); - #Split up the string so we can insert the prefix for the element. - # <OpenOffice.org-minimal-version> - # <d:OpenOffice.org-minimal-version> - $orig=~/(\s*<)(.*?)\s/x; - #in $2 is the element name, look for the prefix - if ($2 !~/(.*?):/ && $parser->namespace($name)) { - #no prefix, that is element uses default namespace. - #Now check if the default namespace in <dependencies> is the same as the one in this - #element. If not, then the default ns was defined "after" <dependencies>. Because all - #children of <dependencies> are copied into the update information, so will this default - #namespace definition. Hence this element will have the same default namespace in the - #update information. - my $defNsDep = $validPrefsInDep{"#default"}; - #we must have #default, see the if statement above - my $defNsCur = $parser->expand_ns_prefix("#default"); - - if ($defNsDep eq $defNsCur) { - #Determine if there is in <dependency> a prefix defined (only valid there and need not - #directly defined in this element). If there is no prefix defined then we will - #add a new definition to <dependencies>. - for (keys %validPrefsInDep) { - if (($validPrefsInDep{$_} eq $defNsDep) && $_ ne "#default") { - $prefix = $_; last; - } - } - if (! $prefix) { - #If there was no prefix, we will add new prefix definition to <dependency> - #Which prefix this is has been determined during the first parsing. - for (keys %notDefInDep) { - if (($notDefInDep{$_} eq $defNsCur) && $_ ne "#default") { - $prefix = $_; last; - } - } - } - #die if we have no prefix - confess "No prefix defined for default namespace " unless $prefix; - #get the full part after < - $orig=~/(\s*<)(.*)/x; - $fullString= $1.$prefix.":".$2; - } - - } - $fullString = $orig unless $fullString; - - # We record anything within <dependencies> </dependencies>. - print $FH $fullString; - } -} - -sub end_handler -{ - my $parser = shift; - my $name = shift; - - if ($name eq "description" - && $descNS eq $parser->namespace($name)) - { - $inDescription = 0; - } - elsif ($inDescription - && $name eq "version" - && $descNS eq $parser->namespace($name)) - { - $inVersion = 0; - print $FH $parser->original_string(), "\n"; - } - elsif ($inDescription - && $name eq "identifier" - && $descNS eq $parser->namespace($name)) - { - $inIdentifier = 0; - print $FH $parser->original_string(), "\n"; - } - elsif($inDescription - && $name eq "dependencies" - && $descNS eq $parser->namespace($name)) - { - $inDependencies = 0; - print $FH $parser->original_string(), "\n"; - } - elsif ($inDependencies) - { - my $orig = $parser->original_string(); - #$orig is empty if we have tags like this: <name /> - if ($orig && $prefix) { - $orig=~/(\s*<\/)(.*)/x; - $orig= $1.$prefix.":".$2; - } - print $FH $orig; - } -} - -#We write the complete content between start and end tags of -# <identifier>, <version>, <dependencies> -sub default_handler -{ - my $parser = shift; - my $name = shift; - if ($inIdentifier || $inVersion) { - print $FH $parser->original_string(); - } elsif ($inDependencies) { - print $FH $parser->original_string(); - } - -} # End of default_handler - -#sax handler used for the first parsing to recognize the used prefixes in <dependencies > and its -#children and to find out if we need to define a new prefix for the current default namespace. -sub start_handler_infos -{ - my $parser = shift; - my $name = shift; - if ($name eq "description" - && $descNS eq $parser->namespace($name)) { - $inDescription = 1; - } - elsif ($inDescription - && $name eq "dependencies" - && $descNS eq $parser->namespace($name)) { - $inDependencies = 1; - #build the map of prefix/namespace which are valid in <dependencies> - my @cur = $parser->current_ns_prefixes(); - for (@cur) { - $validPrefsInDep{$_} = $parser->expand_ns_prefix($_); - } - #remember the prefixes defined in <dependencies> - @newPrefsInDep = $parser->new_ns_prefixes(); - - collectPrefixes($parser, $name, \@_, \@usedNsInDependencies); - return if $generatedPrefix; - - #determine if need to create a new prefix for the current element if it uses a default ns. - #Split up the string so we can see if there is a prefix used - # <OpenOffice.org-minimal-version> - # <d:OpenOffice.org-minimal-version> - my $orig = $parser->original_string(); - $orig=~/(\s*<)(.*?)\s/x; - #in $2 is the element name, look for the prefix - if ($2 !~/(.*?):/ && $parser->namespace($name)) { - #no prefix, that is element uses default namespace. - #Now check if the default namespace in <dependencies> is the same as the one in this - #element. If not, then the default ns was defined "after" <dependencies>. Because all - #children of <dependencies> are copied into the update information, so will this default - #namespace definition. Hence this element will have the same default namespace in the - #update information. - my $defNsDep = $validPrefsInDep{"#default"}; - #we must have #default, see the if statement above - my $defNsCur = $parser->expand_ns_prefix("#default"); - - if ($defNsDep eq $defNsCur) { - #Determine if there is in <dependency> a prefix defined (only valid there and need not - #directly defined in this element). If there is no prefix defined then we will - #add a new definition to <dependencies>. - for (keys %validPrefsInDep) { - if (($validPrefsInDep{$_} eq $defNsDep) && $_ ne "#default") { - $prefix = $_; last; - } - } - - if (! $prefix) { - - #define a new prefix - #actually there can be only onle prefix, which is the case when the element - #uses the same default namespace as <dependencies> otherwise, the default - #namespace was redefined by the children of <dependencies>. These are completely - #copied and still valid in the update information file - $generatedPrefix = "a"; - $defNsInDep = $defNsDep; - } - } - } - - } - elsif ($inDependencies) { - determineNsDefinitions($parser, $name, \@_); - collectPrefixes($parser, $name, \@_, \@usedNsInDependencies); - } -} -#sax handler used for the first parsing to recognize the used prefixes in <dependencies > and its -#children -sub end_handler_infos -{ - my $parser = shift; - my $name = shift; - - if ($name eq "description" - && $descNS eq $parser->namespace($name)) { - $inDescription = 0; - } - elsif($inDescription - && $name eq "dependencies" - && $descNS eq $parser->namespace($name)) { - $inDependencies = 0; - } -} - -sub writeUpdateInformationData($) -{ - my $desc = shift; - { - #parse description xml to collect information about all used - #prefixes and names within <dependencies> - - my $parser = new XML::Parser(ErrorContext => 2, - Namespaces => 1); - $parser->setHandlers(Start => \&start_handler_infos, - End => \&end_handler_infos); - - $parser->parsefile($desc); - - - } - #remove duplicates in the array containing the prefixes - if ($generatedPrefix) { - my %hashtmp; - @usedNsInDependencies = grep(!$hashtmp{$_}++, @usedNsInDependencies); - - #check that the prefix for the default namespace in <dependencies> does not clash - #with any other prefixes - my $clash; - do { - $clash = 0; - for (@usedNsInDependencies) { - if ($_ eq $generatedPrefix) { - $generatedPrefix++; - $clash = 1; last; - } - } - } while ($clash); - $notDefInDep{$generatedPrefix} = $defNsInDep; - } - #if $notDefInDep contains the prefix #default then we need to add the generated prefix as well - - #add the special prefix for the default namespace into the map of prefixes that will be - #added to the <dependencies> element in the update information file - - - ($inDependencies, $inDescription) = (0,0); - { - my $parser = new XML::Parser(ErrorContext => 2, - Namespaces => 1); - $parser->setHandlers( - Start => \&start_handler, - End => \&end_handler, - Default => \&default_handler); - $parser->parsefile($desc); - } -} - -# param 1: name of the attribute we look for -# param 2: array of name value pairs, the first subscript is the attribute and the second -# is the value. -sub findAttribute($$) -{ - my ($name, $args_r) = @_; - my @args = @{$args_r}; - my $value; - while (my $attr = shift(@args)) - { - if ($attr eq $name) { - $value = shift(@args); - die "href attribut has no valid URL" unless $value; - last; - } else { # shift away the following value for the attribute - shift(@args); - } - } - return $value; -} - -#collect the prefixes used in an xml element -#param 1: parser, -#param 2: element name, -#param 3: array of name and values of attributes -#param 4: out parameter, the array containing the prefixes -sub collectPrefixes($$$$) -{ - my $parser = shift; - my $name = shift; - my $attr_r = shift; - my $out_r = shift; - #get the prefixes which are currently valid - my @cur = $parser->current_ns_prefixes(); - my %map_ns; - #get the namespaces for the prefixes - for (@cur) { - if ($_ eq '#default') { - next; - } - my $ns = $parser->expand_ns_prefix($_); - $map_ns{$ns} = $_; - } - #investigat ns of element - my $pref = $map_ns{$parser->namespace($name)}; - push(@{$out_r}, $pref) if $pref; - #now go over the attributes - - while (my $attr = shift(@{$attr_r})) { - my $ns = $parser->namespace($attr); - if (! $ns) { - shift(@{$attr_r}); - next; - } - $pref = $map_ns{$ns}; - push( @{$out_r}, $pref) if $pref; - shift(@{$attr_r}); - } - #also add newly defined prefixes - my @newNs = $parser->new_ns_prefixes(); - for (@newNs) { - if ($_ eq '#default') { - next; - } - push (@{$out_r}, $_); - } -} - -#The function is called for each child element of dependencies. It finds out the prefixes -#which are used by the children and which are defined by the parents of <dependencies>. These -#would be lost when copying the children of <dependencies> into the update information file. -#Therefore these definitions are collected so that they then can be written in the <dependencies> -#element of the update information file. -#param 1: parser -#param 2: namsepace -#param 3: the @_ received in the start handler -sub determineNsDefinitions($$$) -{ - my ($parser, $name, $attr_r) = @_; - my @attr = @{$attr_r}; - - determineNsDefinitionForItem($parser, $name, 1); - - while (my $attr = shift(@attr)) { - determineNsDefinitionForItem($parser, $attr, 0); - shift @attr; - } -} - -#do not call this function for the element that does not use a prefix -#param 1: parser -#param 2: name of the element or attribute -#param 3: 1 if called for an elment name and 0 when called for attribue -sub determineNsDefinitionForItem($$$) -{ - my ($parser, $name) = @_; - my $ns = $parser->namespace($name); - if (! $ns) { - return; - } - #If the namespace was not kwown in <dependencies> then it was defined in one of its children - #or in this element. Then we are done since this namespace definition is copied into the - #update information. - my $bNsKnownInDep; - for ( keys %validPrefsInDep) { - if ( $validPrefsInDep{$_} eq $ns) { - $bNsKnownInDep = 1; - last; - } - } - #If the namespace of the current element is known in <dependencies> then check if the same - #prefix is used. If not, then the prefix was defined in one of the children of <dependencies> - #and was assigned the same namespace. Because we copy of children into the update information, - #this definition is also copied. - if ($bNsKnownInDep) { - #create a map of currently valid prefix/namespace - my %curPrefToNs; - my @curNs = $parser->current_ns_prefixes(); - for (@curNs) { - $curPrefToNs{$_} = $parser->expand_ns_prefix($_); - } - #find the prefix used in <dependencies> to define the namespace of the current element - my $validDepPref; - for (keys %validPrefsInDep) { - if ($validPrefsInDep{$_} eq $ns) { - #ignore #default - next if $_ eq "#default"; - $validDepPref = $_; - last; - } - } - #find the prefix defined in the current element used for the namespace of the element - my $curPref; - for (keys %curPrefToNs) { - if ($curPrefToNs{$_} eq $ns) { - #ignore #default - next if $_ eq "#default"; - $curPref = $_; - last; - } - } - if ($curPref && $validDepPref && ($curPref eq $validDepPref)) { - #If the prefixes and ns are the same, then the prefix definition of <dependencies> or its - #parent can be used. However, we need to find out which prefixed are NOT defined in - #<dependencies> so we can add them to it when we write the update information. - my $bDefined = 0; - for (@newPrefsInDep) { - if ($curPref eq $_) { - $bDefined = 1; - last; - } - } - if (! $bDefined) { - $notDefInDep{$curPref} = $ns; - } - } - } -} diff --git a/solenv/bin/make_installer.pl b/solenv/bin/make_installer.pl deleted file mode 100644 index d895cc9d9..000000000 --- a/solenv/bin/make_installer.pl +++ /dev/null @@ -1,2386 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -################# -# use -################# - -use lib ("$ENV{SOLARENV}/bin/modules"); - -use Cwd; -use File::Copy; -use installer::archivefiles; -use installer::control; -use installer::converter; -use installer::copyproject; -use installer::download; -use installer::environment; -use installer::epmfile; -use installer::exiter; -use installer::files; -use installer::followme; -use installer::globals; -use installer::helppack; -use installer::languagepack; -use installer::languages; -use installer::logger; -use installer::packagelist; -use installer::packagepool; -use installer::parameter; -use installer::pathanalyzer; -use installer::profiles; -use installer::scppatchsoname; -use installer::scpzipfiles; -use installer::scriptitems; -use installer::setupscript; -use installer::simplepackage; -use installer::sorter; -use installer::strip; -use installer::substfilenamefiles; -use installer::upx; -use installer::systemactions; -use installer::windows::assembly; -use installer::windows::binary; -use installer::windows::component; -use installer::windows::createfolder; -use installer::windows::directory; -use installer::windows::feature; -use installer::windows::featurecomponent; -use installer::windows::file; -use installer::windows::font; -use installer::windows::icon; -use installer::windows::idtglobal; -use installer::windows::inifile; -use installer::windows::java; -use installer::windows::media; -use installer::windows::mergemodule; -use installer::windows::msiglobal; -use installer::windows::msp; -use installer::windows::patch; -use installer::windows::property; -use installer::windows::removefile; -use installer::windows::registry; -use installer::windows::selfreg; -use installer::windows::shortcut; -use installer::windows::strip; -use installer::windows::update; -use installer::windows::upgrade; -use installer::worker; -use installer::xpdinstaller; -use installer::ziplist; - -################################################# -# Main program -################################################# - -################################################# -# Part 1: The platform independent part -################################################# - -################################################# -# Part 1a: The language independent part -################################################# - -installer::logger::starttime(); - -######################################### -# Checking the environment and setting -# most important variables -######################################### - -installer::logger::print_message( "... checking environment variables ...\n" ); -my $environmentvariableshashref = installer::control::check_system_environment(); - -installer::environment::set_global_environment_variables($environmentvariableshashref); - -################################# -# Check and output of parameter -################################# - -installer::parameter::saveparameter(); -installer::parameter::getparameter(); - -# debugging can start after function "getparameter" -if ( $installer::globals::debug ) { installer::logger::debuginfo("\nPart 1: The platform independent part\n"); } -if ( $installer::globals::debug ) { installer::logger::debuginfo("\nPart 1a: The language independent part\n"); } - -installer::parameter::control_fundamental_parameter(); -installer::parameter::setglobalvariables(); -installer::parameter::control_required_parameter(); - -if (!($installer::globals::languages_defined_in_productlist)) { installer::languages::analyze_languagelist(); } -installer::parameter::outputparameter(); - -installer::control::check_updatepack(); - -$installer::globals::build = uc($installer::globals::build); # using "SRC680" instead of "src680" - -###################################### -# Creating the log directory -###################################### - -my $loggingdir = installer::systemactions::create_directories("logging", ""); -$loggingdir = $loggingdir . $installer::globals::separator; -$installer::globals::exitlog = $loggingdir; - -my $installdir = ""; -my $currentdir = cwd(); -my $shipinstalldir = ""; -my $current_install_number = ""; - -###################################### -# Checking the system requirements -###################################### - -installer::logger::print_message( "... checking required files ...\n" ); -installer::control::check_system_path(); - -my $pathvariableshashref = installer::environment::create_pathvariables($environmentvariableshashref); - -############################################### -# Checking saved setting for Windows patches -############################################### - -if (( $installer::globals::iswindowsbuild ) && ( $installer::globals::prepare_winpatch )) { installer::windows::msiglobal::read_saved_mappings(); } - -################################################### -# Analyzing the settings and variables in zip.lst -################################################### - -installer::logger::globallog("zip list file: $installer::globals::ziplistname"); - -my $ziplistref = installer::files::read_file($installer::globals::ziplistname); - -installer::logger::print_message( "... analyzing $installer::globals::ziplistname ... \n" ); - -my ($productblockref, $parent) = installer::ziplist::getproductblock($ziplistref, $installer::globals::product, 1); # product block from zip.lst -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "productblock.log" ,$productblockref); } - -my ($settingsblockref, undef) = installer::ziplist::getproductblock($productblockref, "Settings", 0); # settings block from zip.lst -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "settingsblock1.log" ,$settingsblockref); } - -$settingsblockref = installer::ziplist::analyze_settings_block($settingsblockref); # select data from settings block in zip.lst -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "settingsblock2.log" ,$settingsblockref); } - -my $allsettingsarrayref = installer::ziplist::get_settings_from_ziplist($settingsblockref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allsettings1.log" ,$allsettingsarrayref); } - -my $allvariablesarrayref = installer::ziplist::get_variables_from_ziplist($settingsblockref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allvariables1.log" ,$allvariablesarrayref); } - -my ($globalproductblockref, undef) = installer::ziplist::getproductblock($ziplistref, $installer::globals::globalblock, 0); # global product block from zip.lst -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "globalproductblock.log" ,$globalproductblockref); } - -while (defined $parent) -{ - my $parentproductblockref; - ($parentproductblockref, $parent) = installer::ziplist::getproductblock( - $ziplistref, $parent, 1); - my ($parentsettingsblockref, undef) = installer::ziplist::getproductblock( - $parentproductblockref, "Settings", 0); - $parentsettingsblockref = installer::ziplist::analyze_settings_block( - $parentsettingsblockref); - my $allparentsettingsarrayref = - installer::ziplist::get_settings_from_ziplist($parentsettingsblockref); - my $allparentvariablesarrayref = - installer::ziplist::get_variables_from_ziplist($parentsettingsblockref); - $allsettingsarrayref = - installer::converter::combine_arrays_from_references_first_win( - $allsettingsarrayref, $allparentsettingsarrayref) - if $#{$allparentsettingsarrayref} > -1; - $allvariablesarrayref = - installer::converter::combine_arrays_from_references_first_win( - $allvariablesarrayref, $allparentvariablesarrayref) - if $#{$allparentvariablesarrayref} > -1; -} - -if ( $#{$globalproductblockref} > -1 ) -{ - my ($globalsettingsblockref, undef) = installer::ziplist::getproductblock($globalproductblockref, "Settings", 0); # settings block from zip.lst - if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "globalsettingsblock1.log" ,$globalsettingsblockref); } - - $globalsettingsblockref = installer::ziplist::analyze_settings_block($globalsettingsblockref); # select data from settings block in zip.lst - if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "globalsettingsblock2.log" ,$globalsettingsblockref); } - - my $allglobalsettingsarrayref = installer::ziplist::get_settings_from_ziplist($globalsettingsblockref); - if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allglobalsettings1.log" ,$allglobalsettingsarrayref); } - - my $allglobalvariablesarrayref = installer::ziplist::get_variables_from_ziplist($globalsettingsblockref); - if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allglobalvariables1.log" ,$allglobalvariablesarrayref); } - - if ( $#{$allglobalsettingsarrayref} > -1 ) { $allsettingsarrayref = installer::converter::combine_arrays_from_references_first_win($allsettingsarrayref, $allglobalsettingsarrayref); } - if ( $#{$allglobalvariablesarrayref} > -1 ) { $allvariablesarrayref = installer::converter::combine_arrays_from_references_first_win($allvariablesarrayref, $allglobalvariablesarrayref); } -} - -$allsettingsarrayref = installer::ziplist::remove_multiples_from_ziplist($allsettingsarrayref); # the settings from the zip.lst -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allsettings2.log" ,$allsettingsarrayref); } - -$allvariablesarrayref = installer::ziplist::remove_multiples_from_ziplist($allvariablesarrayref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allvariables2.log" ,$allvariablesarrayref); } - -installer::ziplist::replace_variables_in_ziplist_variables($allvariablesarrayref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allvariables2a.log" ,$allvariablesarrayref); } - -my $allvariableshashref = installer::converter::convert_array_to_hash($allvariablesarrayref); # the variables from the zip.lst -if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables3.log", $allvariableshashref); } - -installer::ziplist::set_default_productversion_if_required($allvariableshashref); -if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables3a.log", $allvariableshashref); } - -installer::ziplist::add_variables_to_allvariableshashref($allvariableshashref); -if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables3b.log", $allvariableshashref); } - -installer::ziplist::overwrite_ooovendor( $allvariableshashref ); -if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables3c.log", $allvariableshashref); } - - -######################################################## -# Check if this is simple packaging mechanism -######################################################## - -installer::simplepackage::check_simple_packager_project($allvariableshashref); - -#################################################################### -# setting global variables -#################################################################### - -installer::control::set_addchildprojects($allvariableshashref); -installer::control::set_addsystemintegration($allvariableshashref); - -######################################################## -# Re-define logging dir, after all variables are set -######################################################## - -my $oldloggingdir = $loggingdir; -installer::systemactions::remove_empty_directory($oldloggingdir); -$loggingdir = installer::systemactions::create_directories("logging", ""); -$loggingdir = $loggingdir . $installer::globals::separator; -$installer::globals::exitlog = $loggingdir; - -# checking, whether this is an opensource product - -if (!($installer::globals::is_copy_only_project)) { installer::ziplist::set_manufacturer($allvariableshashref); } - -############################################## -# Checking version of makecab.exe -############################################## - -if ( $installer::globals::iswindowsbuild ) { installer::control::check_makecab_version(); } - -########################################################## -# Getting the include path from the settings in zip list -########################################################## - -my $includepathref = installer::ziplist::getinfofromziplist($allsettingsarrayref, "include"); -if ( $$includepathref eq "" ) -{ - installer::exiter::exit_program("ERROR: Definition for \"include\" not found in $installer::globals::ziplistname", "Main"); -} - -my $includepatharrayref = installer::converter::convert_stringlist_into_array($includepathref, ","); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray1.log" ,$includepatharrayref); } - -installer::ziplist::replace_all_variables_in_pathes($includepatharrayref, $pathvariableshashref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray2.log" ,$includepatharrayref); } - -installer::ziplist::replace_minor_in_pathes($includepatharrayref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray3.log" ,$includepatharrayref); } - -installer::ziplist::replace_packagetype_in_pathes($includepatharrayref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray3a.log" ,$includepatharrayref); } - -installer::ziplist::resolve_relative_pathes($includepatharrayref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray3b.log" ,$includepatharrayref); } - -installer::ziplist::remove_ending_separator($includepatharrayref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray3c.log" ,$includepatharrayref); } - -############################################## -# Collecting all files from all include -# pathes in global hashes. -############################################## - -installer::worker::collect_all_files_from_includepathes($includepatharrayref); - -############################################## -# Analyzing languages in zip.lst if required -# Probably no longer used. -############################################## - -if ($installer::globals::languages_defined_in_productlist) { installer::languages::get_info_about_languages($allsettingsarrayref); } - -##################################### -# Windows requires the encoding list -##################################### - -if ( $installer::globals::iswindowsbuild ) { installer::control::read_encodinglist($includepatharrayref); } - -##################################################################### -# Including additional inc files for variable settings, if defined -##################################################################### - -if ( $allvariableshashref->{'ADD_INCLUDE_FILES'} ) { installer::worker::add_variables_from_inc_to_hashref($allvariableshashref, $includepatharrayref); } - -################################################ -# Disable xpd installer, if SOLAR_JAVA not set -################################################ - -installer::control::check_java_for_xpd($allvariableshashref); - -##################################### -# Analyzing the setup script -##################################### - -if ($installer::globals::setupscript_defined_in_productlist) { installer::setupscript::set_setupscript_name($allsettingsarrayref, $includepatharrayref); } - -installer::logger::globallog("setup script file: $installer::globals::setupscriptname"); - -installer::logger::print_message( "... analyzing script: $installer::globals::setupscriptname ... \n" ); - -my $setupscriptref = installer::files::read_file($installer::globals::setupscriptname); # Reading the setup script file - -# Resolving variables defined in the zip list file into setup script -# All the variables are defined in $allvariablesarrayref - -installer::scpzipfiles::replace_all_ziplistvariables_in_file($setupscriptref, $allvariableshashref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "setupscript1.log" ,$setupscriptref); } - -# Resolving %variables defined in the installation object - -my $allscriptvariablesref = installer::setupscript::get_all_scriptvariables_from_installation_object($setupscriptref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "setupscriptvariables1.log" ,$allscriptvariablesref); } - -installer::setupscript::add_lowercase_productname_setupscriptvariable($allscriptvariablesref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "setupscriptvariables2.log" ,$allscriptvariablesref); } - -installer::setupscript::resolve_lowercase_productname_setupscriptvariable($allscriptvariablesref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "setupscriptvariables3.log" ,$allscriptvariablesref); } - -$setupscriptref = installer::setupscript::replace_all_setupscriptvariables_in_script($setupscriptref, $allscriptvariablesref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "setupscript2.log" ,$setupscriptref); } - -# Adding all variables defined in the installation object into the hash of all variables. -# This is needed if variables are defined in the installation object, but not in the zip list file. -# If there is a definition in the zip list file and in the installation object, the installation object is more important - -installer::setupscript::add_installationobject_to_variables($allvariableshashref, $allscriptvariablesref); -if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables4.log", $allvariableshashref); } - -# Adding also all variables, that must be included into the $allvariableshashref. -installer::setupscript::add_forced_properties($allvariableshashref); -if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables5.log", $allvariableshashref); } - -# Replacing preset properties, not using the default mechanisms (for example for UNIXPRODUCTNAME) -installer::setupscript::replace_preset_properties($allvariableshashref); -if ( $installer::globals::globallogging ) { installer::files::save_hash($loggingdir . "allvariables6.log", $allvariableshashref); } - -installer::scpzipfiles::replace_all_ziplistvariables_in_file($setupscriptref, $allvariableshashref); -if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "setupscript3.log" ,$setupscriptref); } - - -installer::logger::log_hashref($allvariableshashref); - -installer::logger::print_message( "... analyzing directories ... \n" ); - -# Collect all directories in the script to get the destination dirs - -my $dirsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Directory"); -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories1.log", $dirsinproductarrayref); } - -if ( $installer::globals::languagepack ) { installer::scriptitems::use_langpack_hostname($dirsinproductarrayref); } -if ( $installer::globals::patch ) { installer::scriptitems::use_patch_hostname($dirsinproductarrayref); } -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories1a.log", $dirsinproductarrayref); } - -if ( $allvariableshashref->{'SHIFT_BASIS_INTO_BRAND_LAYER'} ) { $dirsinproductarrayref = installer::scriptitems::shift_basis_directory_parents($dirsinproductarrayref); } -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories1b.log", $dirsinproductarrayref); } -if ( $allvariableshashref->{'OFFICEDIRECTORYNAME'} ) { installer::scriptitems::set_officedirectory_name($dirsinproductarrayref, $allvariableshashref->{'OFFICEDIRECTORYNAME'}); } -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories1b.log", $dirsinproductarrayref); } - - -installer::scriptitems::resolve_all_directory_names($dirsinproductarrayref); -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories2.log", $dirsinproductarrayref); } - -installer::logger::print_message( "... analyzing files ... \n" ); - -my $filesinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "File"); -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles1.log", $filesinproductarrayref); } - -$filesinproductarrayref = installer::scriptitems::remove_delete_only_files_from_productlists($filesinproductarrayref); -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2.log", $filesinproductarrayref); } - -if (( ! $installer::globals::iswindowsbuild ) && - ( ! $installer::globals::isrpmbuild ) && - ( ! $installer::globals::isdebbuild ) && - ( ! $installer::globals::issolarispkgbuild ) && - ( $installer::globals::packageformat ne "installed" ) && - ( $installer::globals::packageformat ne "dmg" ) && - ( $installer::globals::packageformat ne "archive" )) - { installer::control::check_oxtfiles($filesinproductarrayref); } - -if ($installer::globals::product =~ /suite/i ) { $filesinproductarrayref = installer::scriptitems::remove_notinsuite_files_from_productlists($filesinproductarrayref); } -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2aa.log", $filesinproductarrayref); } - -if (! $installer::globals::languagepack) -{ - $filesinproductarrayref = installer::scriptitems::remove_Languagepacklibraries_from_Installset($filesinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2b.log", $filesinproductarrayref); } -} - -if (! $installer::globals::helppack) -{ - $filesinproductarrayref = installer::scriptitems::remove_Helppacklibraries_from_Installset($filesinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2b2.log", $filesinproductarrayref); } -} - -if (! $installer::globals::patch) -{ - $filesinproductarrayref = installer::scriptitems::remove_patchonlyfiles_from_Installset($filesinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2c.log", $filesinproductarrayref); } -} - -if (! $installer::globals::tab) -{ - $filesinproductarrayref = installer::scriptitems::remove_tabonlyfiles_from_Installset($filesinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2c.log", $filesinproductarrayref); } -} - -if (( $installer::globals::packageformat ne "installed" ) && ( $installer::globals::packageformat ne "archive" )) -{ - $filesinproductarrayref = installer::scriptitems::remove_installedproductonlyfiles_from_Installset($filesinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2cc.log", $filesinproductarrayref); } -} - -installer::logger::print_message( "... analyzing scpactions ... \n" ); - -my $scpactionsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "ScpAction"); -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions1.log", $scpactionsinproductarrayref); } - -if (( ! $allvariableshashref->{'XPDINSTALLER'} ) || ( ! $installer::globals::isxpdplatform )) -{ - $scpactionsinproductarrayref = installer::scriptitems::remove_Xpdonly_Items($scpactionsinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions1a.log", $scpactionsinproductarrayref); } -} - -if ( $installer::globals::languagepack ) { installer::scriptitems::use_langpack_copy_scpaction($scpactionsinproductarrayref); } -if ( $installer::globals::helppack ) { installer::scriptitems::use_langpack_copy_scpaction($scpactionsinproductarrayref); } -if ( $installer::globals::patch ) { installer::scriptitems::use_patch_copy_scpaction($scpactionsinproductarrayref); } -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions1b.log", $scpactionsinproductarrayref); } - -# $scpactionsinproductarrayref = installer::scriptitems::remove_scpactions_without_name($scpactionsinproductarrayref); -# if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions2.log", $scpactionsinproductarrayref); } - -installer::scriptitems::change_keys_of_scpactions($scpactionsinproductarrayref); -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions2.log", $scpactionsinproductarrayref); } - -installer::logger::print_message( "... analyzing shortcuts ... \n" ); - -my $linksinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Shortcut"); -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks1.log", $linksinproductarrayref); } - -installer::logger::print_message( "... analyzing unix links ... \n" ); - -my $unixlinksinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Unixlink"); -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks1.log", $unixlinksinproductarrayref); } - -installer::logger::print_message( "... analyzing profile ... \n" ); - -my $profilesinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Profile"); -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profiles1.log", $profilesinproductarrayref); } - -installer::logger::print_message( "... analyzing profileitems ... \n" ); - -my $profileitemsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "ProfileItem"); -if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profileitems1.log", $profileitemsinproductarrayref); } - -my $folderinproductarrayref; -my $folderitemsinproductarrayref; -my $registryitemsinproductarrayref; -my $windowscustomactionsarrayref; -my $mergemodulesarrayref; - -if ( $installer::globals::iswindowsbuild ) # Windows specific items: Folder, FolderItem, RegistryItem, WindowsCustomAction -{ - installer::logger::print_message( "... analyzing folders ... \n" ); - - $folderinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Folder"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folder1.log", $folderinproductarrayref); } - - installer::logger::print_message( "... analyzing folderitems ... \n" ); - - $folderitemsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "FolderItem"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folderitems1.log", $folderitemsinproductarrayref); } - - installer::setupscript::add_predefined_folder($folderitemsinproductarrayref, $folderinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folder1b.log", $folderinproductarrayref); } - - installer::setupscript::prepare_non_advertised_files($folderitemsinproductarrayref, $filesinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles2d.log", $filesinproductarrayref); } - - installer::logger::print_message( "... analyzing registryitems ... \n" ); - - $registryitemsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "RegistryItem"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems1.log", $registryitemsinproductarrayref); } - - $registryitemsinproductarrayref = installer::scriptitems::remove_uninstall_regitems_from_script($registryitemsinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems1b.log", $registryitemsinproductarrayref); } - - installer::logger::print_message( "... analyzing Windows custom actions ... \n" ); - - $windowscustomactionsarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "WindowsCustomAction"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "windowscustomactions1.log", $windowscustomactionsarrayref); } - - installer::logger::print_message( "... analyzing Windows merge modules ... \n" ); - - $mergemodulesarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "MergeModule"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "mergemodules1.log", $mergemodulesarrayref); } -} - -my $modulesinproductarrayref; - -if (!($installer::globals::is_copy_only_project)) -{ - installer::logger::print_message( "... analyzing modules ... \n" ); - - $modulesinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Module"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules1.log", $modulesinproductarrayref); } - - if (( ! $allvariableshashref->{'XPDINSTALLER'} ) || ( ! $installer::globals::isxpdplatform )) - { - $modulesinproductarrayref = installer::scriptitems::remove_Xpdonly_Items($modulesinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules1a.log", $modulesinproductarrayref); } - } - - installer::scriptitems::resolve_assigned_modules($modulesinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules1b.log", $modulesinproductarrayref); } - - $modulesinproductarrayref = installer::scriptitems::remove_template_modules($modulesinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules1c.log", $modulesinproductarrayref); } - - installer::scriptitems::set_children_flag($modulesinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules1d.log", $modulesinproductarrayref); } - - installer::scriptitems::collect_all_languagemodules($modulesinproductarrayref); - - # Assigning the modules to the items - - installer::scriptitems::assigning_modules_to_items($modulesinproductarrayref, $filesinproductarrayref, "Files"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles3.log", $filesinproductarrayref); } - - installer::scriptitems::assigning_modules_to_items($modulesinproductarrayref, $unixlinksinproductarrayref, "Unixlinks"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks2.log", $unixlinksinproductarrayref); } - - installer::scriptitems::assigning_modules_to_items($modulesinproductarrayref, $dirsinproductarrayref, "Dirs"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories2aa.log", $dirsinproductarrayref); } -} - -if ( $installer::globals::debug ) { installer::logger::debuginfo("\nEnd of part 1a: The language independent part\n"); } - -# saving debug info, before staring part 1b -if ( $installer::globals::debug ) { installer::logger::savedebug($installer::globals::exitlog); } - -################################################# -# Part 1b: The language dependent part -# (still platform independent) -################################################# - -# Now starts the language dependent part, if more than one product is defined on the command line -# Example -l en-US,de#es,fr,it defines two multilingual products - -############################################################################### -# Beginning of language dependent part -# The for iterates over all products, separated by an # in the language list -############################################################################### - -if ( $installer::globals::debug ) { installer::logger::debuginfo("\nPart 1b: The language dependent part\n"); } - -for ( my $n = 0; $n <= $#installer::globals::languageproducts; $n++ ) -{ - my $languagesarrayref = installer::languages::get_all_languages_for_one_product($installer::globals::languageproducts[$n], $allvariableshashref); - if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "languages.log" ,$languagesarrayref); } - - $installer::globals::alllanguagesinproductarrayref = $languagesarrayref; - my $languagestringref = installer::languages::get_language_string($languagesarrayref); - installer::logger::print_message( "------------------------------------\n" ); - installer::logger::print_message( "... languages $$languagestringref ... \n" ); - - if ( $installer::globals::patch ) - { - $installer::globals::addlicensefile = 0; # no license files for patches - $installer::globals::makedownload = 0; - $installer::globals::makejds = 0; - } - - if ( $installer::globals::languagepack ) - { - $installer::globals::addchildprojects = 0; - $installer::globals::addsystemintegration = 0; - $installer::globals::makejds = 0; - $installer::globals::addlicensefile = 0; - - if ( $allvariableshashref->{'OPENSOURCE'} ) { $installer::globals::makedownload = 1; } - else { $installer::globals::makedownload = 0; } - } - - if ( $installer::globals::helppack ) - { - $installer::globals::addchildprojects = 0; - $installer::globals::addsystemintegration = 0; - $installer::globals::makejds = 0; - $installer::globals::addlicensefile = 0; - - if ( $allvariableshashref->{'OPENSOURCE'} ) { $installer::globals::makedownload = 1; } - else { $installer::globals::makedownload = 0; } - } - - ############################################################ - # Beginning of language specific logging mechanism - # Until now only global logging into default: logfile.txt - ############################################################ - - @installer::globals::logfileinfo = (); # new logfile array and new logfile name - installer::logger::copy_globalinfo_into_logfile(); - $installer::globals::globalinfo_copied = 1; - - my $logminor = ""; - if ( $installer::globals::updatepack ) { $logminor = $installer::globals::lastminor; } - else { $logminor = $installer::globals::minor; } - - my $loglanguagestring = $$languagestringref; - my $loglanguagestring_orig = $loglanguagestring; - if (length($loglanguagestring) > $installer::globals::max_lang_length) - { - my $number_of_languages = installer::systemactions::get_number_of_langs($loglanguagestring); - chomp(my $shorter = `echo $loglanguagestring | md5sum | sed -e "s/ .*//g"`); - my $id = substr($shorter, 0, 8); # taking only the first 8 digits - $loglanguagestring = "lang_" . $number_of_languages . "_id_" . $id; - } - - $installer::globals::logfilename = "log_" . $installer::globals::build; - if ( $logminor ne "" ) { $installer::globals::logfilename .= "_" . $logminor; } - $installer::globals::logfilename .= "_" . $loglanguagestring; - $installer::globals::logfilename .= ".log"; - $loggingdir = $loggingdir . $loglanguagestring . $installer::globals::separator; - installer::systemactions::create_directory($loggingdir); - - if ($loglanguagestring ne $loglanguagestring_orig) { - (my $dir = $loggingdir) =~ s!/$!!; - open(my $F1, "> $dir.dir"); - open(my $F2, "> " . $loggingdir . $installer::globals::logfilename . '.file'); - my @s = map { "$_\n" } split('_', $loglanguagestring_orig); - print $F1 @s; - print $F2 @s; - } - - $installer::globals::exitlog = $loggingdir; - - ############################################################## - # Determining the ship location, if this is an update pack - ############################################################## - - if ( $installer::globals::updatepack ) { $shipinstalldir = installer::control::determine_ship_directory($languagestringref); } - - ################################################################### - # Reading an existing msi database, to prepare update and patch - ################################################################### - - my $refdatabase = ""; - my $uniquefilename = ""; - my $revuniquefilename = ""; - my $revshortfilename = ""; - my $allupdatesequences = ""; - my $allupdatecomponents = ""; - my $allupdatefileorder = ""; - my $allupdatecomponentorder = ""; - my $shortdirname = ""; - my $componentid = ""; - my $componentidkeypath = ""; - my $alloldproperties = ""; - my $allupdatelastsequences = ""; - my $allupdatediskids = ""; - - if ( $installer::globals::iswindowsbuild ) - { - if ( $allvariableshashref->{'UPDATE_DATABASE'} ) - { - installer::logger::print_message( "... analyzing update database ...\n" ); - $refdatabase = installer::windows::update::readdatabase($allvariableshashref, $languagestringref, $includepatharrayref); - - if ( $installer::globals::updatedatabase ) - { - ($uniquefilename, $revuniquefilename, $revshortfilename, $allupdatesequences, $allupdatecomponents, $allupdatefileorder, $allupdatecomponentorder, $shortdirname, $componentid, $componentidkeypath, $alloldproperties, $allupdatelastsequences, $allupdatediskids) = installer::windows::update::create_database_hashes($refdatabase); - if ( $mergemodulesarrayref > -1 ) { installer::windows::update::readmergedatabase($mergemodulesarrayref, $languagestringref, $includepatharrayref); } - } - } - } - - ############################################## - # Setting global code variables for Windows - ############################################## - - if (!($installer::globals::is_copy_only_project)) - { - if (( $installer::globals::iswindowsbuild ) && ( $installer::globals::packageformat ne "archive" ) && ( $installer::globals::packageformat ne "installed" )) - { - installer::windows::msiglobal::set_global_code_variables($languagesarrayref, $languagestringref, $allvariableshashref, $alloldproperties); - } - } - - ################################################ - # Resolving include paths (language dependent) - ################################################ - - $includepatharrayref_lang = installer::ziplist::replace_languages_in_pathes($includepatharrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "allpatharray4.log" ,$includepatharrayref_lang); } - - if ( $installer::globals::refresh_includepathes ) { installer::worker::collect_all_files_from_includepathes($includepatharrayref_lang); } - - installer::ziplist::list_all_files_from_include_path($includepatharrayref_lang); - - ############################################## - # Analyzing spellchecker languages - ############################################## - - if ( $allvariableshashref->{'SPELLCHECKERFILE'} ) { installer::worker::set_spellcheckerlanguages($languagesarrayref, $allvariableshashref); } - - ##################################### - # Language dependent directory part - ##################################### - - my $dirsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($dirsinproductarrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories3.log", $dirsinproductlanguageresolvedarrayref); } - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories2a.log", $dirsinproductarrayref); } - - # A new directory array is needed ($dirsinproductlanguageresolvedarrayref instead of $dirsinproductarrayref) - # because $dirsinproductarrayref is needed in get_Destination_Directory_For_Item_From_Directorylist - - installer::scriptitems::changing_name_of_language_dependent_keys($dirsinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productdirectories4.log", $dirsinproductlanguageresolvedarrayref); } - - installer::scriptitems::checking_directories_with_corrupt_hostname($dirsinproductlanguageresolvedarrayref, $languagesarrayref); - - installer::scriptitems::set_global_directory_hostnames($dirsinproductlanguageresolvedarrayref, $allvariableshashref); - - ##################################### - # files part, language dependent - ##################################### - - installer::logger::print_message( "... analyzing files ...\n" ); - - my $filesinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($filesinproductarrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles4.log", $filesinproductlanguageresolvedarrayref); } - - if ( ! $installer::globals::set_office_start_language ) - { - $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_office_start_language_files($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles4b.log", $filesinproductlanguageresolvedarrayref); } - } - - installer::scriptitems::changing_name_of_language_dependent_keys($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles5.log", $filesinproductlanguageresolvedarrayref); } - - if ( $installer::globals::iswin and $^O =~ /MSWin/i ) { installer::converter::convert_slash_to_backslash($filesinproductlanguageresolvedarrayref); } - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles6.log", $filesinproductlanguageresolvedarrayref); } - - $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_non_existent_languages_in_productlists($filesinproductlanguageresolvedarrayref, $languagestringref, "Name", "file"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles7.log", $filesinproductlanguageresolvedarrayref); } - - installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist($filesinproductlanguageresolvedarrayref, $dirsinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles8.log", $filesinproductlanguageresolvedarrayref); } - - installer::scriptitems::get_Source_Directory_For_Files_From_Includepathlist($filesinproductlanguageresolvedarrayref, $includepatharrayref_lang, $dirsinproductlanguageresolvedarrayref, "Files"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles9.log", $filesinproductlanguageresolvedarrayref); } - - $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_Files_Without_Sourcedirectory($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles10.log", $filesinproductlanguageresolvedarrayref); } - - if ($installer::globals::languagepack) - { - $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_Files_For_Languagepacks($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles10c.log", $filesinproductlanguageresolvedarrayref); } - } - - if ( ! $allvariableshashref->{'NO_README_IN_ROOTDIR'} ) - { - $filesinproductlanguageresolvedarrayref = installer::scriptitems::add_License_Files_into_Installdir($filesinproductlanguageresolvedarrayref, $dirsinproductlanguageresolvedarrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles10b.log", $filesinproductlanguageresolvedarrayref); } - } - - $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_onlyasialanguage_files_from_productlists($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles10d.log", $filesinproductlanguageresolvedarrayref); } - - $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_onlywesternlanguage_files_from_productlists($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles10e.log", $filesinproductlanguageresolvedarrayref); } - - installer::scriptitems::make_filename_language_specific($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles10f.log", $filesinproductlanguageresolvedarrayref); } - - # print "... calculating checksums ...\n"; - # my $checksumfile = installer::worker::make_checksum_file($filesinproductlanguageresolvedarrayref, $includepatharrayref); - # if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . $installer::globals::checksumfilename, $checksumfile); } - - ###################################################################################### - # Unzipping files with flag ARCHIVE and putting all included files into the file list - ###################################################################################### - - installer::logger::print_message( "... analyzing files with flag ARCHIVE ...\n" ); - - my @additional_paths_from_zipfiles = (); - - $filesinproductlanguageresolvedarrayref = installer::archivefiles::resolving_archive_flag($filesinproductlanguageresolvedarrayref, \@additional_paths_from_zipfiles, $languagestringref, $loggingdir); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles11.log", $filesinproductlanguageresolvedarrayref); } - if ( $installer::globals::globallogging ) { installer::files::save_file($loggingdir . "additional_paths.log" ,\@additional_paths_from_zipfiles); } - - # packed files sometimes contain a "$" in their name: HighlightText$1.class. For epm the "$" has to be quoted by "$$" - - if (!( $installer::globals::iswindowsbuild || $installer::globals::simple ) ) - { - installer::scriptitems::quoting_illegal_filenames($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles12.log", $filesinproductlanguageresolvedarrayref); } - } - - ##################################### - # Files with flag SUBST_FILENAME - ##################################### - - installer::logger::print_message( "... analyzing files with flag SUBST_FILENAME ...\n" ); - - installer::substfilenamefiles::resolving_subst_filename_flag($filesinproductlanguageresolvedarrayref, $allvariableshashref, $languagestringref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles12d.log", $filesinproductlanguageresolvedarrayref); } - - ##################################### - # Files with flag SCPZIP_REPLACE - ##################################### - - installer::logger::print_message( "... analyzing files with flag SCPZIP_REPLACE ...\n" ); - - # Editing files with flag SCPZIP_REPLACE. - - installer::scpzipfiles::resolving_scpzip_replace_flag($filesinproductlanguageresolvedarrayref, $allvariableshashref, "File", $languagestringref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles13.log", $filesinproductlanguageresolvedarrayref); } - - ##################################### - # Files with flag PATCH_SO_NAME - ##################################### - - installer::logger::print_message( "... analyzing files with flag PATCH_SO_NAME ...\n" ); - - # Editing files with flag PATCH_SO_NAME. - - installer::scppatchsoname::resolving_patchsoname_flag($filesinproductlanguageresolvedarrayref, $allvariableshashref, "File", $languagestringref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles13b.log", $filesinproductlanguageresolvedarrayref); } - - ##################################### - # Files with flag HIDDEN - ##################################### - - installer::logger::print_message( "... analyzing files with flag HIDDEN ...\n" ); - - installer::worker::resolving_hidden_flag($filesinproductlanguageresolvedarrayref, $allvariableshashref, "File", $languagestringref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles13c.log", $filesinproductlanguageresolvedarrayref); } - - ############################################ - # Collecting directories for epm list file - ############################################ - - installer::logger::print_message( "... analyzing all directories for this product ...\n" ); - - # There are two ways for a directory to be included into the epm directory list: - # 1. Looking for all destination paths in the files array - # 2. Looking for directories with CREATE flag in the directory array - # Advantage: Many pathes are hidden in zip files, they are not defined in the setup script. - # It will be possible, that in the setup script only those directoies have to be defined, - # that have a CREATE flag. All other directories are created, if they contain at least one file. - - my ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_from_filesarray($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist1.log", $directoriesforepmarrayref); } - - ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_with_create_flag_from_directoryarray($dirsinproductlanguageresolvedarrayref, $alldirectoryhash); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist2.log", $directoriesforepmarrayref); } - - ######################################################### - # language dependent scpactions part - ######################################################### - - my $scpactionsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($scpactionsinproductarrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions3.log", $scpactionsinproductlanguageresolvedarrayref); } - - installer::scriptitems::changing_name_of_language_dependent_keys($scpactionsinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions4.log", $scpactionsinproductlanguageresolvedarrayref); } - - installer::scriptitems::get_Source_Directory_For_Files_From_Includepathlist($scpactionsinproductlanguageresolvedarrayref, $includepatharrayref_lang, $dirsinproductlanguageresolvedarrayref, "ScpActions"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions5.log", $scpactionsinproductlanguageresolvedarrayref); } - - # Editing scpactions with flag SCPZIP_REPLACE and PATCH_SO_NAME. - - installer::scpzipfiles::resolving_scpzip_replace_flag($scpactionsinproductlanguageresolvedarrayref, $allvariableshashref, "ScpAction", $languagestringref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions6.log", $scpactionsinproductlanguageresolvedarrayref); } - - installer::scppatchsoname::resolving_patchsoname_flag($scpactionsinproductlanguageresolvedarrayref, $allvariableshashref, "ScpAction", $languagestringref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions6a.log", $scpactionsinproductlanguageresolvedarrayref); } - - ######################################################### - # language dependent links part - ######################################################### - - installer::logger::print_message( "... analyzing links ...\n" ); - - my $linksinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($linksinproductarrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks2.log", $linksinproductlanguageresolvedarrayref); } - - installer::scriptitems::changing_name_of_language_dependent_keys($linksinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks3.log", $linksinproductlanguageresolvedarrayref); } - - installer::scriptitems::get_destination_file_path_for_links($linksinproductlanguageresolvedarrayref, $filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks4.log", $linksinproductlanguageresolvedarrayref); } - - installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist($linksinproductlanguageresolvedarrayref, $dirsinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks5.log", $linksinproductlanguageresolvedarrayref); } - - # Now taking all links that have no FileID but a ShortcutID, linking to another link - - installer::scriptitems::get_destination_link_path_for_links($linksinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks6.log", $linksinproductlanguageresolvedarrayref); } - - $linksinproductlanguageresolvedarrayref = installer::scriptitems::remove_workstation_only_items($linksinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks7.log", $linksinproductlanguageresolvedarrayref); } - - installer::scriptitems::resolve_links_with_flag_relative($linksinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks8.log", $linksinproductlanguageresolvedarrayref); } - - ######################################################### - # language dependent unix links part - ######################################################### - - installer::logger::print_message( "... analyzing unix links ...\n" ); - - my $unixlinksinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($unixlinksinproductarrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks3.log", $unixlinksinproductlanguageresolvedarrayref); } - - installer::scriptitems::changing_name_of_language_dependent_keys($unixlinksinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks4.log", $unixlinksinproductlanguageresolvedarrayref); } - - installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist($unixlinksinproductlanguageresolvedarrayref, $dirsinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks5.log", $unixlinksinproductlanguageresolvedarrayref); } - - ######################################################### - # language dependent part for profiles and profileitems - ######################################################### - - my $profilesinproductlanguageresolvedarrayref; - my $profileitemsinproductlanguageresolvedarrayref; - - if ((!($installer::globals::is_copy_only_project)) && (!($installer::globals::product =~ /ada/i )) && (!($installer::globals::languagepack)) && (!($installer::globals::helppack))) - { - installer::logger::print_message( "... creating profiles ...\n" ); - - $profilesinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($profilesinproductarrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profiles2.log", $profilesinproductlanguageresolvedarrayref); } - - $profileitemsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($profileitemsinproductarrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profileitems2.log", $profilesinproductlanguageresolvedarrayref); } - - installer::scriptitems::changing_name_of_language_dependent_keys($profilesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profiles3.log", $profilesinproductlanguageresolvedarrayref); } - - installer::scriptitems::changing_name_of_language_dependent_keys($profileitemsinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profileitems3.log", $profileitemsinproductlanguageresolvedarrayref); } - - installer::scriptitems::replace_setup_variables($profileitemsinproductlanguageresolvedarrayref, $languagestringref, $allvariableshashref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profileitems4.log", $profileitemsinproductlanguageresolvedarrayref); } - - if ( $installer::globals::patch_user_dir ) - { - installer::scriptitems::replace_userdir_variable($profileitemsinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profileitems4a.log", $profileitemsinproductlanguageresolvedarrayref); } - } - - installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist($profilesinproductlanguageresolvedarrayref, $dirsinproductarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "profiles4.log", $profilesinproductlanguageresolvedarrayref); } - - # Now the Profiles can be created - - installer::profiles::create_profiles($profilesinproductlanguageresolvedarrayref, $profileitemsinproductlanguageresolvedarrayref, $filesinproductlanguageresolvedarrayref, $languagestringref, $allvariableshashref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles15.log", $filesinproductlanguageresolvedarrayref); } - } - - my $registryitemsinproductlanguageresolvedarrayref; # cannot be defined in the following "if ( $installer::globals::iswindowsbuild )" - my $folderinproductlanguageresolvedarrayref; # cannot be defined in the following "if ( $installer::globals::iswindowsbuild )" - my $folderitemsinproductlanguageresolvedarrayref; # cannot be defined in the following "if ( $installer::globals::iswindowsbuild )" - - if ( $installer::globals::iswindowsbuild ) # Windows specific items: Folder, FolderItem, RegistryItem - { - ######################################################### - # language dependent part for folder - ######################################################### - - installer::logger::print_message( "... analyzing folder ...\n" ); - - $folderinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($folderinproductarrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folder2.log", $folderinproductlanguageresolvedarrayref); } - - installer::scriptitems::changing_name_of_language_dependent_keys($folderinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folder3.log", $folderinproductlanguageresolvedarrayref); } - - ######################################################### - # language dependent part for folderitems - ######################################################### - - installer::logger::print_message( "... analyzing folderitems ...\n" ); - - $folderitemsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($folderitemsinproductarrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folderitems2.log", $folderitemsinproductlanguageresolvedarrayref); } - - installer::scriptitems::changing_name_of_language_dependent_keys($folderitemsinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folderitems3.log", $folderitemsinproductlanguageresolvedarrayref); } - - ######################################################### - # language dependent part for registryitems - ######################################################### - - installer::logger::print_message( "... analyzing registryitems ...\n" ); - - $registryitemsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($registryitemsinproductarrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems2.log", $registryitemsinproductlanguageresolvedarrayref); } - - installer::scriptitems::changing_name_of_language_dependent_keys($registryitemsinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems3.log", $registryitemsinproductlanguageresolvedarrayref); } - } - - ######################################################### - # language dependent part for modules - ######################################################### - - my $modulesinproductlanguageresolvedarrayref; - - if (!($installer::globals::is_copy_only_project)) - { - installer::logger::print_message( "... analyzing modules ...\n" ); - - $modulesinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($modulesinproductarrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes_modules($loggingdir . "modules2.log", $modulesinproductlanguageresolvedarrayref); } - - $modulesinproductlanguageresolvedarrayref = installer::scriptitems::remove_not_required_language_modules($modulesinproductlanguageresolvedarrayref, $languagesarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes_modules($loggingdir . "modules2a.log", $modulesinproductlanguageresolvedarrayref); } - - if ( $installer::globals::analyze_spellcheckerlanguage ) - { - $modulesinproductlanguageresolvedarrayref = installer::scriptitems::remove_not_required_spellcheckerlanguage_modules($modulesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes_modules($loggingdir . "modules3.log", $modulesinproductlanguageresolvedarrayref); } - - $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_not_required_spellcheckerlanguage_files($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles15b.log", $filesinproductlanguageresolvedarrayref); } - } - - installer::scriptitems::changing_name_of_language_dependent_keys($modulesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes_modules($loggingdir . "modules3a.log", $modulesinproductlanguageresolvedarrayref); } - - installer::scriptitems::select_required_language_strings($modulesinproductlanguageresolvedarrayref); # using english strings - - } - - # Copy-only projects can now start to copy all items File and ScpAction - if ( $installer::globals::is_copy_only_project ) { installer::copyproject::copy_project($filesinproductlanguageresolvedarrayref, $scpactionsinproductlanguageresolvedarrayref, $loggingdir, $languagestringref, $shipinstalldir, $allsettingsarrayref); } - - # Language pack projects can now start to select the required information - if ( $installer::globals::languagepack ) - { - $filesinproductlanguageresolvedarrayref = installer::languagepack::select_language_items($filesinproductlanguageresolvedarrayref, $languagesarrayref, "File"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles16b.log", $filesinproductlanguageresolvedarrayref); } - $scpactionsinproductlanguageresolvedarrayref = installer::languagepack::select_language_items($scpactionsinproductlanguageresolvedarrayref, $languagesarrayref, "ScpAction"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions6b.log", $scpactionsinproductlanguageresolvedarrayref); } - $linksinproductlanguageresolvedarrayref = installer::languagepack::select_language_items($linksinproductlanguageresolvedarrayref, $languagesarrayref, "Shortcut"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks8b.log", $linksinproductlanguageresolvedarrayref); } - $unixlinksinproductlanguageresolvedarrayref = installer::languagepack::select_language_items($unixlinksinproductlanguageresolvedarrayref, $languagesarrayref, "Unixlink"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks5.log", $unixlinksinproductlanguageresolvedarrayref); } - @{$folderitemsinproductlanguageresolvedarrayref} = (); # no folderitems in languagepacks - - # Collecting the directories again, to include only the language specific directories - ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_from_filesarray($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist3alangpack.log", $directoriesforepmarrayref); } - ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_with_create_flag_from_directoryarray($dirsinproductlanguageresolvedarrayref, $alldirectoryhash); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist3blangpack.log", $directoriesforepmarrayref); } - installer::sorter::sorting_array_of_hashes($directoriesforepmarrayref, "HostName"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist3clangpack.log", $directoriesforepmarrayref); } - - if ( $installer::globals::iswindowsbuild ) - { - $registryitemsinproductlanguageresolvedarrayref = installer::worker::select_langpack_items($registryitemsinproductlanguageresolvedarrayref, "RegistryItem"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems3aa.log", $registryitemsinproductlanguageresolvedarrayref); } - } - - } - - # Help pack projects can now start to select the required information - if ( $installer::globals::helppack ) - { - $filesinproductlanguageresolvedarrayref = installer::helppack::select_help_items($filesinproductlanguageresolvedarrayref, $languagesarrayref, "File"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles16b2.log", $filesinproductlanguageresolvedarrayref); } - $scpactionsinproductlanguageresolvedarrayref = installer::helppack::select_help_items($scpactionsinproductlanguageresolvedarrayref, $languagesarrayref, "ScpAction"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions6b2.log", $scpactionsinproductlanguageresolvedarrayref); } - $linksinproductlanguageresolvedarrayref = installer::helppack::select_help_items($linksinproductlanguageresolvedarrayref, $languagesarrayref, "Shortcut"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks8b2.log", $linksinproductlanguageresolvedarrayref); } - $unixlinksinproductlanguageresolvedarrayref = installer::helppack::select_help_items($unixlinksinproductlanguageresolvedarrayref, $languagesarrayref, "Unixlink"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks5b2.log", $unixlinksinproductlanguageresolvedarrayref); } - @{$folderitemsinproductlanguageresolvedarrayref} = (); # no folderitems in helppacks - - # Collecting the directories again, to include only the language specific directories - ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_from_filesarray($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist3ahelppack.log", $directoriesforepmarrayref); } - ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_with_create_flag_from_directoryarray($dirsinproductlanguageresolvedarrayref, $alldirectoryhash); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist3bhelppack.log", $directoriesforepmarrayref); } - installer::sorter::sorting_array_of_hashes($directoriesforepmarrayref, "HostName"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist3chelppack.log", $directoriesforepmarrayref); } - - if ( $installer::globals::iswindowsbuild ) - { - $registryitemsinproductlanguageresolvedarrayref = installer::worker::select_helppack_items($registryitemsinproductlanguageresolvedarrayref, "RegistryItem"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems3aa2.log", $registryitemsinproductlanguageresolvedarrayref); } - } - - } - - # Collecting all files without flag PATCH (for maintenance reasons) - if ( $installer::globals::patch ) { installer::worker::collect_all_files_without_patch_flag($filesinproductlanguageresolvedarrayref); } - - # Patch projects can now start to select the required information - if (( $installer::globals::patch ) && (( $installer::globals::issolarispkgbuild ) || ( $installer::globals::iswindowsbuild ))) - { - $filesinproductlanguageresolvedarrayref = installer::worker::select_patch_items($filesinproductlanguageresolvedarrayref, "File"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles16patch.log", $filesinproductlanguageresolvedarrayref); } - $scpactionsinproductlanguageresolvedarrayref = installer::worker::select_patch_items($scpactionsinproductlanguageresolvedarrayref, "ScpAction"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productscpactions6patch.log", $scpactionsinproductlanguageresolvedarrayref); } - $linksinproductlanguageresolvedarrayref = installer::worker::select_patch_items($linksinproductlanguageresolvedarrayref, "Shortcut"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productlinks8patch.log", $linksinproductlanguageresolvedarrayref); } - $unixlinksinproductlanguageresolvedarrayref = installer::worker::select_patch_items($unixlinksinproductlanguageresolvedarrayref, "Unixlink"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks6patch.log", $unixlinksinproductlanguageresolvedarrayref); } - $folderitemsinproductlanguageresolvedarrayref = installer::worker::select_patch_items($folderitemsinproductlanguageresolvedarrayref, "FolderItem"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfolderitems1patch.log", $folderitemsinproductlanguageresolvedarrayref); } - # @{$folderitemsinproductlanguageresolvedarrayref} = (); # no folderitems in languagepacks - - if ( $installer::globals::iswindowsbuild ) - { - $registryitemsinproductlanguageresolvedarrayref = installer::worker::select_patch_items_without_name($registryitemsinproductlanguageresolvedarrayref, "RegistryItem"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems3a.log", $registryitemsinproductlanguageresolvedarrayref); } - - installer::worker::prepare_windows_patchfiles($filesinproductlanguageresolvedarrayref, $languagestringref, $allvariableshashref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles16bpatch.log", $filesinproductlanguageresolvedarrayref); } - - # For Windows patches, the directories can now be collected again - ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_from_filesarray($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist4_patch.log", $directoriesforepmarrayref); } - - installer::sorter::sorting_array_of_hashes($directoriesforepmarrayref, "HostName"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforepmlist5_patch.log", $directoriesforepmarrayref); } - } - } - - ######################################################### - # Collecting all scp actions - ######################################################### - - installer::worker::collect_scpactions($scpactionsinproductlanguageresolvedarrayref); - - ######################################################### - # creating inf files for user system integration - ######################################################### - - if (( $installer::globals::iswindowsbuild ) && ( ! $installer::globals::patch )) # Windows specific items: Folder, FolderItem, RegistryItem - { - installer::logger::print_message( "... creating inf files ...\n" ); - installer::worker::create_inf_file($filesinproductlanguageresolvedarrayref, $registryitemsinproductlanguageresolvedarrayref, $folderinproductlanguageresolvedarrayref, $folderitemsinproductlanguageresolvedarrayref, $modulesinproductlanguageresolvedarrayref, $languagesarrayref, $languagestringref, $allvariableshashref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles16c.log", $filesinproductlanguageresolvedarrayref); } - } - - ########################################### - # Using upx, to decrease file size - # Currently only for Windows. - ########################################### - - if ( $allvariableshashref->{'UPXPRODUCT'} ) - { - installer::upx::upx_on_libraries($filesinproductlanguageresolvedarrayref, $languagestringref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles16d.log", $filesinproductlanguageresolvedarrayref); } - } - - ########################################################### - # Simple package projects can now start to create the - # installation structure by creating Directories, Files - # Links and ScpActions. This is the last platform - # independent part. - ########################################################### - - if ( $installer::globals::is_simple_packager_project ) - { - installer::simplepackage::create_simple_package($filesinproductlanguageresolvedarrayref, $directoriesforepmarrayref, $scpactionsinproductlanguageresolvedarrayref, $linksinproductlanguageresolvedarrayref, $unixlinksinproductlanguageresolvedarrayref, $loggingdir, $languagestringref, $shipinstalldir, $allsettingsarrayref, $allvariableshashref, $includepatharrayref); - next; # ! leaving the current loop, because no further packaging required. - } - - ########################################################### - # Analyzing the package structure - ########################################################### - - installer::logger::print_message( "... analyzing package list ...\n" ); - - my $packages = installer::packagelist::collectpackages($modulesinproductlanguageresolvedarrayref, $languagesarrayref); - installer::packagelist::check_packagelist($packages); - - $packages = installer::packagelist::analyze_list($packages, $modulesinproductlanguageresolvedarrayref); - installer::packagelist::remove_multiple_modules_packages($packages); - - # printing packages content: - installer::packagelist::log_packages_content($packages); - installer::packagelist::create_module_destination_hash($packages, $allvariableshashref); - - if ( $installer::globals::debug ) { installer::logger::debuginfo("\nEnd of part 1b: The language dependent part\n"); } - - # saving debug info, before starting part 2 - if ( $installer::globals::debug ) { installer::logger::savedebug($installer::globals::exitlog); } - - ################################################# - # Part 2: The platform dependent part - ################################################# - - if ( $installer::globals::debug ) { installer::logger::debuginfo("\nPart 2: The platform dependent part\n"); } - - ################################################# - # Part 2a: All non-Windows platforms - ################################################# - - if ( $installer::globals::debug ) { installer::logger::debuginfo("\nPart 2a: All non-Windows platforms\n"); } - - ######################################################### - # ... creating epm list file ... - # Only for non-Windows platforms - ######################################################### - - if (!( $installer::globals::iswindowsbuild )) - { - #################################################### - # Writing log file before packages are packed - #################################################### - - installer::logger::print_message( "... creating log file " . $loggingdir . $installer::globals::logfilename . "\n" ); - installer::files::save_file($loggingdir . $installer::globals::logfilename, \@installer::globals::logfileinfo); - - #################################################### - # Creating directories - #################################################### - - if ( $allvariableshashref->{'OOODOWNLOADNAME'} ) { installer::download::set_download_filename($languagestringref, $allvariableshashref); } - else { installer::download::resolve_variables_in_downloadname($allvariableshashref, "", $languagestringref); } - - $installdir = installer::worker::create_installation_directory($shipinstalldir, $languagestringref, \$current_install_number); - - my $listfiledir = installer::systemactions::create_directories("listfile", $languagestringref); - my $installlogdir = installer::systemactions::create_directory_next_to_directory($installdir, "log"); - - #################################################### - # Reading for Solaris all package descriptions - # from file defined in property PACKAGEMAP - #################################################### - - if ( $installer::globals::issolarisbuild ) { installer::epmfile::read_packagemap($allvariableshashref, $includepatharrayref, $languagesarrayref); } - - my $epmexecutable = ""; - my $found_epm = 0; - - # shuffle array to reduce parallel packaging process in pool - installer::worker::shuffle_array($packages); - - # iterating over all packages - for ( my $k = 0; $k <= $#{$packages}; $k++ ) - { - my $onepackage = ${$packages}[$k]; - - # checking, if this is a language pack or a project pack. - # Creating language packs only, if $installer::globals::languagepack is set. Parameter: -languagepack - - if ( $installer::globals::languagepack ) { installer::languagepack::replace_languagestring_variable($onepackage, $languagestringref); } - - # checking, if this is a help pack - # Creating help packs only, if $installer::globals::helppack is set. Parameter: -helppack - - if ( $installer::globals::helppack ) { installer::helppack::replace_languagestring_variable($onepackage, $languagestringref); } - - my $onepackagename = $onepackage->{'module'}; # name of the top module (required) - - my $shellscriptsfilename = ""; - if ( $onepackage->{'script'} ) { $shellscriptsfilename = $onepackage->{'script'}; } - # no scripts for Solaris patches! - if (( $installer::globals::patch ) && ( $installer::globals::issolarispkgbuild )) { $shellscriptsfilename = ""; } - - ########################### - # package name - ########################### - - my $packagename = ""; - - if ( $installer::globals::issolarisbuild ) # only for Solaris - { - if ( $onepackage->{'solarispackagename'} ) { $packagename = $onepackage->{'solarispackagename'}; } - } - else # not Solaris - { - if ( $onepackage->{'packagename'} ) { $packagename = $onepackage->{'packagename'}; } - } - - if (!($packagename eq "")) - { - installer::packagelist::resolve_packagevariables(\$packagename, $allvariableshashref, 0); - } - - # Debian allows no underline in package name - if ( $installer::globals::debian ) { $packagename =~ s/_/-/g; } - - # Debian allows no underline in package name - if ( $installer::globals::debian ) { $packagename =~ s/_/-/g; } - - my $linkaddon = ""; - my $linkpackage = 0; - $installer::globals::add_required_package = ""; - $installer::globals::linuxlinkrpmprocess = 0; - - if ( $installer::globals::makelinuxlinkrpm ) - { - my $oldpackagename = $packagename; - $installer::globals::add_required_package = $oldpackagename; # the link rpm requires the non-linked version - if ( $installer::globals::languagepack ) { $packagename = $packagename . "_u"; } - elsif ( $installer::globals::helppack ) { $packagename = $packagename . "_v"; } # wtf... - else { $packagename = $packagename . "u"; } - my $savestring = $oldpackagename . "\t" . $packagename; - push(@installer::globals::linkrpms, $savestring); - $linkaddon = "_links"; - $installer::globals::linuxlinkrpmprocess = 1; - $linkpackage = 1; - } - - #################################################### - # Header for this package into log file - #################################################### - - installer::logger::include_header_into_logfile("Creating package: $packagename ($k)"); - - #################################################### - # Pool check: If package is created at the moment - # try it again later. - #################################################### - - if (( $installer::globals::patch ) || - ( $installer::globals::languagepack ) || - ( $installer::globals::helppack ) || - ( $installer::globals::packageformat eq "native" ) || - ( $installer::globals::packageformat eq "portable" ) || - ( $installer::globals::packageformat eq "osx" )) { $allvariableshashref->{'POOLPRODUCT'} = 0; } - - if ( $allvariableshashref->{'POOLPRODUCT'} ) - { - if ( ! $installer::globals::sessionidset ) { installer::packagepool::set_sessionid(); } - if ( ! $installer::globals::poolpathset ) { installer::packagepool::set_pool_path(); } - if (( ! $installer::globals::getuidpathset ) && ( $installer::globals::issolarisbuild )) { installer::worker::set_getuid_path($includepatharrayref); } - - my $package_is_creatable = installer::packagepool::check_package_availability($packagename); - - if (( ! $package_is_creatable ) && ( ! exists($installer::globals::poolshiftedpackages{$packagename}) )) - { - splice(@{$packages}, $k, 1); # removing package ... - push(@{$packages}, $onepackage); # ... and adding it to the end - $installer::globals::poolshiftedpackages{$packagename} = 1; # only shifting each package once - $k--; # decreasing the counter - my $localinfoline = "Pool: Package \"$packagename\" cannot be created at the moment. Trying again later (1).\n"; - installer::logger::print_message($localinfoline); - push( @installer::globals::logfileinfo, $localinfoline); - next; # repeating this iteration with new package - } - } - - ########################################### - # Root path, can be defined as parameter - ########################################### - - my $packagerootpath = ""; - - if ($installer::globals::rootpath eq "") - { - $packagerootpath = $onepackage->{'destpath'}; - installer::packagelist::resolve_packagevariables(\$packagerootpath, $allvariableshashref, 1); - # we put branding and common stuff into the same prefix on unixes => $packagerootpath must be the whole prefix, including the product name - if ($installer::globals::isunix) { $packagerootpath .= "/$allvariableshashref->{'UNIXBASISROOTNAME'}"; } - if ( $^O =~ /darwin/i ) { $packagerootpath =~ s/\/opt\//\/Applications\//; } - } - else - { - $packagerootpath = $installer::globals::rootpath; - } - - ############################################# - # copying the collectors for each package - ############################################# - - my $filesinpackage = installer::converter::copy_collector($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "files1_" . $packagename . ".log", $filesinpackage); } - my $linksinpackage = installer::converter::copy_collector($linksinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "links1_" . $packagename . ".log", $linksinpackage); } - my $unixlinksinpackage = installer::converter::copy_collector($unixlinksinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks1_" . $packagename . ".log", $unixlinksinpackage); } - my $dirsinpackage = installer::converter::copy_collector($directoriesforepmarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "dirs1_" . $packagename . ".log", $dirsinpackage); } - - ########################################### - # setting the root path for the packages - ########################################### - - installer::scriptitems::add_rootpath_to_directories($dirsinpackage, $packagerootpath); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "dirs2_" . $packagename . ".log", $dirsinpackage); } - installer::scriptitems::add_rootpath_to_files($filesinpackage, $packagerootpath); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "files2_" . $packagename . ".log", $filesinpackage); } - installer::scriptitems::add_rootpath_to_links($linksinpackage, $packagerootpath); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "links2_" . $packagename . ".log", $linksinpackage); } - installer::scriptitems::add_rootpath_to_files($unixlinksinpackage, $packagerootpath); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks2_" . $packagename . ".log", $unixlinksinpackage); } - - ################################# - # collecting items for package - ################################# - - $filesinpackage = installer::packagelist::find_files_for_package($filesinpackage, $onepackage); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "files3_" . $packagename . ".log", $filesinpackage); } - $unixlinksinpackage = installer::packagelist::find_files_for_package($unixlinksinpackage, $onepackage); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "unixlinks3_" . $packagename . ".log", $unixlinksinpackage); } - $linksinpackage = installer::packagelist::find_links_for_package($linksinpackage, $filesinpackage); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "links3_" . $packagename . ".log", $linksinpackage); } - $dirsinpackage = installer::packagelist::find_dirs_for_package($dirsinpackage, $onepackage); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "dirs3_" . $packagename . ".log", $dirsinpackage); } - - ############################################### - # nothing to do, if $filesinpackage is empty - ############################################### - - if ( ! ( $#{$filesinpackage} > -1 )) - { - push(@installer::globals::emptypackages, $packagename); - $infoline = "\n\nNo file in package: $packagename \-\> Skipping\n\n"; - push(@installer::globals::logfileinfo, $infoline); - next; # next package, end of loop ! - } - - ################################################################# - # nothing to do for Linux patches, if no file has flag PATCH - ################################################################# - - # Linux Patch: The complete RPM has to be built, if one file in the RPM has the flag PATCH (also for DEBs) - if (( $installer::globals::patch ) && (( $installer::globals::isrpmbuild ) || ( $installer::globals::isdebbuild ))) - { - my $patchfiles = installer::worker::collect_all_items_with_special_flag($filesinpackage ,"PATCH"); - if ( ! ( $#{$patchfiles} > -1 )) - { - $infoline = "\n\nLinux Patch: No patch file in package: $packagename \-\> Skipping\n\n"; - push(@installer::globals::logfileinfo, $infoline); - next; - } - } - - ########################################### - # Stripping libraries - ########################################### - - # Building for non Windows platforms in cws requires, that all files are stripped before packaging: - # 1. copy all files that need to be stripped locally - # 2. strip all these files - - if ( $installer::globals::strip ) - { - installer::strip::strip_libraries($filesinpackage, $languagestringref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . $packagename ."_files.log", $filesinpackage); } - } - - ############################################################### - # Searching for files in $filesinpackage with flag LINUXLINK - ############################################################### - - if (( $installer::globals::islinuxbuild ) && ( ! $installer::globals::simple )) # for rpms and debian packages - { - # special handling for all RPMs in $installer::globals::linuxlinkrpms - - if ( $installer::globals::linuxlinkrpms =~ /\b$onepackagename\b/ ) - { - my $run = 0; - - if (( $installer::globals::makelinuxlinkrpm ) && ( ! $run )) - { - $filesinpackage = \@installer::globals::linuxpatchfiles; - $linksinpackage = \@installer::globals::linuxlinks; - $installer::globals::makelinuxlinkrpm = 0; - if ( $installer::globals::patch ) { $installer::globals::call_epm = 1; } # enabling packing again - $run = 1; - - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "files3b_" . $packagename . ".log", $filesinpackage); } - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "links3b_" . $packagename . ".log", $linksinpackage); } - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "dirs3b_" . $packagename . ".log", $dirsinpackage); } - } - - if (( ! $installer::globals::makelinuxlinkrpm ) && ( ! $run )) - { - $filesinpackage = installer::worker::prepare_linuxlinkfiles($filesinpackage); - $linksinpackage = installer::worker::prepare_forced_linuxlinkfiles($linksinpackage); - $installer::globals::makelinuxlinkrpm = 1; - if ( $allvariableshashref->{'OPENSOURCE'} ) { $installer::globals::add_required_package = $packagename . "u"; } - if ( $installer::globals::patch ) { $installer::globals::call_epm = 0; } # no packing of core module in patch - $shellscriptsfilename = ""; # shell scripts only need to be included into the link rpm - $run = 1; - - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "files3a_" . $packagename . ".log", $filesinpackage); } - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "links3a_" . $packagename . ".log", $linksinpackage); } - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "dirs3a_" . $packagename . ".log", $dirsinpackage); } - } - } - } - - ########################################### - # Simple installation mechanism - ########################################### - - if ( $installer::globals::simple ) { installer::worker::install_simple($onepackagename, $$languagestringref, $dirsinpackage, $filesinpackage, $linksinpackage, $unixlinksinpackage); } - - ########################################### - # Checking epm state - ########################################### - - if (( $installer::globals::call_epm ) && ( ! $found_epm )) - { - $epmexecutable = installer::epmfile::find_epm_on_system($includepatharrayref); - installer::epmfile::set_patch_state($epmexecutable); # setting $installer::globals::is_special_epm - $found_epm = 1; # searching only once - } - - ########################################### - # Creating epm list file - ########################################### - - if ( ! $installer::globals::simple ) - { - # epm list file format: - # type mode owner group destination source options - # Example for a file: f 755 root sys /usr/bin/foo foo - # Example for a directory: d 755 root sys /var/spool/foo - - # Example for a link: l 000 root sys /usr/bin/linkname filename - # The source field specifies the file to link to - - my $epmfilename = "epm_" . $onepackagename . $linkaddon . ".lst"; - - installer::logger::print_message( "... creating epm list file $epmfilename ... \n" ); - - my $completeepmfilename = $listfiledir . $installer::globals::separator . $epmfilename; - - my @epmfile = (); - - my $epmheaderref = installer::epmfile::create_epm_header($allvariableshashref, $filesinproductlanguageresolvedarrayref, $languagesarrayref, $onepackage); - installer::epmfile::adding_header_to_epm_file(\@epmfile, $epmheaderref); - - if (( $installer::globals::patch ) && ( $installer::globals::issolarispkgbuild )) - { - $filesinpackage = installer::worker::analyze_patch_files($filesinpackage); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "files4_" . $packagename . ".log", $filesinpackage); } - - if ( ! ( $#{$filesinpackage} > -1 )) - { - push(@installer::globals::emptypackages, $packagename); - $infoline = "\nNo file in package: $packagename \-\> Skipping\n"; - push(@installer::globals::logfileinfo, $infoline); - next; # next package, end of loop ! - } - } - - # adding directories, files and links into epm file - - installer::epmfile::put_directories_into_epmfile($dirsinpackage, \@epmfile, $allvariableshashref, $packagerootpath); - installer::epmfile::put_files_into_epmfile($filesinpackage, \@epmfile ); - installer::epmfile::put_links_into_epmfile($linksinpackage, \@epmfile ); - installer::epmfile::put_unixlinks_into_epmfile($unixlinksinpackage, \@epmfile ); - - if ((!( $shellscriptsfilename eq "" )) && (!($installer::globals::iswindowsbuild))) { installer::epmfile::adding_shellscripts_to_epm_file(\@epmfile, $shellscriptsfilename, $packagerootpath, $allvariableshashref, $filesinpackage); } - - installer::files::save_file($completeepmfilename ,\@epmfile); - - # ... splitting the rootpath into a relocatable part and a static part, if possible - - my $staticpath = ""; - my $relocatablepath = ""; - # relocatable path can be defined in package list - if ( $onepackage->{'relocatablepath'} ) { $relocatablepath = $onepackage->{'relocatablepath'}; } - # setting fix part and variable part of destination path - installer::epmfile::analyze_rootpath($packagerootpath, \$staticpath, \$relocatablepath, $allvariableshashref); - - # ... replacing the variable PRODUCTDIRECTORYNAME in the shellscriptfile by $staticpath - - installer::epmfile::resolve_path_in_epm_list_before_packaging(\@epmfile, $completeepmfilename, "PRODUCTDIRECTORYNAME", $staticpath); - installer::epmfile::resolve_path_in_epm_list_before_packaging(\@epmfile, $completeepmfilename, "SOLSUREPACKAGEPREFIX", $allvariableshashref->{'SOLSUREPACKAGEPREFIX'}); - installer::epmfile::resolve_path_in_epm_list_before_packaging(\@epmfile, $completeepmfilename, "UREPACKAGEPREFIX", $allvariableshashref->{'UREPACKAGEPREFIX'}); - installer::files::save_file($completeepmfilename ,\@epmfile); - - ####################################################### - # Now the complete content of the package is known, - # including variables and shell scripts. - # Create the package or using the package pool? - ####################################################### - - my $use_package_from_pool = 0; - if ( $allvariableshashref->{'POOLPRODUCT'} ) { $use_package_from_pool = installer::packagepool::package_is_up_to_date($allvariableshashref, $onepackage, $packagename, \@epmfile, $filesinpackage, $installdir, $installer::globals::epmoutpath, $languagestringref); } - - if ( $use_package_from_pool == 3 ) # repeat this package later - { - my $package_is_creatable = installer::packagepool::check_package_availability($packagename); - - if (( ! $package_is_creatable ) && ( ! exists($installer::globals::poolshiftedpackages{$packagename}) )) - { - splice(@{$packages}, $k, 1); # removing package ... - push(@{$packages}, $onepackage); # ... and adding it to the end - $installer::globals::poolshiftedpackages{$packagename} = 1; # only shifting each package once - $k--; # decreasing the counter - my $localinfoline = "\nPool: Package \"$packagename\" cannot be created at the moment. Trying again later (2).\n"; - installer::logger::print_message($localinfoline); - push( @installer::globals::logfileinfo, $localinfoline); - next; # repeating this iteration with new package - } - } - - if ( $use_package_from_pool == 4 ) # There was a problem with pooling. Repeat this package immediately. - { - $k--; # decreasing the counter - my $localinfoline = "\nPool: Package \"$packagename\" had pooling problems. Repeating packaging immediately (3).\n"; - installer::logger::print_message($localinfoline); - push( @installer::globals::logfileinfo, $localinfoline); - next; # repeating this iteration - } - - if ( $use_package_from_pool == 0 ) - { - # changing into the "install" directory to create installation sets - - $currentdir = cwd(); # $currentdir is global in this file - - chdir($installdir); # changing into install directory ($installdir is global in this file) - - ########################################### - # Starting epm - ########################################### - - # With a patched epm, it is now possible to set the relocatable directory, change - # the directory in which the packages are created, setting "requires" and "provides" - # (Linux) or creating the "depend" file (Solaris) and finally to begin - # the packaging process with standard tooling and standard parameter - # Linux: Adding into the spec file: Prefix: /opt - # Solaris: Adding into the pkginfo file: BASEDIR=/opt - # Attention: Changing of the path can influence the shell scripts - - if (( $installer::globals::is_special_epm ) && ( ($installer::globals::isrpmbuild) || ($installer::globals::issolarispkgbuild) )) # special handling only for Linux RPMs and Solaris Packages - { - if ( $installer::globals::call_epm ) # only do something, if epm is really executed - { - # ... now epm can be started, to create the installation sets - - installer::logger::print_message( "... starting patched epm ... \n" ); - - installer::epmfile::call_epm($epmexecutable, $completeepmfilename, $packagename, $includepatharrayref); - - my $newepmdir = installer::epmfile::prepare_packages($loggingdir, $packagename, $staticpath, $relocatablepath, $onepackage, $allvariableshashref, $filesinpackage, $languagestringref); # adding the line for Prefix / Basedir, include rpmdir - - installer::epmfile::create_packages_without_epm($newepmdir, $packagename, $includepatharrayref, $allvariableshashref, $languagestringref); # start to package - - # finally removing all temporary files - - installer::epmfile::remove_temporary_epm_files($newepmdir, $loggingdir, $packagename); - - # Installation: - # Install: pkgadd -a myAdminfile -d ./SUNWso8m34.pkg - # Install: rpm -i --prefix=/opt/special --nodeps so8m35.rpm - - installer::epmfile::create_new_directory_structure($newepmdir); - $installer::globals::postprocess_specialepm = 1; - - # solaris patch not needed anymore - } - } - else # this is the standard epm (not relocatable) or ( nonlinux and nonsolaris ) - { - installer::epmfile::resolve_path_in_epm_list_before_packaging(\@epmfile, $completeepmfilename, "\$\$PRODUCTINSTALLLOCATION", $relocatablepath); - installer::files::save_file($completeepmfilename ,\@epmfile); # Warning for pool, content of epm file is changed. - - if ( $installer::globals::call_epm ) - { - # ... now epm can be started, to create the installation sets - - installer::logger::print_message( "... starting unpatched epm ... \n" ); - - if ( $installer::globals::call_epm ) { installer::epmfile::call_epm($epmexecutable, $completeepmfilename, $packagename, $includepatharrayref); } - - if (($installer::globals::isrpmbuild) || ($installer::globals::issolarispkgbuild) || ($installer::globals::debian)) - { - $installer::globals::postprocess_standardepm = 1; - } - } - } - - if ( $allvariableshashref->{'POOLPRODUCT'} ) { installer::packagepool::put_content_into_pool($packagename, $installdir, $installer::globals::epmoutpath, $filesinpackage, \@epmfile); } - - chdir($currentdir); # changing back into start directory - - } # end of "if ( ! $use_package_from_pool ) - - } # end of "if ( ! $installer::globals::simple ) - - ########################################### - # xpd installation mechanism - ########################################### - - # Creating the xpd file for the package. This has to happen always, not determined by $use_package_from_pool - - if ( $installer::globals::isxpdplatform ) - { - if (( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack ) && ( ! $installer::globals::patch )) - { - if (( $allvariableshashref->{'XPDINSTALLER'} ) && ( $installer::globals::call_epm != 0 )) - { - installer::xpdinstaller::create_xpd_file($onepackage, $packages, $languagestringref, $allvariableshashref, $modulesinproductarrayref, $installdir, $installer::globals::epmoutpath, $linkpackage, \%installer::globals::xpdpackageinfo); - $installer::globals::xpd_files_prepared = 1; - %installer::globals::xpdpackageinfo = (); - } - } - } - - if ( $installer::globals::makelinuxlinkrpm ) { $k--; } # decreasing the counter to create the link rpm! - - } # end of "for ( my $k = 0; $k <= $#{$packages}; $k++ )" - - installer::packagepool::log_pool_statistics(); - - ############################################################## - # Post epm functionality, after the last package is packed - ############################################################## - - if ( $installer::globals::postprocess_specialepm ) - { - installer::logger::include_header_into_logfile("Post EPM processes (Patched EPM):"); - - chdir($installdir); - - # Copying the cde, kde and gnome packages into the installation set - if ( $installer::globals::addsystemintegration ) { installer::epmfile::put_systemintegration_into_installset($installer::globals::epmoutpath, $includepatharrayref, $allvariableshashref, $modulesinproductarrayref); } - - # Adding license and readme into installation set - if ($installer::globals::addlicensefile) { installer::worker::put_scpactions_into_installset("."); } - - # Adding child projects to installation dynamically - if ($installer::globals::addchildprojects) { installer::epmfile::put_childprojects_into_installset($installer::globals::epmoutpath, $allvariableshashref, $modulesinproductarrayref, $includepatharrayref); } - - # Adding license file into setup - if ( $allvariableshashref->{'PUT_LICENSE_INTO_SETUP'} ) { installer::worker::put_license_into_setup(".", $includepatharrayref); } - - # Creating installation set for Unix language packs, that are not part of multi lingual installation sets - if ( ( $installer::globals::languagepack ) && ( ! $installer::globals::debian ) && ( ! $installer::globals::makedownload ) ) { installer::languagepack::build_installer_for_languagepack($installer::globals::epmoutpath, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref); } - - # Creating installation set for Unix help packs, that are not part of multi lingual installation sets - if ( ( $installer::globals::helppack ) && ( ! $installer::globals::debian ) && ( ! $installer::globals::makedownload ) ) { installer::helppack::build_installer_for_helppack($installer::globals::epmoutpath, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref); } - - # Finalizing patch installation sets - if (( $installer::globals::patch ) && ( $installer::globals::issolarispkgbuild )) { installer::epmfile::finalize_patch($installer::globals::epmoutpath, $allvariableshashref); } - if (( $installer::globals::patch ) && ( $installer::globals::isrpmbuild )) { installer::epmfile::finalize_linux_patch($installer::globals::epmoutpath, $allvariableshashref, $includepatharrayref); } - - # Copying the xpd installer into the installation set - if (( $allvariableshashref->{'XPDINSTALLER'} ) && ( $installer::globals::isxpdplatform ) && ( $installer::globals::xpd_files_prepared )) - { - installer::xpdinstaller::create_xpd_installer($installdir, $allvariableshashref, $languagestringref); - } - - chdir($currentdir); # changing back into start directory - } - - if ( $installer::globals::postprocess_standardepm ) - { - installer::logger::include_header_into_logfile("Post EPM processes (Standard EPM):"); - - chdir($installdir); - - # determine the destination directory - my $newepmdir = installer::epmfile::determine_installdir_ooo(); - - # Copying the cde, kde and gnome packages into the installation set - if ( $installer::globals::addsystemintegration ) { installer::epmfile::put_systemintegration_into_installset($newepmdir, $includepatharrayref, $allvariableshashref, $modulesinproductarrayref); } - - # Adding license and readme into installation set - if ($installer::globals::addlicensefile) { installer::worker::put_scpactions_into_installset("."); } - - # Adding license file into setup - if ( $allvariableshashref->{'PUT_LICENSE_INTO_SETUP'} ) { installer::worker::put_license_into_setup(".", $includepatharrayref); } - - # Creating installation set for Unix language packs, that are not part of multi lingual installation sets - if ( ( $installer::globals::languagepack ) && ( ! $installer::globals::debian ) && ( ! $installer::globals::makedownload ) ) { installer::languagepack::build_installer_for_languagepack($newepmdir, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref); } - - # Creating installation set for Unix help packs, that are not part of multi lingual installation sets - if ( ( $installer::globals::helppack ) && ( ! $installer::globals::debian ) && ( ! $installer::globals::makedownload ) ) { installer::helppack::build_installer_for_helpepack($newepmdir, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref); } - - chdir($currentdir); # changing back into start directory - } - - if (( $installer::globals::issolarispkgbuild ) && ( $allvariableshashref->{'COLLECT_PKGMAP'} )) { installer::worker::collectpackagemaps($installdir, $languagestringref, $allvariableshashref); } - - ####################################################### - # Analyzing the log file - ####################################################### - - my $is_success = 0; - my $finalinstalldir = ""; - - installer::worker::clean_output_tree(); # removing directories created in the output tree - ($is_success, $finalinstalldir) = installer::worker::analyze_and_save_logfile($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); - my $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "downloadname"); - if ( $is_success ) { installer::followme::save_followme_info($finalinstalldir, $includepatharrayref, $allvariableshashref, $$downloadname, $languagestringref, $languagesarrayref, $current_install_number, $loggingdir, $installlogdir); } - - ####################################################### - # Creating download installation set - ####################################################### - - if ( $installer::globals::makedownload ) - { - my $create_download = 0; - if ( $$downloadname ne "" ) { $create_download = 1; } - if (( $is_success ) && ( $create_download ) && ( $ENV{'ENABLE_DOWNLOADSETS'} )) - { - my $downloaddir = installer::download::create_download_sets($finalinstalldir, $includepatharrayref, $allvariableshashref, $$downloadname, $languagestringref, $languagesarrayref); - installer::worker::analyze_and_save_logfile($loggingdir, $downloaddir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); - } - } - - ####################################################### - # Creating jds installation set - ####################################################### - - if ( $installer::globals::makejds ) - { - my $create_jds = 0; - - if ( $allvariableshashref->{'JDSBUILD'} ) { $create_jds = 1; } - if (! $installer::globals::issolarispkgbuild ) { $create_jds = 0; } - - if (( $is_success ) && ( $create_jds )) - { - if ( ! $installer::globals::jds_language_controlled ) - { - my $correct_language = installer::worker::check_jds_language($allvariableshashref, $languagestringref); - $installer::globals::correct_jds_language = $correct_language; - $installer::globals::jds_language_controlled = 1; - } - - if ( $installer::globals::correct_jds_language ) - { - my $jdsdir = installer::worker::create_jds_sets($finalinstalldir, $allvariableshashref, $languagestringref, $languagesarrayref, $includepatharrayref); - installer::worker::clean_jds_temp_dirs(); - installer::worker::analyze_and_save_logfile($loggingdir, $jdsdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); - } - } - } - - } # end of "if (!( $installer::globals::iswindowsbuild ))" - - if ( $installer::globals::debug ) { installer::logger::debuginfo("\nEnd of part 2a: All non-Windows platforms\n"); } - - ################################################# - # Part 2b: The Windows platform - ################################################# - - if ( $installer::globals::debug ) { installer::logger::debuginfo("\nPart 2b: The Windows platform\n"); } - - ##################################################################### - # ... creating idt files ... - # Only for Windows builds ($installer::globals::compiler is wntmsci) - ##################################################################### - - if ( $installer::globals::iswindowsbuild ) - { - ########################################### - # Stripping libraries - ########################################### - - # Building for gcc build in cws requires, that all files are stripped before packaging: - # 1. copy all files that need to be stripped locally - # 2. strip all these files - - if ( $installer::globals::compiler =~ /wntgcci/ ) - { - installer::windows::strip::strip_binaries($filesinproductlanguageresolvedarrayref, $languagestringref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles16e.log", $filesinproductlanguageresolvedarrayref); } - } - - $installdir = installer::worker::create_installation_directory($shipinstalldir, $languagestringref, \$current_install_number); - - my $idtdirbase = installer::systemactions::create_directories("idt_files", $languagestringref); - $installer::globals::infodirectory = installer::systemactions::create_directories("info_files", $languagestringref); - my $installlogdir = installer::systemactions::create_directory_next_to_directory($installdir, "log"); - - ################################################################################# - # Preparing cabinet files from package definitions - ################################################################################# - - installer::packagelist::prepare_cabinet_files($packages, $allvariableshashref); - # printing packages content: - installer::packagelist::log_cabinet_assignments(); - - ################################################################################# - # Begin of functions that are used for the creation of idt files (Windows only) - ################################################################################# - - installer::logger::print_message( "... creating idt files ...\n" ); - - installer::logger::include_header_into_logfile("Creating idt files:"); - - my $newidtdir = $idtdirbase . $installer::globals::separator . "00"; # new files into language independent directory "00" - installer::systemactions::create_directory($newidtdir); - - my @allfilecomponents = (); - my @allregistrycomponents = (); - - # Collecting all files with flag "BINARYTABLE" - my $binarytablefiles = installer::worker::collect_all_items_with_special_flag($filesinproductlanguageresolvedarrayref ,"BINARYTABLE"); - - # Removing all files with flag "BINARYTABLE_ONLY" - @installer::globals::binarytableonlyfiles = (); - $filesinproductlanguageresolvedarrayref = installer::worker::remove_all_items_with_special_flag($filesinproductlanguageresolvedarrayref ,"BINARYTABLE_ONLY"); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles17.log", $filesinproductlanguageresolvedarrayref); } - - # Collecting all profileitems with flag "INIFILETABLE" for table "IniFile" - my $inifiletableentries = installer::worker::collect_all_items_with_special_flag($profileitemsinproductlanguageresolvedarrayref ,"INIFILETABLE"); - - # Creating the important dynamic idt files - installer::windows::msiglobal::set_msiproductversion($allvariableshashref); - installer::windows::msiglobal::put_msiproductversion_into_bootstrapfile($filesinproductlanguageresolvedarrayref); - - # Add cabinet assignments to files - installer::windows::file::assign_cab_to_files($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles17a.log", $filesinproductlanguageresolvedarrayref); } - installer::windows::file::assign_sequencenumbers_to_files($filesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles17b.log", $filesinproductlanguageresolvedarrayref); } - - # Collection all available directory trees - installer::windows::directory::collectdirectorytrees($directoriesforepmarrayref); - - $filesinproductlanguageresolvedarrayref = installer::windows::file::create_files_table($filesinproductlanguageresolvedarrayref, \@allfilecomponents, $newidtdir, $allvariableshashref, $uniquefilename, $allupdatesequences, $allupdatecomponents, $allupdatefileorder); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles17c.log", $filesinproductlanguageresolvedarrayref); } - if ( $installer::globals::updatedatabase ) { installer::windows::file::check_file_sequences($allupdatefileorder, $allupdatecomponentorder); } - - # Attention: The table "Director.idt" contains language specific strings -> parameter: $languagesarrayref ! - installer::windows::directory::create_directory_table($directoriesforepmarrayref, $languagesarrayref, $newidtdir, $allvariableshashref, $shortdirname, $loggingdir); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles18.log", $filesinproductlanguageresolvedarrayref); } - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt1.log", $directoriesforepmarrayref); } - - # Attention: The table "Registry.idt" contains language specific strings -> parameter: $languagesarrayref ! - installer::windows::registry::create_registry_table($registryitemsinproductlanguageresolvedarrayref, \@allregistrycomponents, $newidtdir, $languagesarrayref, $allvariableshashref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems4.log", $registryitemsinproductlanguageresolvedarrayref); } - - installer::windows::component::create_component_table($filesinproductlanguageresolvedarrayref, $registryitemsinproductlanguageresolvedarrayref, $directoriesforepmarrayref, \@allfilecomponents, \@allregistrycomponents, $newidtdir, $componentid, $componentidkeypath, $allvariableshashref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles19.log", $filesinproductlanguageresolvedarrayref); } - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "registryitems5.log", $registryitemsinproductlanguageresolvedarrayref); } - - # Attention: The table "Feature.idt" contains language specific strings -> parameter: $languagesarrayref ! - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules4.log", $modulesinproductlanguageresolvedarrayref); } - installer::windows::feature::add_uniquekey($modulesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules4a.log", $modulesinproductlanguageresolvedarrayref); } - $modulesinproductlanguageresolvedarrayref = installer::windows::feature::sort_feature($modulesinproductlanguageresolvedarrayref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "modules4b.log", $modulesinproductlanguageresolvedarrayref); } - installer::windows::feature::create_feature_table($modulesinproductlanguageresolvedarrayref, $newidtdir, $languagesarrayref, $allvariableshashref); - - installer::windows::featurecomponent::create_featurecomponent_table($filesinproductlanguageresolvedarrayref, $registryitemsinproductlanguageresolvedarrayref, $newidtdir); - - installer::windows::media::create_media_table($filesinproductlanguageresolvedarrayref, $newidtdir, $allvariableshashref, $allupdatelastsequences, $allupdatediskids); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "productfiles20.log", $filesinproductlanguageresolvedarrayref); } - - installer::windows::font::create_font_table($filesinproductlanguageresolvedarrayref, $newidtdir); - - # Attention: The table "Shortcut.idt" contains language specific strings -> parameter: $languagesarrayref ! - # Attention: Shortcuts (Folderitems) have icon files, that have to be copied into the Icon directory (last parameter) - my @iconfilecollector = (); - - installer::windows::shortcut::create_shortcut_table($filesinproductlanguageresolvedarrayref, $linksinproductlanguageresolvedarrayref, $folderinproductlanguageresolvedarrayref, $folderitemsinproductlanguageresolvedarrayref, $directoriesforepmarrayref, $newidtdir, $languagesarrayref, $includepatharrayref, \@iconfilecollector); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "folderitems4.log", $folderitemsinproductlanguageresolvedarrayref); } - - installer::windows::inifile::create_inifile_table($inifiletableentries, $filesinproductlanguageresolvedarrayref, $newidtdir); - - installer::windows::icon::create_icon_table(\@iconfilecollector, $newidtdir); # creating the icon table with all iconfiles used as shortcuts (FolderItems) - - installer::windows::createfolder::create_createfolder_table($directoriesforepmarrayref, $filesinproductlanguageresolvedarrayref, $newidtdir, $allvariableshashref); - - installer::windows::upgrade::create_upgrade_table($newidtdir, $allvariableshashref); - - if (( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack )) # the following tables not for language packs or help packs - { - installer::windows::removefile::create_removefile_table($folderitemsinproductlanguageresolvedarrayref, $newidtdir); - - installer::windows::selfreg::create_selfreg_table($filesinproductlanguageresolvedarrayref, $newidtdir); - - # Adding Assemblies into the tables MsiAssembly and MsiAssemblyName dynamically - installer::windows::assembly::create_msiassembly_table($filesinproductlanguageresolvedarrayref, $newidtdir); - installer::windows::assembly::create_msiassemblyname_table($filesinproductlanguageresolvedarrayref, $newidtdir); - installer::windows::assembly::add_assembly_condition_into_component_table($filesinproductlanguageresolvedarrayref, $newidtdir); - } - - $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - - # Localizing the language dependent idt files - # For every language there will be a localized msi database - # For multilingual installation sets, the differences of this - # databases have to be stored in transforms. - - for ( my $m = 0; $m <= $#{$languagesarrayref}; $m++ ) - { - my $onelanguage = ${$languagesarrayref}[$m]; - - my $is_bidi = 0; - if ( installer::existence::exists_in_array($onelanguage, \@installer::globals::bidilanguages) ) { $is_bidi = 1; } - - my $languageidtdir = $idtdirbase . $installer::globals::separator . $onelanguage; - if ( -d $languageidtdir ) { installer::systemactions::remove_complete_directory($languageidtdir, 1); } - installer::systemactions::create_directory($languageidtdir); - - # Copy the template idt files and the new created idt files into this language directory - - installer::logger::print_message( "... copying idt files ...\n" ); - - installer::logger::include_header_into_logfile("Copying idt files to $languageidtdir:"); - - installer::windows::idtglobal::prepare_language_idt_directory($languageidtdir, $newidtdir, $onelanguage, $filesinproductlanguageresolvedarrayref, \@iconfilecollector, $binarytablefiles, $allvariableshashref); - - if ( ! $installer::globals::languagepack && ! $installer::globals::helppack ) - { - # For multilingual installation sets, the dialog for the language selection can now be prepared, with - # a checkbox for each available language. This has to happen before the following translation. - # The new controls have to be added into the Control.idt - - my $controlidttablename = $languageidtdir . $installer::globals::separator . "Control.idt"; - my $controlidttable = installer::files::read_file($controlidttablename); - installer::windows::idtglobal::add_language_checkboxes_to_database($controlidttable, $languagesarrayref); - installer::files::save_file($controlidttablename, $controlidttable); - $infoline = "Added checkboxes for language selection dialog into table $controlidttablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - # Now all files are copied into a language specific directory - # The template idt files can be translated - - installer::logger::print_message( "... localizing idt files (language: $onelanguage) ...\n" ); - - installer::logger::include_header_into_logfile("Localizing idt files (Language: $onelanguage):"); - - my @translationfiles = (); # all idt files, that need a translation - push(@translationfiles, "ActionTe.idt"); - push(@translationfiles, "Control.idt"); - push(@translationfiles, "CustomAc.idt"); - push(@translationfiles, "Error.idt"); - push(@translationfiles, "LaunchCo.idt"); - push(@translationfiles, "RadioBut.idt"); - push(@translationfiles, "Property.idt"); - push(@translationfiles, "UIText.idt"); - - my $oneidtfilename; - my $oneidtfile; - - foreach $oneidtfilename (@translationfiles) - { - my $languagefilename = installer::windows::idtglobal::get_languagefilename($oneidtfilename, $installer::globals::idtlanguagepath); - my $languagefile = installer::files::read_file($languagefilename); - - $oneidtfilename = $languageidtdir . $installer::globals::separator . $oneidtfilename; - $oneidtfile = installer::files::read_file($oneidtfilename); - - # Now the substitution can start - installer::windows::idtglobal::translate_idtfile($oneidtfile, $languagefile, $onelanguage); - - installer::files::save_file($oneidtfilename, $oneidtfile); - - $infoline = "Translated idt file: $oneidtfilename into language $onelanguage\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Used languagefile: $languagefilename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - # setting the encoding in every table (replacing WINDOWSENCODINGTEMPLATE) - - installer::windows::idtglobal::setencoding($languageidtdir, $onelanguage); - - # setting bidi attributes, if required - - if ( $is_bidi ) { installer::windows::idtglobal::setbidiattributes($languageidtdir, $onelanguage); } - - # setting the encoding in every table (replacing WINDOWSENCODINGTEMPLATE) - installer::windows::idtglobal::set_multilanguageonly_condition($languageidtdir); - - # include the license text into the table Control.idt - - if ( ! $allvariableshashref->{'HIDELICENSEDIALOG'} ) - { - my $licensefilesource = installer::windows::idtglobal::get_rtflicensefilesource($onelanguage, $includepatharrayref_lang); - my $licensefile = installer::files::read_file($licensefilesource); - installer::scpzipfiles::replace_all_ziplistvariables_in_rtffile($licensefile, $allvariablesarrayref, $onelanguage, $loggingdir); - my $controltablename = $languageidtdir . $installer::globals::separator . "Control.idt"; - my $controltable = installer::files::read_file($controltablename); - installer::windows::idtglobal::add_licensefile_to_database($licensefile, $controltable); - installer::files::save_file($controltablename, $controltable); - - $infoline = "Added licensefile $licensefilesource into database $controltablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - # include a component into environment table if required - - installer::windows::component::set_component_in_environment_table($languageidtdir, $filesinproductlanguageresolvedarrayref); - - # include the ProductCode and the UpgradeCode from codes-file into the Property.idt - - installer::windows::property::set_codes_in_property_table($languageidtdir); - - # the language specific properties can now be set in the Property.idt - - installer::windows::property::update_property_table($languageidtdir, $onelanguage, $allvariableshashref, $languagestringref); - - # replacing variables in RegLocat.idt - - installer::windows::msiglobal::update_reglocat_table($languageidtdir, $allvariableshashref); - - # replacing variables in RemoveRe.idt (RemoveRegistry.idt) - - installer::windows::msiglobal::update_removere_table($languageidtdir); - - # adding language specific properties for multilingual installation sets - - installer::windows::property::set_languages_in_property_table($languageidtdir, $languagesarrayref); - - # adding settings into CheckBox.idt - installer::windows::property::update_checkbox_table($languageidtdir, $allvariableshashref); - - # adding the files from the binary directory into the binary table - installer::windows::binary::update_binary_table($languageidtdir, $filesinproductlanguageresolvedarrayref, $binarytablefiles); - - # setting patch codes to detect installed products - - if (( $installer::globals::patch ) || ( $installer::globals::languagepack ) || ( $installer::globals::helppack ) || ( $allvariableshashref->{'PDFCONVERTER'} )) { installer::windows::patch::update_patch_tables($languageidtdir, $allvariableshashref); } - - # Adding Windows Installer CustomActions - - installer::windows::idtglobal::addcustomactions($languageidtdir, $windowscustomactionsarrayref, $filesinproductlanguageresolvedarrayref); - - # Adding child projects if specified - - if ($installer::globals::addchildprojects) - { - # Adding child projects to installation dynamically (also in feature table) - installer::windows::idtglobal::add_childprojects($languageidtdir, $filesinproductlanguageresolvedarrayref, $allvariableshashref); - # setting Java variables for Java products - if ( $allvariableshashref->{'JAVAPRODUCT'} ) { installer::windows::java::update_java_tables($languageidtdir, $allvariableshashref); } - } - - # Then the language specific msi database can be created - - if ( $installer::globals::iswin ) # only possible on a Windows platform - { - my $msidatabasename = installer::windows::msiglobal::get_msidatabasename($allvariableshashref, $onelanguage); - my $msifilename = $languageidtdir . $installer::globals::separator . $msidatabasename; - - installer::logger::print_message( "... creating msi database (language $onelanguage) ... \n" ); - - installer::windows::msiglobal::set_uuid_into_component_table($languageidtdir, $allvariableshashref); # setting new GUID for the components using the tool uuidgen.exe - installer::windows::msiglobal::prepare_64bit_database($languageidtdir, $allvariableshashref); # making last 64 bit changes - installer::windows::msiglobal::create_msi_database($languageidtdir ,$msifilename); - - # validating the database # ToDo - - my $languagefile = installer::files::read_file($installer::globals::idtlanguagepath . $installer::globals::separator . "SIS.mlf"); - - installer::windows::msiglobal::write_summary_into_msi_database($msifilename, $onelanguage, $languagefile, $allvariableshashref); - - # if there are Merge Modules, they have to be integrated now - $filesinproductlanguageresolvedarrayref = installer::windows::mergemodule::merge_mergemodules_into_msi_database($mergemodulesarrayref, $filesinproductlanguageresolvedarrayref, $msifilename, $languagestringref, $onelanguage, $languagefile, $allvariableshashref, $includepatharrayref, $allupdatesequences, $allupdatelastsequences, $allupdatediskids); - if (( $installer::globals::globallogging ) && ($installer::globals::globalloggingform21)) { installer::files::save_array_of_hashes($loggingdir . "productfiles21_" . $onelanguage . ".log", $filesinproductlanguageresolvedarrayref); } - $installer::globals::globalloggingform21 = 0; - if ( $installer::globals::use_packages_for_cabs ) { installer::windows::media::create_media_table($filesinproductlanguageresolvedarrayref, $newidtdir, $allvariableshashref, $allupdatelastsequences, $allupdatediskids); } - - # copy msi database into installation directory - - my $msidestfilename = $installdir . $installer::globals::separator . $msidatabasename; - installer::systemactions::copy_one_file($msifilename, $msidestfilename); - } - } - - # Creating transforms, if the installation set has more than one language - # renaming the msi database and generating the setup.ini file - - my $defaultlanguage = installer::languages::get_default_language($languagesarrayref); - - if ( $installer::globals::iswin ) # only possible on a Windows platform - { - if ( $#{$languagesarrayref} > 0 ) - { - installer::windows::msiglobal::create_transforms($languagesarrayref, $defaultlanguage, $installdir, $allvariableshashref); - } - - installer::windows::msiglobal::rename_msi_database_in_installset($defaultlanguage, $installdir, $allvariableshashref); - - if ( $allvariableshashref->{'ADDLANGUAGEINDATABASENAME'} ) { installer::windows::msiglobal::add_language_to_msi_database($defaultlanguage, $installdir, $allvariableshashref); } - - installer::logger::print_message( "... generating setup.ini ...\n" ); - - if ( ! $allvariableshashref->{'NOLOADERREQUIRED'} ) { installer::windows::msiglobal::create_setup_ini($languagesarrayref, $defaultlanguage, $installdir, $allvariableshashref); } - } - - # Analyzing the ScpActions and copying the files into the installation set - # At least the loader.exe - - installer::logger::print_message( "... copying files into installation set ...\n" ); - - installer::worker::put_scpactions_into_installset($installdir); - - # ... copying the setup.exe - - installer::windows::msiglobal::copy_windows_installer_files_into_installset($installdir, $includepatharrayref, $allvariableshashref); - - # ... copying MergeModules into installation set - - if ( ! $installer::globals::fix_number_of_cab_files ) { installer::windows::msiglobal::copy_merge_modules_into_installset($installdir); } - - # ... copying the child projects - - if ($installer::globals::addchildprojects) - { - installer::windows::msiglobal::copy_child_projects_into_installset($installdir, $allvariableshashref); - } - - installer::logger::print_message( "... creating ddf files ...\n" ); - - # Creating all needed ddf files and generating a list - # for the package process containing all system calls - - my $ddfdir = installer::systemactions::create_directories("ddf", $languagestringref); - - $installer::globals::packjobref = installer::windows::msiglobal::generate_cab_file_list($filesinproductlanguageresolvedarrayref, $installdir, $ddfdir, $allvariableshashref); - - # Update and patch reasons the pack order needs to be saved - installer::windows::msiglobal::save_packorder(); - - $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - - #################################### - # Writing log file - # before cab files are packed - #################################### - - installer::logger::print_message( "... creating log file $installer::globals::logfilename \n" ); - - installer::files::save_file($loggingdir . $installer::globals::logfilename, \@installer::globals::logfileinfo); - - ####################################################### - # Finally really create the installation packages, - # Only for Windows and only on a windows platform. - ####################################################### - - if ( $installer::globals::iswin ) # only possible on a Windows platform - { - installer::logger::print_message( "... packaging installation set ... \n" ); - installer::windows::msiglobal::execute_packaging($installer::globals::packjobref, $loggingdir, $allvariableshashref); - if ( $installer::globals::include_cab_in_msi ) { installer::windows::msiglobal::include_cabs_into_msi($installdir); } - - #################################### - # Writing log file - # after cab files are packed - #################################### - - installer::logger::print_message( "\n... creating log file $installer::globals::logfilename \n" ); - installer::files::save_file($loggingdir . $installer::globals::logfilename, \@installer::globals::logfileinfo); - } - - ####################################################### - # Analyzing the log file - ####################################################### - - my $is_success = 0; - my $finalinstalldir = ""; - installer::worker::clean_output_tree(); # removing directories created in the output tree - ($is_success, $finalinstalldir) = installer::worker::analyze_and_save_logfile($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); - - ####################################################### - # Creating Windows msp patches - ####################################################### - - if (( $is_success ) && ( $installer::globals::updatedatabase ) && ( $allvariableshashref->{'CREATE_MSP_INSTALLSET'} )) - { - # Required: - # Temp path for administrative installations: $installer::globals::temppath - # Path of new installation set: $finalinstalldir - # Path of old installation set: $installer::globals::updatedatabasepath - my $mspdir = installer::windows::msp::create_msp_patch($finalinstalldir, $includepatharrayref, $allvariableshashref, $languagestringref, $languagesarrayref, $filesinproductlanguageresolvedarrayref); - ($is_success, $finalinstalldir) = installer::worker::analyze_and_save_logfile($loggingdir, $mspdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); - installer::worker::clean_output_tree(); # removing directories created in the output tree - } - - ####################################################### - # Creating download installation set - ####################################################### - - my $create_download = 0; - my $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "downloadname"); - if ( $installer::globals::languagepack ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "langpackdownloadname"); } - if ( $installer::globals::helppack ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "helppackdownloadname"); } - if ( $installer::globals::patch ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "patchdownloadname"); } - - if ( $is_success ) { installer::followme::save_followme_info($finalinstalldir, $includepatharrayref, $allvariableshashref, $$downloadname, $languagestringref, $languagesarrayref, $current_install_number, $loggingdir, $installlogdir); } - - if ( $$downloadname ne "" ) { $create_download = 1; } - if (( $is_success ) && ( $create_download ) && ( $ENV{'ENABLE_DOWNLOADSETS'} )) - { - my $downloaddir = installer::download::create_download_sets($finalinstalldir, $includepatharrayref, $allvariableshashref, $$downloadname, $languagestringref, $languagesarrayref); - installer::worker::analyze_and_save_logfile($loggingdir, $downloaddir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); - } - - } # end of "if ( $installer::globals::iswindowsbuild )" - - if ( $installer::globals::debug ) { installer::logger::debuginfo("\nEnd of part 2b: The Windows platform\n"); } - - # saving file_info file for later analysis - my $speciallogfilename = "fileinfo_" . $installer::globals::product . "\.log"; - installer::files::save_array_of_hashes($loggingdir . $speciallogfilename, $filesinproductlanguageresolvedarrayref); - -} # end of iteration for one language group - -# saving debug info at end -if ( $installer::globals::debug ) { installer::logger::savedebug($installer::globals::exitlog); } - -####################################################### -# Stopping time -####################################################### - -installer::logger::stoptime(); - -#################################### -# Main program end -#################################### diff --git a/solenv/bin/makedepn b/solenv/bin/makedepn deleted file mode 100755 index c08ea38d0..000000000 --- a/solenv/bin/makedepn +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -e -if [ -z "$1" ]; then - exit 1; -fi -infile=`echo "$1" | sed 's/^@//'` -for i in `cat "$infile"`; do - i=`echo "$i" | fgrep -- "-O:" | awk -F: '{print $2}'` - if [ ! -z "$i" ]; then - echo "#" > "$i" - exit 0; - fi; -done -exit 1 diff --git a/solenv/bin/makemani.pl b/solenv/bin/makemani.pl deleted file mode 100644 index c98ba6535..000000000 --- a/solenv/bin/makemani.pl +++ /dev/null @@ -1,111 +0,0 @@ -#! /usr/bin/perl -w - eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' - if 0; #$running_under_some_shell -#************************************************************************* -# -# 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. -# -#************************************************************************* - -use strict; -use File::Find (); -use Cwd qw (cwd); - -my @findlist; - -# Set the variable $File::Find::dont_use_nlink if you're using AFS, -# since AFS cheats. - -# for the convenience of &wanted calls, including -eval statements: -use vars qw/*name *dir *prune/; -*name = *File::Find::name; -*dir = *File::Find::dir; -*prune = *File::Find::prune; - -sub wanted; - - - -sub wanted { - /^.*\.xc(s|u)\z/s - && ( push @findlist, $name ); -} - -sub usage -{ - print STDERR "\n$0 - append *.xcu file entries to .oxt manifest.xml\n\n"; - print STDERR "usage: $0 <static_part> <start dir> <search dir> <destination dir>\n\n"; - print STDERR " static part - file containig all other content for mainfest.xml\n"; - print STDERR " start dir - directory to change to before starting search\n"; - print STDERR " out dir - destination directory to write manifes.xml to\n\n"; - exit 1; -} - -if ( $#ARGV != 3 ) { usage(); }; - -my $manifest_head = $ARGV[0]; -my $start_dir = $ARGV[1]; -my $dynamic_dir = $ARGV[2]; -my $out_dir = $ARGV[3]; - -print "################################################\n"; -print "# #\n"; -print "# just a prototype - for testing purpose only! #\n"; -print "# #\n"; -print "################################################\n\n"; - - -# Traverse desired filesystems -my $work_dir = cwd(); -chdir $start_dir or die "$0: ERROR - cannot change directory to \"$start_dir\"\n"; -File::Find::find({wanted => \&wanted}, $dynamic_dir); -chdir $work_dir or die "$0: ERROR - oops... cannot change dir to where i came from!\n"; - -open (HEAD, "$manifest_head") or die "$0: ERROR - Cannot open $manifest_head\n"; -my @headlines = <HEAD>; -close HEAD; -chomp @headlines; -chomp @findlist; - -my @bodylines; -my @taillines = ("</manifest:manifest>"); - -foreach my $i (@findlist) { - if ($i =~ m/^.*\.xcu\z/s) { - push @bodylines, " <manifest:file-entry manifest:media-type=\"application/vnd.sun.star.configuration-data\""; - } else { - push @bodylines, " <manifest:file-entry manifest:media-type=\"application/vnd.sun.star.configuration-schema\""; - } - push @bodylines, " manifest:full-path=\"$i\"/>"; -} - -open (MANIOUT,">$out_dir/manifest.xml") or die "$0: ERROR - cannot open \"$out_dir/manifest.xml\" for writing.\n"; -binmode MANIOUT; - -foreach my $j (@headlines, @bodylines, @taillines) { - print MANIOUT "$j\n"; -} - -close MANIOUT; - diff --git a/solenv/bin/mapgen.pl b/solenv/bin/mapgen.pl deleted file mode 100644 index 1d6ccf484..000000000 --- a/solenv/bin/mapgen.pl +++ /dev/null @@ -1,210 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - -# -# mapgen - generate a map file for Unix libraries -# - -#use File::Path; -#use File::Copy; - -#### script id ##### - -( $script_name = $0 ) =~ s/^.*\b(\w+)\.pl$/$1/; - -$id_str = ' $Revision: 1.6 $ '; -$id_str =~ /Revision:\s+(\S+)\s+\$/ - ? ($script_rev = $1) : ($script_rev = "-"); - -print "$script_name -- version: $script_rev\n"; -print "Multi Platform Enabled Edition\n"; - -######################### -# # -# Globale Variablen # -# # -######################### - -$dump_file = ''; -$flt_file = ''; -$map_file = ''; -$first_string = ''; -$tab = ' '; - -#### main #### - -&get_options; -if (!(open (DUMP_FILE, $dump_file))) { - &print_error("Unable open $dump_file"); -}; -if (!(open (FLT_FILE, $flt_file))) { - close DUMP_FILE; - &print_error("Unable open $flt_file"); -}; -unlink $map_file; -if (!(open (MAP_FILE, ">>$map_file"))) { - close DUMP_FILE; - close FLT_FILE; - &print_error("Unable open $map_file"); -}; - -if ($ENV{OS} eq 'SOLARIS') { - &gen_sol; -} elsif ($ENV{OS} eq 'LINUX') { - &gen_lnx; -} else { - &print_error ('Environment not set!!'); -}; - -close DUMP_FILE; -close FLT_FILE; -close MAP_FILE; - -#### end of main procedure #### - -######################### -# # -# Procedures # -# # -######################### - -# -# Generate a map file for solaris -# -sub gen_sol { - my %symbols = (); - foreach (<DUMP_FILE>) { - next if (!(/\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*\|\s*(\S+)\s*/)); - next if (($7 =~ /UNDEF/) || ($7 =~ /ABS/)); - next if ($5 eq 'LOCL'); - $symbols{$8}++; - }; - &filter_symbols(\%symbols); -}; - -# -# Generate a map file for linux -# -sub gen_lnx { - my %symbols = (); - foreach (<DUMP_FILE>) { - next if (!(/^\S+ [A|B|C|D|G|I|N|R|S|T|U|V|W|-|\?|-] (\S+)/)); - $symbols{$1}++; - }; - &filter_symbols(\%symbols); -} - -# -# Filter symbols with filters from $flt_file -# -sub filter_symbols { - my $symbols = shift; - my $env_section = ''; - my @filters = (); - my @filtered_symbols = (); - while (<FLT_FILE>) { - s/\r//; - s/\n//; - $env_section = '1' and next if ((/^# SOLARIS #$/) && ($ENV{OS} eq 'SOLARIS')); - $env_section = '1' and next if ((/^# LINUX #$/) && ($ENV{OS} eq 'LINUX')); - $env_section = '1' and next if ((/^# FREEBSD #$/) && ($ENV{OS} eq 'FREEBSD')); - $env_section = '1' and next if ((/^# NETBSD #$/) && ($ENV{OS} eq 'NETBSD')); - $env_section = '1' and next if ((/^# OPENBSD #$/) && ($ENV{OS} eq 'OPENBSD')); - $env_section = '1' and next if ((/^# DRAGONFLY #$/) && ($ENV{OS} eq 'DRAGONFLY')); - last if ($env_section && ((/^# SOLARIS #$/) || (/^# FREEBSD #$/) || (/^# LINUX #$/) || (/^# NETBSD #$/) || (/^# OPENBSD #$/) (/^# DRAGONFLY #$/))); - next if (!$_ || /^#/); - push(@filters, $_); - }; - foreach my $symbol (keys %$symbols) { - my $export = '-'; - foreach my $filter_str (@filters) { - my $add = substr ($filter_str, 0, 1); - my $filter = substr($filter_str, 1); - if ($symbol =~ /$filter/) { - $export = $add; - }; - }; - if ($export eq '+') { - push(@filtered_symbols, $symbol); - }; - }; - &write_mapfile(\@filtered_symbols); -}; - -# -# Write a map file -# -sub write_mapfile { - my $symbols = shift; - print MAP_FILE $first_string . " {\n$tab" . "global:\n"; - foreach (@$symbols) { - print MAP_FILE "$tab$tab$_\;\n"; - }; - print MAP_FILE "$tab" . "local:\n$tab\*\;\n}\;"; -}; - -# -# Get all options passed -# -sub get_options { - -$dump_file = ''; -$flt_file = ''; -$map_file = ''; - my ($arg); - &usage() && exit(0) if ($#ARGV == -1); - while ($arg = shift @ARGV) { - $arg =~ /^-d$/ and $dump_file = shift @ARGV and next; - $arg =~ /^-f$/ and $flt_file = shift @ARGV and next; - $arg =~ /^-m$/ and $map_file = shift @ARGV and next; - $arg =~ /^-h$/ and &usage and exit(0); - $arg =~ /^--help$/ and &usage and exit(0); - $arg =~ /^-s$/ and $first_string = shift @ARGV and next; - }; - if (!$dump_file || - !$flt_file || - !$first_string || - !$map_file) { - &usage; - exit(1); - }; -}; - -sub print_error { - my $message = shift; - print STDERR "\nERROR: $message\n"; - exit(1) -}; - -sub usage { - print STDERR "\nmapgen:\n"; - print STDERR "Syntax: mapgen -d dump_file -s first_string -f filter_file -m map_file [-h|--help]\n"; -}; - diff --git a/solenv/bin/mkdir.btm b/solenv/bin/mkdir.btm deleted file mode 100644 index 5b610c829..000000000 --- a/solenv/bin/mkdir.btm +++ /dev/null @@ -1,6 +0,0 @@ -rem @echo off -iff "%PERL%" == "" then - call perl5 %SOLARENV%\bin\mkdir.pl %1& -else - call %PERL% %SOLARENV%\bin\mkdir.pl %1& -endiff diff --git a/solenv/bin/mkdir.pl b/solenv/bin/mkdir.pl deleted file mode 100755 index a8fe6f2a0..000000000 --- a/solenv/bin/mkdir.pl +++ /dev/null @@ -1,65 +0,0 @@ -: # -*- perl -*- -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -# -# mkdir - a perl script to substitute mkdir -p -# accepts "/", ":", and "\" as delimiters of subdirectories -# options -p (for compatibility) -# -mode mode -# -# Copyright 2000, 2010 Oracle and/or its affiliates. - -use Cwd; - -$currdir = cwd; - -$MODE = 00777 ; - -while ( $#ARGV >= 0 ) { - if ( $ARGV[0] eq "-mode" ) { - $MODE = oct $ARGV[1] ; - shift @ARGV ; - shift @ARGV ; - } - elsif ( $ARGV[0] eq "-p" ) { - shift @ARGV ; - # -p does not do anything, it's supported just for compatibility - } - else { - - $ARGV[0] =~ s?\\|:?/?g ; - @SUBDIRS = split "/", $ARGV[0] ; - - # absolute path UNIX - if ( $SUBDIRS[0] eq "" ) { - chdir '/' ; - shift @SUBDIRS ; - } - # absolute path WINDOWS - if ( $#SUBDIRS > 1 ) { - if ( $SUBDIRS[1] eq "" ) { - if ( $SUBDIRS[0] =~ /\w/ ) { - chdir "$SUBDIRS[0]:\\" ; - shift @SUBDIRS ; - shift @SUBDIRS ; - } ; - } ; - } - - while (@SUBDIRS) { - if ( -e $SUBDIRS[0] ) { - if ( ! -d $SUBDIRS[0] ) { - die "file exists\n" - } - } - else { - mkdir $SUBDIRS[0], $MODE or die "Can't create directory $SUBDIRS[0]" - } - chdir $SUBDIRS[0] or die "Can't cd to $SUBDIRS[0]" ; - shift @SUBDIRS ; - } ; - - shift @ARGV ; - } ; - chdir $currdir; -} diff --git a/solenv/bin/mkdocs.sh b/solenv/bin/mkdocs.sh deleted file mode 100755 index 3d6ba295c..000000000 --- a/solenv/bin/mkdocs.sh +++ /dev/null @@ -1,130 +0,0 @@ -#!/bin/bash -# -# Doxygen Doc generation -# - -# binaries that we need -which doxygen > /dev/null 2>&1 || { - echo "You need doxygen for doc generation" - exit 1 -} -which dot > /dev/null 2>&1 || { - echo "You need the graphviz tools to create the nice inheritance graphs" - exit 1 -} - -# otherwise, aliases are not expanded below -shopt -s expand_aliases - -# Title of the documentation -DOXYGEN_PROJECT_PREFIX="LibreOffice" - -# suck setup -BINDIR=`dirname $0` -. $BINDIR/setup - -. ./*.Set.sh - -# get list of modules in build order - bah, blows RAM & disk, static list below -INPUT_PROJECTS="o3tl basegfx basebmp comphelper svl vcl canvas cppcanvas oox svtools goodies drawinglayer xmloff slideshow sfx2 editeng svx cui chart2 dbaccess sd starmath sc sw" - -# output directory for generated documentation -BASE_OUTPUT="$1" -mkdir -p "$BASE_OUTPUT" || { - echo "Cannot create $BASE_OUTPUT" - exit 1 -} - -# paths for binary and configuration file -BASE_PATH=`pwd` -DOXYGEN_CFG="$2" -if test ! -f "$DOXYGEN_CFG"; then - echo "doxygen.cfg not found" - exit 1 -fi - -# strip -I. and bin -I prefix; exlude system headers -DOXYGEN_INCLUDE_PATH=`echo $SOLARINC | sed -e ' s/-I\.//'g | sed -e ' s/ -I/ /'g | sed -e ' s|/usr/[^ ]*| |g'` - -# setup version string -DOXYGEN_VERSION="$GITTAG" - - -################################################### -# -# Generate docs -# -################################################### - -# cleanup -rm -rf $BASE_OUTPUT/* - -# make the stuff world-readable -umask 022 - -# generate docs -DOXYGEN_REF_TAGFILES="" -for PROJECT in $INPUT_PROJECTS; -do - # avoid processing of full project subdirs, only add source and inc - DOXYGEN_INPUT=`printf "%s" "$PROJECT/source $PROJECT/inc "` - - DOXYGEN_OUTPUT="$BASE_OUTPUT/$PROJECT" - DOXYGEN_OUR_TAGFILE="$DOXYGEN_OUTPUT/$PROJECT.tags" - DOXYGEN_PROJECTNAME="$DOXYGEN_PROJECT_PREFIX Module $PROJECT" - - # export variables referenced in doxygen config file - export DOXYGEN_INPUT - export DOXYGEN_OUTPUT - export DOXYGEN_INCLUDE_PATH - export DOXYGEN_VERSION - export DOXYGEN_OUR_TAGFILE - export DOXYGEN_REF_TAGFILES - export DOXYGEN_PROJECTNAME - - # debug - echo "Calling $DOXYGEN_PATH/doxygen $DOXYGEN_CFG with" - echo "Input: $DOXYGEN_INPUT" - echo "Output: $DOXYGEN_OUTPUT" - echo "Include: $DOXYGEN_INCLUDE_PATH" - echo "Version: $DOXYGEN_VERSION" - echo "Tagfile: $DOXYGEN_OUR_TAGFILE" - echo "Ref-Tags: $DOXYGEN_REF_TAGFILES" - echo "Title: $DOXYGEN_PROJECTNAME" - - nice -15 doxygen "$DOXYGEN_CFG" - - # setup referenced tagfiles for next round - DOXYGEN_REF_TAGFILES="$DOXYGEN_REF_TAGFILES $DOXYGEN_OUR_TAGFILE=$BASE_URL/$PROJECT/html" -done - -# generate entry page -cat - > $BASE_OUTPUT/index.html <<EOF -<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> -<html> - <head> - <title>LibreOffice Source Code Documentation (fragmentary)</title> - </head> - <body> - <h1>LibreOffice Source Code Documentation (fragmentary)</h1> - <ul> -EOF - -for PROJECT in $INPUT_PROJECTS; -do - echo "<li><a href=\"$PROJECT/html/classes.html\">$PROJECT</a></li>" >> $BASE_OUTPUT/index.html -done - -cat - >> $BASE_OUTPUT/index.html <<EOF - </ul> - <p>Last updated: -EOF -LANG= date >> $BASE_OUTPUT/index.html - -cat - >> $BASE_OUTPUT/index.html <<EOF - </p> - </body> -</html> -EOF - -## done diff --git a/solenv/bin/mkout.pl b/solenv/bin/mkout.pl deleted file mode 100755 index 43d43fa7d..000000000 --- a/solenv/bin/mkout.pl +++ /dev/null @@ -1,156 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - -# -# mkout.pl - create output tree -# - -use Cwd; -use Getopt::Std; -use File::Path; - -#### script id ##### - -( $script_name = $0 ) =~ s/^.*\b(\w+)\.pl$/$1/; - -#### globals #### - -$is_debug = 0; - -$base_dir = 0; # path to module base directory -$dir_mode = 0755; # default directory creation mode - -$envpath = 0; # platform/product combination -$opt_r = 0; # create 'remote' subdirs - -%sub_dirs = ( -# dirname remote(yes/no) - 'bin' => 1, - 'class' => 0, - 'inc' => 0, - 'lib' => 1, - 'misc/logs' => 1, - 'obj' => 1, - 'res' => 1, - 'slb' => 1, - 'slo' => 1, - 'srs' => 1 - ); - -#### main #### - -parse_options(); -init_globals(); -create_dirs(); - -exit(0); - -#### subroutines ##### - -sub parse_options { - my $rc; - - $rc = getopts('r'); - - if ( !$rc || $#ARGV > 0 ) { - usage(); - exit(1); - } - $envpath = $ARGV[0] if defined($ARGV[0]); -} - -sub init_globals { - my $umask; - $base_dir = get_base(); - print "Base_Diri=$base_dir\n" if $is_debug; - - $umask = umask(); - if ( defined($umask) ) { - $dir_mode = 0777 - $umask; - } - $envpath = $ENV{INPATH} unless $envpath; - - if ( !$envpath ) { - print_error("can't determine platform/environment"); - exit(3); - } - print "Platform/Environment: $envpath\n" if $is_debug; -} - -sub get_base { - # a module base dir contains a subdir 'prj' - # which in turn contains a file 'd.lst' - my (@field, $base, $dlst); - my $path = cwd(); - - @field = split(/\//, $path); - - while ( $#field != -1 ) { - $base = join('/', @field); - $dlst = $base . '/prj/d.lst'; - last if -e $dlst; - pop @field; - } - - if ( $#field == -1 ) { - print_error("can't determine module"); - exit(2); - } - else { - return $base; - } -} - -sub create_dirs { - foreach $dir ( keys %sub_dirs ) { - $path = $base_dir . '/' . $envpath . '/' . $dir; - if ( $opt_r && $sub_dirs{$dir} ) { - $path .= "/remote"; - } - eval { mkpath($path, 0, $dir_mode) }; - if ( $@ ) { - print_error( "$@" ); - } - print "Create path: $path\n" if $is_debug; - } -} - -sub print_error { - my $message = shift; - - print STDERR "$script_name: ERROR: $message\n"; -} - -sub usage { - print STDERR "Usage:\n$script_name [-r] [platform/environment]\n"; - print STDERR "Options:\n -r create 'remote' directories\n"; -} - -# vim: set ts=4 shiftwidth=4 expandtab syntax=perl: diff --git a/solenv/bin/modules/CreatePDBRelocators.pm b/solenv/bin/modules/CreatePDBRelocators.pm deleted file mode 100644 index 2be4f7b15..000000000 --- a/solenv/bin/modules/CreatePDBRelocators.pm +++ /dev/null @@ -1,228 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -#************************************************************************* -# -# createPDBRelocators - create for pdb relocator files -# PDB relocator files are used to find debug infos -# for analysis of creash reports -# -# usage: create_pdb_relocators($inpath, $milestoneext, $pre); -# -#************************************************************************* - -package CreatePDBRelocators; - -use strict; -use File::Basename; -use SourceConfig; - -sub new -{ - my $Object = shift; - my $solarversion = shift; - my $workdir; - my $relworkdir; - my $self = {}; - my @basedirs; - my @repos; - - if (!defined ($solarversion)) { - $solarversion = $ENV{SOLARVERSION}; - } - if ( !$solarversion ) { - print STDERR "can't determine SOLARVERSION.\n"; - exit (1); - } - - $self->{SOLARVERSION} = $solarversion; - - $workdir = $ENV{WORKDIR}; - if ( !$workdir ) { - print STDERR "can't determine WORKDIR.\n"; - exit (1); - } - - if ( $workdir =~ /^$solarversion/ ) { - $relworkdir = $workdir; - $relworkdir =~ s/^$solarversion\///; - } else { - print STDERR "ERROR: workdir outside $solarversion unsupported\n"; - exit (2); - } - my $SourceConfigObj = SourceConfig->new(); - @repos = $SourceConfigObj->get_repositories(); - # basdirs is repositories (dmake) + workdir (gnu make) - push(@basedirs, $relworkdir); - if (!scalar @basedirs) { - print STDERR "no basedir and no working directory found.\n"; - exit (2); - } - $self->{BASEDIRS} = \@basedirs; - bless($self, $Object); - return $self; -} - -sub create_pdb_relocators -{ - my $self = shift; - my $inpath = shift; - my $milestoneext = shift; - my $pre = shift; - - my $solarversion = $self->{SOLARVERSION}; - my $root_dir = "$solarversion/$inpath"; - - # sanitize path - $root_dir =~ s/\\/\//g; - my $o =~ s/\\/\//g; - my $premilestoneext = $milestoneext; - if ( $pre ne "" ) { - $premilestoneext = ~ s/^\.//; - $premilestoneext = ".pre$premilestoneext"; - } - my $pdb_dir = $root_dir . "/pdb$premilestoneext"; - my $pdb_so_dir = $root_dir . "/pdb$premilestoneext/so"; - - # create pdb directories if necessary - if ( ! -d $pdb_dir ) { - if ( !mkdir($pdb_dir, 0775) ) { - print STDERR "can't create directory '$pdb_dir'\n"; - return undef; - } - } - if ( ! -d $pdb_so_dir ) { - if ( !mkdir($pdb_so_dir, 0775) ) { - print STDERR "can't create directory '$pdb_so_dir'\n"; - return undef; - } - } - - # collect files - foreach my $basedir (@{$self->{BASEDIRS}}) { - my @pdb_files; - my $o = $self->{SOLARVERSION} . "/$basedir"; - $basedir =~ s/(.*?)\.(.*)/$1/; - $self->collect_files( $o, $inpath, \@pdb_files); - - foreach (@pdb_files) { - my $relocator = basename($_) . ".location"; - /$o\/(.*)/i; - - my $src_location = $1; - - my $location = ""; - my $target = ""; - if ( $src_location =~ /\/so\// ) - { - $location = "../../../$basedir$milestoneext/" . $src_location; - $target = "$pdb_dir/so/$relocator"; - } - else - { - $location = "../../$basedir$milestoneext/" . $src_location; - $target = "$pdb_dir/$relocator"; - } - - if ( !open(RELOCATOR, ">$target") ) { - print STDERR "can't write file '$target'\n"; - return undef; - } - print RELOCATOR "$location\n"; - close(RELOCATOR); - } - } - return 1; -} - -sub collect_files_from_all_basedirs -{ - my $self = shift; - my ($platform, $filesref) = @_; - my $basedir; - my $ret; - foreach $basedir (@{$self->{BASEDIRS}}) { - my $srcdir = $self->{SOLARVERSION} . "/$basedir"; - $ret |= $self->collect_files ($srcdir, $platform, $filesref); - } - return $ret; -} - -sub collect_files -{ - my $self = shift; - my ($srcdir, $platform, $filesref) = @_; - my $template = "$srcdir/*/$platform"; - my $template2 = "$srcdir/LinkTarget"; - if ( $ENV{GUI} eq "WNT" ) { - # collect all pdb files on o: - # regular glob does not work with two wildcard on WNT - my @bin = glob("$template/bin/*.pdb"); - my @bin_so = glob("$template/bin/so/*.pdb"); - my @workdir = glob("$template2/*/*.pdb"); - # we are only interested in pdb files which are accompanied by - # .exe or .dll which the same name - foreach (@bin, @bin_so, @workdir) { - my $dir = dirname($_); - my $base = basename($_, ".pdb"); - my $exe = "$dir/$base.exe"; - my $dll = "$dir/$base.dll"; - if ( -e $exe || -e $dll ) { - push(@$filesref, $_); - } - } - } - else { - # collect all shared libraries on o: - my @lib = glob("$template/lib/*.so*"); - my @workdir_lib = glob("$template2/Library/*.so*"); - my @lib_so = glob("$template/lib/so/*.so*"); - my @mac_lib = glob("$template/lib/*.dylib*"); - my @mac_workdir_lib = glob("$template2/Library/*.dylib*"); - my @mac_lib_so = glob("$template/lib/so/*.dylib*"); - # collect all binary executables on o: - my @bin = $self->find_binary_execs("$template/bin"); - my @workdir_bin = $self->find_binary_execs("$template2/Executable"); - my @bin_so = $self->find_binary_execs("$template/bin/so"); - push(@$filesref, (@lib, @lib_so, @workdir_lib, @mac_lib, @mac_workdir_lib, @mac_lib_so, @bin, @workdir_bin, @bin_so)); - } - return 1; -} - -sub find_binary_execs -{ - my $self = shift; - my $path = shift; - my @files = glob("$path/*"); - my @execs = grep(-x $_, @files); - my @elf_files = grep(`file $_` =~ /ELF/, @execs); - my @MachO_files = grep(`file $_` =~ /Mach\-O/, @execs); - return ( @elf_files, @MachO_files ); -} - -1; # required - diff --git a/solenv/bin/modules/Eis.pm b/solenv/bin/modules/Eis.pm deleted file mode 100755 index 897960cd0..000000000 --- a/solenv/bin/modules/Eis.pm +++ /dev/null @@ -1,220 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - - -# -# Eis.pm - package for accessing/manipulating the EIS database via SOAP -# - -package Eis; -use strict; - -use SOAP::Lite; -use Class::Struct; -use Carp; - -# Declaration of class Eis together with ctor and accessors. -# See 'perldoc Class::Struct' for details - -struct Eis => [ - # public members - uri => '$', # name of webservice - proxy_list => '@', # list of proxy URLs - current_proxy => '$', # current proxy (index in proxy_list) - net_proxy => '$', # network proxy to pass through firewall - # private members - eis_connector => '$' # SOAP connector to EIS database -]; - -#### public methods #### - -# Any not predeclared method call to this package is -# interpreted as a SOAP method call. We use the AUTOLOAD -# mechanism to intercept these calls and delgate them -# to the eis_connector. -# See the 'Camel Book', 3rd edition, page 337 for an -# explanation of the AUTOLOAD mechanism. -sub AUTOLOAD -{ - my $self = shift; - my $callee = $Eis::AUTOLOAD; # $callee now holds the name of - # called subroutine - # - return if $callee =~ /::DESTROY$/; - $callee = substr($callee, 5); - - my $sl = $self->eis_connector(); - if ( !$sl ) { - $sl = $self->init_eis_connector(); - $self->eis_connector($sl); - } - - my $response; - while ( 1 ) { - # Call callee() on web service. - eval { $response = $sl->$callee(@_) }; - if ( $@ ) { - # Transport error (server not available, timeout, etc). - # Use backup server. - print STDERR ("Warning: web service unavailable. Trying backup server.\n"); - if ( !$self->set_next_proxy() ) { - # All proxies tried, out of luck - carp("ERROR: Connection to EIS database failed.\n"); - return undef; - } - } - else { - last; - } - } - - if ( $response->fault() ) { - my $fault_msg = get_soap_fault_message($response); - die $fault_msg; # throw $fault_msg as exception - } - else { - return $response->result(); - } -} - -#### public class methods #### - -# Turn scalar into SOAP string. -sub to_string -{ - my $value = shift; - - return SOAP::Data->type(string => $value); -} - -#### non public instance methods #### - -# Initialize SOAP connection to EIS. -sub init_eis_connector -{ - my $self = shift; - - # Init current_proxy with first element of the proxy list. - my $current = $self->current_proxy(0); - - if ( !$self->uri() ) { - carp("ERROR: web service URI not set."); - return undef; - } - - if ( !$self->proxy_list->[$current] ) { - carp("ERROR: proxy list not proper initialized."); - return undef; - } - - # might be needed to get through a firewall - if ( defined($self->net_proxy()) ) { - $ENV{HTTPS_PROXY}=$self->net_proxy(); - } - - my $proxy = $self->proxy_list()->[$current]; - if ( $proxy =~ /^\s*https\:\/\// ) { - # SOAP::Lite does not complain if Crypt::SSLeay is not available, - # but crypted connections will just not work. Force the detection of - # Crypt::SSLeay for https connections and fail with a meaningful - # message if it's not available. - require Crypt::SSLeay; - } - return create_eis_connector($self->uri(), $proxy); -} - -# Advance one entry in proxy list. -sub set_next_proxy -{ - my $self = shift; - - my @proxies = @{$self->proxy_list()}; - my $current = $self->current_proxy(); - - if ( $current == $#proxies ) { - return 0; - } - else { - $self->current_proxy(++$current); - my $next_proxy = $self->proxy_list()->[$current]; - $self->eis_connector()->proxy($next_proxy); - return 1; - } -} - -#### misc #### - -# Create new SOAP EIS conector. -sub create_eis_connector -{ - my $uri = shift; - my $proxy = shift; - - my $sl; - - # With version 0.66 of SOAP::Lite the uri() method - # has been deprecated in favour of ns(). There - # seems to be no way to switch of the deprecation warning - # (which may be a bug in this version of SOAP::Lite). - # Since older versions do not support the ns() method we - # either force everyone to upgrade now, or make the following - # dependent on the SOAP::Lite version. - my ($vmaj, $vmin) = (0, 0); - if( $SOAP::Lite::VERSION =~ m/([0-9]*)\.([0-9]*)/ ) { - $vmaj = $1; - $vmin = $2; - if ( $vmaj > 0 || ( $vmaj == 0 && $vmin >= 66 ) ) { - $sl = SOAP::Lite - -> ns($uri) - -> proxy($proxy); - } - else { - $sl = SOAP::Lite - -> uri($uri) - -> proxy($proxy); - } - } - else { - carp("ERROR: Can't determine SOAP::Lite version."); - } - - return $sl; -} - -# Retrieve SOAP fault message. -sub get_soap_fault_message -{ - my $faulty_response = shift; - my $fault_msg = join(', ', $faulty_response->faultcode(), - $faulty_response->faultstring(), - $faulty_response->faultdetail()); - return $fault_msg; -} - -#### - -1; # needed by "use" or "require" diff --git a/solenv/bin/modules/GenInfoParser.pm b/solenv/bin/modules/GenInfoParser.pm deleted file mode 100644 index 5db77bee4..000000000 --- a/solenv/bin/modules/GenInfoParser.pm +++ /dev/null @@ -1,293 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -#************************************************************************* -# -# GenInfoParser - Perl extension for parsing general info databases -# -# usage: see below -# -#************************************************************************* - -package GenInfoParser; - -use strict; - -use Carp; - -##### profiling ##### -# use Benchmark; - -##### ctor ##### - -sub new { - my $proto = shift; - my $class = ref($proto) || $proto; - my $self = {}; - $self->{'LIST'} = undef; - $self->{'DATA'} = {}; - bless ($self, $class); - return $self; -} - -##### methods ##### - -sub load_list -{ - # load list into memory - my $self = shift; - my $list_file = shift; - - if ( $self->parse_list($list_file) ) { - return 1; - } - return 0; -} - -sub get_keys -{ - # return a sorted list of keys, the sorting is case insensitive - my $self = shift; - my $access_path = shift; - - my ($key, $value, $sub_data_ref) = $self->walk_accesspath($access_path); - - my @keys = (); - if ( $sub_data_ref ) { - my @normalized_keys = keys %$sub_data_ref; - foreach my $normalized_key (sort keys %$sub_data_ref) { - push(@keys, $$sub_data_ref{$normalized_key}[0]); - } - } elsif ( $value ) { - chomp $value; - push @keys, ($value); - } - return @keys; -} - -sub get_key -{ - # returns the key corresponding to the access_path - my $self = shift; - my $access_path = shift; - - my ($key, $value, $sub_data_ref) = $self->walk_accesspath($access_path); - return undef if !$key; - return $key; -} - -sub get_value -{ - # returns the value corresponding to the access_path - my $self = shift; - my $access_path = shift; - - my ($key, $value, $sub_data_ref) = $self->walk_accesspath($access_path); - return undef if !$key; - $value = "" if !defined($value); - # trim line ends - $value =~ tr/\r\n//d; - # trim trailing whitespace - $value =~ s/\s+$//; - return $value; -} - -##### private methods ##### - -sub parse_list -{ - # parse complete list - my $self = shift; - my $list_file = shift; - my @list_data; - - return 0 if ! -r $list_file; - - open(FILE, "<$list_file") or croak("can't open $list_file: $!"); - $self->parse_block(\*FILE, $self->{'DATA'}); - close(FILE); -} - -sub parse_block -{ - # parse each sub block and place it in a hash - # used data structure: - # $hash{$normalized_key} = [ $key, $value, 0 | $sub_hash_ref ] - my $self = shift; - my $glob_ref = shift; - my $data_ref = shift; - - my $current_key = 0; - my $line; - while( $line = <$glob_ref> ) { - # this is the inner loop, any additional pattern matching will - # have a notable affect on runtime behavior - # clean up of $value is done in get_value() - my ($key, $value) = split(' ', $line, 2); - next if !$key; # skip empty lines - my $chr = substr($key, 0, 1); - next if $chr eq '#'; # skip comment lines - last if $chr eq '}'; # return from block; - if ( $chr eq '{' ) { - if ( !$current_key ) { - croak("unexpected block start"); - } - else { - # create empty hash and start sub block parse - $$data_ref{$current_key}[2] = {}; - $self->parse_block($glob_ref, $$data_ref{$current_key}[2]); - next; - } - } - # sanity check - croak("key $key is not well formed") if $key =~ /\//; - # normalize key for hash lookup - $current_key = lc($key); - # but we have to keep the original - not normalized - key, too - $$data_ref{($current_key)} = [$key, $value, 0]; - } -} - -sub walk_accesspath -{ - # returns the key, value and sub_data_ref which - # corresponds to the access_path - - my $self = shift; - my $access_path = shift; - - my $sub_data_ref = $self->{'DATA'}; - - if ( $access_path ) { - my $lookup_ref = 0; - # normalize key - $access_path = lc($access_path); - my @key_sequence = split(/\//, $access_path); - foreach my $key_element (@key_sequence) { - # at least one more key element, but no sub_hash, accesspath invalid - return () if !$sub_data_ref; - $lookup_ref = $$sub_data_ref{$key_element}; - # lookup failed, accesspath invalid - return () if !defined($lookup_ref); - # we've got a valid key - $sub_data_ref = $$lookup_ref[2]; - } - return ($$lookup_ref[0], $$lookup_ref[1], $sub_data_ref); - } - else { - # empty access path is only vlaid for getting top level key list - return ( undef, undef, $sub_data_ref ); - } -} - -##### finish ##### - -1; # needed by use or require - -__END__ - -=head1 NAME - -GenInfoParser - Perl extension for parsing general info databases - -=head1 SYNOPSIS - - # example that will load a general info database called 'stand.lst' - - use GenInfoParser; - - # Create a new instance of the parser: - $a = GenInfoParser->new(); - - # Load the database into the parser: - $a->load_list('ssrc633.ini'); - - # get top level keys from database - @top_level_keys = $a->get_keys(); - - # get sub list keys - @sub_list_keys = $a->get_keys('src633/Drives/o:/Projects'); - - # get key/value pair - $key = $a->get_key('src633/Comment/build'); - $value = $a->get_value('src633/Comment/build'); - -=head1 DESCRIPTION - -GenInfoParser is a perl extension to load and parse General Info Databses. -It uses a simple object oriented interface to retrieve the information stored -in the database. - -Methods: - -GenInfoParser::new() - -Creates a new instance of the parser. Can't fail. - - -GenInfoParser::load_list($database) - -Loads and parses $database. Returns 1 on success and 0 on failure - - -GenInfoParser::get_keys($path) - -Returns a sorted list of keys from the path $path. Returns an emtpy list if $path -has no sublist. If there is no $path spcified, the method will return the -primary key list. $path can be specified case insensitive. Sorting is done case -insensitive. - -GenInfoParser::get_key($path) - -Returns the key to $path or 'undef' if an invalid path is given. -Example: $path = 'src633/comment/build' will return 'Build' as key. -Note: $path can be specified case insensitive, but the returned key will -have the exact case as in the database. - -GenInfoParser::get_value($path) - -Returns the value to $path or 'undef' is invalid path is given. - - -=head2 EXPORT - -GenInfoParser::new() -GenInfoParser::load_list($database) -GenInfoParser::get_keys($path) -GenInfoParser::get_key($path) -GenInfoParser::get_value($path) - - -=head1 AUTHOR - -Jens-Heiner Rechtien, rechtien@sun.com - -=head1 SEE ALSO - -perl(1). - -=cut diff --git a/solenv/bin/modules/RepositoryHelper.pm b/solenv/bin/modules/RepositoryHelper.pm deleted file mode 100644 index 8aa45f29e..000000000 --- a/solenv/bin/modules/RepositoryHelper.pm +++ /dev/null @@ -1,209 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -#************************************************************************* -# -# RepositoryHelper - Perl for working with repositories and underlying SCM -# -# usage: see below -# -#************************************************************************* - -package RepositoryHelper; - -use strict; - - -use Carp; -use Cwd qw (cwd); -use File::Basename; -#use File::Temp qw(tmpnam); - -my $debug = 0; - -##### profiling ##### - -##### ctor ##### - -sub new { - my $proto = shift; - my $class = ref($proto) || $proto; - my $initial_directory = shift; - if ($initial_directory) { - $initial_directory = Cwd::realpath($initial_directory); - } else { - if ( defined $ENV{PWD} ) { - $initial_directory = $ENV{PWD}; - } elsif (defined $ENV{_cwd}) { - $initial_directory = $ENV{_cwd}; - } else { - $initial_directory = cwd(); - }; - }; - my $self = {}; - $self->{INITIAL_DIRECTORY} = $initial_directory; - $self->{REPOSITORY_ROOT} = undef; - $self->{REPOSITORY_NAME} = undef; - $self->{SCM_NAME} = undef; - detect_repository($self); - bless($self, $class); - return $self; -} - -##### methods ##### -sub get_repository_root -{ - my $self = shift; - return $self->{REPOSITORY_ROOT}; -} - -sub get_initial_directory -{ - my $self = shift; - return $self->{INITIAL_DIRECTORY}; -} - -sub get_scm_name -{ - my $self = shift; - return$self->{SCM_NAME}; -} - -##### private methods ##### -sub search_for_hg { - my $self = shift; - my $hg_root; - my $scm_name = 'hg'; - if (open(COMMAND, "$scm_name root 2>&1 |")) { - foreach (<COMMAND>) { - next if (/^Not trusting file/); - chomp; - $hg_root = $_; - last; - }; - close COMMAND; - chomp $hg_root; - if ($hg_root !~ /There is no Mercurial repository here/) { - $self->{REPOSITORY_ROOT} = $hg_root; - $self->{SCM_NAME} = $scm_name; - return 1; - }; - }; - return 0; -}; - -sub search_via_build_lst { - my $self = shift; - my @possible_build_lists = ('gbuild.lst', 'build.lst'); # build lists names - my $previous_dir = ''; - my $rep_root_candidate = $self->{INITIAL_DIRECTORY}; - do { - foreach (@possible_build_lists) { - my $test_file; - if ($rep_root_candidate eq '/') { - $test_file = '/prj/' . $_; - } else { - $test_file = $rep_root_candidate . '/prj/' . $_; - }; - if (-e $test_file) { - $self->{REPOSITORY_ROOT} = File::Basename::dirname($rep_root_candidate); - return 1; - }; - }; - $previous_dir = $rep_root_candidate; - $rep_root_candidate = File::Basename::dirname($rep_root_candidate); - return 0 if ((!$rep_root_candidate) || ($rep_root_candidate eq $previous_dir)); - } - while (chdir "$rep_root_candidate"); -}; - -sub detect_repository { - my $self = shift; - return if (search_via_build_lst($self)); - chdir $self->{INITIAL_DIRECTORY}; - return if (search_for_hg($self)); - croak('Cannot determine source directory/repository for ' . $self->{INITIAL_DIRECTORY}); -}; - -##### finish ##### - -1; # needed by use or require - -__END__ - -=head1 NAME - -RepositoryHelper - Perl module for working with repositories and underlying SCM - -=head1 SYNOPSIS - - # example that will analyze sources and return the source root directory - - use RepositoryHelper; - - # Create a new instance: - $a = RepositoryHelper->new(); - - # Get repositories for the actual workspace: - $a->get_repository_root(); - - -=head1 DESCRIPTION - -RepositoryHelper is a perlPerl module for working with repositories and underlying SCM -in the database. - -Methods: - -RepositoryHelper::new() - -Creates a new instance of RepositoryHelper. Can be initialized by: some path which likely to belong to a repository, default - empty, the current dir will be taken. - -RepositoryHelper::get_repository_root() - -Returns the repository root, retrieved by SCM methods or on educated guess... - -RepositoryHelper::get_initial_directory() - -Returns full path to the initialistion directory. - -=head2 EXPORT - -RepositoryHelper::new() -RepositoryHelper::get_repository_root() -RepositoryHelper::get_scm_name() -RepositoryHelper::get_initial_directory() - -=head1 AUTHOR - -Vladimir Glazunov, vg@openoffice.org - -=head1 SEE ALSO - -perl(1). - -=cut diff --git a/solenv/bin/modules/SourceConfig.pm b/solenv/bin/modules/SourceConfig.pm deleted file mode 100644 index 83ab02da3..000000000 --- a/solenv/bin/modules/SourceConfig.pm +++ /dev/null @@ -1,675 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -#************************************************************************* -# -# SourceConfig - Perl extension for parsing general info databases -# -# usage: see below -# -#************************************************************************* - -package SourceConfig; - -use strict; - -use constant SOURCE_CONFIG_FILE_NAME => 'source_config'; -use constant SOURCE_CONFIG_VERSION => 3; - -use Carp; -use Cwd; -use RepositoryHelper; -use File::Basename; -use File::Temp qw(tmpnam); - -my $debug = 0; - -##### profiling ##### - -##### ctor ##### - -sub new { - my $proto = shift; - my $class = ref($proto) || $proto; - my $source_root = shift; - my $self = {}; - $self->{USER_SOURCE_ROOT} = undef; - $self->{SOURCE_CONFIG_FILE} = undef; - if (defined $source_root) { - $source_root = Cwd::realpath($source_root); - $source_root =~ s/\\|\/$//; - if (-f $source_root) { - # We have path to source_config - if (File::Basename::basename($source_root) eq 'source_config') { - # We have path to source_config - $self->{SOURCE_CONFIG_FILE} = $source_root; - $source_root = File::Basename::dirname($source_root); - } else { - croak("$source_root is not a source_config file"); - }; - } else { - $self->{USER_SOURCE_ROOT} = $source_root; - $source_root .= '/..'; - } - } else { - $source_root = $ENV{SRC_ROOT}; - }; - if ( defined $ENV{USE_GBUILD} and "$ENV{USE_GBUILD}" ne "" ) - { - $self->{POSSIBLE_BUILD_LIST} = ('gbuild.lst', 'build.lst', 'build.xlist'); # build lists names - } - else - { - $self->{POSSIBLE_BUILD_LIST} = ('build.lst', 'build.xlist'); # build lists names - } - $source_root = Cwd::realpath($source_root); - $self->{SOURCE_ROOT} = $source_root; - $self->{DEBUG} = 0; - $self->{VERBOSE} = 0; - $self->{REPOSITORIES} = {}; - $self->{ACTIVATED_REPOSITORIES} = {}; - $self->{MODULE_PATHS} = {}; - $self->{MODULE_BUILD_LIST_PATHS} = {}; - $self->{ACTIVATED_MODULES} = {}; - $self->{MODULE_REPOSITORY} = {}; - $self->{REAL_MODULES} = {}; - $self->{NEW_MODULES} = []; - $self->{REMOVE_MODULES} = {}; - $self->{REMOVE_REPOSITORIES} = {}; - $self->{NEW_REPOSITORIES} = []; - $self->{WARNINGS} = []; - $self->{GBUILD} = 0; - $self->{REPORT_MESSAGES} = []; - $self->{CONFIG_FILE_CONTENT} = []; - if (defined $self->{USER_SOURCE_ROOT}) { - ${$self->{REPOSITORIES}}{File::Basename::basename($self->{USER_SOURCE_ROOT})} = $self->{USER_SOURCE_ROOT}; - }; - $self->{SOURCE_CONFIG_FILE} = get_config_file($self->{SOURCE_ROOT}) if (!defined $self->{SOURCE_CONFIG_FILE}); - $self->{SOURCE_CONFIG_DEFAULT} = $self->{SOURCE_ROOT} .'/'.SOURCE_CONFIG_FILE_NAME; - if (defined $self->{USER_SOURCE_ROOT}) { - ${$self->{REPOSITORIES}}{File::Basename::basename($self->{USER_SOURCE_ROOT})} = $self->{USER_SOURCE_ROOT}; - }; - read_config_file($self); - get_module_paths($self); - bless($self, $class); - return $self; -} - -##### methods ##### - -sub get_version { - return SOURCE_CONFIG_VERSION; -}; - -sub get_repositories -{ - my $self = shift; - return sort keys %{$self->{REPOSITORIES}}; -} - -sub add_repository -{ - my $self = shift; - my $new_rep_path = shift; - $new_rep_path = Cwd::realpath($new_rep_path); - my $new_rep_name = File::Basename::basename($new_rep_path); - if (defined ${$self->{REPOSITORIES}}{$new_rep_name}) { - croak("Repository $new_rep_name is already defined!!"); - }; - ${$self->{REPOSITORIES}}{$new_rep_name} = $new_rep_path; - $self -> get_repository_module_paths($new_rep_name); -} - -sub get_config_file_default_path { - my $self = shift; - return $self->{SOURCE_CONFIG_DEFAULT}; -} - -sub get_config_file_path { - my $self = shift; - return $self->{SOURCE_CONFIG_FILE}; -} - -sub get_module_repository { - my $self = shift; - my $module = shift; - if (defined ${$self->{MODULE_REPOSITORY}}{$module}) { - return ${$self->{MODULE_REPOSITORY}}{$module}; - } else { - Carp::cluck("No such module $module in active repositories!!\n"); - return undef; - }; -} - -sub get_module_path { - my $self = shift; - my $module = shift; - if (defined ${$self->{MODULE_PATHS}}{$module}) { - return ${$self->{MODULE_PATHS}}{$module}; - } else { - Carp::cluck("No path for module $module in active repositories!!\n") if ($debug); - return undef; - }; -} - -sub get_module_build_list { - my $self = shift; - my $module = shift; - if (defined ${$self->{MODULE_BUILD_LIST_PATHS}}{$module}) { - return ${$self->{MODULE_BUILD_LIST_PATHS}}{$module}; - } else { - my @possible_build_lists = $self->{POSSIBLE_BUILD_LIST}; # build lists names - foreach my $build_list (@possible_build_lists) { - my $possible_path = ${$self->{MODULE_PATHS}}{$module} . "/prj/$build_list"; - if (-e $possible_path) { - ${$self->{MODULE_BUILD_LIST_PATHS}}{$module} = $possible_path; - if ( $build_list eq "gbuild.lst" ) { - $self->{GBUILD} = 1; - }; - return $possible_path; - }; - }; - Carp::cluck("No build list in module $module found!!\n") if ($self->{DEBUG}); - return undef; - }; -} - -sub get_all_modules -{ - my $self = shift; - my $module = shift; - return sort keys %{$self->{MODULE_PATHS}}; -}; - -sub get_active_modules -{ - my $self = shift; - if (scalar keys %{$self->{ACTIVATED_MODULES}}) { - return sort keys %{$self->{ACTIVATED_MODULES}}; - } - return sort keys %{$self->{REAL_MODULES}}; -} - -sub is_active -{ - my $self = shift; - my $module = shift; - if (scalar keys %{$self->{ACTIVATED_MODULES}}) { - return exists ($self->{ACTIVATED_MODULES}{$module}); - } - return exists ($self->{REAL_MODULES}{$module}); -} - -##### private methods ##### - -sub get_repository_module_paths { - my $self = shift; - my $repository = shift; - my $repository_path = ${$self->{REPOSITORIES}}{$repository}; - if (opendir DIRHANDLE, $repository_path) { - foreach my $module (readdir(DIRHANDLE)) { - next if (($module =~ /^\.+/) || (!-d "$repository_path/$module")); - my $module_entry = $module; - if (($module !~ s/\.lnk$//) && ($module !~ s/\.link$//)) { - $self->{REAL_MODULES}{$module}++; - } - my $possible_path = "$repository_path/$module_entry"; - if (-d $possible_path) { - if (defined ${$self->{MODULE_PATHS}}{$module}) { - close DIRHANDLE; - croak("Ambiguous paths for module $module: $possible_path and " . ${$self->{MODULE_PATHS}}{$module}); - }; - ${$self->{MODULE_PATHS}}{$module} = $possible_path; - ${$self->{MODULE_REPOSITORY}}{$module} = $repository; - } - }; - close DIRHANDLE; - } else { - croak("Cannot read $repository_path repository content"); - }; -}; - -sub get_module_paths { - my $self = shift; - foreach my $repository (keys %{$self->{REPOSITORIES}}) { - get_repository_module_paths($self, $repository); - }; - my @false_actives = (); - foreach (keys %{$self->{ACTIVATED_MODULES}}) { - push(@false_actives, $_) if (!defined ${$self->{MODULE_PATHS}}{$_}); - }; - croak("Error!! Activated module(s): @false_actives\nnot found in the active repositories!! Please check your " . $self->{SOURCE_CONFIG_FILE} . "\n") if (scalar @false_actives); - croak("No modules found!") if (!scalar keys %{$self->{MODULE_PATHS}}); -}; - -sub get_config_file { - my $source_root = shift; - my $possible_path = $source_root . '/' . SOURCE_CONFIG_FILE_NAME; - return $possible_path if (-f $possible_path); - return ''; -}; - -# -# Fallback - fallback repository is based on RepositoryHelper educated guess -# -sub get_fallback_repository { - my $self = shift; - my $repository_root = RepositoryHelper->new()->get_repository_root(); - ${$self->{REPOSITORIES}}{File::Basename::basename($repository_root)} = $repository_root; -}; - -sub read_config_file { - my $self = shift; - if (!$self->{SOURCE_CONFIG_FILE}) { - if (!defined $self->{USER_SOURCE_ROOT}) { - get_fallback_repository($self); - }; - return; - }; - my $repository_section = 0; - my $module_section = 0; - my $line = 0; - my @file_content = (); - - if (open(SOURCE_CONFIG_FILE, $self->{SOURCE_CONFIG_FILE})) { - foreach (<SOURCE_CONFIG_FILE>) { - push (@{$self->{CONFIG_FILE_CONTENT}}, $_); - $line++; - chomp; - next if (!/^\S+/); - next if (/^\s*#+/); - s/\r\n//; - if (/^\[repositories\]\s*(\s+#)*/) { - $module_section = 0; - $repository_section = 1; - next; - }; - if (/^\[modules\]\s*(\s+#)*/) { - $module_section = 1; - $repository_section = 0; - next; - }; - next if (!$repository_section && !$module_section); - if (/\s*(\S+)=active\s*(\s+#)*/) { - if ($repository_section) { - my $repository_source_path = $self->{SOURCE_ROOT} . "/$1"; - ${$self->{REPOSITORIES}}{$1} = $repository_source_path; - ${$self->{ACTIVATED_REPOSITORIES}}{$1}++; - next; - } - if ($module_section) { - ${$self->{ACTIVATED_MODULES}}{$1}++; - next; - }; - }; - croak("Line $line in " . $self->{SOURCE_CONFIG_FILE} . ' violates format. Please make your checks!'); - }; - close SOURCE_CONFIG_FILE; - if (!scalar keys %{$self->{REPOSITORIES}}) { - get_fallback_repository($self); - }; - } else { - croak('Cannot open ' . $self->{SOURCE_CONFIG_FILE} . ' for reading'); - }; -}; - -sub remove_all_activated_repositories { - my $self = shift; - $self->remove_activated_repositories([keys %{$self->{ACTIVATED_REPOSITORIES}}]); -}; - -sub remove_activated_repositories { - my $self = shift; - my $new_repositories_ref = shift; - push(@{$self->{WARNINGS}}, "\nWARNING: Empty repository list passed for removing from source_config\n") if (!scalar @$new_repositories_ref); - $self->{VERBOSE} = shift; - $self->{REMOVE_REPOSITORIES} = {}; - foreach (@$new_repositories_ref) { - if (!defined ${$self->{ACTIVATED_REPOSITORIES}}{$_}) { - push (@{$self->{WARNINGS}}, "\nWARNING: repository $_ is not activated in ". $self->get_config_file_default_path()."\n"); - } else { - ${$self->{REMOVE_REPOSITORIES}}{$_}++; - delete ${$self->{ACTIVATED_REPOSITORIES}}{$_}; - }; - }; - generate_config_file($self); -}; - -sub remove_all_activated_modules { - my $self = shift; - $self->remove_activated_modules([keys %{$self->{ACTIVATED_MODULES}}]); -}; - -sub remove_activated_modules { - my $self = shift; - my $new_modules_ref = shift; - push(@{$self->{WARNINGS}}, "\nWARNING: Empty module list passed for removing from source_config\n") if (!scalar @$new_modules_ref); - $self->{VERBOSE} = shift; - $self->{REMOVE_MODULES} = {}; - foreach (@$new_modules_ref) { - if (!defined ${$self->{ACTIVATED_MODULES}}{$_}) { - push (@{$self->{WARNINGS}}, "\nWARNING: module $_ is not activated in ". $self->get_config_file_default_path()."\n"); - } else { - ${$self->{REMOVE_MODULES}}{$_}++; - delete ${$self->{ACTIVATED_MODULES}}{$_}; - }; - }; - generate_config_file($self); -}; - -sub add_active_repositories { - my $self = shift; - $self->{NEW_REPOSITORIES} = shift; - croak('Empty repository list passed for addition to source_config') if (!scalar @{$self->{NEW_REPOSITORIES}}); - $self->{VERBOSE} = shift; - foreach (@{$self->{NEW_REPOSITORIES}}) { - $self->add_repository($_); - }; - generate_config_file($self); -}; - -sub add_active_modules { - my $self = shift; - my $module_list_ref = shift; - my $ignored_modules_string = ''; - my @real_modules = (); - foreach my $module (sort @$module_list_ref) { - if ($self->get_module_path($module)) { - push(@real_modules, $module); - } else { - $ignored_modules_string .= " $module"; - }; - }; - push (@{$self->{WARNINGS}}, "\nWARNING: following modules are not found in active repositories, and have not been added to the " . $self->get_config_file_default_path() . ":$ignored_modules_string\n") if ($ignored_modules_string); - $self->{NEW_MODULES} = \@real_modules; - croak('Empty module list passed for addition to source_config') if (!scalar @{$self->{NEW_MODULES}}); - $self->{VERBOSE} = shift; - generate_config_file($self); -}; - -sub add_content { - my $self = shift; - my $content = shift; - my $entries_to_add = shift; - return if (!scalar @$entries_to_add); - my $message; - my $message_part1; - my $warning_message; - my $activated_entries; - - if ($entries_to_add == $self->{NEW_MODULES}) { - $self->{NEW_MODULES} = []; - $message_part1 = "Module(s):\n"; - $activated_entries = $self->{ACTIVATED_MODULES}; - } elsif ($entries_to_add == $self->{NEW_REPOSITORIES}) { - $self->{NEW_REPOSITORIES} = []; - $message_part1 = "Repositories:\n"; - $activated_entries = $self->{ACTIVATED_REPOSITORIES}; - }; - foreach my $entry (@$entries_to_add) { - if (defined $$activated_entries{$entry}) { - $warning_message .= "$entry " - } else { - push(@$content, "$entry=active\n"); - ${$activated_entries}{$entry}++; - $message .= "$entry " - }; - }; - - push(@{$self->{REPORT_MESSAGES}}, "\n$message_part1 $message\nhave been added to the ". $self->get_config_file_default_path()."\n") if ($message); - push (@{$self->{WARNINGS}}, "\nWARNING: $message_part1 $warning_message\nare already added to the ". $self->get_config_file_default_path()."\n") if ($warning_message); -}; - -sub generate_config_file { - my $self = shift; - my @config_content_new = (); - my ($module_section, $repository_section); - my %removed_modules = (); - my %removed_repositories = (); - foreach (@{$self->{CONFIG_FILE_CONTENT}}) { - if (/^\[repositories\]\s*(\s+#)*/) { - if ($module_section) { - $self->add_content(\@config_content_new, $self->{NEW_MODULES}); - }; - $module_section = 0; - $repository_section = 1; - }; - if (/^\[modules\]\s*(\s+#)*/) { - if ($repository_section) { - $self->add_content(\@config_content_new, $self->{NEW_REPOSITORIES}); - }; - $module_section = 1; - $repository_section = 0; - }; - if ($module_section && /\s*(\S+)=active\s*(\s+#)*/) { - if (defined ${$self->{REMOVE_MODULES}}{$1}) { - $removed_modules{$1}++; - next; - }; - } - if ($repository_section && /\s*(\S+)=active\s*(\s+#)*/) { - if (defined ${$self->{REMOVE_REPOSITORIES}}{$1}) { - $removed_repositories{$1}++; - next; - }; - } - push(@config_content_new, $_); - }; - if (scalar @{$self->{NEW_MODULES}}) { - push(@config_content_new, "[modules]\n") if (!$module_section); - $self->add_content(\@config_content_new, $self->{NEW_MODULES}); - }; - if (scalar @{$self->{NEW_REPOSITORIES}}) { - push(@config_content_new, "[repositories]\n") if (!$repository_section); - $self->add_content(\@config_content_new, $self->{NEW_REPOSITORIES}); - }; - if (scalar keys %removed_modules) { - my @deleted_modules = keys %removed_modules; - push(@{$self->{REPORT_MESSAGES}}, "\nModules: @deleted_modules\nhave been removed from the ". $self->get_config_file_default_path()."\n"); - - }; - if (scalar keys %removed_repositories) { - my @deleted_repositories = keys %removed_repositories; - push(@{$self->{REPORT_MESSAGES}}, "\nRepositories: @deleted_repositories\nhave been removed from the ". $self->get_config_file_default_path()."\n"); - - }; - - # Writing file, printing warnings and reports - - #check if we need to write a new file - my $write_needed = 0; - if ((scalar @{$self->{CONFIG_FILE_CONTENT}}) != (scalar @config_content_new)) { - $write_needed++; - } else { - foreach my $i (0 .. $#{$self->{CONFIG_FILE_CONTENT}}) { - if (${$self->{CONFIG_FILE_CONTENT}}[$i] ne $config_content_new[$i]) { - $write_needed++; - last; - }; - }; - }; - if ($write_needed) { - my $temp_config_file = File::Temp::tmpnam($ENV{TMP}); - die("Cannot open $temp_config_file") if (!open(NEW_CONFIG, ">$temp_config_file")); - print NEW_CONFIG $_ foreach (@config_content_new); - close NEW_CONFIG; - rename($temp_config_file, $self->get_config_file_default_path()) or system("mv", $temp_config_file, $self->get_config_file_default_path()); - if (-e $temp_config_file) { - system("rm -rf $temp_config_file") if (!unlink $temp_config_file); - }; - $self->{CONFIG_FILE_CONTENT} = \@config_content_new; - }; - if ($self->{VERBOSE}) { - print $_ foreach (@{$self->{WARNINGS}}); - $self->{VERBOSE} = 0; - }; - $self->{WARNINGS} = []; - print $_ foreach (@{$self->{REPORT_MESSAGES}}); - $self->{REPORT_MESSAGES} = []; -}; - -##### finish ##### - -1; # needed by use or require - -__END__ - -=head1 NAME - -SourceConfig - Perl extension for parsing general info databases - -=head1 SYNOPSIS - - # example that will read source_config file and return the active repositories - - use SourceConfig; - - # Create a new instance of the parser: - $a = SourceConfig->new(); - - # Get repositories for the actual workspace: - $a->get_repositories(); - - # Add a repository new_repository for the actual workspace (via full path): - $a->add_repository(/DEV300/new_repository); - -=head1 DESCRIPTION - -SourceConfig is a perl extension to load and parse General Info Databses. -It uses a simple object oriented interface to retrieve the information stored -in the database. - -Methods: - -SourceConfig::new() - -Creates a new instance of SourceConfig. Can be initialized by: path to the default repository, path to the source_config, default - empty, the source_config will be taken from the environment - - -SourceConfig::get_version() - -Returns version number of the module. Can't fail. - - -SourceConfig::get_repositories() - -Returns sorted list of active repositories for the actual workspace - - -SourceConfig::add_repository(REPOSITORY_PATH) - -Adds a repository to the list of active repositories - - -SourceConfig::get_active_modules() - -Returns a sorted list of active modules - -SourceConfig::get_all_modules() - -Returns sorted list of all modules in active repositories. - -SourceConfig::get_module_path($module) - -Returns absolute module path - -SourceConfig::get_module_build_list($module) - -Returns absolute module build list path - -SourceConfig::get_module_repository($module) - -Returns the module's repository - -SourceConfig::get_config_file_path() - -Returns absolute module to the source configuration file - -SourceConfig::get_config_file_default_path() - -Returns default path for source configuration file - -SourceConfig::is_active() - -Returns 1 (TRUE) if a module is active -Returns 0 (FALSE) if a module is not active - -SourceConfig::add_active_modules($module_array_ref) - -Adds modules from the @$module_array_ref as active to the source_config file - -SourceConfig::add_active_repositories($repository_array_ref) - -Adds repositories from the @$repository_array_ref as active to the source_config file - -SourceConfig::remove_activated_modules($module_array_ref) - -Removes modules from the @$module_array_ref from the source_config file - -SourceConfig::remove_all_activated_modules() - -Removes all activated modules from the source_config file - -SourceConfig::remove_activated_repositories($repository_array_ref) - -Removes repositories from the @$repository_array_ref from the source_config file - -SourceConfig::remove_all_activated_repositories() - -Removes all activated repositories from the source_config file - - -=head2 EXPORT - -SourceConfig::new() -SourceConfig::get_version() -SourceConfig::get_repositories() -SourceConfig::add_repository() -SourceConfig::get_active_modules() -SourceConfig::get_all_modules() -SourceConfig::get_module_path($module) -SourceConfig::get_module_build_list($module) -SourceConfig::get_module_repository($module) -SourceConfig::get_config_file_path() -SourceConfig::get_config_file_default_path() -SourceConfig::is_active($module) -SourceConfig::add_active_modules($module_array_ref) -SourceConfig::add_active_repositories($repository_array_ref) -SourceConfig::remove_activated_modules($module_array_ref) -SourceConfig::remove_all_activated_modules() -SourceConfig::remove_activated_repositories($repository_array_ref) -SourceConfig::remove_all_activated_repositories() - -=head1 AUTHOR - -Vladimir Glazunov, vg@openoffice.org - -=head1 SEE ALSO - -perl(1). - -=cut diff --git a/solenv/bin/modules/SourceConfigHelper.pm b/solenv/bin/modules/SourceConfigHelper.pm deleted file mode 100644 index d6f8a547c..000000000 --- a/solenv/bin/modules/SourceConfigHelper.pm +++ /dev/null @@ -1,422 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -#************************************************************************* -# -# SourceConfigHelper - Perl extension for parsing general info databases -# -# usage: see below -# -#************************************************************************* - -package SourceConfigHelper; - -use strict; - -use RepositoryHelper; -use SourceConfig; -use Cwd qw (cwd); -use Carp; - -my $debug = 0; -my @source_config_list; # array of sourceconfig objects - -#----------------------------------------------------------------------- -# Constants -#----------------------------------------------------------------------- - -use constant SOURCE_CONFIG_NONE => 0; -use constant SOURCE_CONFIG_CURRENT_FIRST => 1; -use constant SOURCE_CONFIG_ENVIRONMENT_FIRST => 2; -use constant SOURCE_CONFIG_CURRENT_ONLY => 3; -use constant SOURCE_CONFIG_ENVIRONMENT_ONLY => 4; - -use constant SOURCE_CONFIG_DEFAULT => SOURCE_CONFIG_CURRENT_FIRST; - -##### profiling ##### - -##### ctor ##### - -sub new { - my $proto = shift; - my $class = ref($proto) || $proto; - my $init_action = shift; - my $self = {}; - my $SourceConfigCurrent; - my $SourceConfigEnvironment; - - $init_action = SOURCE_CONFIG_DEFAULT if (!defined ($init_action)); - if (!eval ($init_action) or ($init_action < SOURCE_CONFIG_NONE) or ($init_action > SOURCE_CONFIG_ENVIRONMENT_ONLY)) { - croak("wrong initial parameter: $init_action\n"); - } - - if ($init_action != SOURCE_CONFIG_NONE) { - my $repositoryHash_ref = {}; - if ($init_action != SOURCE_CONFIG_ENVIRONMENT_ONLY) { - my $initial_directory = cwd(); - my $result = is_repository($initial_directory, $repositoryHash_ref); - if ($result) { - $SourceConfigCurrent = SourceConfig->new($repositoryHash_ref->{REPOSITORY_ROOT}); - } - } - if ($init_action != SOURCE_CONFIG_CURRENT_ONLY) { - my $source_config = $ENV{SOURCE_ROOT_DIR} . '/' . SourceConfig::SOURCE_CONFIG_FILE_NAME; - if (-f $source_config) { - $SourceConfigEnvironment = SourceConfig->new($source_config); - } - } - - # fill array - - if (($init_action == SOURCE_CONFIG_CURRENT_FIRST) or ($init_action == SOURCE_CONFIG_CURRENT_ONLY)) { - if (defined ($SourceConfigCurrent)) { - push (@source_config_list, $SourceConfigCurrent); - } - if ($init_action == SOURCE_CONFIG_CURRENT_FIRST) { - if (defined ($SourceConfigEnvironment)) { - push (@source_config_list, $SourceConfigEnvironment); - } - } - } - elsif (($init_action == SOURCE_CONFIG_ENVIRONMENT_FIRST) or ($init_action == SOURCE_CONFIG_ENVIRONMENT_ONLY)) { - if (defined ($SourceConfigEnvironment)) { - push (@source_config_list, $SourceConfigEnvironment); - } - if ($init_action == SOURCE_CONFIG_ENVIRONMENT_FIRST) { - if (defined ($SourceConfigCurrent)) { - push (@source_config_list, $SourceConfigCurrent); - } - } - } - } - - $self->{SOURCE_CONFIG_LIST} = \@source_config_list; - - bless($self, $class); - return $self; -} - -##### methods ##### - -############################################################################################ - -sub add_SourceConfig { - my $self = shift; - my $source_config = shift; - push (@{$self->{SOURCE_CONFIG_LIST}}, $source_config); -} - -############################################################################################ - -sub get_SourceConfigList { - my $self = shift; - return @{$self->{SOURCE_CONFIG_LIST}}; -} - -############################################################################################ - -sub has_SourceConfig { - my $self = shift; - my $result = 0; - my $count = @{$self->{SOURCE_CONFIG_LIST}}; - $result = 1 if ($count > 0); - return $result; -} - -############################################################################################ - -sub get_module_path { - my $self = shift; - my $module = shift; - my $function = \&SourceConfig::get_module_path; - my $result; - $result = $self->get_StringResult ($function, $module); - return $result; -} - -############################################################################################ - -sub get_active_modules { - my $self = shift; - my $parameter; # empty - my $function = \&SourceConfig::get_active_modules; - my $array_ref; - $array_ref = $self->get_ArrayResult ($function, $parameter); - return @$array_ref; -} - -############################################################################################ - -sub get_repositories { - my $self = shift; - my $parameter; # empty - my $function = \&SourceConfig::get_repositories; - my $array_ref; - $array_ref = $self->get_ArrayResult ($function, $parameter); - return @$array_ref; -} - -############################################################################################ - -sub get_module_repository { - my $self = shift; - my $module = shift; - my $function = \&SourceConfig::get_module_repository; - my $result; - $result = $self->get_StringResult ($function, $module); - return $result; -} - -############################################################################################ - -sub is_active { - my $self = shift; - my $module = shift; - my $function = \&SourceConfig::is_active; - my $result_ref; - my $is_active = 0; - $result_ref = $self->get_ResultOfList ($function, $module); - my $count = @$result_ref; - if ($count>0) { - foreach my $active (@$result_ref) { - if ($active) { - $is_active = $active; - } - } - } - return $is_active; -} - -##### private methods ##### - -############################################################################################ -# -# is_repository () : check if the directory is a valid repository -# -# input: - directory -# - hash reference, where the output will be stored -# -# output: 0 = FALSE, the directory is no valid repository -# 1 = TRUE, the repository root can be found in $repositoryHash_ref->{REPOSITORY_ROOT} -# -############################################################################################ - -sub is_repository { - my $directory = shift; - my $repositoryHash_ref = shift; - $repositoryHash_ref->{INITIAL_DIRECTORY} = $directory; - $repositoryHash_ref->{REPOSITORY_ROOT} = undef; - $repositoryHash_ref->{REPOSITORY_NAME} = undef; - my $result = RepositoryHelper::search_via_build_lst($repositoryHash_ref); - chdir $repositoryHash_ref->{INITIAL_DIRECTORY}; - if (!$result) { - $result = RepositoryHelper::search_for_hg($repositoryHash_ref); - } - return $result; -} - -############################################################################################ -# -# get_ResultOfList(): give back an array reference from all SourceConfig Objects results -# -# input: - function : reference to the called function of each SourceConfig Object -# - parameter : parameter for the called function -# -# output: result : array of all results -# -############################################################################################ - -sub get_ResultOfList { - my $self = shift; - my $function = shift; - my $parameter = shift; - my @result; - foreach my $source_config (@{$self->{SOURCE_CONFIG_LIST}}) { - push (@result, &$function ($source_config, $parameter)); - } - return \@result; -} - -############################################################################################ -# -# get_StringResult(): give back the first defined result from all SourceConfig Objects -# -# input: - function : reference to the called function of each SourceConfig Object -# - parameter : parameter for the called function -# -# output: result : scalar variable (string), undef if no result -# -############################################################################################ - -sub get_StringResult { - my $self = shift; - my $function = shift; - my $parameter = shift; - my $result_ref; - $result_ref = $self->get_ResultOfList ($function, $parameter); - my $count = @$result_ref; - if ($count>0) { - my $value; - my $i = 0; - while (($i < $count) and !defined ($value)) { # search the first defined result - $value = $$result_ref[$i]; - $i++; - } - return $value; - } - return undef; -} - -############################################################################################ -# -# get_StringResult(): give back a sorted and uniqe array reference of the results -# from all SourceConfig Objects -# -# input: - function : reference to the called function of each SourceConfig Object -# - parameter : parameter for the called function -# -# output: result : sorted and uniqe array reference -# -############################################################################################ - -sub get_ArrayResult { - my $self = shift; - my $function = shift; - my $parameter = shift; - my $result_ref; - my @modules; - $result_ref = $self->get_ResultOfList ($function, $parameter); - my $count = @$result_ref; - if ($count>0) { - my %moduleHash; - foreach my $module (@$result_ref) { - $moduleHash{$module}++; - } - @modules = sort keys %moduleHash; - } - return \@modules; -} - - ##### finish ##### - -1; # needed by use or require - -__END__ - -=head1 NAME - -SourceConfigHelper - Perl extension for handling with SourceConfigObjetcs - -=head1 SYNOPSIS - - # example that will read source_config file and return the active repositories - - use SourceConfigHelper; - - # Create a new instance: - $a = SourceConfigHelper->new(); - - # Get repositories for the actual workspace: - $a->get_repositories(); - -=head1 DESCRIPTION - -SourceConfigHelper is a perl extension to handle more than one objects of SourceConfig -to set up a search order for modules. - -Methods: - -SourceConfigHelper::new() - -Creates a new instance of SourceConfigHelper. Can be initialized by: default - empty or with a constant of search order. default: the source_config will be taken first from the current repository and second from the environment -Possible parameters are: -SourceConfigHelper::SOURCE_CONFIG_NONE - no SourceConfig Object will be created -SourceConfigHelper::SOURCE_CONFIG_CURRENT_FIRST - use the current repository first -SourceConfigHelper::SOURCE_CONFIG_ENVIRONMENT_FIRST - use the repository of the environment first -SourceConfigHelper::SOURCE_CONFIG_CURRENT_ONLY - use only the current repository -SourceConfigHelper::SOURCE_CONFIG_ENVIRONMENT_ONLY - use only the repository of the environment - -SourceConfigHelper::get_repositories() - -Returns sorted list of active repositories for the actual workspace - -SourceConfigHelper::get_active_modules() - -Returns a sorted list of active modules - -SourceConfigHelper::get_all_modules() - -Returns sorted list of all modules in active repositories. - -SourceConfigHelper::get_module_path($module) - -Returns absolute module path. If the module is not active or don't exists, "undef" will be returned. - -SourceConfigHelper::get_module_repository($module) - -Returns the module's repository. If the module is not active or don't exists, "undef" will be returned. - -SourceConfigHelper::is_active() - -Returns 1 (TRUE) if a module is active -Returns 0 (FALSE) if a module is not active - -SourceConfigHelper::add_SourceConfig($SourceConfigObject) - -Add the SourceConfigObject to the end of the list - -SourceConfigHelper::get_SourceConfigList() - -Return an array of SourceConfigObjects - -SourceConfigHelper::has_SourceConfig() - -Returns 1 (TRUE) if one or more SourceConfig Objects is in the list -Returns 0 (FALSE) if no SourceConfig Object is in the list (can happen if there is no valid repository) - -=head2 EXPORT - -SourceConfigHelper::new() -SourceConfigHelper::get_repositories() -SourceConfigHelper::get_active_modules() -SourceConfigHelper::get_all_modules() -SourceConfigHelper::get_module_path($module) -SourceConfigHelper::get_module_repository($module) -SourceConfigHelper::is_active($module) -SourceConfigHelper::add_SourceConfig($SourceConfigObject) -SourceConfigHelper::get_SourceConfigList() -SourceConfigHelper::has_SourceConfig() - -=head1 AUTHOR - -Kurt Zenker, kz@openoffice.org - -=head1 SEE ALSO - -perl(1). - -=cut diff --git a/solenv/bin/modules/installer/archivefiles.pm b/solenv/bin/modules/installer/archivefiles.pm deleted file mode 100644 index 34fff6c6c..000000000 --- a/solenv/bin/modules/installer/archivefiles.pm +++ /dev/null @@ -1,565 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::archivefiles; - -use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); -use installer::converter; -use installer::existence; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::systemactions; -use Cwd; - -################################################################# -# Changing the name for files with flag RENAME_TO_LANGUAGE -################################################################# - -sub put_language_into_name -{ - my ( $oldname, $onelanguage ) = @_; - - my $newname = ""; - - my $filename = ""; - my $extension = ""; - - if ( $oldname =~ /en-US/ ) # files, that contain the language in the file name - { - $newname = $oldname; - $newname =~ s/en-US/$onelanguage/; - } - else # files, that do not contain the language in the file name - { - if ( $oldname =~ /^\s*(.*)(\..*?)\s*$/ ) # files with extension - { - $filename = $1; - $extension = $2; - } - else - { - $filename = $oldname; - $extension = ""; - } - - $newname = $1 . "_" . $onelanguage . $2; - } - - return $newname; -} - -################################################################# -# Converting patchfiles string into array -################################################################# - -sub get_patch_file_list -{ - my ( $patchfilestring ) = @_; - - $patchfilestring =~ s/^\s*\(?//; - $patchfilestring =~ s/\)?\s*$//; - $patchfilestring =~ s/^\s*\///; - $patchfilestring =~ s/^\s*\\//; - - my $patchfilesarray = installer::converter::convert_stringlist_into_array_without_newline(\$patchfilestring, ","); - - return $patchfilesarray; -} - -################################################################# -# Reading all executables in the "manifest.xml" -################################################################# - -sub get_all_executables_from_manifest -{ - my ($unzipdir, $manifestfile, $executable_files_in_extensions) = @_; - - my $is_executable = 0; - - for ( my $i = 0; $i <= $#{$manifestfile}; $i++ ) - { - my $line = ${$manifestfile}[$i]; - - if ( $line =~ /\"application\/vnd\.sun\.star\.executable\"/ ) { $is_executable = 1; } - - if (( $line =~ /manifest\:full\-path=\"(.*?)\"/ ) && ( $is_executable )) - { - my $filename = $unzipdir . $installer::globals::separator . $1; - # making only slashes for comparison reasons - $filename =~ s/\\/\//g; - $executable_files_in_extensions->{$filename} = 1; - } - - if ( $line =~ /\/\>/ ) { $is_executable = 0; } - } -} - -################################################################# -# Reading the "manifest.xml" in extensions and determine, if -# there are executable files -################################################################# - -sub collect_all_executable_files_in_extensions -{ - my ($unzipdir, $executable_files_in_extensions) = @_; - - $unzipdir =~ s/\Q$installer::globals::separator\E\s*$//; - - my $manifestfilename = $unzipdir . $installer::globals::separator . "META-INF" . $installer::globals::separator . "manifest.xml"; - - if ( -f $manifestfilename ) - { - my $manifestfile = installer::files::read_file($manifestfilename); - get_all_executables_from_manifest($unzipdir, $manifestfile, $executable_files_in_extensions); - } -} - -################################################################# -# Analyzing files with flag ARCHIVE -################################################################# - -sub resolving_archive_flag -{ - my ($filesarrayref, $additionalpathsref, $languagestringref, $loggingdir) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::archivefiles::resolving_archive_flag : $#{$filesarrayref} : $#{$additionalpathsref} : $$languagestringref : $loggingdir"); } - - my @newallfilesarray = (); - - my ($systemcall, $returnvalue, $infoline); - - my $unziplistfile = $loggingdir . "unziplist_" . $installer::globals::build . "_" . $installer::globals::compiler . "_" . $$languagestringref . ".txt"; - - my $platformunzipdirbase = installer::systemactions::create_directories("zip", $languagestringref); - push(@installer::globals::removedirs, $platformunzipdirbase); - - installer::logger::include_header_into_logfile("Files with flag ARCHIVE:"); - - my $repeat_unzip = 0; - my $maxcounter = 0; - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - if ( $repeat_unzip ) { $i--; } # decreasing the counter - - my $onefile = ${$filesarrayref}[$i]; - my $styles = ""; - - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - - if ( $styles =~ /\bARCHIVE\b/ ) # copying, unzipping and changing the file list - { - my $iscommonfile = 0; - my $sourcepath = $onefile->{'sourcepath'}; - - if ( $sourcepath =~ /\Q$installer::globals::separator\E\bcommon$installer::globals::productextension\Q$installer::globals::separator\E/ ) # /common/ or /common.pro/ - { - $iscommonfile = 1; - } - - my $use_internal_rights = 0; - if ( $styles =~ /\bUSE_INTERNAL_RIGHTS\b/ ) { $use_internal_rights = 1; } # using the rights used inside the zip file - - my $rename_to_language = 0; - if ( $styles =~ /\bRENAME_TO_LANGUAGE\b/ ) { $rename_to_language = 1; } # special handling for renamed files (scriptitems.pm) - - my %executable_files_in_extensions = (); - my $set_executable_privileges = 0; # setting privileges for exectables is required for oxt files - if ( $onefile->{'Name'} =~ /\.oxt\s*$/ ) { $set_executable_privileges = 1; } - - # mechanism to select files from an archive files - my $select_files = 0; - my $selectlistfiles = ""; - my @keptfiles = (); - if ( $onefile->{'Selectfiles'} ) - { - $select_files = 1; - $selectlistfiles = get_patch_file_list( $onefile->{'Selectfiles'} ); - $infoline = "Selected file list defined at file: $onefile->{'Name'} :\n"; - push( @installer::globals::logfileinfo, $infoline); - for ( my $k = 0; $k <= $#{$selectlistfiles}; $k++ ) - { - $infoline = "\"${$selectlistfiles}[$k]\"\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - if ( $onefile->{'Selectfiles'} ) { $onefile->{'Selectfiles'} = ""; } # Selected files list no longer required - - # mechanism to define patch files inside an archive files - my $select_patch_files = 0; - my $patchlistfiles = ""; - my @keptpatchflags = (); - if (( $styles =~ /\bPATCH\b/ ) && ( $onefile->{'Patchfiles'} ) && ( $installer::globals::patch )) - { - $select_patch_files = 1; # special handling if a Patchlist is defined - $patchlistfiles = get_patch_file_list( $onefile->{'Patchfiles'} ); - $infoline = "Patch file list defined at file: $onefile->{'Name'} :\n"; - push( @installer::globals::logfileinfo, $infoline); - for ( my $k = 0; $k <= $#{$patchlistfiles}; $k++ ) - { - $infoline = "\"${$patchlistfiles}[$k]\"\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - if ( $onefile->{'Patchfiles'} ) { $onefile->{'Patchfiles'} = ""; } # Patch file list no longer required - - # creating directories - - my $onelanguage = $onefile->{'specificlanguage'}; - - # files without language into directory "00" - - if ($onelanguage eq "") { $onelanguage = "00"; } - - my $unzipdir; - - $unzipdir = $platformunzipdirbase . $installer::globals::separator . $onelanguage . $installer::globals::separator; - - installer::systemactions::create_directory($unzipdir); # creating language specific subdirectories - - my $onefilename = $onefile->{'Name'}; - $onefilename =~ s/\./\_/g; # creating new directory name - $onefilename =~ s/\//\_/g; # only because of /letter/fontunxpsprint.zip, the only zip file with path - $unzipdir = $unzipdir . $onefilename . $installer::globals::separator; - - if ( $installer::globals::dounzip ) { installer::systemactions::create_directory($unzipdir); } # creating subdirectories with the names of the zipfiles - - my $zip = Archive::Zip->new(); - if ( $zip->read($sourcepath) != AZ_OK ) - { - $infoline = "ERROR: Could not unzip $sourcepath\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - my $counter = 0; - my $contains_dll = 0; - my @dllList = (); - my @dirs = (); - foreach my $member ( $zip->memberNames() ) - { - $counter++; - if ( $member =~ /.dll\s*$/i ) { $contains_dll = 1; push(@dllList, $member); } - if ( $member =~ m/\/$/ ) { push(@dirs, $member); } - } - - if (! ( $counter > 0 )) # the zipfile is empty - { - $infoline = "ERROR: Could not unzip $sourcepath\n"; - push( @installer::globals::logfileinfo, $infoline); - - } - else - { - if ( $installer::globals::dounzip ) # really unpacking the files - { - if ( $zip->extractTree("", $unzipdir) != AZ_OK ) { installer::exiter::exit_program("ERROR: $infoline", "resolving_archive_flag"); } - - if (( $^O =~ /cygwin/i ) && ( $contains_dll )) - { - my $dir = getcwd(); - chdir($unzipdir); - my $changed = chmod(0775, @dllList); - $infoline = "Changed mode of $changed files (of ".scalar(@dllList).")\n"; - push( @installer::globals::logfileinfo, $infoline); - chdir($dir); - - if ($changed != scalar(@dllList)) - { - $infoline = "ERROR: Could not chmod all files!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - if ( ! $installer::globals::iswindowsbuild && scalar(@dirs) > 0 ) - { - my $dir = getcwd(); - chdir($unzipdir); - # Setting unix rights to "775" for all created directories inside the package - my $changed = chmod(0775, @dirs); - $infoline = "Changed mode of : $changed; should be: ".scalar(@dirs)."\n"; - chdir($dir); - - push( @installer::globals::logfileinfo, $infoline); - - if ($changed != scalar(@dirs)) - { - $infoline = "ERROR: Could not chmod all files!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - # Selecting names of executable files in extensions - if ( $set_executable_privileges ) - { - collect_all_executable_files_in_extensions($unzipdir, \%executable_files_in_extensions); - } - } - - my $zipfileref = \@zipfile; - my $unziperror = 0; - - foreach my $zipname ( $zip->memberNames() ) - { - # Format from Archive:::Zip : - # dir1/ - # dir1/so7drawing.desktop - - # some directories and files (from the help) start with "./simpress.idx" - - $zipname =~ s/^\s*\.\///; - - if ($installer::globals::iswin and $^O =~ /MSWin/i) { $zipname =~ s/\//\\/g; } - - if ( $zipname =~ /\Q$installer::globals::separator\E\s*$/ ) # slash or backslash at the end characterizes a directory - { - $zipname = $zipname . "\n"; - push(@{$additionalpathsref}, $zipname); - - # Also needed here: - # Name - # Language - # ismultilingual - # Basedirectory - - # This is not needed, because the list of all directories for the - # epm list file is generated from the destination directories of the - # files included in the product! - } - else - { - my %newfile = (); - %newfile = %{$onefile}; - $newfile{'Name'} = $zipname; - my $destination = $onefile->{'destination'}; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$destination); - $newfile{'destination'} = $destination . $zipname; - $newfile{'sourcepath'} = $unzipdir . $zipname; - $newfile{'zipfilename'} = $onefile->{'Name'}; - $newfile{'zipfilesource'} = $onefile->{'sourcepath'}; - $newfile{'zipfiledestination'} = $onefile->{'destination'}; - - if (( $use_internal_rights ) && ( ! $installer::globals::iswin )) - { - my $value = sprintf("%o", (stat($newfile{'sourcepath'}))[2]); - $newfile{'UnixRights'} = substr($value, 3); - $infoline = "Setting unix rights for \"$newfile{'sourcepath'}\" to \"$newfile{'UnixRights'}\"\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - if ( $set_executable_privileges ) - { - # All pathes to executables are saved in the hash %executable_files_in_extensions - my $compare_path = $newfile{'sourcepath'}; - $compare_path =~ s/\\/\//g; # contains only slashes for comparison reasons - if ( exists($executable_files_in_extensions{$compare_path}) ) - { - $newfile{'UnixRights'} = "775"; - $infoline = "Executable in Extension: Setting unix rights for \"$newfile{'sourcepath'}\" to \"$newfile{'UnixRights'}\"\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - if ( $select_files ) - { - if ( ! installer::existence::exists_in_array($zipname,$selectlistfiles) ) - { - $infoline = "Removing from ARCHIVE file $onefilename: $zipname\n"; - push( @installer::globals::logfileinfo, $infoline); - next; # ignoring files, that are not included in $selectlistfiles - } - else - { - $infoline = "Keeping from ARCHIVE file $onefilename: $zipname\n"; - push( @installer::globals::logfileinfo, $infoline); - push( @keptfiles, $zipname); # collecting all kept files - } - } - - if ( $select_patch_files ) - { - # Is this file listed in the Patchfile list? - # $zipname (filename including path in zip file has to be listed in patchfile list - - if ( ! installer::existence::exists_in_array($zipname,$patchlistfiles) ) - { - $newfile{'Styles'} =~ s/\bPATCH\b//; # removing the flag PATCH - $newfile{'Styles'} =~ s/\,\s*\,/\,/; - $newfile{'Styles'} =~ s/\(\s*\,/\(/; - $newfile{'Styles'} =~ s/\,\s*\)/\)/; - } - else - { - push( @keptpatchflags, $zipname); # collecting all PATCH flags - } - } - - if ( $rename_to_language ) - { - my $newzipname = put_language_into_name($zipname, $onelanguage); - my $oldfilename = $unzipdir . $zipname; - my $newfilename = $unzipdir . $newzipname; - - installer::systemactions::copy_one_file($oldfilename, $newfilename); - - $newfile{'Name'} = $newzipname; - $newfile{'destination'} = $destination . $newzipname; - $newfile{'sourcepath'} = $unzipdir . $newzipname; - - $infoline = "RENAME_TO_LANGUAGE: Using $newzipname instead of $zipname!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - my $sourcefiletest = $unzipdir . $zipname; - if ( ! -f $sourcefiletest ) - { - $infoline = "ATTENTION: Unzip failed for $sourcefiletest!\n"; - push( @installer::globals::logfileinfo, $infoline); - $unziperror = 1; - } - - # only adding the new line into the files array, if not in repeat modus - - if ( ! $repeat_unzip ) { push(@newallfilesarray, \%newfile); } - } - } - - # Comparing the content of @keptfiles and $selectlistfiles - # Do all files from the list of selected files are stored in @keptfiles ? - # @keptfiles contains only files included in $selectlistfiles. But are all - # files from $selectlistfiles included in @keptfiles? - - if ( $select_files ) - { - my $number = $#{$selectlistfiles} + 1; - $infoline = "SELECTLIST: Number of files in file selection list: $number\n"; - push( @installer::globals::logfileinfo, $infoline); - $number = $#keptfiles + 1; - $infoline = "SELECTLIST: Number of kept files: $number\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $k = 0; $k <= $#keptfiles; $k++ ) - { - $infoline = "KEPT FILES: $keptfiles[$k]\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - my @warningfiles = (); - - for ( my $k = 0; $k <= $#{$selectlistfiles}; $k++ ) - { - if ( ! installer::existence::exists_in_array(${$selectlistfiles}[$k],\@keptfiles) ) - { - push(@warningfiles, ${$selectlistfiles}[$k]); - } - } - - for ( my $k = 0; $k <= $#warningfiles; $k++ ) - { - $infoline = "WARNING: $warningfiles[$k] not included in install set (does not exist in zip file)!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - } - - # Comparing the content of @keptpatchflags and $patchlistfiles - # Do all files from the patch list have a PATCH flag ? - # @keptpatchflags contains only files included in $patchlistfiles. But are all - # files from $patchlistfiles included in @keptpatchflags? - - if ( $select_patch_files ) - { - my $number = $#{$patchlistfiles} + 1; - $infoline = "PATCHLIST: Number of files in patch list: $number\n"; - push( @installer::globals::logfileinfo, $infoline); - $number = $#keptpatchflags + 1; - $infoline = "PATCHLIST: Number of kept PATCH flags: $number\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $k = 0; $k <= $#keptpatchflags; $k++ ) - { - $infoline = "KEPT PATCH FLAGS: $keptpatchflags[$k]\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - my @warningfiles = (); - - for ( my $k = 0; $k <= $#{$patchlistfiles}; $k++ ) - { - if ( ! installer::existence::exists_in_array(${$patchlistfiles}[$k],\@keptpatchflags) ) - { - push(@warningfiles, ${$patchlistfiles}[$k]); - } - } - - for ( my $k = 0; $k <= $#warningfiles; $k++ ) - { - $infoline = "WARNING: $warningfiles[$k] did not keep PATCH flag (does not exist in zip file)!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - if ( $unziperror ) - { - installer::logger::print_warning( "Repeating to unpack $sourcepath! \n" ); - $infoline = "ATTENTION: Repeating to unpack $sourcepath !\n"; - push( @installer::globals::logfileinfo, $infoline); - $repeat_unzip = 1; - $maxcounter++; - - if ( $maxcounter == 5 ) # exiting the program - { - installer::exiter::exit_program("ERROR: Failed to unzip $sourcepath !", "resolving_archive_flag"); - } - } - else - { - $infoline = "Info: $sourcepath unpacked without problems !\n"; - push( @installer::globals::logfileinfo, $infoline); - $repeat_unzip = 0; - $maxcounter = 0; - } - } - } - else # nothing to do here, no zipped file (no ARCHIVE flag) - { - push(@newallfilesarray, $onefile); - } - } - - $infoline = "\n"; - push( @installer::globals::logfileinfo, $infoline); - - return \@newallfilesarray; -} - - -1; diff --git a/solenv/bin/modules/installer/configuration.pm b/solenv/bin/modules/installer/configuration.pm deleted file mode 100644 index 7212b795e..000000000 --- a/solenv/bin/modules/installer/configuration.pm +++ /dev/null @@ -1,896 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::configuration; - -use Cwd; -use installer::converter; -use installer::existence; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::remover; -use installer::systemactions; - -################################################################################ -# Getting package from configurationitem (for instance: org.openoffice.Office) -# Getting name from configurationitem (for instance: Common) -################################################################################ - -sub analyze_path_of_configurationitem -{ - my ($configurationitemsref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::analyze_path_of_configurationitem : $#{$configurationitemsref}"); } - - my ($startpath, $nodes, $name, $packagename, $onenode, $first, $second, $third, $bracketnode); - - for ( my $i = 0; $i <= $#{$configurationitemsref}; $i++ ) - { - my $oneconfig = ${$configurationitemsref}[$i]; - my $path = $oneconfig->{'Path'}; - - installer::remover::remove_leading_and_ending_slashes(\$path); # in scp are some path beginning with "/" - - if ( $path =~ /^\s*(.*?)\/(.*)\s*$/ ) - { - $startpath = $1; - $nodes = $2; - } - else - { - installer::exiter::exit_program("ERROR: Unknown format of ConfigurationItem path: $path", "analyze_path_of_configurationitem"); - } - - # Startpath is now: org.openoffice.Setup - # Nodes is now: Office/Factories/com.sun.star.chart.ChartDocument - - # Dividing the startpath into package (org.openoffic) and name (Setup). - - $oneconfig->{'startpath'} = $startpath; # saving the startpath into the hash - - if ( $startpath =~ /^\s*(\S*)\.(\S*?)\s*$/ ) - { - $packagename = $1; - $name = $2; - $oneconfig->{'name'} = $name; - $oneconfig->{'packagename'} = $packagename; - } - else - { - installer::exiter::exit_program("ERROR: Unknown format of ConfigurationItem startpath: $startpath", "analyze_path_of_configurationitem"); - } - - # Collecting all nodes - - installer::remover::remove_leading_and_ending_slashes(\$nodes); - - my $counter = 1; - - # Attention: Do not trust the slash - # Filters/Filter['StarWriter 5.0 Vorlage/Template'] - # Menus/New/*['m10']/Title - - if ( $nodes =~ /^(.*\[\')(.*\/.*)(\'\].*)$/ ) - { - $first = $1; - $second = $2; - $third = $3; - - $second =~ s/\//SUBSTITUTEDSLASH/g; # substituting "/" to "SUBSTITUTEDSLASH" - $nodes = $first . $second . $third; - } - - while ( $nodes =~ /\// ) - { - if ($nodes =~ /^\s*(.*?)\/(.*)\s*$/ ) - { - $onenode = $1; - $nodes = $2; - $nodename = "node". $counter; - - # Special handling for filters. Difference between: - # Filter['StarWriter 5.0 Vorlage/Template'] without oor:op="replace" - # *['m10'] with oor:op="replace" - - if ( $onenode =~ /^\s*Filter\[\'(.*)\'\].*$/ ) { $oneconfig->{'isfilter'} = 1; } - - # Changing the nodes with brackets: - # Filter['StarWriter 5.0 Vorlage/Template'] - # *['m10'] - - if ( $onenode =~ /^.*\[\'(.*)\'\].*$/ ) - { - $onenode = $1; - $bracketnode = "bracket_" . $nodename; - $oneconfig->{$bracketnode} = 1; - } - - $onenode =~ s/SUBSTITUTEDSLASH/\//g; # substituting "SUBSTITUTEDSLASH" to "/" - $oneconfig->{$nodename} = $onenode; - - # special handling for nodes "Factories" - - if ( $onenode eq "Factories" ) { $oneconfig->{'factoriesnode'} = $counter; } - else { $oneconfig->{'factoriesnode'} = -99; } - } - - $counter++ - } - - # and the final node - - if ( $nodes =~ /^\s*Filter\[\'(.*)\'\].*$/ ) { $oneconfig->{'isfilter'} = 1; } - - $nodename = "node". $counter; - - if ( $nodes =~ /^.*\[\'(.*)\'\].*$/ ) - { - $nodes = $1; - $bracketnode = "bracket_" . $nodename; - $oneconfig->{$bracketnode} = 1; - } - - $nodes =~ s/SUBSTITUTEDSLASH/\//g; # substituting "SUBSTITUTEDSLASH" to "/" - - if (($nodes eq "Name") || ($nodes eq "Title")) # isocodes below "Name" or "Title" - { - # if the last node $nodes is "Name" or "Title", it is a Property, not a name! See Common.xcu - - $oneconfig->{'isisocode'} = 1; - - if ( $nodes eq "Name" ) { $oneconfig->{'isname'} = 1; } - if ( $nodes eq "Title" ) { $oneconfig->{'istitle'} = 1; } - $counter--; # decreasing the counter, because "Name" and "Title" are no nodes - } - else - { - $oneconfig->{$nodename} = $nodes; - $oneconfig->{'isisocode'} = 0; - } - - # special handling for nodes "Factories" - - if ( $onenode eq "Factories" ) { $oneconfig->{'factoriesnode'} = $counter; } - else { $oneconfig->{'factoriesnode'} = -99; } - - # saving the number of nodes - - $oneconfig->{'nodenumber'} = $counter; - } -} - -#################################################################### -# Inserting the start block into a configuration file -#################################################################### - -sub insert_start_block_into_configfile -{ - my ($configfileref, $oneconfig) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::insert_start_block_into_configfile : $#{$configfileref} : $oneconfig->{'name'}"); } - - my $line = '<?xml version="1.0" encoding="UTF-8"?>' . "\n"; - push( @{$configfileref}, $line); - - $line = '<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:install="http://openoffice.org/2004/installation" oor:name="FILENAME" oor:package="PACKAGENAME">' . "\n"; - my $packagename = $oneconfig->{'packagename'}; - my $name = $oneconfig->{'name'}; - $line =~ s/PACKAGENAME/$packagename/g; - $line =~ s/FILENAME/$name/g; - push( @{$configfileref}, $line); - - $line = "\n"; - push( @{$configfileref}, $line); -} - -#################################################################### -# Inserting the end block into a configuration file -#################################################################### - -sub insert_end_block_into_configfile -{ - my ($configfileref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::insert_end_block_into_configfile : $#{$configfileref}"); } - - my $line = "\n" . '</oor:component-data>' . "\n"; - push( @{$configfileref}, $line); -} - -############################################################## -# Getting the content of a node -############################################################## - -sub get_node_content -{ - my ($nodeline) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::get_node_content : $nodeline"); } - - my $content = ""; - - if ( $nodeline =~ /name\=\"(.*?)\"/ ) - { - $content = $1; - } - else - { - installer::exiter::exit_program("ERROR: Impossible error in function get_node_content!", "get_node_content"); - } - - return \$content; -} - -############################################################## -# Getting the line number of an existing node -# Return "-1" if node does not exist -############################################################## - -sub get_node_line_number -{ - my ($nodecount, $oneconfig, $oneconfigfileref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::get_node_line_number : $nodecount : $oneconfig->{'name'} : $#{$oneconfigfileref}"); } - - my $linenumber = -1; # the node does not exists, if returnvalue is "-1" - - # Attention: Take care of the two title nodes: - # Path=org.openoffice.Office.Common/Menus/Wizard/*['m14']/Title - # Path=org.openoffice.Office.Common/Menus/Wizard/*['m15']/Title - # -> every subnode has to be identical - - # creating the allnodes string from $oneconfig - - my $allnodes = ""; - - for ( my $i = 1; $i <= $nodecount; $i++ ) - { - my $nodename = "node" . $i; - $allnodes .= $oneconfig->{$nodename} . "/"; - } - - installer::remover::remove_leading_and_ending_slashes(\$allnodes); # exactly this string has to be found in the following iteration - - # Iterating over the already built configuration file - - my @allnodes = (); - - for ( my $i = 0; $i <= $#{$oneconfigfileref}; $i++ ) - { - my $line = ${$oneconfigfileref}[$i]; - installer::remover::remove_leading_and_ending_whitespaces(\$line); - my $nodechanged = 0; - - if ( $line =~ /^\s*\<node/ ) # opening node - { - $nodechanged = 1; - my $nodecontentref = get_node_content($line); - push(@allnodes, $$nodecontentref); # collecting all nodes in an array - } - - if ( $line =~ /^\s*\<\/node/ ) # ending node - { - $nodechanged = 1; - pop(@allnodes); # removing the last node from the array - } - - if (( $nodechanged ) && ($#allnodes > -1)) # a node was found and the node array is not empty - { - # creating the string to compare with the string $allnodes - - my $nodestring = ""; - - for ( my $j = 0; $j <= $#allnodes; $j++ ) - { - $nodestring .= $allnodes[$j] . "/"; - } - - installer::remover::remove_leading_and_ending_slashes(\$nodestring); - - if ( $nodestring eq $allnodes ) - { - # that is exactly the same node - - $linenumber = $i; - $linenumber++; # increasing the linenumber - last; - - } - } - } - - return $linenumber; -} - -############################################################## -# Inserting one configurationitem into the configurationfile -############################################################## - -sub insert_into_config_file -{ - my ($oneconfig, $oneconfigfileref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::insert_into_config_file : $oneconfig->{'nodenumber'} : $#{$oneconfigfileref}"); } - - my ($nodename, $nodecontent, $newnodeline, $bracketkey, $line, $insertline); - - # interpreting the nodes, keys and values - - my $nodeline = '<node oor:name="NODECONTENT" REPLACEPART >' . "\n"; - my $propline = '<prop oor:name="KEYCONTENT" REPLACEPART TYPEPART>' . "\n"; - my $valueline = '<value SEPARATORPART>VALUECONTENT</value>' . "\n"; - my $langvalueline = '<value xml:lang="SAVEDLANGUAGE">VALUECONTENT</value>' . "\n"; - my $propendline = '</prop>' . "\n"; - my $nodeendline = '</node>' . "\n"; - - my $replacepart = 'oor:op="replace"'; - my $typepart = 'oor:type="xs:VALUETYPE"'; # VALUETYPE can be "string", "boolean", ... - - my $nodecount = $oneconfig->{'nodenumber'}; - my $styles = $oneconfig->{'Styles'}; - - for ( my $i = 1; $i <= $nodecount; $i++ ) - { - $insertline = get_node_line_number($i, $oneconfig, $oneconfigfileref); - - if ( $insertline == -1) # if true, the node does not exist - { - $nodename = "node" . $i; - $nodecontent = $oneconfig->{$nodename}; - $newnodeline = $nodeline; - - $newnodeline =~ s/NODECONTENT/$nodecontent/g; - - # Case1: - # Nodes with brackets, need the replacepart 'oor:op="replace"' - # Bracket node is set for each node with: bracket_node1=1, bracket_node2=1, ... - # Case a: <node oor:name="m0" oor:op="replace"> (Common.xcu needs oor:op="replace") - # Case b: <node oor:name="Ami Pro 1.x-3.1 (W4W)"> (TypeDetection.xcu does not need oor:op="replace") - # For case b introducting a special case for Filters - - $bracketkey = "bracket_" . $nodename; - - my $localbracketkey = 0; - - if ( $oneconfig->{$bracketkey} ) { $localbracketkey = $oneconfig->{$bracketkey}; } - - if ( $localbracketkey == 1 ) # 'oor:op="replace"' is needed - { - my $isfilter = 0; - if ( $oneconfig->{'isfilter'} ) { $isfilter = $oneconfig->{'isfilter'}; } - - if ( $isfilter == 1 ) # this is a filter - { - $newnodeline =~ s/REPLACEPART//; - } - else - { - $newnodeline =~ s/REPLACEPART/$replacepart/; - } - - $newnodeline =~ s/\s*\>/\>/; # removing resulting whitespaces - } - - # Case2: - # Nodes below a Node "Factories", also need the replacepart 'oor:op="replace"' - # This is saved in $oneconfig->{'factoriesnode'}. If not set, the value is "-99" - - if ( $i == $oneconfig->{'factoriesnode'} ) - { - $newnodeline =~ s/REPLACEPART/$replacepart/; - $newnodeline =~ s/\s*\>/\>/; # removing resulting whitespaces - } - - # Case3: - # In all other cases, REPLACEPART in nodes can be removed - - $newnodeline =~ s/REPLACEPART//; - $newnodeline =~ s/\s*\>/\>/; # removing resulting whitespaces - - # Finding the correct place for inserting the node - - if ( $i == 1 ) # this is a toplevel node - { - push(@{$oneconfigfileref}, $newnodeline); - push(@{$oneconfigfileref}, $nodeendline); - } - else - { - # searching for the parent node - - my $parentnumber = $i-1; - $insertline = get_node_line_number($parentnumber, $oneconfig, $oneconfigfileref); - splice(@{$oneconfigfileref}, $insertline, 0, ($newnodeline, $nodeendline)); - } - } - } - - # Setting variables $isbracketnode and $isfactorynode for the properties - - - my $isbracketnode = 0; - my $isfactorynode = 0; - - for ( my $i = 1; $i <= $nodecount; $i++ ) - { - $nodename = "node" . $i; - $bracketkey = "bracket_" . $nodename; - - my $localbracketkey = 0; - if ( $oneconfig->{$bracketkey} ) { $localbracketkey = $oneconfig->{$bracketkey}; } - - if ( $localbracketkey == 1 ) { $isbracketnode = 1; } - if ( $i == $oneconfig->{'factoriesnode'} ) { $isfactorynode = 1; } - } - - # now all nodes exist, and the key and value can be inserted into the configfile - # the next line contains the key, for instance: <prop oor:name="UseDefaultMailer" oor:type="xs:boolean"> - # my $propline = '<prop oor:name="KEYCONTENT" REPLACEPART TYPEPART>' . "\n"; - # The type is only needed, if a replace is set. - - my $newpropline = $propline; - - # Replacement of KEYCONTENT, REPLACEPART and TYPEPART - - # Case 1: - # Properties with oor:name="Name" (Common.xcu) are simply <prop oor:name="Name"> - # The information about such a property is stored in $oneconfig->{'isisocode'} - - if ( $oneconfig->{'isisocode'} ) - { - if ( $oneconfig->{'isname'} ) { $newpropline =~ s/KEYCONTENT/Name/; } # The property name is always "Name" - if ( $oneconfig->{'istitle'} ) { $newpropline =~ s/KEYCONTENT/Title/; } # The property name is always "Title" - $newpropline =~ s/REPLACEPART//; - $newpropline =~ s/TYPEPART//; - $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces - } - - # Begin of all other cases - - my $key = $oneconfig->{'Key'}; - $newpropline =~ s/KEYCONTENT/$key/; - - my $valuetype; - - if ( $styles =~ /CFG_STRING\b/ ) { $valuetype = "string"; } - elsif ( $styles =~ /CFG_NUMERIC/ ) { $valuetype = "int"; } - elsif ( $styles =~ /CFG_BOOLEAN/ ) { $valuetype = "boolean"; } - elsif ( $styles =~ /CFG_STRINGLIST/ ) { $valuetype = "string-list"; } - else - { - installer::exiter::exit_program("ERROR: Unknown configuration value type: $styles", "insert_into_config_file"); - } - - # Case 2: - # Properties below a node "Factories" do not need a 'oor:op="replace"' and a 'oor:type="xs:VALUETYPE"' - - if ( $isfactorynode ) - { - $newpropline =~ s/REPLACEPART//; - $newpropline =~ s/TYPEPART//; - $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces - } - - # Case 3: - # Properties below a "bracket" node do not need a 'oor:op="replace"', except they are iso-codes - # Assumption here: They are multilingual - - if ( $isbracketnode ) - { - my $localtypepart = $typepart; - $localtypepart =~ s/VALUETYPE/$valuetype/; - $newpropline =~ s/TYPEPART/$localtypepart/; - - if ( $oneconfig->{'ismultilingual'} ) # This is solved by "Name" and "Title" - { - $newpropline =~ s/REPLACEPART/$replacepart/; - } - else - { - $newpropline =~ s/REPLACEPART//; - } - - $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces - } - - # Case 4: - # if the flag CREATE is set, the properties get 'oor:op="replace"' and 'oor:type="xs:VALUETYPE"' - - if (( $styles =~ /\bCREATE\b/ ) && (!($isbracketnode))) - { - # $typepart is 'oor:type="xs:VALUETYPE"'; - # VALUETYPE can be "string", "boolean", ... - my $localtypepart = $typepart; - $localtypepart =~ s/VALUETYPE/$valuetype/; - - $newpropline =~ s/TYPEPART/$localtypepart/; - $newpropline =~ s/REPLACEPART/$replacepart/; - $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces - } - - # Case 5: - # all other ConfigurationItems do not need 'oor:op="replace"' and 'oor:type="xs:VALUETYPE"' - - $newpropline =~ s/REPLACEPART//; - $newpropline =~ s/TYPEPART//; - $newpropline =~ s/\s*\>/\>/; # removing resulting whitespaces - - # finally the value can be set - - my $value = $oneconfig->{'Value'}; - - # Some values in setup script are written during installation process by the setup. These - # have values like "<title>". This will lead to an error, because of the brackets. Therefore the - # brackets have to be removed. - - # ToDo: Substituting the setup replace variables - - $value =~ s/^\s*\<//; - $value =~ s/\>\s*$//; - - # Deal with list separators - my $separatorpart = ''; - if ( ($valuetype eq "string-list") && ($value =~ /\|/) ) - { - $separatorpart = 'oor:separator="|"'; - } - - # Fake: substituting german umlauts - - $value =~ s/\ä/ae/; - $value =~ s/\ö/oe/; - $value =~ s/\ü/ue/; - $value =~ s/\Ä/AE/; - $value =~ s/\Ö/OE/; - $value =~ s/\Ü/UE/; - - my $newvalueline; - - if (!($oneconfig->{'isisocode'} )) # this is the simpe case - { - $newvalueline = $valueline; - $newvalueline =~ s/VALUECONTENT/$value/g; - $newvalueline =~ s/SEPARATORPART/$separatorpart/; - } - else - { - $newvalueline = $langvalueline; - $newvalueline =~ s/VALUECONTENT/$value/; - my $savedlanguage = $oneconfig->{'Key'}; - $newvalueline =~ s/SAVEDLANGUAGE/$savedlanguage/; - } - - # For language dependent values, it is possible, that the property already exist. - # In this case the prop must not be created again and only the value has to be included: - # <prop oor:name="Name"> - # <value xml:lang="de">OpenOffice.org 2.0 Diagramm</value> - # <value xml:lang="en-US">OpenOffice.org 2.0 Chart</value> - # </prop> - - # The key has to be written after the line, containing the complete node - - $insertline = get_node_line_number($nodecount, $oneconfig, $oneconfigfileref); - - if ( $oneconfig->{'ismultilingual'} ) - { - if ( $newpropline eq ${$oneconfigfileref}[$insertline] ) - { - if (!($newvalueline eq ${$oneconfigfileref}[$insertline+1])) # only include, if the value not already exists (example: value="FALSE" for many languages) - { - splice(@{$oneconfigfileref}, $insertline+1, 0, ($newvalueline)); # only the value needs to be added - } - } - else - { - splice(@{$oneconfigfileref}, $insertline, 0, ($newpropline, $newvalueline, $propendline)); - } - } - else - { - splice(@{$oneconfigfileref}, $insertline, 0, ($newpropline, $newvalueline, $propendline)); - } - - return $oneconfigfileref; -} - -########################################################## -# Inserting tabs for better view into configuration file -########################################################## - -sub insert_tabs_into_configfile -{ - my ($configfileref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::insert_tabs_into_configfile : $#{$configfileref}"); } - - my $counter = 0; - - for ( my $i = 0; $i <= $#{$configfileref}; $i++ ) - { - my $line = ${$configfileref}[$i]; - my $linebefore = ${$configfileref}[$i-1]; - - if (( $line =~ /^\s*\<node/ ) || ( $line =~ /^\s*\<prop/ )) - { - if ((!( $linebefore =~ /^\s*\<\/node/ )) && (!( $linebefore =~ /^\s*\<\/prop/ ))) # do not increase after "</node" and after "</prop" - { - $counter++; - } - } - - if ( $line =~ /^\s*\<value/ ) - { - if (!($linebefore =~ /^\s*\<value/ )) # do not increase counter with "<value>" after "<value>" (multilingual configitems) - { - $counter++; - } - } - - if (( $line =~ /^\s*\<\/node\>/ ) || ( $line =~ /^\s*\<\/prop\>/ )) - { - if ((!( $linebefore =~ /^\s*\<node/ )) && (!( $linebefore =~ /^\s*\<prop/ ))) # do not decrease after "<node" and after "<prop" - { - $counter--; - } - } - - if ($counter > 0) - { - for ( my $j = 0; $j < $counter; $j++ ) - { - $line = "\t" . $line; - } - } - - ${$configfileref}[$i] = $line; - } -} - -###################################################################### -# Collecting all different configuration items (Files and Modules) -###################################################################### - -sub collect_all_configuration_items -{ - my ($configurationitemsref, $item) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::collect_all_configuration_items : $#{$configurationitemsref} : $item"); } - - my @allitems = (); - - for ( my $i = 0; $i <= $#{$configurationitemsref}; $i++ ) - { - my $oneconfig = ${$configurationitemsref}[$i]; - - if (! installer::existence::exists_in_array($oneconfig->{$item}, \@allitems)) - { - push(@allitems, $oneconfig->{$item}); - } - } - - return \@allitems; -} - -###################################################################### -# Collecting all module specific configuration items -###################################################################### - -sub get_all_configitems_at_module -{ - my ($moduleid, $configurationitemsref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::get_all_configitems_at_module : $moduleid : $#{$configurationitemsref}"); } - - my @moduleconfigurationitems = (); - - for ( my $i = 0; $i <= $#{$configurationitemsref}; $i++ ) - { - my $oneconfig = ${$configurationitemsref}[$i]; - - if ( $oneconfig->{'ModuleID'} eq $moduleid ) - { - push(@moduleconfigurationitems, $oneconfig); - } - } - - return \@moduleconfigurationitems; -} - -####################################################### -# Saving and zipping the created configurationfile -####################################################### - -sub save_and_zip_configfile -{ - my ($oneconfigfileref, $onefile, $onemodule, $configdir) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::save_and_zip_configfile : $#{$oneconfigfileref} : $onefile : $onemodule : $configdir"); } - - my $savefilename = $onefile; - $savefilename =~ s/\./\_/g; - $savefilename = $savefilename . "_" . $onemodule; - $savefilename = $savefilename . ".xcu"; - my $shortsavefilename = $savefilename; - - $savefilename = $configdir . $installer::globals::separator . $savefilename; - - installer::files::save_file($savefilename, $oneconfigfileref); - - # zipping the configfile - - my $returnvalue = 1; - - my $zipfilename = $shortsavefilename; - $zipfilename =~ s/\.xcu/\.zip/; - - my $currentdir = cwd(); - if ( $installer::globals::iswin ) { $currentdir =~ s/\//\\/g; } - - chdir($configdir); - - my $systemcall = "$installer::globals::zippath -q -m $zipfilename $shortsavefilename"; - $returnvalue = system($systemcall); - - chdir($currentdir); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not zip $savefilename to $zipfilename\n"; - } - else - { - $infoline = "SUCCESS: Zipped file $savefilename to $zipfilename\n"; - } - push( @installer::globals::logfileinfo, $infoline); - - return $zipfilename; -} - -##################################################################### -# Adding the newly created configuration file into the file list -##################################################################### - -sub add_zipfile_into_filelist -{ - my ($zipfilename, $configdir, $filesarrayref, $onemodule) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::add_zipfile_into_filelist: $zipfilename : $configdir : $#{$filesarrayref} : $onemodule"); } - - my $longzipfilename = $configdir . $installer::globals::separator . $zipfilename; - my $gid = "gid_" . $zipfilename; - $gid =~ s/\./\_/g; - - my %configfile = (); - - # Taking the base data from the "gid_File_Lib_Vcl" - - my $vclgid = "gid_File_Lib_Vcl"; - my $vclfile = installer::existence::get_specified_file($filesarrayref, $vclgid); - - # copying all base data - installer::converter::copy_item_object($vclfile, \%configfile); - - # and overriding all new data - $configfile{'ismultilingual'} = 0; - $configfile{'sourcepath'} = $longzipfilename; - $configfile{'Name'} = $zipfilename; - $configfile{'UnixRights'} = "644"; - $configfile{'gid'} = $gid; - $configfile{'Dir'} = "gid_Dir_Share_Uno_Packages"; - $configfile{'destination'} = "share" . $installer::globals::separator . "uno_packages" . $installer::globals::separator . $zipfilename; - $configfile{'modules'} = $onemodule; # assigning the file to the correct module! - - push(@{$filesarrayref}, \%configfile); -} - -####################################################### -# Creating configuration files from configurationitems -####################################################### - -sub create_configuration_files -{ - my ($configurationitemsref, $filesarrayref, $languagestringref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::configuration::create_configuration_files: $#{$configurationitemsref} : $#{$filesarrayref} : $$languagestringref"); } - - installer::logger::include_header_into_logfile("Creating configuration files:"); - - # creating the directory - - my $configdir = installer::systemactions::create_directories("configfiles", $languagestringref); - - $configdir = installer::converter::make_path_conform($configdir); - - # collecting an array of all modules - my $allmodules = collect_all_configuration_items($configurationitemsref, "ModuleID"); - - # iterating over all modules - - for ( my $i = 0; $i <= $#{$allmodules}; $i++ ) - { - my $onemodule = ${$allmodules}[$i]; - - my $moduleconfigitems = get_all_configitems_at_module($onemodule, $configurationitemsref); - - # collecting an array of all "startpath". This are all different files (org.openoffice.Office.Common). - my $allfiles = collect_all_configuration_items($moduleconfigitems, "startpath"); - - # iteration over all files - - for ( my $j = 0; $j <= $#{$allfiles}; $j++ ) - { - my $onefile = ${$allfiles}[$j]; - - my @oneconfigfile = (); - my $oneconfigfileref = \@oneconfigfile; - - my $startblockwritten = 0; - - for ( my $k = 0; $k <= $#{$moduleconfigitems}; $k++ ) - { - my $oneconfig = ${$moduleconfigitems}[$k]; - - my $startpath = $oneconfig->{'startpath'}; - - if ($startpath eq $onefile) - { - if (!($startblockwritten)) # writing some global lines into the xcu file - { - insert_start_block_into_configfile($oneconfigfileref, $oneconfig); - $startblockwritten = 1; - } - - $oneconfigfileref = insert_into_config_file($oneconfig, $oneconfigfileref); - } - } - - insert_end_block_into_configfile($oneconfigfileref); - - # inserting tabs for nice appearance - insert_tabs_into_configfile($oneconfigfileref); - - # saving the configfile - my $zipfilename = save_and_zip_configfile($oneconfigfileref, $onefile, $onemodule, $configdir); - - # adding the zipped configfile to the list of installed files - # Some data are set now, others are taken from the file "soffice.exe" ("soffice.bin") - - add_zipfile_into_filelist($zipfilename, $configdir, $filesarrayref, $onemodule); - } - } - - my $infoline = "\n"; - push( @installer::globals::logfileinfo, $infoline); - -} - -1; diff --git a/solenv/bin/modules/installer/control.pm b/solenv/bin/modules/installer/control.pm deleted file mode 100644 index cda8512fc..000000000 --- a/solenv/bin/modules/installer/control.pm +++ /dev/null @@ -1,719 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::control; - -use Cwd; -use installer::converter; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::pathanalyzer; -use installer::scriptitems; -use installer::systemactions; - -######################################################### -# Function that can be used for additional controls. -# Search happens in $installer::globals::patharray. -######################################################### - -sub check_needed_files_in_path -{ - my ( $filesref ) = @_; - - foreach $onefile ( @{$filesref} ) - { - installer::logger::print_message( "...... searching $onefile ..." ); - - my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$onefile, $installer::globals::patharray , 0); - - if ( $$fileref eq "" ) - { - $error = 1; - installer::logger::print_error( "$onefile not found\n" ); - } - else - { - installer::logger::print_message( "\tFound: $$fileref\n" ); - } - } - - if ( $error ) - { - installer::exiter::exit_program("ERROR: Could not find all needed files in path!", "check_needed_files_in_path"); - } -} - -######################################################### -# Checking the local system -# Checking existence of needed files in include path -######################################################### - -sub check_system_path -{ - # The following files have to be found in the environment variable PATH - # All platforms: zip - # Windows only: "msiinfo.exe", "msidb.exe", "uuidgen.exe", "makecab.exe", "msitran.exe", "expand.exe" for msi database and packaging - - my $onefile; - my $error = 0; - my $pathvariable = $ENV{'PATH'}; - my $local_pathseparator = $installer::globals::pathseparator; - - if( $^O =~ /cygwin/i ) - { # When using cygwin's perl the PATH variable is POSIX style and ... - my $temparrayref = installer::converter::convert_stringlist_into_array_without_newline(\$pathvariable, $local_pathseparator); - foreach $i (0..$#$temparrayref) { - $$temparrayref[$i] = qx{cygpath -m "$$temparrayref[$i]"}; - chomp($$temparrayref[$i]); - } - # has to be converted to DOS style for further use. - $local_pathseparator = ';'; - $pathvariable = join($local_pathseparator, @$temparrayref); - } - my $patharrayref = installer::converter::convert_stringlist_into_array(\$pathvariable, $local_pathseparator); - - $installer::globals::patharray = $patharrayref; - - my @needed_files_in_path = (); - - if (($installer::globals::iswin) && ($installer::globals::iswindowsbuild)) - { - @needed_files_in_path = ("zip.exe", "msiinfo.exe", "msidb.exe", "uuidgen.exe", "makecab.exe", "msitran.exe", "expand.exe"); - } - elsif ($installer::globals::iswin) - { - @needed_files_in_path = ("zip.exe"); - } - else - { - @needed_files_in_path = ("zip"); - } - - foreach $onefile ( @needed_files_in_path ) - { - installer::logger::print_message( "...... searching $onefile ..." ); - - my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$onefile, $patharrayref , 0); - - if ( $$fileref eq "" ) - { - $error = 1; - installer::logger::print_error( "$onefile not found\n" ); - } - else - { - installer::logger::print_message( "\tFound: $$fileref\n" ); - # Saving the absolut path for msitran.exe. This is required for the determination of the checksum. - if ( $onefile eq "msitran.exe" ) { $installer::globals::msitranpath = $$fileref; } - } - } - - if ( $error ) - { - installer::exiter::exit_program("ERROR: Could not find all needed files in path!", "check_system_path"); - } - - # checking for epm, which has to be in the path or in the solver - - if (( $installer::globals::call_epm ) && (!($installer::globals::iswindowsbuild))) - { - my $onefile = "epm"; - my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$onefile, $patharrayref , 0); - if (!( $$fileref eq "" )) - { - $installer::globals::epm_in_path = 1; - - if ( $$fileref =~ /^\s*\.\/epm\s*$/ ) - { - my $currentdir = cwd(); - $$fileref =~ s/\./$currentdir/; - } - - $installer::globals::epm_path = $$fileref; - } - } - - # checking, if upx can be found in path - - if ( $installer::globals::iswindowsbuild ) { $installer::globals::upxfile = "upx.exe"; } - else { $installer::globals::upxfile = "upx"; } - - my $upxfilename = $installer::globals::upxfile; - my $upxfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$upxfilename, $patharrayref , 0); - - if (!( $$upxfileref eq "" )) - { - $installer::globals::upx_in_path = 1; - $installer::globals::upxfile = $$upxfileref; - installer::logger::print_message( "\tFound: $$upxfileref\n" ); - } - -} - -###################################################################### -# Determining the version of file makecab.exe -###################################################################### - -sub get_makecab_version -{ - my $makecabversion = -1; - - my $systemcall = "makecab.exe |"; - my @makecaboutput = (); - - open (CAB, $systemcall); - while (<CAB>) { push(@makecaboutput, $_); } - close (CAB); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::globallogfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - my $versionline = ""; - - for ( my $i = 0; $i <= $#makecaboutput; $i++ ) - { - if ( $makecaboutput[$i] =~ /\bVersion\b/i ) - { - $versionline = $makecaboutput[$i]; - last; - } - } - - $infoline = $versionline; - push( @installer::globals::globallogfileinfo, $infoline); - - if ( $versionline =~ /\bVersion\b\s+(\d+[\d\.]+\d+)\s+/ ) - { - $makecabversion = $1; - } - - # Only using the first number - - if ( $makecabversion =~ /^\s*(\d+?)\D*/ ) - { - $makecabversion = $1; - } - - $infoline = "Using version: " . $makecabversion . "\n"; - push( @installer::globals::globallogfileinfo, $infoline); - } - - return $makecabversion; -} - -###################################################################### -# Checking the version of file makecab.exe -###################################################################### - -sub check_makecab_version -{ - # checking version of makecab.exe - # Now it is guaranteed, that makecab.exe is in the path - - my $do_check = 1; - - my $makecabversion = get_makecab_version(); - - my $infoline = "Tested version: " . $installer::globals::controlledmakecabversion . "\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - if ( $makecabversion < 0 ) { $do_check = 0; } # version could not be determined - - if ( $do_check ) - { - if ( $makecabversion < $installer::globals::controlledmakecabversion ) - { - # warning for OOo, error for inhouse products - if ( $installer::globals::isopensourceproduct ) - { - installer::logger::print_warning("Old version of makecab.exe. Found version: \"$makecabversion\", tested version: \"$installer::globals::controlledmakecabversion\"!\n"); - } - else - { - installer::exiter::exit_program("makecab.exe too old. Found version: \"$makecabversion\", required version: \"$installer::globals::controlledmakecabversion\"!", "check_makecab_version"); - } - } - } - else - { - $infoline = "Warning: No version check of makecab.exe\n"; - push( @installer::globals::globallogfileinfo, $infoline); - } -} - -###################################################################### -# Reading the environment variables for the pathes in ziplist. -# solarpath, solarenvpath, solarcommonpath, os, osdef, pmiscpath -###################################################################### - -sub check_system_environment -{ - my %variables = (); - my $key; - my $error = 0; - - foreach $key ( @installer::globals::environmentvariables ) - { - my $value = ""; - if ( $ENV{$key} ) { $value = $ENV{$key}; } - $variables{$key} = $value; - - if ( $value eq "" ) - { - installer::logger::print_error( "$key not set in environment\n" ); - $error = 1; - } - } - - if ( $error ) - { - installer::exiter::exit_program("ERROR: Environment variable not set!", "check_system_environment"); - } - - return \%variables; -} - -############################################################# -# Controlling the log file at the end of the -# packaging process -############################################################# - -sub check_logfile -{ - my ($logfile) = @_; - - my @errors = (); - my @output = (); - my $contains_error = 0; - - my $ignore_error = 0; - my $make_error_to_warning = 0; - - if (( ! $installer::globals::pro ) && ( $installer::globals::ignore_error_in_logfile )) { $ignore_error = 1; } - - for ( my $i = 0; $i <= $#{$logfile}; $i++ ) - { - my $line = ${$logfile}[$i]; - - # Errors are all errors, but not the Windows installer table "Error.idt" - - my $compareline = $line; - $compareline =~ s/Error\.idt//g; # removing all occurrences of "Error.idt" - $compareline =~ s/Error\.mlf//g; # removing all occurrences of "Error.mlf" - $compareline =~ s/Error\.ulf//g; # removing all occurrences of "Error.ulf" - $compareline =~ s/Error\.idl//g; # removing all occurrences of "Error.idl" - $compareline =~ s/Error\.html//g; # removing all occurrences of "Error.html" - - if ( $compareline =~ /\bError\b/i ) - { - $contains_error = 1; - push(@errors, $line); - - if ( $ignore_error ) - { - $contains_error = 0; - $make_error_to_warning = 1; - } - } - } - - if ($contains_error) - { - my $line = "\n*********************************************************************\n"; - push(@output, $line); - $line = "ERROR: The following errors occurred in packaging process:\n\n"; - push(@output, $line); - - for ( my $i = 0; $i <= $#errors; $i++ ) - { - $line = "$errors[$i]"; - push(@output, $line); - } - - $line = "*********************************************************************\n"; - push(@output, $line); - } - else - { - my $line = ""; - - if ( $make_error_to_warning ) - { - $line = "\n*********************************************************************\n"; - push(@output, $line); - $line = "The following errors in the log file were ignored:\n\n"; - push(@output, $line); - - for ( my $i = 0; $i <= $#errors; $i++ ) - { - $line = "$errors[$i]"; - push(@output, $line); - } - - $line = "*********************************************************************\n"; - push(@output, $line); - } - - $line = "\n***********************************************************\n"; - push(@output, $line); - $line = "Successful packaging process!\n"; - push(@output, $line); - $line = "***********************************************************\n"; - push(@output, $line); - } - - # printing the output file and adding it to the logfile - - installer::logger::include_header_into_logfile("Summary:"); - - my $force = 1; # print this message even in 'quiet' mode - for ( my $i = 0; $i <= $#output; $i++ ) - { - my $line = "$output[$i]"; - installer::logger::print_message( "$line", $force ); - push( @installer::globals::logfileinfo, $line); - push( @installer::globals::errorlogfileinfo, $line); - } - - return $contains_error; -} - -############################################################# -# Determining the ship installation directory -############################################################# - -sub determine_ship_directory -{ - my ($languagesref) = @_; - - if (!( $ENV{'SHIPDRIVE'} )) { installer::exiter::exit_program("ERROR: SHIPDRIVE must be set for updater!", "determine_ship_directory"); } - - my $shipdrive = $ENV{'SHIPDRIVE'}; - - my $languagestring = $$languagesref; - - if (length($languagestring) > $installer::globals::max_lang_length ) - { - my $number_of_languages = installer::systemactions::get_number_of_langs($languagestring); - chomp(my $shorter = `echo $languagestring | md5sum | sed -e "s/ .*//g"`); - my $id = substr($shorter, 0, 8); # taking only the first 8 digits - $languagestring = "lang_" . $number_of_languages . "_id_" . $id; - } - - my $productstring = $installer::globals::product; - my $productsubdir = ""; - - if ( $productstring =~ /^\s*(.+?)\_\_(.+?)\s*$/ ) - { - $productstring = $1; - $productsubdir = $2; - } - - if ( $installer::globals::languagepack ) { $productstring = $productstring . "_languagepack"; } - if ( $installer::globals::helppack ) { $productstring = $productstring . "_helppack"; } - if ( $installer::globals::patch ) { $productstring = $productstring . "_patch"; } - - my $destdir = $shipdrive . $installer::globals::separator . $installer::globals::compiler . - $installer::globals::productextension . $installer::globals::separator . - $productstring . $installer::globals::separator; - - if ( $productsubdir ) { $destdir = $destdir . $productsubdir . $installer::globals::separator; } - - $destdir = $destdir . $installer::globals::installertypedir . $installer::globals::separator . - $installer::globals::build . "_" . $installer::globals::lastminor . "_" . - "native_inprogress-number_" . $languagestring . "\." . $installer::globals::buildid; - - my $infoline = "\nSetting ship directory: $destdir\n"; - push(@installer::globals::globallogfileinfo, $infoline); - - return $destdir; -} - -############################################################# -# Controlling if this is an official RE pack process -############################################################# - -sub check_updatepack -{ - my $shipdrive = ""; - my $filename = ""; - my $infoline = ""; - - if ( $ENV{'UPDATER'} ) # the environment variable UPDATER has to be set - { - $infoline = "\nEnvironment variable UPDATER set\n"; - push(@installer::globals::globallogfileinfo, $infoline); - - # There are no CWSes any more, no environment variable CWS_WORK_STAMP - { - if ( $ENV{'SHIPDRIVE'} ) # the environment variable SHIPDRIVE must be set - { - $shipdrive = $ENV{'SHIPDRIVE'}; - $infoline = "Ship drive defined: $shipdrive\n"; - push(@installer::globals::globallogfileinfo, $infoline); - - if ( -d $shipdrive ) # SHIPDRIVE must be a directory - { - $infoline = "Ship drive exists\n"; - push(@installer::globals::globallogfileinfo, $infoline); - - # try to write into $shipdrive - - $directory = $installer::globals::product . "_" . $installer::globals::compiler . "_" . $installer::globals::buildid . "_" . $installer::globals::languageproducts[0] . "_test_$$"; - $directory =~ s/\,/\_/g; # for the list of languages - $directory =~ s/\-/\_/g; # for en-US, pt-BR, ... - $directory = $shipdrive . $installer::globals::separator . $directory; - - $infoline = "Try to create directory: $directory\n"; - push(@installer::globals::globallogfileinfo, $infoline); - - # saving this directory for later removal - $installer::globals::shiptestdirectory = $directory; - - if ( installer::systemactions::try_to_create_directory($directory)) - { - $infoline = "Write access on Ship drive\n"; - push(@installer::globals::globallogfileinfo, $infoline); - $infoline = "Ship test directory $installer::globals::shiptestdirectory was successfully created\n"; - push(@installer::globals::globallogfileinfo, $infoline); - my $systemcall = "rmdir $directory"; - my $returnvalue = system($systemcall); - - # 5th condition: No local build environment. - # In this case the content of SOLARENV starts with the content of SOL_TMP - - my $solarenv = ""; - my $sol_tmp; - if ( $ENV{'SOLARENV'} ) { $solarenv = $ENV{'SOLARENV'}; } - - $infoline = "Environment variable SOLARENV: $solarenv\n"; - push(@installer::globals::globallogfileinfo, $infoline); - - if ( $ENV{'SOL_TMP'} ) - { - $sol_tmp = $ENV{'SOL_TMP'}; - $infoline = "Environment variable SOL_TMP: $sol_tmp\n"; - } else { - $infoline = "Environment variable SOL_TMP not set\n"; - } - push(@installer::globals::globallogfileinfo, $infoline); - - if ( defined $sol_tmp && ( $solarenv =~ /^\s*\Q$sol_tmp\E/ )) - { - $infoline = "Content of SOLARENV starts with the content of SOL_TMP\: Local environment -\> No Updatepack\n"; - push(@installer::globals::globallogfileinfo, $infoline); - } - else - { - $infoline = "Content of SOLARENV does not start with the content of SOL_TMP: No local environment\n"; - push(@installer::globals::globallogfileinfo, $infoline); - - $installer::globals::updatepack = 1; # That's it - } - - # Additional logging information for the temporary ship directory - - if ( -d $installer::globals::shiptestdirectory ) - { - $infoline = "Ship test directory $installer::globals::shiptestdirectory still exists. Trying removal later again.\n"; - push(@installer::globals::globallogfileinfo, $infoline); - } - else - { - $infoline = "Ship test directory $installer::globals::shiptestdirectory was successfully removed.\n"; - push(@installer::globals::globallogfileinfo, $infoline); - } - } - else - { - $infoline = "No write access on Ship drive\n"; - push(@installer::globals::globallogfileinfo, $infoline); - $infoline = "Failed to create directory $directory\n"; - push(@installer::globals::globallogfileinfo, $infoline); - if ( defined $ENV{'BSCLIENT'} && ( uc $ENV{'BSCLIENT'} eq 'TRUE' ) ) { - installer::exiter::exit_program("ERROR: No write access to SHIPDRIVE allthough BSCLIENT is set.", "check_updatepack"); - } - } - } - else - { - $infoline = "Ship drive not found: No updatepack\n"; - push(@installer::globals::globallogfileinfo, $infoline); - } - } - else - { - $infoline = "Environment variable SHIPDRIVE not set: No updatepack\n"; - push(@installer::globals::globallogfileinfo, $infoline); - } - } - } - - if ( $installer::globals::updatepack ) { $infoline = "Setting updatepack true\n\n"; } - else { $infoline = "\nNo updatepack\n"; } - push(@installer::globals::globallogfileinfo, $infoline); - -} - -############################################################# -# Reading the Windows list file for language encodings -############################################################# - -sub read_encodinglist -{ - my ($patharrayref) = @_; - - my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$installer::globals::encodinglistname, $patharrayref , 0); - - if ( $$fileref eq "" ) { installer::exiter::exit_program("ERROR: Did not find Windows encoding list $installer::globals::encodinglistname!", "read_encodinglist"); } - - my $infoline = "Found encoding file: $$fileref\n"; - push(@installer::globals::globallogfileinfo, $infoline); - - my $encodinglist = installer::files::read_file($$fileref); - - my %msiencoding = (); - my %msilanguage = (); - - # Controlling the encoding list - - for ( my $i = 0; $i <= $#{$encodinglist}; $i++ ) - { - my $line = ${$encodinglist}[$i]; - - if ( $line =~ /^\s*\#/ ) { next; } # this is a comment line - - if ( $line =~ /^(.*?)(\#.*)$/ ) { $line = $1; } # removing comments after "#" - - if ( $line =~ /^\s*([\w-]+)\s*(\d+)\s*(\d+)\s*$/ ) - { - my $onelanguage = $1; - my $codepage = $2; - my $windowslanguage = $3; - - $msiencoding{$onelanguage} = $codepage; - $msilanguage{$onelanguage} = $windowslanguage; - } - else - { - installer::exiter::exit_program("ERROR: Wrong syntax in Windows encoding list $installer::globals::encodinglistname : en-US 1252 1033 !", "read_encodinglist"); - } - } - - $installer::globals::msiencoding = \%msiencoding; - $installer::globals::msilanguage = \%msilanguage; -} - -############################################################# -# Only for Windows and Linux (RPM)there is currently -# a reliable mechanism to register extensions during -# installation process. Therefore it is for all other -# platforms forbidden to install oxt files into that -# directory, in which they are searched for registration. -############################################################# - -sub check_oxtfiles -{ - my ( $filesarray ) = @_; - - for ( my $i = 0; $i <= $#{$filesarray}; $i++ ) - { - my $onefile = ${$filesarray}[$i]; - - if (( $onefile->{'Name'} ) && ( $onefile->{'Dir'} )) - { - if (( $onefile->{'Name'} =~ /\.oxt\s*$/ ) && ( $onefile->{'Dir'} eq $installer::globals::extensioninstalldir )) - { - installer::exiter::exit_program("There is currently only for Linux (RPM) and Windows a reliable mechanism to register extensions during installation.\nPlease remove file \"$onefile->{'gid'}\" from your installation set!\nYou can use \"\#ifdef WNT\" and \"\#ifdef LINUX\" in scp.", "check_oxtfiles"); - } - } - } -} - -############################################################# -# Check if Java is available to create xpd installer -############################################################# - -sub check_java_for_xpd -{ - my ( $allvariables ) = @_; - - if ( ! $installer::globals::solarjavaset ) { $allvariables->{'XPDINSTALLER'} = 0; } -} - -#################################################################### -# Setting global variable "$installer::globals::addchildprojects" -#################################################################### - -sub set_addchildprojects -{ - my ($allvariables) = @_; - - if (( $allvariables->{'JAVAPRODUCT'} ) || - ( $allvariables->{'ADAPRODUCT'} ) || - ( $allvariables->{'UREPRODUCT'} ) || - ( $allvariables->{'ADDREQUIREDPACKAGES'} )) { $installer::globals::addchildprojects = 1; } - - if ( $installer::globals::patch ) - { - $installer::globals::addchildprojects = 0; # no child projects for patches - } - - my $infoline = "Value of \$installer::globals::addchildprojects: $installer::globals::addchildprojects\n"; - push( @installer::globals::globallogfileinfo, $infoline); -} - -####################################################################### -# Setting global variable "$installer::globals::addsystemintegration" -####################################################################### - -sub set_addsystemintegration -{ - my ($allvariables) = @_; - - if ( $allvariables->{'ADDSYSTEMINTEGRATION'} ) { $installer::globals::addsystemintegration = 1; } - - if ( $installer::globals::patch ) { $installer::globals::addsystemintegration = 0; } - if ( $installer::globals::languagepack ) { $installer::globals::addsystemintegration = 0; } - if ( $installer::globals::helppack ) { $installer::globals::addsystemintegration = 0; } - if (( $installer::globals::packageformat eq "native" ) || ( $installer::globals::packageformat eq "portable" )) { $installer::globals::addsystemintegration = 0; } - - my $infoline = "Value of \$installer::globals::addsystemintegration: $installer::globals::addsystemintegration\n"; - push( @installer::globals::globallogfileinfo, $infoline); -} - -1; diff --git a/solenv/bin/modules/installer/converter.pm b/solenv/bin/modules/installer/converter.pm deleted file mode 100644 index ea95fb856..000000000 --- a/solenv/bin/modules/installer/converter.pm +++ /dev/null @@ -1,265 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::converter; - -use installer::globals; - -############################# -# Converter -############################# - -sub convert_array_to_hash -{ - my ($arrayref) = @_; - - my %newhash = (); - - for (@{$arrayref}) - { - next unless /^\s*([\w-]+?)\s+(.*?)\s*$/; - $newhash{$1} = $2; - } - - return \%newhash; -} - -sub convert_hash_into_array -{ - my ($hashref) = @_; - - return [map { "$_ = $hashref->{$_}\n" } keys %{$hashref}]; -} - -############################################################################# -# Converting a string list with separator $listseparator -# into an array -############################################################################# - -sub convert_stringlist_into_array -{ - my ( $includestringref, $listseparator ) = @_; - - return [map "$_\n", split /\Q$listseparator\E\s*/, ${$includestringref}]; -} - -############################################################################# -# Converting a string list with separator $listseparator -# into an array -############################################################################# - -sub convert_stringlist_into_array_without_newline -{ - my ( $includestringref, $listseparator ) = @_; - - return [split /\Q$listseparator\E\s*/, ${$includestringref}]; -} - -############################################################################# -# Converting a string list with separator $listseparator -# into a hash with values 1. -############################################################################# - -sub convert_stringlist_into_hash -{ - my ( $includestringref, $listseparator ) = @_; - - return {map {$_, 1} split /\Q$listseparator\E\s*/, ${$includestringref}}; -} - -############################################################################# -# Converting a string list with separator $listseparator -# into an array -############################################################################# - -sub convert_whitespace_stringlist_into_array -{ - my ( $includestringref ) = @_; - - my $tmp = ${$includestringref}; - $tmp = s/^\s+//; - $tmp = s/\s+$//; - - return [map "$_\n", split /\s+/, $tmp]; -} - -############################################################################# -# Converting an array into a comma separated string -############################################################################# - -sub convert_array_to_comma_separated_string -{ - my ( $arrayref ) = @_; - - my $newstring; - for (@{$arrayref}) { - my $tmp = $_; - $tmp =~ s/\s+$//; - $newstring .= "$tmp,"; - } - $newstring =~ s/\,$//; - - return $newstring; -} - -############################################################################# -# Converting an array into a space separated string -############################################################################# - -sub convert_array_to_space_separated_string -{ - my ( $arrayref ) = @_; - - my $newstring; - for (@{$arrayref}) { - my $tmp = $_; - $tmp =~ s/\s+$//; - $newstring .= "$tmp "; - } - $newstring =~ s/ $//; - - return $newstring; -} - -############################################################################# -# The file name contains for some files "/". If this programs runs on -# a windows platform, this has to be converted to "\". -############################################################################# - -sub convert_slash_to_backslash -{ - my ($filesarrayref) = @_; - - for my $onefile (@{$filesarrayref}) - { - if ( $onefile->{'Name'} ) { $onefile->{'Name'} =~ s/\//\\/g; } - } -} - -############################################################################ -# Creating a copy of an existing file object -# No converter -############################################################################ - -sub copy_item_object -{ - my ($olditemhashref, $newitemhashref) = @_; - - $newitemhashref = {%{$olditemhashref}}; -} - -################################################################# -# Windows pathes must not contain the following structure: -# c:\dirA\dirB\..\dirC -# This has to be exchanged to -# c:\dirA\dirC -################################################################# - -sub make_path_conform -{ - my ( $path ) = @_; - my $s = $installer::globals::separator; - - while ($path =~ s/[^\.\Q$s\E]+?\Q$s\E\.\.(?:\Q$s\E|$)//g) {} - - return $path; -} - -################################################################# -# Copying an item collector -# A reference to an array consisting of references to hashes. -################################################################# - -sub copy_collector -{ - return [map { {%{$_}} } @{$_[0]}]; -} - -################################################################# -# Combining two arrays, first wins -################################################################# - -sub combine_arrays_from_references_first_win -{ - my ( $arrayref1, $arrayref2 ) = @_; - - my $hashref1 = convert_array_to_hash($arrayref1); - my $hashref2 = convert_array_to_hash($arrayref2); - - # add key-value pairs from hash1 to hash2 (overwrites existing keys) - @{$hashref2}{keys %{$hashref1}} = values %{$hashref1}; - - return [map { "$_ $hashref2->{$_}\n" } keys %{$hashref2}]; -} - -################################################################# -# Returning the current ending number of a directory -################################################################# - -sub get_number_from_directory -{ - my ( $directory ) = @_; - - my $number = 0; - - if ( $directory =~ /\_(\d+)\s*$/ ) - { - $number = $1; - } - - return $number; -} - -################################################################# -# Replacing separators, that are included into quotes -################################################################# - -sub replace_masked_separator -{ - my ($string, $separator, $replacementstring) = @_; - - $string =~ s/\\\Q$separator\E/$replacementstring/g; - - return $string; -} - -################################################################# -# Resolving separators, that were replaced -# in function mask_separator_in_quotes -################################################################# - -sub resolve_masked_separator -{ - my ($arrayref, $separator, $replacementstring) = @_; - - for (@{$arrayref}) - { - s/$replacementstring/$separator/g; - } -} - -1; diff --git a/solenv/bin/modules/installer/copyproject.pm b/solenv/bin/modules/installer/copyproject.pm deleted file mode 100644 index 0a310096c..000000000 --- a/solenv/bin/modules/installer/copyproject.pm +++ /dev/null @@ -1,111 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::copyproject; - -use installer::control; -use installer::converter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::systemactions; -use installer::worker; - -#################################################### -# Including header files into the logfile -#################################################### - -sub copy_project -{ - my ( $filesref, $scpactionsref, $loggingdir, $languagestringref, $shipinstalldir, $allsettingsarrayref ) = @_; - - # Creating directories - - installer::logger::include_header_into_logfile("Creating installation directory"); - - my $current_install_number = ""; - - my $installdir = installer::worker::create_installation_directory($shipinstalldir, $languagestringref, \$current_install_number); - - my $installlogdir = installer::systemactions::create_directory_next_to_directory($installdir, "log"); - - # Copy files and ScpActions - - installer::logger::include_header_into_logfile("Copying files:"); - - # copy Files - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - - my $source = $onefile->{'sourcepath'}; - my $destination = $installdir . $installer::globals::separator . $onefile->{'Name'}; - - installer::systemactions::copy_one_file($source, $destination); - - if ( $onefile->{'UnixRights'} ) - { - chmod oct($onefile->{'UnixRights'}), $destination; - } - elsif ( $destination =~ /install\s*$/ ) - { - chmod 0775, $destination; - } - } - - # copy ScpActions - - for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ ) - { - my $onefile = ${$scpactionsref}[$i]; - - my $source = $onefile->{'sourcepath'}; - my $destination = $installdir . $installer::globals::separator . $onefile->{'DestinationName'}; - - installer::systemactions::copy_one_file($source, $destination); - - if ( $onefile->{'UnixRights'} ) - { - chmod oct($onefile->{'UnixRights'}), $destination; - } - elsif ( $destination =~ /install\s*$/ ) - { - chmod 0775, $destination; - } - } - - # Analyzing the log file - - installer::worker::analyze_and_save_logfile($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); - - # That's all - - exit(0); -} - -1; diff --git a/solenv/bin/modules/installer/download.pm b/solenv/bin/modules/installer/download.pm deleted file mode 100644 index 11eb869a9..000000000 --- a/solenv/bin/modules/installer/download.pm +++ /dev/null @@ -1,2067 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::download; - -use File::Spec; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::remover; -use installer::systemactions; - -BEGIN { # This is needed so that cygwin's perl evaluates ACLs - # (needed for correctly evaluating the -x test.) - if( $^O =~ /cygwin/i ) { - require filetest; import filetest "access"; - } -} - -################################################################## -# Including the lowercase product name into the script template -################################################################## - -sub put_productname_into_script -{ - my ($scriptfile, $variableshashref) = @_; - - my $productname = $variableshashref->{'PRODUCTNAME'}; - $productname = lc($productname); - $productname =~ s/\.//g; # openoffice.org -> openofficeorg - $productname =~ s/\s*//g; - - my $infoline = "Adding productname $productname into download shell script\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/PRODUCTNAMEPLACEHOLDER/$productname/; - } -} - -######################################################### -# Including the linenumber into the script template -######################################################### - -sub put_linenumber_into_script -{ - my ( $scriptfile ) = @_; - - my $linenumber = $#{$scriptfile} + 2; - - my $infoline = "Adding linenumber $linenumber into download shell script\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/LINENUMBERPLACEHOLDER/$linenumber/; - } -} - -######################################################### -# Determining the name of the new scriptfile -######################################################### - -sub determine_scriptfile_name -{ - my ( $filename ) = @_; - - $installer::globals::downloadfileextension = ".sh"; - $filename = $filename . $installer::globals::downloadfileextension; - $installer::globals::downloadfilename = $filename; - - my $infoline = "Setting download shell script file name to $filename\n"; - push( @installer::globals::logfileinfo, $infoline); - - return $filename; -} - -######################################################### -# Saving the script file in the installation directory -######################################################### - -sub save_script_file -{ - my ($directory, $newscriptfilename, $scriptfile) = @_; - - $newscriptfilename = $directory . $installer::globals::separator . $newscriptfilename; - installer::files::save_file($newscriptfilename, $scriptfile); - - my $infoline = "Saving script file $newscriptfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( ! $installer::globals::iswindowsbuild ) - { - chmod 0775, $newscriptfilename; - } - - return $newscriptfilename; -} - -######################################################### -# Including checksum and size into script file -######################################################### - -sub put_checksum_and_size_into_script -{ - my ($scriptfile, $sumout) = @_; - - my $checksum = ""; - my $size = ""; - - if ( $sumout =~ /^\s*(\d+)\s+(\d+)\s*$/ ) - { - $checksum = $1; - $size = $2; - } - else - { - installer::exiter::exit_program("ERROR: Incorrect return value from /usr/bin/sum: $sumout", "put_checksum_and_size_into_script"); - } - - my $infoline = "Adding checksum $checksum and size $size into download shell script\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/CHECKSUMPLACEHOLDER/$checksum/; - ${$scriptfile}[$i] =~ s/DISCSPACEPLACEHOLDER/$size/; - } - -} - -######################################################### -# Calling md5sum -######################################################### - -sub call_md5sum -{ - my ($filename) = @_; - - $md5sumfile = "/usr/bin/md5sum"; - - if ( ! -f $md5sumfile ) { installer::exiter::exit_program("ERROR: No file /usr/bin/md5sum", "call_md5sum"); } - - my $systemcall = "$md5sumfile $filename |"; - - my $md5sumoutput = ""; - - open (SUM, "$systemcall"); - $md5sumoutput = <SUM>; - close (SUM); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return $md5sumoutput; -} - -######################################################### -# Calling md5sum -######################################################### - -sub get_md5sum -{ - ($md5sumoutput) = @_; - - my $md5sum; - - if ( $md5sumoutput =~ /^\s*(\w+?)\s+/ ) - { - $md5sum = $1; - } - else - { - installer::exiter::exit_program("ERROR: Incorrect return value from /usr/bin/md5sum: $md5sumoutput", "get_md5sum"); - } - - my $infoline = "Setting md5sum: $md5sum\n"; - push( @installer::globals::logfileinfo, $infoline); - - return $md5sum; -} - -######################################################### -# Determining checksum and size of tar file -######################################################### - -sub call_sum -{ - my ($filename, $getuidlibrary) = @_; - - my $systemcall = "/usr/bin/sum $filename |"; - - my $sumoutput = ""; - - open (SUM, "$systemcall"); - $sumoutput = <SUM>; - close (SUM); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - $sumoutput =~ s/\s+$filename\s$//; - return $sumoutput; -} - -######################################################### -# Searching for the getuid.so in the solver -######################################################### - -sub get_path_for_library -{ - my ($includepatharrayref) = @_; - - my $getuidlibraryname = "getuid.so"; - - my $getuidlibraryref = ""; - - if ( $installer::globals::include_pathes_read ) - { - $getuidlibraryref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$getuidlibraryname, $includepatharrayref, 0); - } - else - { - $getuidlibraryref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$getuidlibraryname, $includepatharrayref, 0); - } - - if ($$getuidlibraryref eq "") { installer::exiter::exit_program("ERROR: Could not find $getuidlibraryname!", "get_path_for_library"); } - - return $$getuidlibraryref; -} - -######################################################### -# Include the tar file into the script -######################################################### - -sub include_tar_into_script -{ - my ($scriptfile, $temporary_tarfile) = @_; - - my $systemcall = "cat $temporary_tarfile >> $scriptfile && rm $temporary_tarfile"; - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - return $returnvalue; -} - -######################################################### -# Create a tar file from the binary package -######################################################### - -sub tar_package -{ - my ( $installdir, $tarfilename, $getuidlibrary) = @_; - - my $ldpreloadstring = ""; - if ( $getuidlibrary ne "" ) { $ldpreloadstring = "LD_PRELOAD=" . $getuidlibrary; } - - my $systemcall = "cd $installdir; $ldpreloadstring tar -cf - * > $tarfilename"; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - chmod 0775, $tarfilename; - - return ( -s $tarfilename ); -} - -######################################################### -# Creating a tar.gz file -######################################################### - -sub create_tar_gz_file_from_package -{ - my ($installdir, $getuidlibrary) = @_; - - my $infoline = ""; - my $alldirs = installer::systemactions::get_all_directories($installdir); - my $onedir = ${$alldirs}[0]; - $installdir = $onedir; - - my $allfiles = installer::systemactions::get_all_files_from_one_directory($installdir); - - for ( my $i = 0; $i <= $#{$allfiles}; $i++ ) - { - my $onefile = ${$allfiles}[$i]; - my $systemcall = "cd $installdir; rm $onefile"; - my $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - $alldirs = installer::systemactions::get_all_directories($installdir); - $packagename = ${$alldirs}[0]; # only taking the first Solaris package - if ( $packagename eq "" ) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); } - - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$packagename); - - $installer::globals::downloadfileextension = ".tar.gz"; - my $targzname = $packagename . $installer::globals::downloadfileextension; - $installer::globals::downloadfilename = $targzname; - my $ldpreloadstring = ""; - if ( $getuidlibrary ne "" ) { $ldpreloadstring = "LD_PRELOAD=" . $getuidlibrary; } - - $systemcall = "cd $installdir; $ldpreloadstring tar -cf - $packagename | gzip > $targzname"; - print "... $systemcall ...\n"; - - my $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -######################################################### -# Setting type of installation -######################################################### - -sub get_installation_type -{ - my $type = ""; - - if ( $installer::globals::languagepack ) { $type = "langpack"; } - elsif ( $installer::globals::helppack ) { $type = "helppack"; } - else { $type = "install"; } - - return $type; -} - -######################################################### -# Setting installation languages -######################################################### - -sub get_downloadname_language -{ - my ($languagestringref) = @_; - - my $languages = $$languagestringref; - - if ( $installer::globals::added_english ) - { - $languages =~ s/en-US_//; - $languages =~ s/_en-US//; - } - - if ( length ($languages) > $installer::globals::max_lang_length ) - { - $languages = 'multi'; - } - - return $languages; -} - -######################################################### -# Setting download name -######################################################### - -sub get_downloadname_productname -{ - my ($allvariables) = @_; - - my $start = "LibO"; - - if ( $allvariables->{'PRODUCTNAME'} eq "LibreOffice" ) { $start = "LibO"; } - - if ( $allvariables->{'PRODUCTNAME'} eq "LibO-dev" ) { $start = "LibO-Dev"; } - - if (( $allvariables->{'PRODUCTNAME'} eq "LibreOffice" ) && ( $allvariables->{'POSTVERSIONEXTENSION'} eq "SDK" )) { $start = "LibO-SDK"; } - - if (( $allvariables->{'PRODUCTNAME'} eq "LibO-dev" ) && ( $allvariables->{'POSTVERSIONEXTENSION'} eq "SDK" )) { $start = "LibO-Dev-SDK"; } - - if ( $allvariables->{'PRODUCTNAME'} eq "URE" ) { $start = "LibO-URE"; } - - if ( $allvariables->{'PRODUCTNAME'} eq "OxygenOffice" ) { $start = "OOOP"; } - - - - return $start; -} - -######################################################### -# Setting download version -######################################################### - -sub get_download_version -{ - my ($allvariables) = @_; - - my $version = ""; - - my $devproduct = 0; - if (( $allvariables->{'DEVELOPMENTPRODUCT'} ) && ( $allvariables->{'DEVELOPMENTPRODUCT'} == 1 )) { $devproduct = 1; } - - if ( $devproduct ) # use "DEV300m75" - { - my $source = uc($installer::globals::build); # DEV300 - my $localminor = ""; - if ( $installer::globals::minor ne "" ) { $localminor = $installer::globals::minor; } - else { $localminor = $installer::globals::lastminor; } - $version = $source . $localminor; - } - else # use 3.2.0rc1 - { - $version = $allvariables->{'PRODUCTVERSION'}; - if (( $allvariables->{'ABOUTBOXPRODUCTVERSION'} ) && ( $allvariables->{'ABOUTBOXPRODUCTVERSION'} ne "" )) { $version = $allvariables->{'ABOUTBOXPRODUCTVERSION'}; } - if (( $allvariables->{'SHORT_PRODUCTEXTENSION'} ) && ( $allvariables->{'SHORT_PRODUCTEXTENSION'} ne "" )) { $version = $version . $allvariables->{'SHORT_PRODUCTEXTENSION'}; } - } - - return $version; -} - -############################################################### -# Set date string, format: yymmdd -############################################################### - -sub set_date_string -{ - my ($allvariables) = @_; - - my $datestring = ""; - - my $devproduct = 0; - if (( $allvariables->{'DEVELOPMENTPRODUCT'} ) && ( $allvariables->{'DEVELOPMENTPRODUCT'} == 1 )) { $devproduct = 1; } - - my $releasebuild = 1; - if (( $allvariables->{'SHORT_PRODUCTEXTENSION'} ) && ( $allvariables->{'SHORT_PRODUCTEXTENSION'} ne "" )) { $releasebuild = 0; } - - if (( ! $devproduct ) && ( ! $releasebuild )) - { - my @timearray = localtime(time); - - my $day = $timearray[3]; - my $month = $timearray[4] + 1; - my $year = $timearray[5] + 1900; - - if ( $month < 10 ) { $month = "0" . $month; } - if ( $day < 10 ) { $day = "0" . $day; } - - $datestring = $year . $month . $day; - } - - return $datestring; -} - -################################################################# -# Setting the platform name for download -################################################################# - -sub get_download_platformname -{ - my $platformname = ""; - - if ( $installer::globals::islinuxbuild ) - { - $platformname = "Linux"; - } - elsif ( $installer::globals::issolarisbuild ) - { - $platformname = "Solaris"; - } - elsif ( $installer::globals::iswindowsbuild ) - { - $platformname = "Win"; - } - elsif ( $installer::globals::isfreebsdbuild ) - { - $platformname = "FreeBSD"; - } - elsif ( $installer::globals::ismacbuild ) - { - $platformname = "MacOS"; - } - else - { - $platformname = $installer::globals::compiler; - } - - return $platformname; -} - -######################################################### -# Setting the architecture for the download name -######################################################### - -sub get_download_architecture -{ - my $arch = ""; - - if ( $installer::globals::compiler =~ /unxlngi/ ) - { - $arch = "x86"; - } - elsif ( $installer::globals::compiler =~ /unxlngppc/ ) - { - $arch = "PPC"; - } - elsif ( $installer::globals::compiler =~ /unxlngx/ ) - { - $arch = "x86-64"; - } - elsif ( $installer::globals::issolarissparcbuild ) - { - $arch = "Sparc"; - } - elsif ( $installer::globals::issolarisx86build ) - { - $arch = "x86"; - } - elsif ( $installer::globals::iswindowsbuild ) - { - $arch = "x86"; - } - elsif ( $installer::globals::compiler =~ /^unxmacxi/ ) - { - $arch = "x86"; - } - elsif ( $installer::globals::compiler =~ /^unxmacxp/ ) - { - $arch = "PPC"; - } - - return $arch; -} - -######################################################### -# Setting the installation type for the download name -######################################################### - -sub get_install_type -{ - my ($allvariables) = @_; - - my $type = ""; - - if ( $installer::globals::languagepack ) - { - $type = "langpack"; - - if ( $installer::globals::isrpmbuild ) - { - $type = $type . "-rpm"; - } - - if ( $installer::globals::isdebbuild ) - { - $type = $type . "-deb"; - } - - if ( $installer::globals::packageformat eq "archive" ) - { - $type = $type . "-arc"; - } - } - elsif ( $installer::globals::helppack ) - { - $type = "helppack"; - - if ( $installer::globals::isrpmbuild ) - { - $type = $type . "-rpm"; - } - - if ( $installer::globals::isdebbuild ) - { - $type = $type . "-deb"; - } - - if ( $installer::globals::packageformat eq "archive" ) - { - $type = $type . "-arc"; - } - } - else - { - $type = "install"; - - if ( $installer::globals::isrpmbuild ) - { - $type = $type . "-rpm"; - } - - if ( $installer::globals::isdebbuild ) - { - $type = $type . "-deb"; - } - - if ( $installer::globals::packageformat eq "archive" ) - { - $type = $type . "-arc"; - } - - if (( $allvariables->{'WITHJREPRODUCT'} ) && ( $allvariables->{'WITHJREPRODUCT'} == 1 )) - { - $type = $type . "-wJRE"; - } - - } - - return $type; -} - -######################################################### -# Setting installation addons -######################################################### - -sub get_downloadname_addon -{ - my $addon = ""; - - if ( $installer::globals::isdebbuild ) { $addon = $addon . "_deb"; } - - if ( $installer::globals::product =~ /_wJRE\s*$/ ) { $addon = "_wJRE"; } - - return $addon; -} - -######################################################### -# Looking for versionstring in version.info -# This has to be the only content of this file. -######################################################### - -sub get_versionstring -{ - my ( $versionfile ) = @_; - - my $versionstring = ""; - - for ( my $i = 0; $i <= $#{$versionfile}; $i++ ) - { - my $oneline = ${$versionfile}[$i]; - - if ( $oneline =~ /^\s*\#/ ) { next; } # comment line - if ( $oneline =~ /^\s*\"\s*(.*?)\s*\"\s*$/ ) - { - $versionstring = $1; - last; - } - } - - return $versionstring; -} - -######################################################### -# Returning the current product version -# This has to be defined in file "version.info" -# in directory $installer::globals::ooouploaddir -######################################################### - -sub get_current_version -{ - my $infoline = ""; - my $versionstring = ""; - my $filename = "version.info"; - - if ( -f $filename ) - { - $infoline = "File $filename exists. Trying to find current version.\n"; - push( @installer::globals::logfileinfo, $infoline); - my $versionfile = installer::files::read_file($filename); - $versionstring = get_versionstring($versionfile); - $infoline = "Setting version string: $versionstring\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "File $filename does not exist. No version setting in download file name.\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - $installer::globals::oooversionstring = $versionstring; - - return $versionstring; -} - -############################################################################################### -# Setting the download file name -# Syntax: -# (PRODUCTNAME)_(VERSION)_(OS)_(ARCH)_(INSTALLTYPE)_(LANGUAGE).(FILEEXTENSION) -############################################################################################### - -sub set_download_filename -{ - my ($languagestringref, $allvariables) = @_; - - my $start = get_downloadname_productname($allvariables); - my $versionstring = get_download_version($allvariables); - my $platform = get_download_platformname(); - my $architecture = get_download_architecture(); - my $type = get_install_type($allvariables); - my $language = get_downloadname_language($languagestringref); - - # Setting the extension happens automatically - - my $filename = $start . "_" . $versionstring . "_" . "_" . $platform . "_" . $architecture . "_" . $type . "_" . $language; - - $filename =~ s/\_\_/\_/g; # necessary, if $versionstring or $platform or $language are empty - $filename =~ s/\_\s*$//; # necessary, if $language and $addon are empty - - $installer::globals::ooodownloadfilename = $filename; - - return $filename; -} - -######################################################### -# Creating a tar.gz file -######################################################### - -sub create_tar_gz_file_from_directory -{ - my ($installdir, $getuidlibrary, $downloaddir, $downloadfilename) = @_; - - my $infoline = ""; - - my $packdir = $installdir; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$packdir); - my $changedir = $installdir; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$changedir); - - my $ldpreloadstring = ""; - if ( $getuidlibrary ne "" ) { $ldpreloadstring = "LD_PRELOAD=" . $getuidlibrary; } - - $installer::globals::downloadfileextension = ".tar.gz"; - $installer::globals::downloadfilename = $downloadfilename . $installer::globals::downloadfileextension; - my $targzname = $downloaddir . $installer::globals::separator . $installer::globals::downloadfilename; - - $systemcall = "cd $changedir; $ldpreloadstring tar -cf - $packdir | gzip > $targzname"; - - my $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return $targzname; -} - -######################################################### -# Setting the variables in the download name -######################################################### - -sub resolve_variables_in_downloadname -{ - my ($allvariables, $downloadname, $languagestringref) = @_; - - # Typical name: soa-{productversion}-{extension}-bin-{os}-{languages} - - my $productversion = ""; - if ( $allvariables->{'PRODUCTVERSION'} ) { $productversion = $allvariables->{'PRODUCTVERSION'}; } - $downloadname =~ s/\{productversion\}/$productversion/; - - my $ppackageversion = ""; - if ( $allvariables->{'PACKAGEVERSION'} ) { $packageversion = $allvariables->{'PACKAGEVERSION'}; } - $downloadname =~ s/\{packageversion\}/$packageversion/; - - my $extension = ""; - if ( $allvariables->{'SHORT_PRODUCTEXTENSION'} ) { $extension = $allvariables->{'SHORT_PRODUCTEXTENSION'}; } - $extension = lc($extension); - $downloadname =~ s/\{extension\}/$extension/; - - my $os = ""; - if ( $installer::globals::iswindowsbuild ) { $os = "windows"; } - elsif ( $installer::globals::issolarissparcbuild ) { $os = "solsparc"; } - elsif ( $installer::globals::issolarisx86build ) { $os = "solia"; } - elsif ( $installer::globals::islinuxbuild ) { $os = "linux"; } - elsif ( $installer::globals::compiler =~ /unxmacxi/ ) { $os = "macosxi"; } - elsif ( $installer::globals::compiler =~ /unxmacxp/ ) { $os = "macosxp"; } - else { $os = ""; } - $downloadname =~ s/\{os\}/$os/; - - my $languages = $$languagestringref; - $downloadname =~ s/\{languages\}/$languages/; - - $downloadname =~ s/\-\-\-/\-/g; - $downloadname =~ s/\-\-/\-/g; - $downloadname =~ s/\-\s*$//; - - return $downloadname; -} - -################################################################## -# Windows: Replacing one placeholder with the specified value -################################################################## - -sub replace_one_variable -{ - my ($templatefile, $placeholder, $value) = @_; - - my $infoline = "Replacing $placeholder by $value in nsi file\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$templatefile}; $i++ ) - { - ${$templatefile}[$i] =~ s/$placeholder/$value/g; - } - -} - -######################################################################################## -# Converting a string to a unicode string -######################################################################################## - -sub convert_to_unicode -{ - my ($string) = @_; - - my $unicodestring = ""; - - my $stringlength = length($string); - - for ( my $i = 0; $i < $stringlength; $i++ ) - { - $unicodestring = $unicodestring . substr($string, $i, 1); - $unicodestring = $unicodestring . chr(0); - } - - return $unicodestring; -} - -################################################################## -# Windows: Setting nsis version is necessary because of small -# changes in nsis from version 2.0.4 to 2.3.1 -################################################################## - -sub set_nsis_version -{ - my ($nshfile) = @_; - - my $searchstring = "\$\{LangFileString\}"; # occurs only in nsis 2.3.1 or similar - - for ( my $i = 0; $i <= $#{$nshfile}; $i++ ) - { - if ( ${$nshfile}[$i] =~ /\Q$searchstring\E/ ) - { - # this is nsis 2.3.1 or similar - $installer::globals::nsis231 = 1; - $installer::globals::unicodensis = 0; - last; - } - } - - # checking unicode version - $searchstring = convert_to_unicode($searchstring); - - for ( my $i = 0; $i <= $#{$nshfile}; $i++ ) - { - if ( ${$nshfile}[$i] =~ /\Q$searchstring\E/ ) - { - # this is nsis 2.3.1 or similar - $installer::globals::nsis231 = 1; - $installer::globals::unicodensis = 1; - last; - } - } - - if ( ! $installer::globals::nsis231 ) { $installer::globals::nsis204 = 1; } -} - -################################################################## -# Windows: Including the product name into nsi template -################################################################## - -sub put_windows_productname_into_template -{ - my ($templatefile, $variableshashref) = @_; - - my $productname = $variableshashref->{'PRODUCTNAME'}; - $productname =~ s/\.//g; # OpenOffice.org -> OpenOfficeorg - - replace_one_variable($templatefile, "PRODUCTNAMEPLACEHOLDER", $productname); -} - -################################################################## -# Windows: Substituting the path to a file into the nsi template -################################################################## - -sub substitute_path_into_template -{ - my ($templatefile, $includepatharrayref, $allvariables, $var, $subst) = @_; - - if ( ! $allvariables->{$var} ) { $var =~ s/_.*$//; } # _BR suffix ? - if ( ! $allvariables->{$var} ) { installer::exiter::exit_program("ERROR: $var not defined in product definition!", "substitute_path_into_template"); } - my $filename = $allvariables->{$var}; - - my $completefilenameref = ""; - - if ( $installer::globals::include_pathes_read ) - { - $completefilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$filename, $includepatharrayref, 0); - } - else - { - $completefilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$filename, $includepatharrayref, 0); - } - - if ($$completefilenameref eq "") { installer::exiter::exit_program("ERROR: Could not find download file $filename!", "substitute_path_into_template"); } - - if ( $^O =~ /cygwin/i ) { $$completefilenameref =~ s/\//\\/g; } - - replace_one_variable($templatefile, $subst, $$completefilenameref); -} - -################################################################## -# Windows: substitute a variable into the nsi template -################################################################## -sub substitute_variable_into_template($$$$) -{ - my ($templatefile, $variableshashref, $varname, $subst) = @_; - - my $var = ""; - if ( $variableshashref->{$varname} ) { $var = $variableshashref->{$varname}; } - - replace_one_variable($templatefile, $subst, $var); -} - -################################################################## -# Windows: Including the product version into nsi template -################################################################## - -sub put_windows_productpath_into_template -{ - my ($templatefile, $variableshashref, $languagestringref, $localnsisdir) = @_; - - my $productpath = $variableshashref->{'PROPERTYTABLEPRODUCTNAME'}; - - if (length($locallangs) > $installer::globals::max_lang_length) { $locallangs = "multi lingual"; } - - if ( ! $installer::globals::languagepack || ! $installer::globals::helppack ) { $productpath = $productpath . " (" . sprintf('%x', time()) . ")"; } - - replace_one_variable($templatefile, "PRODUCTPATHPLACEHOLDER", $productpath); -} - -################################################################## -# Windows: Including download file name into nsi template -################################################################## - -sub put_outputfilename_into_template -{ - my ($templatefile, $downloadname) = @_; - - $installer::globals::downloadfileextension = ".exe"; - $downloadname = $downloadname . $installer::globals::downloadfileextension; - $installer::globals::downloadfilename = $downloadname; - - replace_one_variable($templatefile, "DOWNLOADNAMEPLACEHOLDER", $downloadname); -} - -################################################################## -# Windows: Generating the file list in nsi file format -################################################################## - -sub get_file_list -{ - my ( $basedir ) = @_; - - my @filelist = (); - - my $alldirs = installer::systemactions::get_all_directories($basedir); - unshift(@{$alldirs}, $basedir); # $basedir is the first directory in $alldirs - - for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) - { - my $onedir = ${$alldirs}[$i]; - - # Syntax: - # SetOutPath "$INSTDIR" - - my $relativedir = $onedir; - $relativedir =~ s/\Q$basedir\E//; - - my $oneline = " " . "SetOutPath" . " " . "\"\$INSTDIR" . $relativedir . "\"" . "\n"; - - if ( $^O =~ /cygwin/i ) { - $oneline =~ s/\//\\/g; - } - push(@filelist, $oneline); - - # Collecting all files in the specific directory - - my $files = installer::systemactions::get_all_files_from_one_directory($onedir); - - for ( my $j = 0; $j <= $#{$files}; $j++ ) - { - my $onefile = ${$files}[$j]; - - my $fileline = " " . "File" . " " . "\"" . $onefile . "\"" . "\n"; - - if ( $^O =~ /cygwin/i ) { - $fileline =~ s/\//\\/g; - } - push(@filelist, $fileline); - } - } - - return \@filelist; -} - -################################################################## -# Windows: Including list of all files into nsi template -################################################################## - -sub put_filelist_into_template -{ - my ($templatefile, $installationdir) = @_; - - my $filelist = get_file_list($installationdir); - - my $filestring = ""; - - for ( my $i = 0; $i <= $#{$filelist}; $i++ ) - { - $filestring = $filestring . ${$filelist}[$i]; - } - - $filestring =~ s/\s*$//; - - replace_one_variable($templatefile, "ALLFILESPLACEHOLDER", $filestring); -} - -################################################################## -# Windows: NSIS uses specific language names -################################################################## - -sub nsis_language_converter -{ - my ($language) = @_; - - my $nsislanguage = ""; - - # Assign language used by NSIS. - # The files "$nsislanguage.nsh" and "$nsislanguage.nlf" - # are needed in the NSIS environment. - # Directory: <NSIS-Dir>/Contrib/Language files - if ( $language eq "en-US" ) { $nsislanguage = "English"; } - elsif ( $language eq "sq" ) { $nsislanguage = "Albanian"; } - elsif ( $language eq "ar" ) { $nsislanguage = "Arabic"; } - elsif ( $language eq "bg" ) { $nsislanguage = "Bulgarian"; } - elsif ( $language eq "ca" ) { $nsislanguage = "Catalan"; } - elsif ( $language eq "hr" ) { $nsislanguage = "Croatian"; } - elsif ( $language eq "cs" ) { $nsislanguage = "Czech"; } - elsif ( $language eq "da" ) { $nsislanguage = "Danish"; } - elsif ( $language eq "nl" ) { $nsislanguage = "Dutch"; } - elsif ( $language eq "de" ) { $nsislanguage = "German"; } - elsif ( $language eq "de-LU" ) { $nsislanguage = "Luxembourgish"; } - elsif ( $language eq "et" ) { $nsislanguage = "Estonian"; } - elsif ( $language eq "fa" ) { $nsislanguage = "Farsi"; } - elsif ( $language eq "el" ) { $nsislanguage = "Greek"; } - elsif ( $language eq "fi" ) { $nsislanguage = "Finnish"; } - elsif ( $language eq "fr" ) { $nsislanguage = "French"; } - elsif ( $language eq "hu" ) { $nsislanguage = "Hungarian"; } - elsif ( $language eq "he" ) { $nsislanguage = "Hebrew"; } - elsif ( $language eq "is" ) { $nsislanguage = "Icelandic"; } - elsif ( $language eq "id" ) { $nsislanguage = "Indonesian"; } - elsif ( $language eq "it" ) { $nsislanguage = "Italian"; } - elsif ( $language eq "lv" ) { $nsislanguage = "Latvian"; } - elsif ( $language eq "lt" ) { $nsislanguage = "Lithuanian"; } - elsif ( $language eq "mk" ) { $nsislanguage = "Macedonian"; } - elsif ( $language eq "mn" ) { $nsislanguage = "Mongolian"; } - elsif ( $language eq "no" ) { $nsislanguage = "Norwegian"; } - elsif ( $language eq "no-NO" ) { $nsislanguage = "Norwegian"; } - elsif ( $language eq "es" ) { $nsislanguage = "Spanish"; } - elsif ( $language eq "sl" ) { $nsislanguage = "Slovenian"; } - elsif ( $language eq "sv" ) { $nsislanguage = "Swedish"; } - elsif ( $language eq "sk" ) { $nsislanguage = "Slovak"; } - elsif ( $language eq "pl" ) { $nsislanguage = "Polish"; } - elsif ( $language eq "pt-BR" ) { $nsislanguage = "PortugueseBR"; } - elsif ( $language eq "pt" ) { $nsislanguage = "Portuguese"; } - elsif ( $language eq "ro" ) { $nsislanguage = "Romanian"; } - elsif ( $language eq "ru" ) { $nsislanguage = "Russian"; } - elsif ( $language eq "sh" ) { $nsislanguage = "SerbianLatin"; } - elsif ( $language eq "sr" ) { $nsislanguage = "Serbian"; } - elsif ( $language eq "sr-SP" ) { $nsislanguage = "Serbian"; } - elsif ( $language eq "uk" ) { $nsislanguage = "Ukrainian"; } - elsif ( $language eq "tr" ) { $nsislanguage = "Turkish"; } - elsif ( $language eq "ja" ) { $nsislanguage = "Japanese"; } - elsif ( $language eq "ko" ) { $nsislanguage = "Korean"; } - elsif ( $language eq "th" ) { $nsislanguage = "Thai"; } - elsif ( $language eq "zh-CN" ) { $nsislanguage = "SimpChinese"; } - elsif ( $language eq "zh-TW" ) { $nsislanguage = "TradChinese"; } - else { - my $infoline = "NSIS language_converter : Could not find nsis language for $language!\n"; - push( @installer::globals::logfileinfo, $infoline); - $nsislanguage = "English"; - } - - return $nsislanguage; -} - -################################################################## -# Windows: Including list of all languages into nsi template -################################################################## - -sub put_language_list_into_template -{ - my ($templatefile, $languagesarrayref) = @_; - - my $alllangstring = ""; - my %nsislangs; - - for ( my $i = 0; $i <= $#{$languagesarrayref}; $i++ ) - { - my $onelanguage = ${$languagesarrayref}[$i]; - my $nsislanguage = nsis_language_converter($onelanguage); - $nsislangs{$nsislanguage}++; - } - - foreach my $nsislanguage ( keys(%nsislangs) ) - { - # Syntax: !insertmacro MUI_LANGUAGE "English" - my $langstring = "\!insertmacro MUI_LANGUAGE_PACK " . $nsislanguage . "\n"; - if ( $nsislanguage eq "English" ) - { - $alllangstring = $langstring . $alllangstring; - } - else - { - $alllangstring = $alllangstring . $langstring; - } - } - - $alllangstring =~ s/\s*$//; - - replace_one_variable($templatefile, "ALLLANGUAGESPLACEHOLDER", $alllangstring); -} - -################################################################## -# Windows: Collecting all identifier from mlf file -################################################################## - -sub get_identifier -{ - my ( $mlffile ) = @_; - - my @identifier = (); - - for ( my $i = 0; $i <= $#{$mlffile}; $i++ ) - { - my $oneline = ${$mlffile}[$i]; - - if ( $oneline =~ /^\s*\[(.+)\]\s*$/ ) - { - my $identifier = $1; - push(@identifier, $identifier); - } - } - - return \@identifier; -} - -############################################################## -# Returning the complete block in all languages -# for a specified string -############################################################## - -sub get_language_block_from_language_file -{ - my ($searchstring, $languagefile) = @_; - - my @language_block = (); - - for ( my $i = 0; $i <= $#{$languagefile}; $i++ ) - { - if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ ) - { - my $counter = $i; - - push(@language_block, ${$languagefile}[$counter]); - $counter++; - - while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ ))) - { - push(@language_block, ${$languagefile}[$counter]); - $counter++; - } - - last; - } - } - - return \@language_block; -} - -############################################################## -# Returning a specific language string from the block -# of all translations -############################################################## - -sub get_language_string_from_language_block -{ - my ($language_block, $language) = @_; - - my $newstring = ""; - - for ( my $i = 0; $i <= $#{$language_block}; $i++ ) - { - if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) - { - $newstring = $1; - last; - } - } - - if ( $newstring eq "" ) - { - $language = "en-US"; # defaulting to english - - for ( my $i = 0; $i <= $#{$language_block}; $i++ ) - { - if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) - { - $newstring = $1; - last; - } - } - } - - return $newstring; -} - -################################################################## -# Windows: Replacing strings in NSIS nsh file -# nsh file syntax: -# !define MUI_TEXT_DIRECTORY_TITLE "Zielverzeichnis ausw�hlen" -################################################################## - -sub replace_identifier_in_nshfile -{ - my ( $nshfile, $identifier, $newstring, $nshfilename, $onelanguage ) = @_; - - if ( $installer::globals::nsis231 ) - { - $newstring =~ s/\\r/\$\\r/g; # \r -> $\r in modern nsis versions - $newstring =~ s/\\n/\$\\n/g; # \n -> $\n in modern nsis versions - } - - for ( my $i = 0; $i <= $#{$nshfile}; $i++ ) - { - if ( ${$nshfile}[$i] =~ /\s+\Q$identifier\E\s+\"(.+)\"\s*$/ ) - { - my $oldstring = $1; - ${$nshfile}[$i] =~ s/\Q$oldstring\E/$newstring/; - my $infoline = "NSIS replacement in $nshfilename ($onelanguage): $oldstring \-\> $newstring\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } -} - -################################################################## -# Windows: Replacing strings in NSIS nlf file -# nlf file syntax (2 lines): -# # ^DirSubText -# Zielverzeichnis -################################################################## - -sub replace_identifier_in_nlffile -{ - my ( $nlffile, $identifier, $newstring, $nlffilename, $onelanguage ) = @_; - - for ( my $i = 0; $i <= $#{$nlffile}; $i++ ) - { - if ( ${$nlffile}[$i] =~ /^\s*\#\s+\^\s*\Q$identifier\E\s*$/ ) - { - my $next = $i+1; - my $oldstring = ${$nlffile}[$next]; - ${$nlffile}[$next] = $newstring . "\n"; - $oldstring =~ s/\s*$//; - my $infoline = "NSIS replacement in $nlffilename ($onelanguage): $oldstring \-\> $newstring\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } -} - -################################################################## -# Windows: Translating the NSIS nsh and nlf file -################################################################## - -sub translate_nsh_nlf_file -{ - my ($nshfile, $nlffile, $mlffile, $onelanguage, $nshfilename, $nlffilename, $nsislanguage) = @_; - - # Analyzing the mlf file, collecting all Identifier - my $allidentifier = get_identifier($mlffile); - - $onelanguage = "en-US" if ( $nsislanguage eq "English" && $onelanguage ne "en-US"); - for ( my $i = 0; $i <= $#{$allidentifier}; $i++ ) - { - my $identifier = ${$allidentifier}[$i]; - my $language_block = get_language_block_from_language_file($identifier, $mlffile); - my $newstring = get_language_string_from_language_block($language_block, $onelanguage); - - # removing mask - $newstring =~ s/\\\'/\'/g; - - replace_identifier_in_nshfile($nshfile, $identifier, $newstring, $nshfilename, $onelanguage); - replace_identifier_in_nlffile($nlffile, $identifier, $newstring, $nlffilename, $onelanguage); - } -} - -################################################################## -# Converting utf 16 file to utf 8 -################################################################## - -sub convert_utf16_to_utf8 -{ - my ( $filename ) = @_; - - my @localfile = (); - - my $savfilename = $filename . "_before.utf16"; - installer::systemactions::copy_one_file($filename, $savfilename); - - open( IN, "<:encoding(UTF16-LE)", $filename ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for reading", "convert_utf16_to_utf8"); - while ( $line = <IN> ) { - push @localfile, $line; - } - close( IN ); - - if ( open( OUT, ">:utf8", $filename ) ) - { - print OUT @localfile; - close(OUT); - } - - $savfilename = $filename . "_before.utf8"; - installer::systemactions::copy_one_file($filename, $savfilename); -} - -################################################################## -# Converting utf 8 file to utf 16 -################################################################## - -sub convert_utf8_to_utf16 -{ - my ( $filename ) = @_; - - my @localfile = (); - - my $savfilename = $filename . "_after.utf8"; - installer::systemactions::copy_one_file($filename, $savfilename); - - open( IN, "<:utf8", $filename ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for reading", "convert_utf8_to_utf16"); - while ( $line = <IN> ) { - push @localfile, $line; - } - close( IN ); - - if ( open( OUT, ">:raw:encoding(UTF16-LE):crlf:utf8", $filename ) ) - { - print OUT @localfile; - close(OUT); - } - - $savfilename = $filename . "_after.utf16"; - installer::systemactions::copy_one_file($filename, $savfilename); -} - -################################################################## -# Converting text string to utf 16 -################################################################## - -sub convert_textstring_to_utf16 -{ - my ( $textstring, $localnsisdir, $shortfilename ) = @_; - - my $filename = $localnsisdir . $installer::globals::separator . $shortfilename; - my @filecontent = (); - push(@filecontent, $textstring); - installer::files::save_file($filename, \@filecontent); - convert_utf8_to_utf16($filename); - my $newfile = installer::files::read_file($filename); - my $utf16string = ""; - if ( ${$newfile}[0] ne "" ) { $utf16string = ${$newfile}[0]; } - - return $utf16string; -} - -################################################################## -# Windows: Copying NSIS language files to local nsis directory -################################################################## - -sub copy_and_translate_nsis_language_files -{ - my ($nsispath, $localnsisdir, $languagesarrayref, $allvariables) = @_; - - my $nlffilepath = $nsispath . $installer::globals::separator . "Contrib" . $installer::globals::separator . "Language\ files" . $installer::globals::separator; - my $nshfilepath = $nsispath . $installer::globals::separator . "Contrib" . $installer::globals::separator . "Modern\ UI" . $installer::globals::separator . "Language files" . $installer::globals::separator; - - my $infoline = ""; - - for ( my $i = 0; $i <= $#{$languagesarrayref}; $i++ ) - { - my $onelanguage = ${$languagesarrayref}[$i]; - my $nsislanguage = nsis_language_converter($onelanguage); - - # Copying the nlf file - my $sourcepath = $nlffilepath . $nsislanguage . "\.nlf"; - if ( ! -f $sourcepath ) { installer::exiter::exit_program("ERROR: Could not find nsis file: $sourcepath!", "copy_and_translate_nsis_language_files"); } - my $nlffilename = $localnsisdir . $installer::globals::separator . $nsislanguage . "_pack.nlf"; - if ( $^O =~ /cygwin/i ) { $nlffilename =~ s/\//\\/g; } - installer::systemactions::copy_one_file($sourcepath, $nlffilename); - - # Copying the nsh file - # In newer nsis versions, the nsh file is located next to the nlf file - $sourcepath = $nshfilepath . $nsislanguage . "\.nsh"; - if ( ! -f $sourcepath ) - { - # trying to find the nsh file next to the nlf file - $sourcepath = $nlffilepath . $nsislanguage . "\.nsh"; - if ( ! -f $sourcepath ) - { - installer::exiter::exit_program("ERROR: Could not find nsis file: $sourcepath!", "copy_and_translate_nsis_language_files"); - } - } - my $nshfilename = $localnsisdir . $installer::globals::separator . $nsislanguage . "_pack.nsh"; - if ( $^O =~ /cygwin/i ) { $nshfilename =~ s/\//\\/g; } - installer::systemactions::copy_one_file($sourcepath, $nshfilename); - - # Changing the macro name in nsh file: MUI_LANGUAGEFILE_BEGIN -> MUI_LANGUAGEFILE_PACK_BEGIN - my $nshfile = installer::files::read_file($nshfilename); - set_nsis_version($nshfile); - - if ( $installer::globals::unicodensis ) - { - $infoline = "This is Unicode NSIS!\n"; - push( @installer::globals::logfileinfo, $infoline); - convert_utf16_to_utf8($nshfilename); - convert_utf16_to_utf8($nlffilename); - $nshfile = installer::files::read_file($nshfilename); # read nsh file again - } - - replace_one_variable($nshfile, "MUI_LANGUAGEFILE_BEGIN", "MUI_LANGUAGEFILE_PACK_BEGIN"); - - # find the ulf file for translation - my $mlffile = get_translation_file($allvariables); - - # Translate the files - my $nlffile = installer::files::read_file($nlffilename); - translate_nsh_nlf_file($nshfile, $nlffile, $mlffile, $onelanguage, $nshfilename, $nlffilename, $nsislanguage); - - installer::files::save_file($nshfilename, $nshfile); - installer::files::save_file($nlffilename, $nlffile); - - if ( $installer::globals::unicodensis ) - { - convert_utf8_to_utf16($nshfilename); - convert_utf8_to_utf16($nlffilename); - } - } - -} - -################################################################## -# Windows: Including the nsis path into the nsi template -################################################################## - -sub put_nsis_path_into_template -{ - my ($templatefile, $nsisdir) = @_; - - replace_one_variable($templatefile, "NSISPATHPLACEHOLDER", $nsisdir); -} - -################################################################## -# Windows: Including the output path into the nsi template -################################################################## - -sub put_output_path_into_template -{ - my ($templatefile, $downloaddir) = @_; - - if ( $^O =~ /cygwin/i ) { $downloaddir =~ s/\//\\/g; } - - replace_one_variable($templatefile, "OUTPUTDIRPLACEHOLDER", $downloaddir); -} - -################################################################## -# Windows: Only allow specific code for nsis 2.0.4 or nsis 2.3.1 -################################################################## - -sub put_version_specific_code_into_template -{ - my ($templatefile) = @_; - - my $subst204 = ""; - my $subst231 = ""; - - if ( $installer::globals::nsis204 ) - { - $subst231 = ";"; - } - else - { - $subst204 = ";"; - } - - replace_one_variable($templatefile, "\#204\#", $subst204); - replace_one_variable($templatefile, "\#231\#", $subst231); -} - -################################################################## -# Windows: Finding the path to the nsis SDK -################################################################## - -sub get_path_to_nsis_sdk -{ - my $vol; - my $dir; - my $file; - my $nsispath = ""; - - if ( $ENV{'NSIS_PATH'} ) { - $nsispath = $ENV{'NSIS_PATH'}; - } elsif ( $ENV{'SOLARROOT'} ) { - $nsispath = $ENV{'SOLARROOT'} . $installer::globals::separator . "NSIS"; - } else { - # do we have nsis already in path ? - @paths = split(/:/, $ENV{'PATH'}); - foreach $paths (@paths) { - $paths =~ s/[\/\\]+$//; # remove trailing slashes; - $nsispath = $paths . "/nsis"; - - if ( -x $nsispath ) { - $nsispath = $paths; - last; - } - else { - $nsispath = ""; - } - } - } - if ( $ENV{'NSISSDK_SOURCE'} ) { - installer::logger::print_warning( "NSISSDK_SOURCE is deprecated. use NSIS_PATH instead.\n" ); - $nsispath = $ENV{'NSISSDK_SOURCE'}; # overriding the NSIS SDK with NSISSDK_SOURCE - } - - if ( $nsispath eq "" ) - { - installer::logger::print_message( "... no Environment variable \"SOLARROOT\", \"NSIS_PATH\" or \"NSISSDK_SOURCE\" found and NSIS not found in path!", "get_path_to_nsis_sdk"); - } elsif ( ! -d $nsispath ) - { - installer::exiter::exit_program("ERROR: NSIS path $nsispath does not exist!", "get_path_to_nsis_sdk"); - } - - return $nsispath; -} - -################################################################## -# Windows: Executing NSIS to create the installation set -################################################################## - -sub call_nsis -{ - my ( $nsispath, $nsifile ) = @_; - - my $makensisexe = $nsispath . $installer::globals::separator . "makensis.exe"; - - installer::logger::print_message( "... starting $makensisexe ... \n" ); - - if( $^O =~ /cygwin/i ) { $nsifile =~ s/\\/\//g; } - - my $systemcall = "$makensisexe /V4 /DMUI_VERBOSE=4 $nsifile |"; - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - my @nsisoutput = (); - - open (NSI, "$systemcall"); - while (<NSI>) {push(@nsisoutput, $_); } - close (NSI); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - if ($returnvalue) - { - $infoline = "ERROR: $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - for ( my $i = 0; $i <= $#nsisoutput; $i++ ) { push( @installer::globals::logfileinfo, "$nsisoutput[$i]"); } - -} - -################################################################################# -# Replacing one variable in one files -################################################################################# - -sub replace_one_variable_in_translationfile -{ - my ($translationfile, $variable, $searchstring) = @_; - - for ( my $i = 0; $i <= $#{$translationfile}; $i++ ) - { - ${$translationfile}[$i] =~ s/\%$searchstring/$variable/g; - } -} - -################################################################################# -# Replacing the variables in the translation file -################################################################################# - -sub replace_variables -{ - my ($translationfile, $variableshashref) = @_; - - # we want to substitute FOO_BR before FOO to avoid floating _BR suffixes - foreach $key (sort { length ($b) <=> length ($a) } keys %{$variableshashref}) - { - my $value = $variableshashref->{$key}; - - # special handling for PRODUCTVERSION, if $allvariables->{'POSTVERSIONEXTENSION'} - if (( $key eq "PRODUCTVERSION" ) && ( $variableshashref->{'POSTVERSIONEXTENSION'} )) { $value = $value . " " . $variableshashref->{'POSTVERSIONEXTENSION'}; } - - replace_one_variable_in_translationfile($translationfile, $value, $key); - } -} - -######################################################### -# Getting the translation file for the nsis installer -######################################################### - -sub get_translation_file -{ - my ($allvariableshashref) = @_; - my $translationfilename = $installer::globals::idtlanguagepath . $installer::globals::separator . $installer::globals::nsisfilename; - if ( $installer::globals::unicodensis ) { $translationfilename = $translationfilename . ".uulf"; } - else { $translationfilename = $translationfilename . ".mlf"; } - if ( ! -f $translationfilename ) { installer::exiter::exit_program("ERROR: Could not find language file $translationfilename!", "get_translation_file"); } - my $translationfile = installer::files::read_file($translationfilename); - replace_variables($translationfile, $allvariableshashref); - - my $infoline = "Reading translation file: $translationfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - return $translationfile; -} - -#################################################### -# Removing english, if it was added before -#################################################### - -sub remove_english_for_nsis_installer -{ - my ($languagestringref, $languagesarrayref) = @_; - - @{$languagesarrayref} = ("en-US"); # only english for NSIS installer! -} - -#################################################### -# Creating link tree for upload -#################################################### - -sub create_link_tree -{ - my ($sourcedownloadfile, $destfilename, $versionstring) = @_; - - if ( ! $installer::globals::ooouploaddir ) { installer::exiter::exit_program("ERROR: Directory for LO upload not defined!", "create_link_tree"); } - my $versiondir = $installer::globals::ooouploaddir . $installer::globals::separator . $versionstring; - my $infoline = "Directory for the link: $versiondir\n"; - push(@installer::globals::logfileinfo, $infoline); - - if ( ! -d $versiondir ) { installer::systemactions::create_directory_structure($versiondir); } - - # inside directory $versiondir all links have to be created - my $linkdestination = $versiondir . $installer::globals::separator . $destfilename; - - # If there is an older version of this file (link), it has to be removed - if ( -f $linkdestination ) { unlink($linkdestination); } - - $infoline = "Creating hard link from $sourcedownloadfile to $linkdestination\n"; - push(@installer::globals::logfileinfo, $infoline); - installer::systemactions::hardlink_one_file($sourcedownloadfile, $linkdestination); -} - -####################################################### -# Setting supported platform for LibreOffice -# builds -####################################################### - -sub is_supported_platform -{ - my $is_supported = 0; - - if (( $installer::globals::isrpmbuild ) || - ( $installer::globals::issolarissparcbuild ) || - ( $installer::globals::issolarisx86build ) || - ( $installer::globals::iswindowsbuild )) - { - $is_supported = 1; - } - - return $is_supported; -} - -#################################################### -# Creating download installation sets -#################################################### - -sub create_download_sets -{ - my ($installationdir, $includepatharrayref, $allvariableshashref, $downloadname, $languagestringref, $languagesarrayref) = @_; - - my $infoline = ""; - - my $force = 1; # print this message even in 'quiet' mode - installer::logger::print_message( "\n******************************************\n" ); - installer::logger::print_message( "... creating download installation set ...\n", $force ); - installer::logger::print_message( "******************************************\n" ); - - installer::logger::include_header_into_logfile("Creating download installation sets:"); - - # special handling for installation sets, to which english was added automatically - if ( $installer::globals::added_english ) { remove_english_for_nsis_installer($languagestringref, $languagesarrayref); } - - my $firstdir = $installationdir; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$firstdir); - - my $lastdir = $installationdir; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$lastdir); - - if ( $installer::globals::iswindowsbuild && $lastdir =~ /\./ ) { $lastdir =~ s/\./_download_inprogress\./ } - else { $lastdir = $lastdir . "_download_inprogress"; } - - # removing existing directory "_native_packed_inprogress" and "_native_packed_witherror" and "_native_packed" - - my $downloaddir = $firstdir . $lastdir; - - if ( -d $downloaddir ) { installer::systemactions::remove_complete_directory($downloaddir); } - - my $olddir = $downloaddir; - $olddir =~ s/_inprogress/_witherror/; - if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); } - - $olddir = $downloaddir; - $olddir =~ s/_inprogress//; - if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); } - - # creating the new directory - - installer::systemactions::create_directory($downloaddir); - - $installer::globals::saveinstalldir = $downloaddir; - - # evaluating the name of the download file - - if ( $allvariableshashref->{'OOODOWNLOADNAME'} ) { $downloadname = set_download_filename($languagestringref, $allvariableshashref); } - else { $downloadname = resolve_variables_in_downloadname($allvariableshashref, $downloadname, $languagestringref); } - - if ( ! $installer::globals::iswindowsbuild ) # Unix specific part - { - - # getting the path of the getuid.so (only required for Solaris and Linux) - my $getuidlibrary = ""; - if (( $installer::globals::issolarisbuild ) || ( $installer::globals::islinuxbuild )) { $getuidlibrary = get_path_for_library($includepatharrayref); } - - if ( $allvariableshashref->{'OOODOWNLOADNAME'} ) - { - my $downloadfile = create_tar_gz_file_from_directory($installationdir, $getuidlibrary, $downloaddir, $downloadname); - } - else - { - # find and read setup script template - my $scriptfilename = "downloadscript.sh"; - - my $scriptref = ""; - - if ( $installer::globals::include_pathes_read ) - { - $scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptfilename, $includepatharrayref, 0); - } - else - { - $scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$scriptfilename, $includepatharrayref, 0); - } - - if ($$scriptref eq "") { installer::exiter::exit_program("ERROR: Could not find script file $scriptfilename!", "create_download_sets"); } - my $scriptfile = installer::files::read_file($$scriptref); - - $infoline = "Found script file $scriptfilename: $$scriptref \n"; - push( @installer::globals::logfileinfo, $infoline); - - # add product name into script template - put_productname_into_script($scriptfile, $allvariableshashref); - - # replace linenumber in script template - put_linenumber_into_script($scriptfile); - - # create tar file - my $temporary_tarfile_name = $downloaddir . $installer::globals::separator . 'installset.tar'; - my $size = tar_package($installationdir, $temporary_tarfile_name, $getuidlibrary); - installer::exiter::exit_program("ERROR: Could not create tar file $temporary_tarfile_name!", "create_download_sets") unless $size; - - # calling sum to determine checksum and size of the tar file - my $sumout = call_sum($temporary_tarfile_name); - - # writing checksum and size into scriptfile - put_checksum_and_size_into_script($scriptfile, $sumout); - - # saving the script file - my $newscriptfilename = determine_scriptfile_name($downloadname); - $newscriptfilename = save_script_file($downloaddir, $newscriptfilename, $scriptfile); - - installer::logger::print_message( "... including installation set into $newscriptfilename ... \n" ); - # Append tar file to script - include_tar_into_script($newscriptfilename, $temporary_tarfile_name); - } - } - else # Windows specific part - { - my $localnsisdir = installer::systemactions::create_directories("nsis", $languagestringref); - # push(@installer::globals::removedirs, $localnsisdir); - - # find nsis in the system - my $nsispath = get_path_to_nsis_sdk(); - - if ( $nsispath eq "" ) { - # If nsis is not found just skip the rest of this function - # and do not create the NSIS file. - $infoline = "\nNo NSIS SDK found. Skipping the generation of NSIS file.\n"; - push(@installer::globals::logfileinfo, $infoline); - installer::logger::print_message( "... no NSIS SDK found. Skipping the generation of NSIS file ... \n" ); - return $downloaddir; - } - - # copy language files into nsis directory and translate them - copy_and_translate_nsis_language_files($nsispath, $localnsisdir, $languagesarrayref, $allvariableshashref); - - # find and read the nsi file template - my $templatefilename = "downloadtemplate.nsi"; - - my $templateref = ""; - - if ( $installer::globals::include_pathes_read ) - { - $templateref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$templatefilename, $includepatharrayref, 0); - } - else - { - $templateref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$templatefilename, $includepatharrayref, 0); - } - - if ($$templateref eq "") { installer::exiter::exit_program("ERROR: Could not find nsi template file $templatefilename!", "create_download_sets"); } - my $templatefile = installer::files::read_file($$templateref); - - # add product name into script template - put_windows_productname_into_template($templatefile, $allvariableshashref); - @path_substs = ( - 'DOWNLOADBANNER' => 'BANNERBMPPLACEHOLDER', - 'DOWNLOADBITMAP' => 'WELCOMEBMPPLACEHOLDER', - 'DOWNLOADSETUPICO' => 'SETUPICOPLACEHOLDER' - ); - while (@path_substs) { - my $var= shift @path_substs; - my $val = shift @path_substs; - substitute_path_into_template($templatefile, $includepatharrayref, - $allvariableshashref, $var, $val); - } - %var_substs = ( - 'OOOVENDOR' => 'PUBLISHERPLACEHOLDER', - 'STARTCENTER_INFO_URL' => 'WEBSITEPLACEHOLDER', - 'WINDOWSJAVAFILENAME' => 'WINDOWSJAVAFILENAMEPLACEHOLDER', - 'PRODUCTVERSION' => 'PRODUCTVERSIONPLACEHOLDER' - ); - for $var (keys %var_substs) { - substitute_variable_into_template($templatefile, $allvariableshashref, - $var, $var_substs{$var}); - } - put_windows_productpath_into_template($templatefile, $allvariableshashref, $languagestringref, $localnsisdir); - put_outputfilename_into_template($templatefile, $downloadname); - put_filelist_into_template($templatefile, $installationdir); - put_language_list_into_template($templatefile, $languagesarrayref); - put_nsis_path_into_template($templatefile, $localnsisdir); - put_output_path_into_template($templatefile, $downloaddir); - put_version_specific_code_into_template($templatefile); - - my $nsifilename = save_script_file($localnsisdir, $templatefilename, $templatefile); - - installer::logger::print_message( "... created NSIS file $nsifilename ... \n" ); - - # starting the NSIS SDK to create the download file - call_nsis($nsispath, $nsifilename); - } - - return $downloaddir; -} - -#################################################### -# Creating LO upload tree -#################################################### - -sub create_download_link_tree -{ - my ($downloaddir, $languagestringref, $allvariableshashref) = @_; - - my $infoline; - - installer::logger::print_message( "\n******************************************\n" ); - installer::logger::print_message( "... creating download hard link ...\n" ); - installer::logger::print_message( "******************************************\n" ); - - installer::logger::include_header_into_logfile("Creating download hard link:"); - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Creating hard link, start"); - - if ( is_supported_platform() ) - { - my $versionstring = ""; - # Already defined $installer::globals::oooversionstring and $installer::globals::ooodownloadfilename ? - - if ( ! $installer::globals::oooversionstring ) { $versionstring = get_current_version(); } - else { $versionstring = $installer::globals::oooversionstring; } - - # Is $versionstring empty? If yes, there is nothing to do now. - - $infoline = "Version string is set to: $versionstring\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( $versionstring ) - { - # Now the downloadfilename has to be set (if not already done) - my $destdownloadfilename = ""; - if ( ! $installer::globals::ooodownloadfilename ) { $destdownloadfilename = set_download_filename($languagestringref, $versionstring, $allvariableshashref); } - else { $destdownloadfilename = $installer::globals::ooodownloadfilename; } - - if ( $destdownloadfilename ) - { - $destdownloadfilename = $destdownloadfilename . $installer::globals::downloadfileextension; - - $infoline = "Setting destination download file name: $destdownloadfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $sourcedownloadfile = $downloaddir . $installer::globals::separator . $installer::globals::downloadfilename; - - $infoline = "Setting source download file name: $sourcedownloadfile\n"; - push( @installer::globals::logfileinfo, $infoline); - - create_link_tree($sourcedownloadfile, $destdownloadfilename, $versionstring); - } - } - else - { - $infoline = "Version string is empty. Nothing to do!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - else - { - $infoline = "Platform not used for hard linking. Nothing to do!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - installer::logger::include_timestamp_into_logfile("Performance Info: Creating hard link, stop"); -} - -1; diff --git a/solenv/bin/modules/installer/downloadsigner.pm b/solenv/bin/modules/installer/downloadsigner.pm deleted file mode 100644 index ab82ef269..000000000 --- a/solenv/bin/modules/installer/downloadsigner.pm +++ /dev/null @@ -1,587 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::downloadsigner; - -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; - -############################################ -# Parameter Operations -############################################ - -sub usage -{ - print <<Ende; --------------------------------------------------------------------------------- -make_download V1.0 -The following parameter are needed: --d: Full path to the file containing the follow-me info or to a directory - containing the follow-me info files. In the latter case, all follow-me - info files are evaluated. If a directory is used, the successfully used - follow-me info files are renamed using a string "success". Files with - this string are ignored in repeated processes using "-d" with a - directory. - -The following parameter are optional: --nodownload: Only signing, no creation of download sets (Windows only) --useminor: Important for installation sets, created without minor set --writetotemp: Necessary, if you do not want to write into solver - This can be caused by missing privileges (Windows only) --internalcabinet: Not only the cabinet files are signed, but also all - files included in the cabinet files (Windows only). - --sign: Uses signing mechanism to sign installation sets -If \"-sign\" is set, the following two parameter are required: --pfx: Full path to the pfx file --pw: Full path to the file, containing the pfx password. - -Examples: - -Specifying an installation set (with "-d"): - -perl make_download.pl -d <followmeinfofilename> - -perl make_download.pl -d <followmeinfofilename> - -sign - -pfx <pfxfilename> - -pw <passwordfilename> - -or without specifying an installation set: - -perl make_download.pl -d <followmedirectory> - -sign - -pfx <pfxfilename> - -pw <passwordfilename> --------------------------------------------------------------------------------- -Ende - exit(-1); -} - -##################################### -# Reading parameter -##################################### - -sub getparameter -{ - while ( $#ARGV >= 0 ) - { - my $param = shift(@ARGV); - - if ($param eq "-d") { $installer::globals::followmeinfofilename = shift(@ARGV); } - elsif ($param eq "-pw") { $installer::globals::pwfile = shift(@ARGV); } - elsif ($param eq "-pfx") { $installer::globals::pfxfile = shift(@ARGV); } - elsif ($param eq "-sign") { $installer::globals::dosign = 1; } - elsif ($param eq "-nodownload") { $installer::globals::nodownload = 1; } - elsif ($param eq "-writetotemp") { $installer::globals::writetotemp = 1; } - elsif ($param eq "-useminor") { $installer::globals::useminor = 1; } - elsif ($param eq "-internalcabinet") { $installer::globals::internal_cabinet_signing = 1; } - else - { - installer::logger::print_error( "unknown parameter: $param" ); - usage(); - exit(-1); - } - } -} - -##################################### -# Controlling required parameter -##################################### - -sub checkparameter -{ - if ( $installer::globals::followmeinfofilename eq "" ) - { - installer::logger::print_error( "Error: Required parameter is missing: -d\n" ); - usage(); - exit(-1); - } - - if ( $installer::globals::dosign ) - { - # -pfx and -pw have to be set - if ( $installer::globals::pfxfile eq "" ) - { - installer::logger::print_error( "Error: If \"-sign\" is set, a pfx file has to be specified: -pfx\n" ); - usage(); - exit(-1); - } - - # -pfx and -pw have to be set - if ( $installer::globals::pwfile eq "" ) - { - installer::logger::print_error( "Error: If \"-sign\" is set, a password file has to be specified: -pw\n" ); - usage(); - exit(-1); - } - - # and both files have to exist - if ( ! -f $installer::globals::pfxfile ) - { - installer::logger::print_error( "Error: pfx file \"$installer::globals::pfxfile\" does not exist.\n" ); - usage(); - exit(-1); - } - - if ( ! -f $installer::globals::pwfile ) - { - installer::logger::print_error( "Error: Password file \"$installer::globals::pwfile\" does not exist (-pw).\n" ); - usage(); - exit(-1); - } - } -} - -############################################# -# Setting the temporary path for the download -# and signing process -############################################# - -sub set_temp_path -{ - my $temppath = ""; - my $pid = $$; # process id - my $time = time(); # time - my $helperdir = "unpackdir_" . $pid . $time; - - if (( $ENV{'TMP'} ) || ( $ENV{'TEMP'} )) - { - if ( $ENV{'TMP'} ) { $temppath = $ENV{'TMP'}; } - elsif ( $ENV{'TEMP'} ) { $temppath = $ENV{'TEMP'}; } - $temppath =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes - $temppath = $temppath . $installer::globals::separator . $helperdir; - - if( $^O =~ /cygwin/i ) - { - $temppath = qx{cygpath -w "$temppath"}; - $temppath =~ s/\\/\//g; - $temppath =~ s/\s*$//g; - } - - installer::systemactions::create_directory_structure($temppath); - } - else - { - installer::logger::print_error( "Error: TMP and TEMP not defined. This is required for this process.\n" ); - usage(); - exit(-1); - } - - installer::logger::print_message( "\n... using output path: $temppath ...\n" ); - - push(@installer::globals::removedirs, $temppath); - - return $temppath; -} - -############################################# -# Setting output pathes to temp directory -# This are the: -# unpackpath and the loggingdir -############################################# - -sub set_output_pathes_to_temp -{ - my ($followmeinfohash, $temppath) = @_; - - $followmeinfohash->{'loggingdir'} = $temppath . $installer::globals::separator; - $installer::globals::unpackpath = $temppath; -} - -############################################# -# Setting the minor into the pathes. This is -# required, if the original installation set -# was created without minor -# Value is always saved in -# $installer::globals::lastminor -# which is saved in the follow_me file -############################################# - -sub set_minor_into_pathes -{ - my ($followmeinfohash, $temppath) = @_; - - installer::logger::print_message( "\n... forcing into minor: $installer::globals::lastminor ...\n" ); - - my @pathnames = ("bin", "doc", "inc", "lib", "pck", "res", "xml"); - my $sourcename = "src"; - my $srcpath = $installer::globals::separator . $sourcename . $installer::globals::separator; - - if ( $installer::globals::minor ne "" ) - { - installer::logger::print_message( "\n... already defined minor: $installer::globals::minor -> ignoring parameter \"-useminor\" ...\n" ); - return; - } - - # Affected pathes: - # $contenthash{'installlogdir'} - # $contenthash{'includepatharray'} - # $installer::globals::unpackpath - # $installer::globals::idttemplatepath - # $installer::globals::idtlanguagepath - - installer::logger::include_header_into_logfile("Changing saved pathes to add the minor"); - my $infoline = "Old pathes:\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "\$followmeinfohash->{'installlogdir'}: $followmeinfohash->{'installlogdir'}\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "\$installer::globals::unpackpath: $installer::globals::unpackpath\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "\$installer::globals::idttemplatepath: $installer::globals::idttemplatepath\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "\$installer::globals::idtlanguagepath: $installer::globals::idtlanguagepath\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "Include pathes:\n"; - push( @installer::globals::logfileinfo, $infoline); - foreach my $path ( @{$followmeinfohash->{'includepatharray'}} ) { push( @installer::globals::logfileinfo, $path); } - - foreach $onepath ( @pathnames ) - { - my $oldvalue = $installer::globals::separator . $onepath . $installer::globals::separator; - my $newvalue = $installer::globals::separator . $onepath . "\." . $installer::globals::lastminor . $installer::globals::separator; - - if (( $followmeinfohash->{'installlogdir'} =~ /\Q$oldvalue\E/ ) && ( ! ( $followmeinfohash->{'installlogdir'} =~ /\Q$srcpath\E/ ))) { $followmeinfohash->{'installlogdir'} =~ s/\Q$oldvalue\E/$newvalue/; } - if (( $installer::globals::unpackpath =~ /\Q$oldvalue\E/ ) && ( ! ( $installer::globals::unpackpath =~ /\Q$srcpath\E/ ))) { $installer::globals::unpackpath =~ s/\Q$oldvalue\E/$newvalue/; } - if (( $installer::globals::idttemplatepath =~ /\Q$oldvalue\E/ ) && ( ! ( $installer::globals::idttemplatepath =~ /\Q$srcpath\E/ ))) { $installer::globals::idttemplatepath =~ s/\Q$oldvalue\E/$newvalue/; } - if (( $installer::globals::idtlanguagepath =~ /\Q$oldvalue\E/ ) && ( ! ( $installer::globals::idtlanguagepath =~ /\Q$srcpath\E/ ))) { $installer::globals::idtlanguagepath =~ s/\Q$oldvalue\E/$newvalue/; } - foreach my $path ( @{$followmeinfohash->{'includepatharray'}} ) { if (( $path =~ /\Q$oldvalue\E/ ) && ( ! ( $path =~ /\Q$srcpath\E/ ))) { $path =~ s/\Q$oldvalue\E/$newvalue/; } } - - # Checking for the end of the path - $oldvalue = $installer::globals::separator . $onepath; - $newvalue = $installer::globals::separator . $onepath . "\." . $installer::globals::lastminor; - - if (( $followmeinfohash->{'installlogdir'} =~ /\Q$oldvalue\E\s*$/ ) && ( ! ( $followmeinfohash->{'installlogdir'} =~ /\Q$srcpath\E/ ))) { $followmeinfohash->{'installlogdir'} =~ s/\Q$oldvalue\E\s*$/$newvalue/; } - if (( $installer::globals::unpackpath =~ /\Q$oldvalue\E\s*$/ ) && ( ! ( $installer::globals::unpackpath =~ /\Q$srcpath\E/ ))) { $installer::globals::unpackpath =~ s/\Q$oldvalue\E\s*$/$newvalue/; } - if (( $installer::globals::idttemplatepath =~ /\Q$oldvalue\E\s*$/ ) && ( ! ( $installer::globals::idttemplatepath =~ /\Q$srcpath\E/ ))) { $installer::globals::idttemplatepath =~ s/\Q$oldvalue\E\s*$/$newvalue/; } - if (( $installer::globals::idtlanguagepath =~ /\Q$oldvalue\E\s*$/ ) && ( ! ( $installer::globals::idtlanguagepath =~ /\Q$srcpath\E/ ))) { $installer::globals::idtlanguagepath =~ s/\Q$oldvalue\E\s*$/$newvalue/; } - foreach my $path ( @{$followmeinfohash->{'includepatharray'}} ) - { - if (( $path =~ /\Q$oldvalue\E\s*$/ ) && ( ! ( $path =~ /\Q$srcpath\E/ ))) - { - $path =~ s/\Q$oldvalue\E\s*$/$newvalue/; - $path = $path . "\n"; - } - } - } - - # And now can follow the replacement for the source path "src". Subdirs like "bin" in the source tree - # must not get the minor. This is instead "src.m9/instsetoo_native/common.pro/bin/..." - # Directory "src" can never be the end of the path - - my $newsrcpath = $installer::globals::separator . $sourcename . "\." . $installer::globals::lastminor . $installer::globals::separator; - - if ( $followmeinfohash->{'installlogdir'} =~ /\Q$srcpath\E/ ) { $followmeinfohash->{'installlogdir'} =~ s/\Q$srcpath\E/$newsrcpath/; } - if ( $installer::globals::unpackpath =~ /\Q$srcpath\E/ ) { $installer::globals::unpackpath =~ s/\Q$srcpath\E/$newsrcpath/; } - if ( $installer::globals::idttemplatepath =~ /\Q$srcpath\E/ ) { $installer::globals::idttemplatepath =~ s/\Q$srcpath\E/$newsrcpath/; } - if ( $installer::globals::idtlanguagepath =~ /\Q$srcpath\E/ ) { $installer::globals::idtlanguagepath =~ s/\Q$srcpath\E/$newsrcpath/; } - foreach my $path ( @{$followmeinfohash->{'includepatharray'}} ) { if ( $path =~ /\Q$srcpath\E/ ) { $path =~ s/\Q$srcpath\E/$newsrcpath/; } } - - $infoline = "\nNew pathes:\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "\$followmeinfohash->{'installlogdir'}: $followmeinfohash->{'installlogdir'}\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "\$installer::globals::unpackpath: $installer::globals::unpackpath\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "\$installer::globals::idttemplatepath: $installer::globals::idttemplatepath\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "\$installer::globals::idtlanguagepath: $installer::globals::idtlanguagepath\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "Include pathes:\n"; - push( @installer::globals::logfileinfo, $infoline); - foreach my $path ( @{$followmeinfohash->{'includepatharray'}} ) { push( @installer::globals::logfileinfo, $path); } -} - -############################################# -# Setting the name of the log file -############################################# - -sub setlogfilename -{ - if ( $installer::globals::dosign ) { $installer::globals::logfilename = "sign_and_download_" . $installer::globals::logfilename; } - else { $installer::globals::logfilename = "download_" . $installer::globals::logfilename; } - # reset the log file - @installer::globals::logfileinfo = (); -} - -######################################################### -# Checking, if this is a task in a cws or -# on the master. Simple check of naming schema: -# CWS: follow_me_DEV300_m40_de.log -# Master: follow_me_4_DEV300_m40_en-US.log -######################################################### - -sub check_cws_build -{ - my ( $filename ) = @_; - - my $iscws = 1; - - if ( $filename =~ /follow_me_\d+_/ ) { $iscws = 0; } - - return $iscws; -} - -######################################################### -# Reading a specific key from a follow-me file -######################################################### - -sub get_property_from_file -{ - my ($followmefile, $key) = @_; - - my $value = ""; - - my $filecontent = installer::files::read_file($followmefile); - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( ${$filecontent}[$i] =~ /^\s*\Q$key\E\s*\:\s*(.*?)\s*$/ ) - { - $value = $1; - last; - } - } - - return $value; -} - -######################################################### -# Publishing the content of the product list -######################################################### - -sub publishproductlist -{ - my ($infofilelist) = @_; - - installer::logger::print_message( "\n... found products: ...\n" ); - - for ( my $i = 0; $i <= $#{$infofilelist}; $i++ ) - { - my $onefile = ${$infofilelist}[$i]; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$onefile); - installer::logger::print_message( "...... $onefile ...\n" ); - } - - installer::logger::print_message( "\n" ); -} - -######################################################### -# Filtering all files, that have correct minor -# and work stamp. -# Master: follow_me_4_DEV300_m40_en-US.log -######################################################### - -sub filter_all_files_with_correct_settings -{ - my ($allfollowmefiles) = @_; - - my @allfiles = (); - my @allfiles2 = (); - my $maxhash = (); - - my $minor = ""; - my $workstamp = ""; - - if ( $ENV{'WORK_STAMP'} ) { $workstamp = $ENV{'WORK_STAMP'}; } - - # This is broken, we don't want to support any UPDMINOR - # complexities in LibreOffice. (Or do we?) This needs updating if - # we want to actually use this file for signing. - - if ( $ENV{'UPDMINOR'} ) { $minor = $ENV{'UPDMINOR'}; } - - if ( $minor eq "" ) { installer::exiter::exit_program("ERROR: Environment variable \"UPDMINOR\" not set!", "filter_all_files_with_correct_settings"); } - if ( $workstamp eq "" ) { installer::exiter::exit_program("ERROR: Environment variable \"WORK_STAMP\" not set!", "filter_all_files_with_correct_settings"); } - - foreach my $onefile ( @{$allfollowmefiles} ) - { - if (( $onefile =~ /_\Q$minor\E_/i ) && ( $onefile =~ /_\Q$workstamp\E_/i )) - { - push(@allfiles, $onefile); - - # also collecting maximum hash - - if ( $onefile =~ /follow_me_(\d+)_\Q$workstamp\E_\Q$minor\E_([-\w]+)\.log\s*$/i ) - { - my $sequence = $1; - my $lang = $2; - - if (( ! exists($maxhash{$lang})) || ( $maxhash{$lang} < $sequence )) { $maxhash{$lang} = $sequence; } - } - } - } - - # second run, because of sequence numbers - - foreach my $onefile ( @allfiles ) - { - if ( $onefile =~ /follow_me_(\d+)_\Q$workstamp\E_\Q$minor\E_([-\w]+)\.log\s*$/i ) - { - my $sequence = $1; - my $lang = $2; - - if ( $sequence == $maxhash{$lang} ) { push(@allfiles2, $onefile); } - } - } - - return ( \@allfiles2 ); -} - -######################################################### -# Creating a list of products, that need to be signed -# or for which download sets need to be created. -######################################################### - -sub createproductlist -{ - # If "-d" specifies an installation set, there is only one product - - my @infofilelist = (); - my @infofilelist2 = (); - - if ( -f $installer::globals::followmeinfofilename ) - { - push(@infofilelist, $installer::globals::followmeinfofilename); - # Saving info, that this is a file - $installer::globals::followme_from_directory = 0; - } - elsif ( -d $installer::globals::followmeinfofilename ) - { - installer::logger::print_message( "\n... reading directory: $installer::globals::followmeinfofilename ...\n" ); - $installer::globals::followmeinfofilename =~ s/$installer::globals::separator\s*$//; - my $allfollowmefiles = installer::systemactions::find_file_with_file_extension("log", $installer::globals::followmeinfofilename); - - if ( ! ( $#{$allfollowmefiles} > -1 )) - { - installer::logger::print_error( "Error: Nothing to do! No follow-me file in directory \"$installer::globals::followmeinfofilename\"!.\n" ); - usage(); - exit(-1); - } - - # Saving info, that this is a directory - $installer::globals::followme_from_directory = 1; - - # Collect all possible installation sets - # CWS: All installation sets - # Master: All installation sets with same major, minor and buildid. Additionally using the highest number. - - my $iscws = check_cws_build(${$allfollowmefiles}[0]); - - if ( $iscws ) - { - # Simply read all follow-me files and check existence of installation sets - foreach my $onefile ( @{$allfollowmefiles} ) - { - my $fullfilename = $installer::globals::followmeinfofilename . $installer::globals::separator . $onefile; - my $installdir = get_property_from_file($fullfilename, "finalinstalldir"); - if (( $installdir ne "" ) && ( -d $installdir )) { push(@infofilelist2, $fullfilename); } - } - } - else - { - $allfollowmefiles = filter_all_files_with_correct_settings($allfollowmefiles); - - foreach my $onefile ( @{$allfollowmefiles} ) - { - my $fullfilename = $installer::globals::followmeinfofilename . $installer::globals::separator . $onefile; - # Check, if installation set still exists - my $installdir = get_property_from_file($fullfilename, "finalinstalldir"); - if (( $installdir ne "" ) && ( -d $installdir )) { push(@infofilelist2, $fullfilename); } - } - } - - # Removing all files, starting with "follow_me_success_" in their names. This have already been used successfully. - - foreach my $onefile ( @infofilelist2 ) - { - if ( $onefile =~ /follow_me_success_/ ) { next; } - push(@infofilelist, $onefile); - } - - # Checking, if there is content in the list - if ( ! ( $#infofilelist > -1 )) - { - installer::logger::print_error( "Error: Nothing to do! No installation set found for follow-me files in directory \"$installer::globals::followmeinfofilename\"!.\n" ); - usage(); - exit(-1); - } - } - else - { - installer::logger::print_error( "Error: Nothing to do! \"$installer::globals::followmeinfofilename\" is no file and no directory (-d).\n" ); - usage(); - exit(-1); - } - - return \@infofilelist; -} - -############################################# -# Logging the content of the download hash -############################################# - -sub logfollowmeinfohash -{ - my ( $followmehash ) = @_; - - print "\n*****************************************\n"; - print "Content of follow-me info file:\n"; - print "finalinstalldir: $followmehash->{'finalinstalldir'}\n"; - print "downloadname: $followmehash->{'downloadname'}\n"; - print "languagestring: $followmehash->{'languagestring'}\n"; - foreach my $lang ( @{$followmehash->{'languagesarray'}} ) { print "languagesarray: $lang\n"; } - foreach my $path ( @{$followmehash->{'includepatharray'}} ) { print "includepatharray: $path"; } - foreach my $key ( sort keys %{$followmehash->{'allvariableshash'}} ) { print "allvariableshash: $key : $followmehash->{'allvariableshash'}->{$key}\n"; } -} - -######################################################################## -# Renaming the follow me info file, if it was successfully used. -# This can only be done, if the parameter "-d" was used with a -# directory, not a name. In this case the repeated use of parameter -# "-d" with this directory has to ignore this already successfully -# used file. -######################################################################## - -sub rename_followme_infofile -{ - my ( $filename ) = @_; - - my $newfilename = $filename; - $newfilename =~ s/follow_me_/follow_me_success_/; # including "_success" after "follow_me" - - if ( $filename ne $newfilename ) - { - my $returnvalue = rename($filename, $newfilename); - if ( $returnvalue ) { installer::logger::print_message( "\n... renamed file \"$filename\" to \"$newfilename\" ...\n" ); } - } -} - -1; diff --git a/solenv/bin/modules/installer/environment.pm b/solenv/bin/modules/installer/environment.pm deleted file mode 100644 index d9ddc51a4..000000000 --- a/solenv/bin/modules/installer/environment.pm +++ /dev/null @@ -1,136 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::environment; - -use installer::exiter; -use installer::globals; - -###################################################### -# Create path variables from environment variables -###################################################### - -sub create_pathvariables -{ - my ($environment) = @_; - - my %variables = (); - - # The following variables are needed in the path file list - # solarpath, solarenvpath, solarcommonpath, os, osdef, pmiscpath - - my $solarpath = $environment->{'SOLARVERSION'} . $installer::globals::separator . $installer::globals::compiler . $installer::globals::productextension; - $variables{'solarpath'} = $solarpath; - - my $solarcommonpath = $environment->{'SOLARVERSION'} . $installer::globals::separator . "common" . $installer::globals::productextension; - $variables{'solarcommonpath'} = $solarcommonpath; - - my $osdef = lc($environment->{'GUI'}); - $variables{'osdef'} = $osdef; - - $variables{'os'} = $installer::globals::compiler; - - my $solarenvpath = ""; - - if ( $ENV{'SO_PACK'} ) { $solarenvpath = $ENV{'SO_PACK'}; } - # overriding with STAR_INSTPATH, if set - if ( $ENV{'STAR_INSTPATH'} ) { $solarenvpath = $ENV{'STAR_INSTPATH'}; } - - $variables{'solarenvpath'} = $solarenvpath; - - my $localpath = $environment->{'LOCAL_OUT'}; - $variables{'localpath'} = $localpath; - - my $localcommonpath = $environment->{'LOCAL_COMMON_OUT'}; - $variables{'localcommonpath'} = $localcommonpath; - - my $platformname = $environment->{'OUTPATH'}; - $variables{'platformname'} = $platformname; - - return \%variables; -} - -################################################## -# Replacing tilde in pathes, because of -# problem with deep recursion (task 104830) -################################################## - -sub check_tilde_in_directory -{ - if ( $ENV{'HOME'} ) - { - my $home = $ENV{'HOME'}; - $home =~ s/\Q$installer::globals::separator\E\s*$//; - $installer::globals::localinstalldir =~ s/~/$home/; - my $infoline = "Info: Changing LOCALINSTALLDIR to $installer::globals::localinstalldir\n"; - push(@installer::globals::logfileinfo, $infoline); - } - else - { - # exit, because "~" is not allowed, if HOME is not set - my $infoline = "ERROR: If \"~\" is used in \"LOCALINSTALLDIR\", environment variable \"HOME\" needs to be defined!\n"; - push(@installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: If \"~\" is used in \"LOCALINSTALLDIR\", environment variable \"HOME\" needs to be defined!", "check_tilde_in_directory"); - } -} - -################################################## -# Setting some fundamental global variables. -# All these variables can be overwritten -# by parameters. -################################################## - -sub set_global_environment_variables -{ - my ( $environment ) = @_; - - $installer::globals::build = $environment->{'WORK_STAMP'}; - $installer::globals::compiler = $environment->{'OUTPATH'}; - - if ( $ENV{'LAST_MINOR'} ) { $installer::globals::lastminor = $ENV{'LAST_MINOR'}; } - - if ( $ENV{'PROEXT'} ) { $installer::globals::pro = 1; } - - if ( $ENV{'VERBOSE'} && ( (lc $ENV{'VERBOSE'}) eq "false" ) ) { $installer::globals::quiet = 1; } - if ( $ENV{'PREPARE_WINPATCH'} ) { $installer::globals::prepare_winpatch = 1; } - if ( $ENV{'PREVIOUS_IDT_DIR'} ) { $installer::globals::previous_idt_dir = $ENV{'PREVIOUS_IDT_DIR'}; } - if ( $ENV{'LOCALINSTALLDIR'} ) { $installer::globals::localinstalldir = $ENV{'LOCALINSTALLDIR'}; } - if ( $ENV{'LOCALUNPACKDIR'} ) { $installer::globals::localunpackdir = $ENV{'LOCALUNPACKDIR'}; } - if ( $ENV{'MAX_LANG_LENGTH'} ) { $installer::globals::max_lang_length = $ENV{'MAX_LANG_LENGTH'}; } - - if ( $ENV{'SOLAR_JAVA'} ) { $installer::globals::solarjavaset = 1; } - if ( $ENV{'RPM'} ) { $installer::globals::rpm = $ENV{'RPM'}; } - if ( $ENV{'DONTCOMPRESS'} ) { $installer::globals::solarisdontcompress = 1; } - if ( $ENV{'IGNORE_ERROR_IN_LOGFILE'} ) { $installer::globals::ignore_error_in_logfile = 1; } - if (( $ENV{'DISABLE_STRIP'} ) && ( $ENV{'DISABLE_STRIP'} ne '' )) { $installer::globals::strip = 0; } - - if ( $installer::globals::localinstalldir ) { $installer::globals::localinstalldirset = 1; } - # Special handling, if LOCALINSTALLDIR contains "~" in the path - if ( $installer::globals::localinstalldir =~ /^\s*\~/ ) { check_tilde_in_directory(); } -} - -1; diff --git a/solenv/bin/modules/installer/epmfile.pm b/solenv/bin/modules/installer/epmfile.pm deleted file mode 100644 index 3aeb4d8db..000000000 --- a/solenv/bin/modules/installer/epmfile.pm +++ /dev/null @@ -1,3359 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::epmfile; - -use Cwd; -use installer::converter; -use installer::existence; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::packagelist; -use installer::pathanalyzer; -use installer::remover; -use installer::scriptitems; -use installer::systemactions; -use installer::worker; -use POSIX; - -############################################################################ -# Reading the package map to find Solaris package names for -# the corresponding abbreviations -############################################################################ - -sub read_packagemap -{ - my ($allvariables, $includepatharrayref, $languagesarrayref) = @_; - - my $packagemapname = ""; - if ( $allvariables->{'PACKAGEMAP'} ) { $packagemapname = $allvariables->{'PACKAGEMAP'}; } - if ( $packagemapname eq "" ) { installer::exiter::exit_program("ERROR: Property PACKAGEMAP must be defined!", "read_packagemap"); } - - my $infoline = "\n\nCollected abbreviations and package names:\n"; - push(@installer::globals::logfileinfo, $infoline); - - # Can be a comma separated list. All files have to be found in include pathes - my $allpackagemapnames = installer::converter::convert_stringlist_into_hash(\$packagemapname, ","); - foreach my $onepackagemapname ( keys %{$allpackagemapnames} ) - { - my $packagemapref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$onepackagemapname, $includepatharrayref, 0); - - if ( $$packagemapref eq "" ) { installer::exiter::exit_program("ERROR: Could not find package map file \"$onepackagemapname\" (propery PACKAGEMAP)!", "read_packagemap"); } - - my $packagemapcontent = installer::files::read_file($$packagemapref); - - for ( my $i = 0; $i <= $#{$packagemapcontent}; $i++ ) - { - my $line = ${$packagemapcontent}[$i]; - - if ( $line =~ /^\s*\#/ ) { next; } # comment line - if ( $line =~ /^\s*$/ ) { next; } # empty line - - if ( $line =~ /^\s*(.*?)\t(.*?)\s*$/ ) - { - my $abbreviation = $1; - my $packagename = $2; - installer::packagelist::resolve_packagevariables(\$abbreviation, $allvariables, 0); - installer::packagelist::resolve_packagevariables(\$packagename, $allvariables, 0); - - # Special handling for language strings %LANGUAGESTRING - - if (( $abbreviation =~ /\%LANGUAGESTRING/ ) || ( $packagename =~ /\%LANGUAGESTRING/ )) - { - foreach my $onelang ( @{$languagesarrayref} ) - { - my $local_abbreviation = $abbreviation; - my $local_packagename = $packagename; - $local_abbreviation =~ s/\%LANGUAGESTRING/$onelang/g; - $local_packagename =~ s/\%LANGUAGESTRING/$onelang/g; - - # Logging all abbreviations and packagenames - $infoline = "$onelang : $local_abbreviation : $local_packagename\n"; - push(@installer::globals::logfileinfo, $infoline); - - if ( exists($installer::globals::dependfilenames{$local_abbreviation}) ) - { - installer::exiter::exit_program("ERROR: Packagename for Solaris package $local_abbreviation already defined ($installer::globals::dependfilenames{$local_abbreviation})!", "read_packagemap"); - } - else - { - $installer::globals::dependfilenames{$local_abbreviation} = $local_packagename; - } - } - } - else - { - # Logging all abbreviations and packagenames - $infoline = "$abbreviation : $packagename\n"; - push(@installer::globals::logfileinfo, $infoline); - - if ( exists($installer::globals::dependfilenames{$abbreviation}) ) - { - installer::exiter::exit_program("ERROR: Packagename for Solaris package $abbreviation already defined ($installer::globals::dependfilenames{$abbreviation})!", "read_packagemap"); - } - else - { - $installer::globals::dependfilenames{$abbreviation} = $packagename; - } - } - } - else - { - my $errorline = $i + 1; - installer::exiter::exit_program("ERROR: Wrong syntax in file \"$onepackagemapname\" (line $errorline)!", "read_packagemap"); - } - } - } - - $infoline = "\n\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -############################################################################ -# The header file contains the strings for the epm header in all languages -############################################################################ - -sub get_string_from_headerfile -{ - my ($searchstring, $language, $fileref) = @_; - - my $returnstring = ""; - my $onestring = ""; - my $englishstring = ""; - my $foundblock = 0; - my $foundstring = 0; - my $foundenglishstring = 0; - my $englishidentifier = "01"; - - $searchstring = "[" . $searchstring . "]"; - - for ( my $i = 0; $i <= $#{$fileref}; $i++ ) - { - my $line = ${$fileref}[$i]; - - if ( $line =~ /^\s*\Q$searchstring\E\s*$/ ) - { - $foundblock = 1; - my $counter = $i + 1; - - $line = ${$fileref}[$counter]; - - # Beginning of the next block oder Dateiende - - while ((!($line =~ /^\s*\[\s*\w+\s*\]\s*$/ )) && ( $counter <= $#{$fileref} )) - { - if ( $line =~ /^\s*\Q$language\E\s+\=\s*\"(.*)\"\s*$/ ) - { - $onestring = $1; - $foundstring = 1; - last; - } - - if ( $line =~ /^\s*\Q$englishidentifier\E\s+\=\s*\"(.*)\"\s*$/ ) - { - $englishstring = $1; - $foundenglishstring = 1; - } - - $counter++; - $line = ${$fileref}[$counter]; - } - } - } - - if ( $foundstring ) - { - $returnstring = $onestring; - } - else - { - if ( $foundenglishstring ) - { - $returnstring = $englishstring; - } - else - { - installer::exiter::exit_program("ERROR: No string found for $searchstring in epm header file (-h)", "get_string_from_headerfile"); - } - } - - return \$returnstring; -} - -########################################################## -# Filling the epm file with directories, files and links -########################################################## - -sub put_directories_into_epmfile -{ - my ($directoriesarrayref, $epmfileref, $allvariables, $packagerootpath) = @_; - my $group = "bin"; - - if ( $installer::globals::islinuxbuild ) - { - $group = "root"; - } - - for ( my $i = 0; $i <= $#{$directoriesarrayref}; $i++ ) - { - my $onedir = ${$directoriesarrayref}[$i]; - my $dir = ""; - - if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; } - - if ((!($dir =~ /\bPREDEFINED_/ )) || ( $dir =~ /\bPREDEFINED_PROGDIR\b/ )) - { - my $hostname = $onedir->{'HostName'}; - - my $line = "d 755 root $group $hostname -\n"; - - push(@{$epmfileref}, $line) - } - } -} - -sub put_files_into_epmfile -{ - my ($filesinproductarrayref, $epmfileref) = @_; - - for ( my $i = 0; $i <= $#{$filesinproductarrayref}; $i++ ) - { - my $onefile = ${$filesinproductarrayref}[$i]; - - my $unixrights = $onefile->{'UnixRights'}; - my $destination = $onefile->{'destination'}; - my $sourcepath = $onefile->{'sourcepath'}; - - my $filetype = "f"; - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - if ( $styles =~ /\bCONFIGFILE\b/ ) { $filetype = "c"; } - - my $group = "bin"; - if ( $installer::globals::islinuxbuild ) { $group = "root"; } - if (( $installer::globals::issolarisbuild ) && ( $onefile->{'SolarisGroup'} )) { $group = $onefile->{'SolarisGroup'}; } - - my $line = "$filetype $unixrights root $group $destination $sourcepath\n"; - - push(@{$epmfileref}, $line); - } -} - -sub put_links_into_epmfile -{ - my ($linksinproductarrayref, $epmfileref) = @_; - my $group = "bin"; - - if ( $installer::globals::islinuxbuild ) - { - $group = "root"; - } - - - for ( my $i = 0; $i <= $#{$linksinproductarrayref}; $i++ ) - { - my $onelink = ${$linksinproductarrayref}[$i]; - my $destination = $onelink->{'destination'}; - my $destinationfile = $onelink->{'destinationfile'}; - - my $line = "l 000 root $group $destination $destinationfile\n"; - - push(@{$epmfileref}, $line) - } -} - -sub put_unixlinks_into_epmfile -{ - my ($unixlinksinproductarrayref, $epmfileref) = @_; - my $group = "bin"; - - if ( $installer::globals::islinuxbuild ) { $group = "root"; } - - for ( my $i = 0; $i <= $#{$unixlinksinproductarrayref}; $i++ ) - { - my $onelink = ${$unixlinksinproductarrayref}[$i]; - my $destination = $onelink->{'destination'}; - my $target = $onelink->{'Target'}; - - my $line = "l 000 root $group $destination $target\n"; - - push(@{$epmfileref}, $line) - } -} - -############################################### -# Creating epm header file -############################################### - -sub create_epm_header -{ - my ($variableshashref, $filesinproduct, $languagesref, $onepackage) = @_; - - my @epmheader = (); - - my ($licensefilename, $readmefilename, $readmefilenameen); - - my $foundlicensefile = 0; - my $foundreadmefile = 0; - - my $line = ""; - my $infoline = ""; - - # %product LibreOffice Software - # %version 2.0 - # %description A really great software - # %copyright 1999-2003 by OOo - # %vendor LibreOffice - # %license /test/replace/01/LICENSE01 - # %readme /test/replace/01/README01 - # %requires foo - # %provides bar - - # The first language in the languages array determines the language of license and readme file - - my $searchlanguage = ${$languagesref}[0]; - - # using the description for the %product line in the epm list file - - my $productnamestring = $onepackage->{'description'}; - installer::packagelist::resolve_packagevariables(\$productnamestring, $variableshashref, 0); - if ( $variableshashref->{'PRODUCTEXTENSION'} ) { $productnamestring = $productnamestring . " " . $variableshashref->{'PRODUCTEXTENSION'}; } - - $line = "%product" . " " . $productnamestring . "\n"; - push(@epmheader, $line); - - # Determining the release version - # This release version has to be listed in the line %version : %version versionnumber releasenumber - - if ( ! $onepackage->{'packageversion'} ) { installer::exiter::exit_program("ERROR: No packageversion defined for package: $onepackage->{'module'}!", "create_epm_header"); } - $installer::globals::packageversion = $onepackage->{'packageversion'}; - installer::packagelist::resolve_packagevariables(\$installer::globals::packageversion, $variableshashref, 0); - if ( $variableshashref->{'PACKAGEREVISION'} ) { $installer::globals::packagerevision = $variableshashref->{'PACKAGEREVISION'}; } - - $line = "%version" . " " . $installer::globals::packageversion . "\n"; - push(@epmheader, $line); - - $line = "%release" . " " . $installer::globals::packagerevision . "\n"; - if ( $installer::globals::isrpmbuild ) { $line = "%release" . " " . $installer::globals::buildid . "\n"; } - push(@epmheader, $line); - - # Description, Copyright and Vendor are multilingual and are defined in - # the string file for the header file ($headerfileref) - - my $descriptionstring = $onepackage->{'description'}; - installer::packagelist::resolve_packagevariables(\$descriptionstring, $variableshashref, 0); - $line = "%description" . " " . $descriptionstring . "\n"; - push(@epmheader, $line); - - my $copyrightstring = $onepackage->{'copyright'}; - installer::packagelist::resolve_packagevariables(\$copyrightstring, $variableshashref, 0); - $line = "%copyright" . " " . $copyrightstring . "\n"; - push(@epmheader, $line); - - my $vendorstring = $onepackage->{'vendor'}; - installer::packagelist::resolve_packagevariables(\$vendorstring, $variableshashref, 0); - $line = "%vendor" . " " . $vendorstring . "\n"; - push(@epmheader, $line); - - # License and Readme file can be included automatically from the file list - - if ( $installer::globals::iswindowsbuild ) - { - $licensefilename = "license.txt"; - $readmefilename = "readme.txt"; - $readmefilenameen = "readme_en-US.txt"; - } - else - { - $licensefilename = "LICENSE"; - $readmefilename = "README"; - $readmefilenameen = "README_en-US"; - } - - if (( $installer::globals::languagepack ) # in language packs and help packs the files LICENSE and README are removed, because they are not language specific - || ( $installer::globals::helppack ) - || ( $variableshashref->{'NO_README_IN_ROOTDIR'} )) - { - if ( $installer::globals::iswindowsbuild ) - { - $licensefilename = "license.txt"; # _$searchlanguage.txt"; - $readmefilename = "readme_$searchlanguage.txt"; - } - else - { - $licensefilename = "LICENSE"; # _$searchlanguage"; - $readmefilename = "README_$searchlanguage"; - } - } - - my $license_in_package_defined = 0; - - if ( $installer::globals::issolarisbuild ) - { - if ( $onepackage->{'solariscopyright'} ) - { - $licensefilename = $onepackage->{'solariscopyright'}; - $license_in_package_defined = 1; - } - } - - # Process for Linux packages, in which only a very basic license file is - # included into the package. - - if ( $installer::globals::islinuxbuild ) - { - if ( $variableshashref->{'COPYRIGHT_INTO_LINUXPACKAGE'} ) - { - $licensefilename = "linuxcopyrightfile"; - $license_in_package_defined = 1; - } - } - - # searching for and readme file; - # URE uses special README; others use README_en-US - # it does not matter which one is passed for epm if both are packaged - foreach my $possiblereadmefilename ($readmefilenameen, $readmefilename) - { - last if ($foundreadmefile); - for ( my $i = 0; $i <= $#{$filesinproduct}; $i++ ) - { - my $onefile = ${$filesinproduct}[$i]; - my $filename = $onefile->{'Name'}; - if ( $filename eq $possiblereadmefilename ) - { - $foundreadmefile = 1; - $line = "%readme" . " " . $onefile->{'sourcepath'} . "\n"; - push(@epmheader, $line); - last; - } - } - } - - # the readme file need not be packaged more times in the help content - # it needs to be installed in parallel with the main package anyway - # try to find the README file between all available files (not only between the packaged) - if (!($foundreadmefile) && $installer::globals::helppack) - { - my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$readmefilenameen, "" , 0); - if($$fileref ne "" ) - { - $infoline = "Fallback to readme file: \"$$fileref\"!\n"; - push(@installer::globals::logfileinfo, $infoline); - - $foundreadmefile = 1; - $line = "%readme" . " " . $$fileref . "\n"; - push(@epmheader, $line); - } - } - - # searching for and license file - - if ( $license_in_package_defined ) - { - my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, "" , 0); - - if ( $$fileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find license file $licensefilename (A)!", "create_epm_header"); } - - # Special handling to add the content of the file "license_en-US" to the solaris copyrightfile. But not for all products - - if (( $installer::globals::issolarispkgbuild ) && ( ! $variableshashref->{'NO_LICENSE_INTO_COPYRIGHT'} )) - { - if ( ! $installer::globals::englishlicenseset ) { installer::worker::set_english_license() } - - # The location for the new file - my $languagestring = ""; - for ( my $i = 0; $i <= $#{$languagesref}; $i++ ) { $languagestring = $languagestring . "_" . ${$languagesref}[$i]; } - $languagestring =~ s/^\s*_//; - - my $copyrightdir = installer::systemactions::create_directories("copyright", \$languagestring); - - my $copyrightfile = installer::files::read_file($$fileref); - - # Adding license content to copyright file - push(@{$copyrightfile}, "\n"); - for ( my $i = 0; $i <= $#{$installer::globals::englishlicense}; $i++ ) { push(@{$copyrightfile}, ${$installer::globals::englishlicense}[$i]); } - - # New destination for $$fileref - $$fileref = $copyrightdir . $installer::globals::separator . "solariscopyrightfile_" . $onepackage->{'module'}; - if ( -f $$fileref ) { unlink $$fileref; } - installer::files::save_file($$fileref, $copyrightfile); - } - - $infoline = "Using license file: \"$$fileref\"!\n"; - push(@installer::globals::logfileinfo, $infoline); - - $foundlicensefile = 1; - $line = "%license" . " " . $$fileref . "\n"; - push(@epmheader, $line); - } - else - { - for ( my $i = 0; $i <= $#{$filesinproduct}; $i++ ) - { - my $onefile = ${$filesinproduct}[$i]; - my $filename = $onefile->{'Name'}; - - if ( $filename eq $licensefilename ) - { - $foundlicensefile = 1; - $line = "%license" . " " . $onefile->{'sourcepath'} . "\n"; - push(@epmheader, $line); - last; - } - } - - # the license file need not be packaged more times in the langpacks - # they need to be installed in parallel with the main package anyway - # try to find the LICENSE file between all available files (not only between the packaged) - if (!($foundlicensefile) && ($installer::globals::languagepack || $installer::globals::helppack)) - { - my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, "" , 0); - if($$fileref ne "" ) - { - $infoline = "Fallback to license file: \"$$fileref\"!\n"; - push(@installer::globals::logfileinfo, $infoline); - - $foundlicensefile = 1; - $line = "%license" . " " . $$fileref . "\n"; - push(@epmheader, $line); - } - } - } - - if (!($foundlicensefile)) - { - installer::exiter::exit_program("ERROR: Could not find license file $licensefilename (B)", "create_epm_header"); - } - - if (!($foundreadmefile)) - { - installer::exiter::exit_program("ERROR: Could not find readme file $readmefilename (C)", "create_epm_header"); - } - - # including %replaces - - my $replaces = ""; - - if (( $installer::globals::issolarispkgbuild ) && ( ! $installer::globals::patch )) - { - $replaces = "solarisreplaces"; # the name in the packagelist - } - elsif (( $installer::globals::islinuxbuild ) && ( ! $installer::globals::patch )) - { - $replaces = "linuxreplaces"; # the name in the packagelist - } - - if (( $replaces ) && ( ! $installer::globals::patch )) - { - if ( $onepackage->{$replaces} ) - { - my $replacesstring = $onepackage->{$replaces}; - - my $allreplaces = installer::converter::convert_stringlist_into_array(\$replacesstring, ","); - - for ( my $i = 0; $i <= $#{$allreplaces}; $i++ ) - { - my $onereplaces = ${$allreplaces}[$i]; - $onereplaces =~ s/\s*$//; - installer::packagelist::resolve_packagevariables(\$onereplaces, $variableshashref, 1); - if ( $installer::globals::linuxlinkrpmprocess ) { $onereplaces = $onereplaces . "u"; } - $line = "%replaces" . " " . $onereplaces . "\n"; - push(@epmheader, $line); - - # Force the openofficeorg packages to get removed, - # see http://www.debian.org/doc/debian-policy/ch-relationships.html - # 7.5.2 Replacing whole packages, forcing their removal - - if ( $installer::globals::debian ) - { - $line = "%incompat" . " " . $onereplaces . "\n"; - push(@epmheader, $line); - } - } - - if ( $installer::globals::debian && $variableshashref->{'UNIXPRODUCTNAME'} eq 'libreoffice' ) - { - $line = "%provides" . " libreoffice-unbundled\n"; - push(@epmheader, $line); - $line = "%incompat" . " libreoffice-bundled\n"; - push(@epmheader, $line); - } - } - } - - # including the directives for %requires and %provides - - my $provides = ""; - my $requires = ""; - - if ( $installer::globals::issolarispkgbuild ) - { - $provides = "solarisprovides"; # the name in the packagelist - $requires = "solarisrequires"; # the name in the packagelist - } - elsif ( $installer::globals::isfreebsdpkgbuild ) - { - $provides = "freebsdprovides"; # the name in the packagelist - $requires = "freebsdrequires"; # the name in the packagelist - } - elsif (( $installer::globals::isrpmbuild ) && - ( $installer::globals::patch ) && - ( exists($onepackage->{'linuxpatchrequires'}) )) - { - $provides = "provides"; # the name in the packagelist - $requires = "linuxpatchrequires"; # the name in the packagelist - } - else - { - $provides = "provides"; # the name in the packagelist - $requires = "requires"; # the name in the packagelist - } - - my $isdict = 0; - if ( $onepackage->{'packagename'} =~ /-dict-/ ) { $isdict = 1; } - - if ( $onepackage->{$provides} ) - { - my $providesstring = $onepackage->{$provides}; - - my $allprovides = installer::converter::convert_stringlist_into_array(\$providesstring, ","); - - for ( my $i = 0; $i <= $#{$allprovides}; $i++ ) - { - my $oneprovides = ${$allprovides}[$i]; - $oneprovides =~ s/\s*$//; - installer::packagelist::resolve_packagevariables(\$oneprovides, $variableshashref, 1); - if ( $installer::globals::linuxlinkrpmprocess ) { $oneprovides = $oneprovides . "u"; } - $line = "%provides" . " " . $oneprovides . "\n"; - push(@epmheader, $line); - } - } - - if ( $onepackage->{$requires} ) - { - my $requiresstring = $onepackage->{$requires}; - - if ( $installer::globals::add_required_package ) { $requiresstring = $requiresstring . "," . $installer::globals::add_required_package; } - - # The requires string can contain the separator "," in the names (descriptions) of the packages - # (that are required for Solaris depend files). Therefore "," inside such a description has to - # masked with a backslash. - # This masked separator need to be found and replaced, before the stringlist is converted into an array. - # This replacement has to be turned back after the array is created. - - my $replacementstring = "COMMAREPLACEMENT"; - $requiresstring = installer::converter::replace_masked_separator($requiresstring, ",", "$replacementstring"); - - my $allrequires = installer::converter::convert_stringlist_into_array(\$requiresstring, ","); - - installer::converter::resolve_masked_separator($allrequires, ",", $replacementstring); - - for ( my $i = 0; $i <= $#{$allrequires}; $i++ ) - { - my $onerequires = ${$allrequires}[$i]; - $onerequires =~ s/\s*$//; - installer::packagelist::resolve_packagevariables2(\$onerequires, $variableshashref, 0, $isdict); - - $line = "%requires" . " " . $onerequires . "\n"; - push(@epmheader, $line); - } - } - else - { - if ( $installer::globals::add_required_package ) - { - my $requiresstring = $installer::globals::add_required_package; - - my $replacementstring = "COMMAREPLACEMENT"; - $requiresstring = installer::converter::replace_masked_separator($requiresstring, ",", "$replacementstring"); - my $allrequires = installer::converter::convert_stringlist_into_array(\$requiresstring, ","); - installer::converter::resolve_masked_separator($allrequires, ",", $replacementstring); - - for ( my $i = 0; $i <= $#{$allrequires}; $i++ ) - { - my $onerequires = ${$allrequires}[$i]; - $onerequires =~ s/\s*$//; - installer::packagelist::resolve_packagevariables(\$onerequires, $variableshashref, 0); - - $line = "%requires" . " " . $onerequires . "\n"; - push(@epmheader, $line); - } - } - } - - return \@epmheader; -} - -####################################### -# Adding header to epm file -####################################### - -sub adding_header_to_epm_file -{ - my ($epmfileref, $epmheaderref) = @_; - - for ( my $i = 0; $i <= $#{$epmheaderref}; $i++ ) - { - push( @{$epmfileref}, ${$epmheaderref}[$i] ); - } - - push( @{$epmfileref}, "\n\n" ); -} - -##################################################### -# Replace one in shell scripts ( ${VARIABLENAME} ) -##################################################### - -sub replace_variable_in_shellscripts -{ - my ($scriptref, $variable, $searchstring) = @_; - - for ( my $i = 0; $i <= $#{$scriptref}; $i++ ) - { - ${$scriptref}[$i] =~ s/\$\{$searchstring\}/$variable/g; - } -} - -################################################### -# Replace one in shell scripts ( %VARIABLENAME ) -################################################### - -sub replace_percent_variable_in_shellscripts -{ - my ($scriptref, $variable, $searchstring) = @_; - - for ( my $i = 0; $i <= $#{$scriptref}; $i++ ) - { - ${$scriptref}[$i] =~ s/\%$searchstring/$variable/g; - } -} - -################################################ -# Replacing many variables in shell scripts -################################################ - -sub replace_many_variables_in_shellscripts -{ - my ($scriptref, $variableshashref) = @_; - - my $key; - - foreach $key (keys %{$variableshashref}) - { - my $value = $variableshashref->{$key}; - replace_variable_in_shellscripts($scriptref, $value, $key); - } -} - -####################################### -# Adding shell scripts to epm file -####################################### - -sub adding_shellscripts_to_epm_file -{ - my ($epmfileref, $shellscriptsfilename, $localrootpath, $allvariableshashref, $filesinpackage) = @_; - - push( @{$epmfileref}, "\n\n" ); - - my $shellscriptsfileref = installer::files::read_file($shellscriptsfilename); - - replace_variable_in_shellscripts($shellscriptsfileref, $localrootpath, "rootpath"); - - replace_many_variables_in_shellscripts($shellscriptsfileref, $allvariableshashref); - - for ( my $i = 0; $i <= $#{$shellscriptsfileref}; $i++ ) - { - push( @{$epmfileref}, ${$shellscriptsfileref}[$i] ); - } - - push( @{$epmfileref}, "\n" ); -} - -################################################# -# Determining the epm on the system -################################################# - -sub find_epm_on_system -{ - my ($includepatharrayref) = @_; - - installer::logger::include_header_into_logfile("Check epm on system"); - - my $epmname = "epm"; - - # epm should be defined through the configure script but we need to - # check for it to be defined because of the Sun environment. - # Check the environment variable first and if it is not defined, - # or if it is but the location is not executable, search further. - # It has to be found in the solver or it has to be in the path - # (saved in $installer::globals::epm_in_path) or we get the specified - # one through the environment (i.e. when --with-epm=... is specified) - - if ($ENV{'EPM'}) - { - if (($ENV{'EPM'} ne "") && (-x "$ENV{'EPM'}")) - { - $epmname = $ENV{'EPM'}; - } - elsif ( ($ENV{'EPM'} eq "no") || ($ENV{'EPM'} eq "internal") ) - { - $epmname = "epm"; - my $epmref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$epmname, $includepatharrayref, 0); - if ($$epmref eq "") { installer::exiter::exit_program("ERROR: Could not find program $epmname (EPM set to \"internal\" or \"no\")!", "find_epm_on_system"); } - $epmname = $$epmref; - } - else - { - installer::exiter::exit_program("Environment variable EPM set (\"$ENV{'EPM'}\"), but file does not exist or is not executable!", "find_epm_on_system"); - } - } - else - { - my $epmfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$epmname, $includepatharrayref, 0); - - if (($$epmfileref eq "") && (!($installer::globals::epm_in_path))) { installer::exiter::exit_program("ERROR: Could not find program $epmname!", "find_epm_on_system"); } - if (($$epmfileref eq "") && ($installer::globals::epm_in_path)) { $epmname = $installer::globals::epm_path; } - if (!($$epmfileref eq "")) { $epmname = $$epmfileref; } - } - - my $infoline = "Using epmfile: $epmname\n"; - push( @installer::globals::logfileinfo, $infoline); - - return $epmname; -} - -################################################# -# Determining the epm patch state -# saved in $installer::globals::is_special_epm -################################################# - -sub set_patch_state -{ - my ($epmexecutable) = @_; - - my $infoline = ""; - - my $systemcall = "$epmexecutable |"; - open (EPMPATCH, "$systemcall"); - - while (<EPMPATCH>) - { - chop; - if ( $_ =~ /Patched for OpenOffice.org/ ) { $installer::globals::is_special_epm = 1; } - } - - close (EPMPATCH); - - if ( $installer::globals::is_special_epm ) - { - $infoline = "\nPatch state: This is a patched version of epm!\n\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "\nPatch state: This is an unpatched version of epm!\n\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - if ( ( $installer::globals::is_special_epm ) && (($installer::globals::isrpmbuild) || ($installer::globals::issolarispkgbuild)) ) - { - # Special postprocess handling only for Linux RPM and Solaris packages - $installer::globals::postprocess_specialepm = 1; - $installer::globals::postprocess_standardepm = 0; - } - else - { - $installer::globals::postprocess_specialepm = 0; - $installer::globals::postprocess_standardepm = 1; - } -} - -################################################# -# LD_PRELOAD string for Debian packages -################################################# - -sub get_ld_preload_string -{ - my ($includepatharrayref) = @_; - - my $getuidlibraryname = "getuid.so"; - - my $getuidlibraryref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$getuidlibraryname, $includepatharrayref, 0); - if ($$getuidlibraryref eq "") { installer::exiter::exit_program("ERROR: Could not find $getuidlibraryname!", "get_ld_preload_string"); } - - my $ldpreloadstring = "LD_PRELOAD=" . $$getuidlibraryref; - - return $ldpreloadstring; -} - -################################################# -# Calling epm to create the installation sets -################################################# - -sub call_epm -{ - my ($epmname, $epmlistfilename, $packagename, $includepatharrayref) = @_; - - installer::logger::include_header_into_logfile("epm call for $packagename"); - - my $packageformat = $installer::globals::packageformat; - - my $localpackagename = $packagename; - # Debian allows only lowercase letters in package name - if ( $installer::globals::debian ) { $localpackagename = lc($localpackagename); } - - my $outdirstring = ""; - if ( $installer::globals::epmoutpath ne "" ) { $outdirstring = " --output-dir $installer::globals::epmoutpath"; } - - # Debian package build needs a LD_PRELOAD for correct rights - - my $ldpreloadstring = ""; - - if ( $installer::globals::debian ) { $ldpreloadstring = get_ld_preload_string($includepatharrayref) . " "; } - - my $extraflags = ""; - if ($ENV{'EPM_FLAGS'}) { $extraflags = $ENV{'EPM_FLAGS'}; } - - my $systemcall = $ldpreloadstring . $epmname . " -f " . $packageformat . " " . $extraflags . " " . $localpackagename . " " . $epmlistfilename . $outdirstring . " -v " . " 2\>\&1 |"; - - installer::logger::print_message( "... $systemcall ...\n" ); - - my $maxepmcalls = 3; - - for ( my $i = 1; $i <= $maxepmcalls; $i++ ) - { - my @epmoutput = (); - - open (EPM, "$systemcall"); - while (<EPM>) {push(@epmoutput, $_); } - close (EPM); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - my $infoline = "Systemcall (Try $i): $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $j = 0; $j <= $#epmoutput; $j++ ) - { - if ( $i < $maxepmcalls ) { $epmoutput[$j] =~ s/\bERROR\b/PROBLEM/ig; } - push( @installer::globals::logfileinfo, "$epmoutput[$j]"); - } - - if ($returnvalue) - { - $infoline = "Try $i : Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - if ( $i == $maxepmcalls ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "call_epm"); } - } - else - { - installer::logger::print_message( "Success (Try $i): \"$systemcall\"\n" ); - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } -} - -##################################################################### -# Adding the new line for relocatables into pkginfo file (Solaris) -# or spec file (Linux) created by epm -##################################################################### - -sub add_one_line_into_file -{ - my ($file, $insertline, $filename) = @_; - - if ( $installer::globals::issolarispkgbuild ) - { - push(@{$file}, $insertline); # simply adding at the end of pkginfo file - } - - if ( $installer::globals::isrpmbuild ) - { - # Adding behind the line beginning with: Group: - - my $inserted_line = 0; - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - if ( ${$file}[$i] =~ /^\s*Group\:\s*/ ) - { - splice(@{$file},$i+1,0,$insertline); - $inserted_line = 1; - last; - } - } - - if (! $inserted_line) { installer::exiter::exit_program("ERROR: Did not find string \"Group:\" in file: $filename", "add_one_line_into_file"); } - } - - $insertline =~ s/\s*$//; # removing line end for correct logging - my $infoline = "Success: Added line $insertline into file $filename!\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -##################################################################### -# Setting the revision VERSION=1.9,REV=66 . -# Also adding the new line: "AutoReqProv: no" -##################################################################### - -sub set_revision_in_pkginfo -{ - my ($file, $filename, $variables, $packagename) = @_; - - my $revisionstring = "\,REV\=" . $installer::globals::packagerevision; - - # Adding also a time string to the revision. Syntax: VERSION=8.0.0,REV=66.2005.01.24 - - my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); - - $mday = $mday; - $mon = $mon + 1; - $year = $year + 1900; - - if ( $mday < 10 ) { $mday = "0" . $mday; } - if ( $mon < 10 ) { $mon = "0" . $mon; } - $datestring = $year . "." . $mon . "." . $mday; - $revisionstring = $revisionstring . "." . $datestring; - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - if ( ${$file}[$i] =~ /^\s*(VERSION\=.*?)\s*$/ ) - { - my $oldstring = $1; - my $newstring = $oldstring . $revisionstring; # also adding the date string - ${$file}[$i] =~ s/$oldstring/$newstring/; - my $infoline = "Info: Changed in $filename file: \"$oldstring\" to \"$newstring\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } - - # For Update and Patch reasons, this string can also be kept constant - - my $pkgversion = "SOLSPARCPKGVERSION"; - if ( $installer::globals::issolarisx86build ) { $pkgversion = "SOLIAPKGVERSION"; } - - if (( $variables->{$pkgversion} ) && ( $variables->{$pkgversion} ne "" )) - { - if ( $variables->{$pkgversion} ne "FINALVERSION" ) - { - # In OOo 3.x timeframe, this string is no longer unique for all packages, because of the three layer. - # In the string: "3.0.0,REV=9.2008.09.30" only the part "REV=9.2008.09.30" can be unique for all packages - # and therefore be set as $pkgversion. - # The first part "3.0.0" has to be derived from the - - my $version = $installer::globals::packageversion; - if ( $version =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ ) - { - my $major = $1; - my $minor = $2; - my $micro = $3; - - my $finalmajor = $major; - my $finalminor = $minor; - my $finalmicro = 0; - - $version = "$finalmajor.$finalminor.$finalmicro"; - } - - my $datestring = $variables->{$pkgversion}; - - # Allowing some packages to have another date of creation. - # They can be defined in product definition using a key like "SOLSPARCPKGVERSION_$packagename" - - my $additionalkey = $pkgversion . "_" . $packagename; - if (( $variables->{$additionalkey} ) && ( $variables->{$additionalkey} ne "" )) { $datestring = $variables->{$additionalkey}; } - - my $versionstring = "$version,$datestring"; - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - if ( ${$file}[$i] =~ /^\s*(VERSION\=).*?\s*$/ ) - { - my $start = $1; - my $newstring = $start . $versionstring . "\n"; # setting the complete new string - my $oldstring = ${$file}[$i]; - ${$file}[$i] = $newstring; - $oldstring =~ s/\s*$//; - $newstring =~ s/\s*$//; - my $infoline = "Info: Changed in $filename file: \"$oldstring\" to \"$newstring\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } - } - } -} - -######################################################## -# Setting Patch information for Respin versions -# into pkginfo file. This prevents Respin versions -# from patching. -######################################################## - -sub set_patchlist_in_pkginfo_for_respin -{ - my ($changefile, $filename, $allvariables, $packagename) = @_; - - my $patchlistname = "SOLSPARCPATCHLISTFORRESPIN"; - if ( $installer::globals::issolarisx86build ) { $patchlistname = "SOLIAPATCHLISTFORRESPIN"; } - - if ( $allvariables->{$patchlistname} ) - { - # patchlist separator is a blank - my $allpatchesstring = $allvariables->{$patchlistname}; - my @usedpatches = (); - - # Analyzing the patchlist - # Syntax: 120186-10 126411-01(+core-01) -> use 126411-01 only for core-01 - # Syntax: 120186-10 126411-01(-core-01) -> use 126411-01 for all packages except for core-01 - my $allpatches = installer::converter::convert_whitespace_stringlist_into_array(\$allpatchesstring); - - for ( my $i = 0; $i <= $#{$allpatches}; $i++ ) - { - my $patchdefinition = ${$allpatches}[$i]; - - my $patchid = ""; - my $symbol = ""; - my $constraint = ""; - my $isusedpatch = 0; - - if ( $patchdefinition =~ /^\s*(.+)\(([+-])(.+)\)\s*$/ ) - { - $patchid = $1; - $symbol = $2; - $constraint = $3; - } - elsif (( $patchdefinition =~ /\(/ ) || ( $patchdefinition =~ /\)/ )) # small syntax check - { - # if there is a bracket in the $patchdefinition, but it does not - # match the if-condition, this is an erroneous definition. - installer::exiter::exit_program("ERROR: Unknown patch string: $patchdefinition", "set_patchlist_in_pkginfo_for_respin"); - } - else - { - $patchid = $patchdefinition; - $isusedpatch = 1; # patches without constraint are always included - } - - if ( $symbol ne "" ) - { - if ( $symbol eq "+" ) - { - if ( $packagename =~ /^.*\Q$constraint\E\s*$/ ) { $isusedpatch = 1; } - } - - if ( $symbol eq "-" ) - { - if ( ! ( $packagename =~ /^.*\Q$constraint\E\s*$/ )) { $isusedpatch = 1; } - } - } - - if ( $isusedpatch ) { push(@usedpatches, $patchid); } - } - - if ( $#usedpatches > -1 ) - { - my $patchstring = installer::converter::convert_array_to_space_separated_string(\@usedpatches); - - my $newline = "PATCHLIST=" . $patchstring . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - - # Adding patch info for each used patch in the patchlist - - for ( my $i = 0; $i <= $#usedpatches; $i++ ) - { - my $patchid = $usedpatches[$i]; - my $key = "PATCH_INFO_" . $patchid; - $key =~ s/\s*$//; - - if ( ! $allvariables->{$key} ) { installer::exiter::exit_program("ERROR: No Patch info available in zip list file for $key", "set_patchlist_in_pkginfo"); } - my $value = set_timestamp_in_patchinfo($allvariables->{$key}); - $newline = $key . "=" . $value . "\n"; - - add_one_line_into_file($changefile, $newline, $filename); - } - } - } -} - -######################################################## -# Solaris requires, that the time of patch installation -# must not be empty. -# Format: Mon Mar 24 11:20:56 PDT 2008 -# Log file: Tue Apr 29 23:26:19 2008 (04:31 min.) -# Replace string: ${TIMESTAMP} -######################################################## - -sub set_timestamp_in_patchinfo -{ - my ($value) = @_; - - my $currenttime = localtime(); - - if ( $currenttime =~ /^\s*(.+?)(\d\d\d\d)\s*$/ ) - { - my $start = $1; - my $year = $2; - $currenttime = $start . "CET " . $year; - } - - $value =~ s/\$\{TIMESTAMP\}/$currenttime/; - - return $value; -} - -######################################################## -# Setting MAXINST=1000 into the pkginfo file. -######################################################## - -sub set_maxinst_in_pkginfo -{ - my ($changefile, $filename) = @_; - - my $newline = "MAXINST\=1000\n"; - - add_one_line_into_file($changefile, $newline, $filename); -} - -############################################################# -# Setting several Solaris variables into the pkginfo file. -############################################################# - -sub set_solaris_parameter_in_pkginfo -{ - my ($changefile, $filename, $allvariables) = @_; - - my $newline = ""; - - # SUNW_PRODNAME - # SUNW_PRODVERS - # SUNW_PKGVERS - # Not: SUNW_PKGTYPE - # HOTLINE - # EMAIL - - my $productname = $allvariables->{'PRODUCTNAME'}; - $newline = "SUNW_PRODNAME=$productname\n"; - add_one_line_into_file($changefile, $newline, $filename); - - my $productversion = ""; - if ( $allvariables->{'PRODUCTVERSION'} ) - { - $productversion = $allvariables->{'PRODUCTVERSION'}; - if ( $allvariables->{'PRODUCTEXTENSION'} ) { $productversion = $productversion . "/" . $allvariables->{'PRODUCTEXTENSION'}; } - } - $newline = "SUNW_PRODVERS=$productversion\n"; - add_one_line_into_file($changefile, $newline, $filename); - - $newline = "SUNW_PKGVERS=1\.0\n"; - add_one_line_into_file($changefile, $newline, $filename); - - if ( $allvariables->{'SUNW_PKGTYPE'} ) - { - $newline = "SUNW_PKGTYPE=$allvariables->{'SUNW_PKGTYPE'}\n"; - add_one_line_into_file($changefile, $newline, $filename); - } - else - { - $newline = "SUNW_PKGTYPE=\n"; - add_one_line_into_file($changefile, $newline, $filename); - } - - $newline = "HOTLINE=Please contact your local service provider\n"; - add_one_line_into_file($changefile, $newline, $filename); - - $newline = "EMAIL=\n"; - add_one_line_into_file($changefile, $newline, $filename); - -} - -##################################################################### -# epm uses as archtecture for Solaris x86 "i86pc". This has to be -# changed to "i386". -##################################################################### - -sub fix_architecture_setting -{ - my ($changefile) = @_; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*ARCH=i86pc\s*$/ ) - { - ${$changefile}[$i] =~ s/i86pc/i386/; - last; - } - - } -} - -##################################################################### -# Adding a new line for topdir into specfile, removing old -# topdir if set. -##################################################################### - -sub set_topdir_in_specfile -{ - my ($changefile, $filename, $newepmdir) = @_; - - $newepmdir = cwd() . $installer::globals::separator . $newepmdir; # only absolute path allowed - - # removing "%define _topdir", if existing - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*\%define _topdir\s+/ ) - { - my $removeline = ${$changefile}[$i]; - $removeline =~ s/\s*$//; - splice(@{$changefile},$i,1); - my $infoline = "Info: Removed line \"$removeline\" from file $filename!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } - - # Adding "topdir" behind the line beginning with: Group: - - my $inserted_line = 0; - - my $topdirline = "\%define _topdir $newepmdir\n"; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*Group\:\s*/ ) - { - splice(@{$changefile},$i+1,0,$topdirline); - $inserted_line = 1; - $topdirline =~ s/\s*$//; - my $infoline = "Success: Added line $topdirline into file $filename!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - if (! $inserted_line) { installer::exiter::exit_program("ERROR: Did not find string \"Group:\" in file: $filename", "set_topdir_in_specfile"); } - -} - -##################################################################### -# Setting the packager in the spec file -# Syntax: Packager: abc@def -##################################################################### - -sub set_packager_in_specfile -{ - my ($changefile) = @_; - - my $packager = $installer::globals::longmanufacturer; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*Packager\s*:\s*(.+?)\s*$/ ) - { - my $oldstring = $1; - ${$changefile}[$i] =~ s/\Q$oldstring\E/$packager/; - my $infoline = "Info: Changed Packager in spec file from $oldstring to $packager!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } -} - -##################################################################### -# Setting the requirements in the spec file (i81494) -# Syntax: PreReq: "requirements" (only for shared extensions) -##################################################################### - -sub set_prereq_in_specfile -{ - my ($changefile) = @_; - - my $prereq = "PreReq:"; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*Requires:\s*(.+?)\s*$/ ) - { - my $oldstring = ${$changefile}[$i]; - ${$changefile}[$i] =~ s/Requires:/$prereq/; - my $infoline = "Info: Changed requirements in spec file from $oldstring to ${$changefile}[$i]!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } -} - -##################################################################### -# Setting the Auto[Req]Prov line and __find_requires -##################################################################### - -sub set_autoprovreq_in_specfile -{ - my ($changefile, $findrequires, $bindir) = @_; - - my $autoreqprovline; - - if ( $findrequires ) - { - $autoreqprovline = "AutoProv\: no\n%define __find_requires $bindir/$findrequires\n"; - } - else - { - $autoreqprovline = "AutoReqProv\: no\n"; - } - - $autoreqprovline .= "%define _binary_filedigest_algorithm 1\n%define _binary_payload w9.gzdio\n"; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - # Adding "autoreqprov" behind the line beginning with: Group: - if ( ${$changefile}[$i] =~ /^\s*Group\:\s*/ ) - { - splice(@{$changefile},$i+1,0,$autoreqprovline); - $autoreqprovline =~ s/\s*$//; - $infoline = "Success: Added line $autoreqprovline into spec file!\n"; - push( @installer::globals::logfileinfo, $infoline); - - last; - } - } -} - -##################################################################### -# Replacing Copyright with License in the spec file -# Syntax: License: LGPL, SISSL -##################################################################### - -sub set_license_in_specfile -{ - my ($changefile, $variableshashref) = @_; - - my $license = $variableshashref->{'LICENSENAME'}; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*Copyright\s*:\s*(.+?)\s*$/ ) - { - ${$changefile}[$i] = "License: $license\n"; - my $infoline = "Info: Replaced Copyright with License: $license !\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } -} - -######################################################### -# Building relocatable Solaris packages means: -# 1. Add "BASEDIR=/opt" into pkginfo -# 2. Remove "/opt/" from all objects in prototype file -# For step2 this function exists -# Sample: d none /opt/openofficeorg20/help 0755 root other -# -> d none openofficeorg20/help 0755 root other -######################################################### - -sub make_prototypefile_relocatable -{ - my ($prototypefile, $relocatablepath) = @_; - - for ( my $i = 0; $i <= $#{$prototypefile}; $i++ ) - { - if ( ${$prototypefile}[$i] =~ /^\s*\w\s+\w+\s+\/\w+/ ) # this is an object line - { - ${$prototypefile}[$i] =~ s/$relocatablepath//; # Important: $relocatablepath has a "/" at the end. Example "/opt/" - } - } - - # If the $relocatablepath is "/opt/openoffice20/" the line "d none /opt/openoffice20" was not changed. - # This line has to be removed now - - if ( $relocatablepath ne "/" ) { $relocatablepath =~ s/\/\s*$//; } # removing the ending slash - - for ( my $i = 0; $i <= $#{$prototypefile}; $i++ ) - { - if ( ${$prototypefile}[$i] =~ /^\s*d\s+\w+\s+\Q$relocatablepath\E/ ) - { - my $line = ${$prototypefile}[$i]; - splice(@{$prototypefile},$i,1); # removing the line - $line =~ s/\s*$//; - my $infoline = "Info: Removed line \"$line\" from prototype file!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } - - # Making "\$" to "$" in prototype file. "\$" was created by epm. - - for ( my $i = 0; $i <= $#{$prototypefile}; $i++ ) - { - if ( ${$prototypefile}[$i] =~ /\\\$/ ) - { - ${$prototypefile}[$i] =~ s/\\\$/\$/g; - my $infoline2 = "Info: Changed line in prototype file: ${$prototypefile}[$i] !\n"; - push( @installer::globals::logfileinfo, $infoline2); - } - } -} - - -######################################################################### -# In scp the flag VOLATEFILE can be used. This shall lead to style "v" -# in Solaris prototype file. This is not supported by epm and has -# therefore to be included in prototypefile, not in epm list file. -######################################################################### - -sub set_volatilefile_into_prototypefile -{ - my ($prototypefile, $filesref) = @_; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - - if ( $styles =~ /\bVOLATILEFILE\b/ ) - { - my $sourcepath = $onefile->{'sourcepath'}; - - for ( my $j = 0; $j <= $#{$prototypefile}; $j++ ) - { - if (( ${$prototypefile}[$j] =~ /^\s*f\s+none\s+/ ) && ( ${$prototypefile}[$j] =~ /\=\Q$sourcepath\E\s+/ )) - { - my $oldline = ${$prototypefile}[$j]; - ${$prototypefile}[$j] =~ s/^\s*f/v/; - my $newline = ${$prototypefile}[$j]; - $oldline =~ s/\s*$//; - $newline =~ s/\s*$//; - my $infoline = "Volatile file: Changing content from \"$oldline\" to \"$newline\" .\n"; - push(@installer::globals::logfileinfo, $infoline); - last; - } - } - } - } -} - -######################################################################### -# Replacing the variables in the Solaris patch shell scripts. -# Taking care, that multiple slashes are not always removed. -######################################################################### - -sub replace_variables_in_shellscripts_for_patch -{ - my ($scriptfile, $scriptfilename, $oldstring, $newstring) = @_; - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - if ( ${$scriptfile}[$i] =~ /\Q$oldstring\E/ ) - { - my $oldline = ${$scriptfile}[$i]; - if (( $oldstring eq "PRODUCTDIRECTORYNAME" ) && ( $newstring eq "" )) { $oldstring = $oldstring . "/"; } - ${$scriptfile}[$i] =~ s/\Q$oldstring\E/$newstring/g; - my $infoline = "Info: Substituting in $scriptfilename $oldstring by $newstring\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } -} - -######################################################################### -# Replacing the variables in the shell scripts or in the epm list file -# Linux: spec file -# Solaris: preinstall, postinstall, preremove, postremove -# If epm is used in the original version (not relocatable) -# the variables have to be exchanged in the list file, -# created for epm. -######################################################################### - -sub replace_variables_in_shellscripts -{ - my ($scriptfile, $scriptfilename, $oldstring, $newstring) = @_; - - my $debug = 0; - if ( $oldstring eq "PRODUCTDIRECTORYNAME" ) { $debug = 1; } - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - if ( ${$scriptfile}[$i] =~ /\Q$oldstring\E/ ) - { - my $oldline = ${$scriptfile}[$i]; - ${$scriptfile}[$i] =~ s/\Q$oldstring\E/$newstring/g; - ${$scriptfile}[$i] =~ s/\/\//\//g; # replacing "//" by "/" , if path $newstring is empty! - my $infoline = "Info: Substituting in $scriptfilename $oldstring by $newstring\n"; - push(@installer::globals::logfileinfo, $infoline); - if ( $debug ) - { - $infoline = "Old Line: $oldline"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "New Line: ${$scriptfile}[$i]"; - push(@installer::globals::logfileinfo, $infoline); - } - } - } -} - -############################################################ -# Determinig the directory created by epm, in which the -# RPMS or Solaris packages are created. -############################################################ - -sub determine_installdir_ooo -{ - # A simple "ls" command returns the directory name - - my $dirname = ""; - - my $systemcall = "ls |"; - open (LS, "$systemcall"); - $dirname = <LS>; - close (LS); - - $dirname =~ s/\s*$//; - - my $infoline = "Info: Directory created by epm: $dirname\n"; - push(@installer::globals::logfileinfo, $infoline); - - return $dirname; -} - -############################################################ -# Setting the tab content into the file container -############################################################ - -sub set_tab_into_datafile -{ - my ($changefile, $filesref) = @_; - - my @newclasses = (); - my $newclassesstring = ""; - - if ( $installer::globals::issolarispkgbuild ) - { - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - - if ( $onefile->{'SolarisClass'} ) - { - my $sourcepath = $onefile->{'sourcepath'}; - - for ( my $j = 0; $j <= $#{$changefile}; $j++ ) - { - if (( ${$changefile}[$j] =~ /^\s*f\s+none\s+/ ) && ( ${$changefile}[$j] =~ /\=\Q$sourcepath\E\s+/ )) - { - my $oldline = ${$changefile}[$j]; - ${$changefile}[$j] =~ s/f\s+none/e $onefile->{'SolarisClass'}/; - my $newline = ${$changefile}[$j]; - $oldline =~ s/\s*$//; - $newline =~ s/\s*$//; - - my $infoline = "TAB: Changing content from \"$oldline\" to \"$newline\" .\n"; - push(@installer::globals::logfileinfo, $infoline); - - # collecting all new classes - if (! installer::existence::exists_in_array($onefile->{'SolarisClass'}, \@newclasses)) - { - push(@newclasses, $onefile->{'SolarisClass'}); - } - - last; - } - } - } - } - - $newclassesstring = installer::converter::convert_array_to_space_separated_string(\@newclasses); - } - - if ( $installer::globals::isrpmbuild ) - { - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - - if ( $onefile->{'SpecFileContent'} ) - { - my $destination = $onefile->{'destination'}; - - for ( my $j = 0; $j <= $#{$changefile}; $j++ ) - { - if ( ${$changefile}[$j] =~ /^\s*(\%attr\(.*\))\s+(\".*?\Q$destination\E\"\s*)$/ ) - { - my $begin = $1; - my $end = $2; - - my $oldline = ${$changefile}[$j]; - ${$changefile}[$j] = $begin . " " . $onefile->{'SpecFileContent'} . " " . $end; - my $newline = ${$changefile}[$j]; - - $oldline =~ s/\s*$//; - $newline =~ s/\s*$//; - - my $infoline = "TAB: Changing content from \"$oldline\" to \"$newline\" .\n"; - push(@installer::globals::logfileinfo, $infoline); - - last; - } - } - } - } - } - - return $newclassesstring; -} - -############################################################ -# Including additional classes into the pkginfo file -############################################################ - -sub include_classes_into_pkginfo -{ - my ($changefile, $classesstring) = @_; - - for ( my $i = 0; $i <= $#{$changefile}; $i++ ) - { - if ( ${$changefile}[$i] =~ /^\s*CLASSES\=none/ ) - { - ${$changefile}[$i] =~ s/\s*$//; - my $oldline = ${$changefile}[$i]; - ${$changefile}[$i] = ${$changefile}[$i] . " " . $classesstring . "\n"; - my $newline = ${$changefile}[$i]; - $newline =~ s/\s*$//; - - my $infoline = "pkginfo file: Changing content from \"$oldline\" to \"$newline\" .\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } -} - -########################################################################################## -# Checking, if an extension is included into the package (Linux). -# All extension files have to be installed into directory -# share/extension/install -# %attr(0444,root,root) "/opt/staroffice8/share/extension/install/SunSearchToolbar.oxt" -########################################################################################## - -sub is_extension_package -{ - my ($specfile) = @_; - - my $is_extension_package = 0; - - for ( my $i = 0; $i <= $#{$specfile}; $i++ ) - { - my $line = ${$specfile}[$i]; - if ( $line =~ /share\/extension\/install\/.*?\.oxt\"\s*$/ ) - { - $is_extension_package = 1; - last; - } - } - - return $is_extension_package; -} - -###################################################################### -# Checking, if an extension is included into the package (Solaris). -# All extension files have to be installed into directory -# share/extension/install -###################################################################### - -sub contains_extension_dir -{ - my ($prototypefile) = @_; - - my $contains_extension_dir = 0; - - # d none opt/openoffice.org3/share/extensions/ - - for ( my $i = 0; $i <= $#{$prototypefile}; $i++ ) - { - my $line = ${$prototypefile}[$i]; - if ( $line =~ /^\s*d\s+none\s.*\/share\/extensions\// ) - { - $contains_extension_dir = 1; - last; - } - } - - return $contains_extension_dir; -} - -############################################################ -# A Solaris patch contains 7 specific scripts -############################################################ - -sub add_scripts_into_prototypefile -{ - my ($prototypefile, $prototypefilename, $languagestringref, $staticpath) = @_; - - # The files are stored in the directory $installer::globals::patchincludepath - # The file names are available via @installer::globals::solarispatchscripts - - my $path = $installer::globals::patchincludepath; - $path =~ s/\/\s*$//; - $path = $path . $installer::globals::separator; - - my @newlines = (); - my $is_extension_package = contains_extension_dir($prototypefile); - - if ( $is_extension_package ) - { - for ( my $i = 0; $i <= $#installer::globals::solarispatchscriptsforextensions; $i++ ) - { - my $sourcefilename = $path . $installer::globals::solarispatchscriptsforextensions[$i]; - my $destfile = $installer::globals::solarispatchscriptsforextensions[$i]; - - # If the sourcepath has "_extension" in its name, this has to be removed - $destfile =~ s/_extensions\s*$//; # hard coded renaming of script name - - # Creating unique directory name with $prototypefilename - my $extensiondir = installer::systemactions::create_directories("extensionscripts", $languagestringref); - - if ( $prototypefilename =~ /\/(\S*?)\s*$/ ) { $prototypefilename = $1; } - $prototypefilename =~ s/\./_/g; - my $destdir = $extensiondir . $installer::globals::separator . $prototypefilename; - if ( ! -d $destdir ) { installer::systemactions::create_directory($destdir); } - my $destpath = $destdir . $installer::globals::separator . $destfile; - if ( -f $destpath ) { unlink($destpath); } - - # Reading file - my $scriptfile = installer::files::read_file($sourcefilename); - - # Replacing variables - my $oldstring = "PRODUCTDIRECTORYNAME"; - replace_variables_in_shellscripts_for_patch($scriptfile, $destpath, $oldstring, $staticpath); - - # Saving file - installer::files::save_file($destpath, $scriptfile); - - # Writing file destination into prototype file - my $line = "i $destfile=" . $destpath . "\n"; - push(@newlines, $line); - } - } - else - { - for ( my $i = 0; $i <= $#installer::globals::solarispatchscripts; $i++ ) - { - my $line = "i $installer::globals::solarispatchscripts[$i]=" . $path . $installer::globals::solarispatchscripts[$i] . "\n"; - push(@newlines, $line); - } - } - - # Including the new lines after the last line starting with "i" - - for ( my $i = 0; $i <= $#{$prototypefile}; $i++ ) - { - if ( ${$prototypefile}[$i] =~ /^\s*i\s+copyright/ ) - { - splice(@{$prototypefile}, $i, 1); # ignoring old copyright text, using patch standard - next; - } - if ( ${$prototypefile}[$i] =~ /^\s*i\s+/ ) { next; } - splice(@{$prototypefile}, $i, 0, @newlines); - last; - } -} - -############################################################ -# Adding patch infos in pkginfo file -############################################################ - -sub include_patchinfos_into_pkginfo -{ - my ( $changefile, $filename, $variableshashref ) = @_; - - # SUNW_PATCHID=101998-10 - # SUNW_OBSOLETES=114999-01 113999-01 - # SUNW_PKGTYPE=usr - # SUNW_PKGVERS=1.0 - # SUNW_REQUIRES=126411-01 - - my $patchidname = "SOLSPARCPATCHID"; - if ( $installer::globals::issolarisx86build ) { $patchidname = "SOLIAPATCHID"; } - - if ( ! $variableshashref->{$patchidname} ) { installer::exiter::exit_program("ERROR: Variable $patchidname not defined in zip list file!", "include_patchinfos_into_pkginfo"); } - - my $newline = "SUNW_PATCHID=" . $variableshashref->{$patchidname} . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - - my $patchobsoletesname = "SOLSPARCPATCHOBSOLETES"; - if ( $installer::globals::issolarisx86build ) { $patchobsoletesname = "SOLIAPATCHOBSOLETES"; } - - my $obsoletes = ""; - if ( $variableshashref->{$patchobsoletesname} ) { $obsoletes = $variableshashref->{$patchobsoletesname}; } - $newline = "SUNW_OBSOLETES=" . $obsoletes . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - - my $patchrequiresname = "SOLSPARCPATCHREQUIRES"; - if ( $installer::globals::issolarisx86build ) { $patchrequiresname = "SOLIAPATCHREQUIRES"; } - - if ( $variableshashref->{$patchrequiresname} ) - { - my $requires = $variableshashref->{$patchrequiresname}; - $newline = "SUNW_REQUIRES=" . $requires . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - } - $newline = "SUNW_PATCH_PROPERTIES=\n"; - add_one_line_into_file($changefile, $newline, $filename); -} - -############################################################ -# Setting the correct Solaris locales -############################################################ - -sub get_solaris_language_for_langpack -{ - my ( $onelanguage ) = @_; - - my $sollanguage = $onelanguage; - $sollanguage =~ s/\-/\_/; - - if ( $sollanguage eq "de" ) { $sollanguage = "de"; } - elsif ( $sollanguage eq "en_US" ) { $sollanguage = "en_AU,en_CA,en_GB,en_IE,en_MT,en_NZ,en_US,en_US.UTF-8"; } - elsif ( $sollanguage eq "es" ) { $sollanguage = "es"; } - elsif ( $sollanguage eq "fr" ) { $sollanguage = "fr"; } - elsif ( $sollanguage eq "hu" ) { $sollanguage = "hu_HU"; } - elsif ( $sollanguage eq "it" ) { $sollanguage = "it"; } - elsif ( $sollanguage eq "nl" ) { $sollanguage = "nl_BE,nl_NL"; } - elsif ( $sollanguage eq "pl" ) { $sollanguage = "pl_PL"; } - elsif ( $sollanguage eq "sv" ) { $sollanguage = "sv"; } - elsif ( $sollanguage eq "pt" ) { $sollanguage = "pt_PT"; } - elsif ( $sollanguage eq "pt_BR" ) { $sollanguage = "pt_BR"; } - elsif ( $sollanguage eq "ru" ) { $sollanguage = "ru_RU"; } - elsif ( $sollanguage eq "ja" ) { $sollanguage = "ja,ja_JP,ja_JP.PCK,ja_JP.UTF-8"; } - elsif ( $sollanguage eq "ko" ) { $sollanguage = "ko,ko.UTF-8"; } - elsif ( $sollanguage eq "zh_CN" ) { $sollanguage = "zh,zh.GBK,zh_CN.GB18030,zh.UTF-8"; } - elsif ( $sollanguage eq "zh_TW" ) { $sollanguage = "zh_TW,zh_TW.BIG5,zh_TW.UTF-8,zh_HK.BIG5HK,zh_HK.UTF-8"; } - - return $sollanguage; -} - -############################################################ -# Adding language infos in pkginfo file -############################################################ - -sub include_languageinfos_into_pkginfo -{ - my ( $changefile, $filename, $languagestringref, $onepackage, $variableshashref ) = @_; - - # SUNWPKG_LIST=core01 - # SUNW_LOC=de - - my $locallang = $onepackage->{'language'}; - my $solarislanguage = get_solaris_language_for_langpack($locallang); - - my $newline = "SUNW_LOC=" . $solarislanguage . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - - # SUNW_PKGLIST is required, if SUNW_LOC is defined. - if ( $onepackage->{'pkg_list_entry'} ) - { - my $packagelistentry = $onepackage->{'pkg_list_entry'}; - installer::packagelist::resolve_packagevariables(\$packagelistentry, $variableshashref, 1); - $newline = "SUNW_PKGLIST=" . $packagelistentry . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - } - else - { - # Using default package ooobasis30-core01. - my $packagelistentry = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-core01"; - installer::packagelist::resolve_packagevariables(\$packagelistentry, $variableshashref, 1); - $newline = "SUNW_PKGLIST=" . $packagelistentry . "\n"; - add_one_line_into_file($changefile, $newline, $filename); - } -} - -############################################################ -# Collecting all files included in patch in -# @installer::globals::patchfilecollector -############################################################ - -sub collect_patch_files -{ - my ($file, $packagename, $prefix) = @_; - - # $file is the spec file or the prototypefile - - $prefix = $prefix . "/"; - my $packagenamestring = "Package " . $packagename . " \:\n"; - push(@installer::globals::patchfilecollector, $packagenamestring); - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - my $line = ${$file}[$i]; - - if ( $installer::globals::isrpmbuild ) - { - # %attr(0444,root,root) "/opt/openofficeorg20/program/about.bmp" - - if ( $line =~ /^\s*\%attr\(.*\)\s*\"(.*?)\"\s*$/ ) - { - my $filename = $1 . "\n"; - $filename =~ s/^\s*\Q$prefix\E//; - push(@installer::globals::patchfilecollector, $filename); - } - } - - if ( $installer::globals::issolarispkgbuild ) - { - # f none program/msomrl.rdb=/ab/SRC680/unxsols4.pro/bin/msomrl.rdb 0444 root bin - - if ( $line =~ /^\s*f\s+\w+\s+(.*?)\=/ ) - { - my $filename = $1 . "\n"; - push(@installer::globals::patchfilecollector, $filename); - } - } - } - - push(@installer::globals::patchfilecollector, "\n"); - -} - -############################################################ -# Including package names into the depend files. -# The package names have to be included into -# packagelist. They are already saved in -# %installer::globals::dependfilenames. -############################################################ - -sub put_packagenames_into_dependfile -{ - my ( $file ) = @_; - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - my $line = ${$file}[$i]; - if ( $line =~ /^\s*\w\s+(.*?)\s*$/ ) - { - my $abbreviation = $1; - - if ( $abbreviation =~ /\%/ ) { installer::exiter::exit_program("ERROR: Could not resolve all properties in Solaris package abbreviation \"$abbreviation\"!", "read_packagemap"); } - - if ( exists($installer::globals::dependfilenames{$abbreviation}) ) - { - my $packagename = $installer::globals::dependfilenames{$abbreviation}; - if ( $packagename =~ /\%/ ) { installer::exiter::exit_program("ERROR: Could not resolve all properties in Solaris package name \"$packagename\"!", "read_packagemap"); } - - $line =~ s/\s*$//; - ${$file}[$i] = $line . "\t" . $packagename . "\n"; - } - else - { - installer::exiter::exit_program("ERROR: Missing packagename for Solaris package \"$abbreviation\"!", "put_packagenames_into_dependfile"); - } - } - } -} - -############################################################ -# Including the relocatable directory into -# spec file and pkginfo file -# Linux: set topdir in specfile -# Solaris: remove $relocatablepath (/opt/) -# for all objects in prototype file -# and changing "topdir" for Linux -############################################################ - -sub prepare_packages -{ - my ($loggingdir, $packagename, $staticpath, $relocatablepath, $onepackage, $variableshashref, $filesref, $languagestringref) = @_; - - my $filename = ""; - my $newline = ""; - my $newepmdir = $installer::globals::epmoutpath . $installer::globals::separator; - - my $localrelocatablepath = $relocatablepath; - if ( $localrelocatablepath ne "/" ) { $localrelocatablepath =~ s/\/\s*$//; } - - if ( $installer::globals::issolarispkgbuild ) - { - $filename = $packagename . ".pkginfo"; - $newline = "BASEDIR\=" . $localrelocatablepath . "\n"; - } - - if ( $installer::globals::isrpmbuild ) - { - $filename = $packagename . ".spec"; - $newline = "Prefix\:\ " . $localrelocatablepath . "\n"; - } - - my $completefilename = $newepmdir . $filename; - - if ( ! -f $completefilename) { installer::exiter::exit_program("ERROR: Did not find file: $completefilename", "prepare_packages"); } - my $changefile = installer::files::read_file($completefilename); - if ( $newline ne "" ) - { - add_one_line_into_file($changefile, $newline, $filename); - installer::files::save_file($completefilename, $changefile); - } - - # adding new "topdir" and removing old "topdir" in specfile - - if ( $installer::globals::isrpmbuild ) - { - set_topdir_in_specfile($changefile, $filename, $newepmdir); - set_autoprovreq_in_specfile($changefile, $onepackage->{'findrequires'}, "$installer::globals::unpackpath" . "/bin"); - set_packager_in_specfile($changefile); - if ( is_extension_package($changefile) ) { set_prereq_in_specfile($changefile); } - set_license_in_specfile($changefile, $variableshashref); - set_tab_into_datafile($changefile, $filesref); - installer::files::save_file($completefilename, $changefile); - if ( $installer::globals::patch ) { collect_patch_files($changefile, $packagename, $localrelocatablepath); } - } - - # removing the relocatable path in prototype file - - if ( $installer::globals::issolarispkgbuild ) - { - set_revision_in_pkginfo($changefile, $filename, $variableshashref, $packagename); - set_maxinst_in_pkginfo($changefile, $filename); - set_solaris_parameter_in_pkginfo($changefile, $filename, $variableshashref); - if ( $installer::globals::issolarisx86build ) { fix_architecture_setting($changefile); } - if ( ! $installer::globals::patch ) { set_patchlist_in_pkginfo_for_respin($changefile, $filename, $variableshashref, $packagename); } - if ( $installer::globals::patch ) { include_patchinfos_into_pkginfo($changefile, $filename, $variableshashref); } - if (( $onepackage->{'language'} ) && ( $onepackage->{'language'} ne "" ) && ( $onepackage->{'language'} ne "en-US" )) { include_languageinfos_into_pkginfo($changefile, $filename, $languagestringref, $onepackage, $variableshashref); } - installer::files::save_file($completefilename, $changefile); - - my $prototypefilename = $packagename . ".prototype"; - $prototypefilename = $newepmdir . $prototypefilename; - if (! -f $prototypefilename) { installer::exiter::exit_program("ERROR: Did not find prototype file: $prototypefilename", "prepare_packages"); } - - my $prototypefile = installer::files::read_file($prototypefilename); - make_prototypefile_relocatable($prototypefile, $relocatablepath); - set_volatilefile_into_prototypefile($prototypefile, $filesref); - my $classesstring = set_tab_into_datafile($prototypefile, $filesref); - if ($classesstring) - { - include_classes_into_pkginfo($changefile, $classesstring); - installer::files::save_file($completefilename, $changefile); - } - - if ( $installer::globals::patch ) { add_scripts_into_prototypefile($prototypefile, $prototypefilename, $languagestringref, $staticpath); } - - installer::files::save_file($prototypefilename, $prototypefile); - if ( $installer::globals::patch ) { collect_patch_files($prototypefile, $packagename, ""); } - - # Adding package names into depend files for Solaris (not supported by epm) - my $dependfilename = $packagename . ".depend"; - $dependfilename = $newepmdir . $dependfilename; - if ( -f $dependfilename) - { - my $dependfile = installer::files::read_file($dependfilename); - put_packagenames_into_dependfile($dependfile); - installer::files::save_file($dependfilename, $dependfile); - } - } - - return $newepmdir; -} - -############################################################ -# Linux requirement for perl is changed by epm from -# /usr/bin/perl to perl . -# Requires: perl -############################################################ - -sub check_requirements_in_specfile -{ - my ( $specfile ) = @_; - - for ( my $i = 0; $i <= $#{$specfile}; $i++ ) - { - if (( ${$specfile}[$i] =~ /^\s*Requires/ ) && ( ${$specfile}[$i] =~ /\bperl\b/ ) && ( ! ( ${$specfile}[$i] =~ /\/usr\/bin\/perl\b/ ))) - { - my $oldline = ${$specfile}[$i]; - ${$specfile}[$i] =~ s/perl/\/usr\/bin\/perl/; - my $newline = ${$specfile}[$i]; - - $oldline =~ s/\s*$//; - $newline =~ s/\s*$//; - my $infoline = "Spec File: Changing content from \"$oldline\" to \"$newline\".\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } -} - -############################################################################### -# Replacement of PRODUCTINSTALLLOCATION and PRODUCTDIRECTORYNAME in the -# epm list file. -# The complete rootpath is stored in $installer::globals::rootpath -# or for each package in $onepackage->{'destpath'} -# The static rootpath is stored in $staticpath -# The relocatable path is stored in $relocatablepath -# PRODUCTINSTALLLOCATION is the relocatable part ("/opt") and -# PRODUCTDIRECTORYNAME the static path ("openofficeorg20"). -# In standard epm process: -# No usage of package specific variables like $BASEDIR, because -# 1. These variables would be replaced in epm process -# 2. epm version 3.7 does not support relocatable packages -############################################################################### - -sub resolve_path_in_epm_list_before_packaging -{ - my ($listfile, $listfilename, $variable, $path) = @_; - - installer::logger::include_header_into_logfile("Replacing variables in epm list file:"); - - $path =~ s/\/\s*$//; - replace_variables_in_shellscripts($listfile, $listfilename, $variable, $path); - -} - -################################################################# -# Determining the rpm version. Beginning with rpm version 4.0 -# the tool to create RPMs is "rpmbuild" and no longer "rpm" -################################################################# - -sub determine_rpm_version -{ - my $rpmversion = 0; - my $rpmout = ""; - my $systemcall = ""; - - # "rpm --version" has problems since LD_LIBRARY_PATH was removed. Therefore the content of $RPM has to be called. - # "rpm --version" and "rpmbuild --version" have the same output. Therefore $RPM can be used. Its value - # is saved in $installer::globals::rpm - - if ( $installer::globals::rpm ne "" ) - { - $systemcall = "$installer::globals::rpm --version |"; - } - else - { - $systemcall = "rpm --version |"; - } - - open (RPM, "$systemcall"); - $rpmout = <RPM>; - close (RPM); - - if ( $rpmout ne "" ) - { - $rpmout =~ s/\s*$//g; - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( $rpmout eq "" ) { $infoline = "ERROR: Could not find file \"rpm\" !\n"; } - else { $infoline = "Success: rpm version: $rpmout\n"; } - - push( @installer::globals::logfileinfo, $infoline); - - if ( $rpmout =~ /(\d+)\.(\d+)\.(\d+)/ ) { $rpmversion = $1; } - elsif ( $rpmout =~ /(\d+)\.(\d+)/ ) { $rpmversion = $1; } - elsif ( $rpmout =~ /(\d+)/ ) { $rpmversion = $1; } - else { installer::exiter::exit_program("ERROR: Unknown format: $rpmout ! Expected: \"a.b.c\", or \"a.b\", or \"a\"", "determine_rpm_version"); } - } - - return $rpmversion; -} - -#################################################### -# Writing some info about rpm into the log file -#################################################### - -sub log_rpm_info -{ - my $systemcall = ""; - my $infoline = ""; - - $infoline = "\nLogging rpmrc content using --showrc\n\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( $installer::globals::rpm ne "" ) - { - $systemcall = "$installer::globals::rpm --showrc |"; - } - else - { - $systemcall = "rpm --showrc |"; - } - - my @fullrpmout = (); - - open (RPM, "$systemcall"); - while (<RPM>) {push(@fullrpmout, $_); } - close (RPM); - - if ( $#fullrpmout > -1 ) - { - for ( my $i = 0; $i <= $#fullrpmout; $i++ ) - { - my $rpmout = $fullrpmout[$i]; - $rpmout =~ s/\s*$//g; - - $infoline = "$rpmout\n"; - $infoline =~ s/error/e_r_r_o_r/gi; # avoiding log problems - push( @installer::globals::logfileinfo, $infoline); - } - } - else - { - $infoline = "Problem in systemcall: $systemcall : No return value\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - $infoline = "End of logging rpmrc\n\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -################################################# -# Systemcall to start the packaging process -################################################# - -sub create_packages_without_epm -{ - my ($epmdir, $packagename, $includepatharrayref, $allvariables, $languagestringref) = @_; - - # Solaris: pkgmk -o -f solaris-2.8-sparc/SUNWso8m34.prototype -d solaris-2.8-sparc - # Solaris: pkgtrans solaris-2.8-sparc SUNWso8m34.pkg SUNWso8m34 - # Solaris: tar -cf - SUNWso8m34 | gzip > SUNWso8m34.tar.gz - - if ( $installer::globals::issolarispkgbuild ) - { - my $prototypefile = $epmdir . $packagename . ".prototype"; - if (! -f $prototypefile) { installer::exiter::exit_program("ERROR: Did not find file: $prototypefile", "create_packages_without_epm"); } - - my $destinationdir = $prototypefile; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationdir); - $destinationdir =~ s/\/\s*$//; # removing ending slashes - - my $systemcall = "pkgmk -l 1073741824 -o -f $prototypefile -d $destinationdir 2\>\&1 |"; - installer::logger::print_message( "... $systemcall ...\n" ); - - my $maxpkgmkcalls = 3; - - for ( my $i = 1; $i <= $maxpkgmkcalls; $i++ ) - { - my @pkgmkoutput = (); - - open (PKGMK, "$systemcall"); - while (<PKGMK>) {push(@pkgmkoutput, $_); } - close (PKGMK); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - my $infoline = "Systemcall (Try $i): $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $j = 0; $j <= $#pkgmkoutput; $j++ ) - { - if ( $i < $maxpkgmkcalls ) { $pkgmkoutput[$j] =~ s/\bERROR\b/PROBLEM/ig; } - push( @installer::globals::logfileinfo, "$pkgmkoutput[$j]"); - } - - if ($returnvalue) - { - $infoline = "Try $i : Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - if ( $i == $maxpkgmkcalls ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "create_packages_without_epm"); } - } - else - { - installer::logger::print_message( "Success (Try $i): \"$systemcall\"\n" ); - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } - - # It might be necessary to save uncompressed Solaris packages - - if ( $allvariables->{'JDSBUILD'} ) - { - if ( ! $installer::globals::jds_language_controlled ) - { - my $correct_language = installer::worker::check_jds_language($allvariables, $languagestringref); - $installer::globals::correct_jds_language = $correct_language; - $installer::globals::jds_language_controlled = 1; - } - - if ( $installer::globals::correct_jds_language ) - { - if ( $installer::globals::saved_packages_path eq "" ) - { - $packagestempdir = installer::systemactions::create_directories("jds", $languagestringref); - $installer::globals::saved_packages_path = $packagestempdir; - push(@installer::globals::jdsremovedirs, $packagestempdir); - } - - $systemcall = "cd $destinationdir; cp -p -R $packagename $installer::globals::saved_packages_path;"; - make_systemcall($systemcall); - installer::logger::print_message( "... $systemcall ...\n" ); - - # Setting unix rights to "775" for all created directories inside the package, - # that is saved in temp directory - - $systemcall = "cd $packagestempdir; find $packagename -type d | xargs -i chmod 775 \{\} \;"; - installer::logger::print_message( "... $systemcall ...\n" ); - - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - } - - # compressing packages - - if ( ! $installer::globals::solarisdontcompress ) - { - my $faspac = "faspac-so.sh"; - - my $compressorref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$faspac, $includepatharrayref, 0); - if ($$compressorref ne "") - { - # Saving original pkginfo, to set time stamp later - my $pkginfoorig = "$destinationdir/$packagename/pkginfo"; - my $pkginfotmp = "$destinationdir/$packagename" . ".pkginfo.tmp"; - $systemcall = "cp -p $pkginfoorig $pkginfotmp"; - make_systemcall($systemcall); - - $faspac = $$compressorref; - $infoline = "Found compressor: $faspac\n"; - push( @installer::globals::logfileinfo, $infoline); - - installer::logger::print_message( "... $faspac ...\n" ); - installer::logger::include_timestamp_into_logfile("Starting $faspac"); - - $systemcall = "/bin/sh $faspac -a -q -d $destinationdir $packagename"; # $faspac has to be the absolute path! - make_systemcall($systemcall); - - # Setting time stamp for pkginfo, because faspac-so.sh changed the pkginfo file, - # updated the size and checksum, but not the time stamp. - $systemcall = "touch -r $pkginfotmp $pkginfoorig"; - make_systemcall($systemcall); - if ( -f $pkginfotmp ) { unlink($pkginfotmp); } - - installer::logger::include_timestamp_into_logfile("End of $faspac"); - } - else - { - $infoline = "Not found: $faspac\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - # Setting unix rights to "775" for all created directories inside the package - - $systemcall = "cd $destinationdir; find $packagename -type d | xargs -i chmod 775 \{\} \;"; - installer::logger::print_message( "... $systemcall ...\n" ); - - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - - ###################### - # making pkg files - ###################### - - # my $streamname = $packagename . ".pkg"; - # $systemcall = "pkgtrans $destinationdir $streamname $packagename"; - # print "... $systemcall ...\n"; - - # $returnvalue = system($systemcall); - - # $infoline = "Systemcall: $systemcall\n"; - # push( @installer::globals::logfileinfo, $infoline); - - # if ($returnvalue) - # { - # $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - # push( @installer::globals::logfileinfo, $infoline); - # } - # else - # { - # $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - # push( @installer::globals::logfileinfo, $infoline); - # } - - ######################### - # making tar.gz files - ######################### - - # my $targzname = $packagename . ".tar.gz"; - # $systemcall = "cd $destinationdir; tar -cf - $packagename | gzip > $targzname"; - # print "... $systemcall ...\n"; - - # $returnvalue = system($systemcall); - - # $infoline = "Systemcall: $systemcall\n"; - # push( @installer::globals::logfileinfo, $infoline); - - # if ($returnvalue) - # { - # $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - # push( @installer::globals::logfileinfo, $infoline); - # } - # else - # { - # $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - # push( @installer::globals::logfileinfo, $infoline); - # } - - } - - # Linux: rpm -bb so8m35.spec ( -> dependency check abklemmen? ) - - if ( $installer::globals::isrpmbuild ) - { - my $specfilename = $epmdir . $packagename . ".spec"; - if (! -f $specfilename) { installer::exiter::exit_program("ERROR: Did not find file: $specfilename", "create_packages_without_epm"); } - - my $rpmcommand = $installer::globals::rpm; - my $rpmversion = determine_rpm_version(); - - # saving globally for later usage - $installer::globals::rpmcommand = $rpmcommand; - $installer::globals::rpmquerycommand = "rpm"; - - my $target = ""; - if ( $installer::globals::compiler =~ /unxlngi/) { $target = "i586"; } - elsif ( $installer::globals::compiler =~ /unxaigppc/) { $target = "ppc"; } - elsif ( $installer::globals::compiler =~ /unxlng/) {$target = (POSIX::uname())[4]; } - - # rpm 4.6 ignores buildroot tag in spec file - - my $buildrootstring = ""; - - if ( $rpmversion >= 4 ) - { - my $dir = getcwd; - my $buildroot = $dir . "/" . $epmdir . "buildroot/"; - $buildrootstring = "--buildroot=$buildroot"; - mkdir($buildroot = $dir . "/" . $epmdir . "BUILD/"); - } - - if ( ! $installer::globals::rpminfologged ) - { - log_rpm_info(); - $installer::globals::rpminfologged = 1; - } - - my $systemcall = "$rpmcommand -bb --define \"_unpackaged_files_terminate_build 0\" $specfilename --target $target $buildrootstring 2\>\&1 |"; - - installer::logger::print_message( "... $systemcall ...\n" ); - - my $maxrpmcalls = 3; - my $rpm_failed = 0; - - for ( my $i = 1; $i <= $maxrpmcalls; $i++ ) - { - my @rpmoutput = (); - - open (RPM, "$systemcall"); - while (<RPM>) {push(@rpmoutput, $_); } - close (RPM); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - my $infoline = "Systemcall (Try $i): $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $j = 0; $j <= $#rpmoutput; $j++ ) - { - $rpmoutput[$j] =~ s/\bERROR\b/PROBLEM/ig; - push( @installer::globals::logfileinfo, "$rpmoutput[$j]"); - } - - if ($returnvalue) - { - $infoline = "Try $i : Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - $rpm_failed = 1; - } - else - { - installer::logger::print_message( "Success (Try $i): \"$systemcall\"\n" ); - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - $rpm_failed = 0; - last; - } - } - - if ( $rpm_failed ) - { - # Because of the problems with LD_LIBARY_PATH, a direct call of local "rpm" or "rpmbuild" might be successful - my $rpmprog = ""; - if ( -f "/usr/bin/rpmbuild" ) { $rpmprog = "/usr/bin/rpmbuild"; } - elsif ( -f "/usr/bin/rpm" ) { $rpmprog = "/usr/bin/rpm"; } - - if ( $rpmprog ne "" ) - { - installer::logger::print_message( "... $rpmprog ...\n" ); - - my $helpersystemcall = "$rpmprog -bb $specfilename --target $target $buildrootstring 2\>\&1 |"; - - my @helperrpmoutput = (); - - open (RPM, "$helpersystemcall"); - while (<RPM>) {push(@helperrpmoutput, $_); } - close (RPM); - - my $helperreturnvalue = $?; # $? contains the return value of the systemcall - - $infoline = "\nLast try: Using $rpmprog directly (problem with LD_LIBARY_PATH)\n"; - push( @installer::globals::logfileinfo, $infoline); - - $infoline = "\nSystemcall: $helpersystemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $j = 0; $j <= $#helperrpmoutput; $j++ ) { push( @installer::globals::logfileinfo, "$helperrpmoutput[$j]"); } - - if ($helperreturnvalue) - { - $infoline = "Could not execute \"$helpersystemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - installer::logger::print_message( "Success: \"$helpersystemcall\"\n" ); - $infoline = "Success: Executed \"$helpersystemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - $rpm_failed = 0; - } - } - - # Now it is really time to exit this packaging process, if the error still occurs - if ( $rpm_failed ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "create_packages_without_epm"); } - } - } -} - -################################################# -# Removing all temporary files created by epm -################################################# - -sub remove_temporary_epm_files -{ - my ($epmdir, $loggingdir, $packagename) = @_; - - # saving the files into the loggingdir - - if ( $installer::globals::issolarispkgbuild ) - { - my @extensions = (); - push(@extensions, ".pkginfo"); - push(@extensions, ".prototype"); - push(@extensions, ".postinstall"); - push(@extensions, ".postremove"); - push(@extensions, ".preinstall"); - push(@extensions, ".preremove"); - push(@extensions, ".depend"); - - for ( my $i = 0; $i <= $#extensions; $i++ ) - { - my $removefile = $epmdir . $packagename . $extensions[$i]; - my $destfile = $loggingdir . $packagename . $extensions[$i] . ".log"; - - if (! -f $removefile) { next; } - - my $systemcall = "mv -f $removefile $destfile"; - system($systemcall); # ignoring the return value - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - if ( $installer::globals::isrpmbuild ) - { - my $removefile = $epmdir . $packagename . ".spec"; - my $destfile = $loggingdir . $packagename . ".spec.log"; - - my $systemcall = "mv -f $removefile $destfile"; - system($systemcall); # ignoring the return value - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - # removing the directory "buildroot" - - my $removedir = $epmdir . "buildroot"; - - $systemcall = "rm -rf $removedir"; - - installer::logger::print_message( "... $systemcall ...\n" ); - - my $returnvalue = system($systemcall); - - $removedir = $epmdir . "BUILD"; - - $systemcall = "rm -rf $removedir"; - - installer::logger::print_message( "... $systemcall ...\n" ); - - $returnvalue = system($systemcall); - - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } -} - -###################################################### -# Making the systemcall -###################################################### - -sub make_systemcall -{ - my ($systemcall) = @_; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -########################################################### -# Creating a better directory structure in the solver. -########################################################### - -sub create_new_directory_structure -{ - my ($newepmdir) = @_; - - my $newdir = $installer::globals::epmoutpath; - - if ( $installer::globals::isrpmbuild ) - { - my $rpmdir; - my $machine = ""; - if ( $installer::globals::compiler =~ /unxlngi/) { - $rpmdir = "$installer::globals::epmoutpath/RPMS/i586"; - } - elsif ( $installer::globals::compiler =~ /unxaigppc/) { - $machine = "ppc"; - $rpmdir = "$installer::globals::epmoutpath/RPMS/$machine"; - } - elsif ( $installer::globals::compiler =~ /unxlng/) { - $machine = (POSIX::uname())[4]; - $rpmdir = "$installer::globals::epmoutpath/RPMS/$machine"; - } - else { installer::exiter::exit_program("ERROR: rpmdir undefined !", "create_new_directory_structure"); } - - my $systemcall = "mv $rpmdir/* $newdir"; # moving the rpms into the directory "RPMS" - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not move content of \"$rpmdir\" to \"$newdir\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Moved content of \"$rpmdir\" to \"$newdir\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - # and removing the empty directory - - if ( $machine ne "" ) - { - installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/$machine"); - } - installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/powerpc"); - installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/x86_64"); - installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/i586"); - installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS/i386"); - installer::systemactions::remove_empty_directory("$installer::globals::epmoutpath/RPMS"); - - } - - # Setting unix rights to "775" for $newdir ("RPMS" or "packages") - chmod 0775, $newdir; -} - -###################################################### -# Collect modules with product specific styles. -###################################################### - -sub collect_modules_with_style -{ - my ($style, $modulesarrayref) = @_; - - my @allmodules = (); - - for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ ) - { - my $onemodule = ${$modulesarrayref}[$i]; - my $styles = ""; - if ( $onemodule->{'Styles'} ) { $styles = $onemodule->{'Styles'}; } - if ( $styles =~ /\b\Q$style\E\b/ ) - { - push(@allmodules, $onemodule); - } - } - - return \@allmodules; -} - -###################################################### -# Remove modules without packagecontent. -###################################################### - -sub remove_modules_without_package -{ - my ($allmodules) = @_; - - my @allmodules = (); - - for ( my $i = 0; $i <= $#{$allmodules}; $i++ ) - { - my $onemodule = ${$allmodules}[$i]; - my $packagename = ""; - if ( $onemodule->{'PackageName'} ) { $packagename = $onemodule->{'PackageName'}; } - if ( $packagename ne "" ) - { - push(@allmodules, $onemodule); - } - } - - return \@allmodules; -} - -###################################################### -# Unpacking tar.gz file and setting new packagename. -###################################################### - -sub unpack_tar_gz_file -{ - my ($packagename, $destdir) = @_; - - my $newpackagename = ""; - - if ( $packagename =~ /\.tar\.gz\s*$/ ) - { - # Collecting all packages in directory "packages" - my $oldcontent = installer::systemactions::read_directory($destdir); - - # unpacking gunzip - my $systemcall = "cd $destdir; cat $packagename | gunzip | tar -xf -"; - make_systemcall($systemcall); - - # deleting the tar.gz files - $systemcall = "cd $destdir; rm -f $packagename"; - make_systemcall($systemcall); - - # Finding new content -> that is the package name - my ($newcontent, $allcontent ) = installer::systemactions::find_new_content_in_directory($destdir, $oldcontent); - $newpackagename = ${$newcontent}[0]; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$newpackagename); - } - - if ( $newpackagename ne "" ) { $packagename = $newpackagename; } - - return $packagename; -} - -###################################################### -# Copying files of child projects. -###################################################### - -sub copy_childproject_files -{ - my ($allmodules, $sopackpath, $destdir, $modulesarrayref, $allvariables, $subdir, $includepatharrayref, $use_sopackpath) = @_; - - for ( my $i = 0; $i <= $#{$allmodules}; $i++ ) - { - my $localdestdir = $destdir; - my $onemodule = ${$allmodules}[$i]; - my $packagename = $onemodule->{'PackageName'}; - my $sourcefile = ""; - if ( $use_sopackpath ) - { - $sourcefile = $sopackpath . $installer::globals::separator . $installer::globals::compiler . $installer::globals::separator . $subdir . $installer::globals::separator . $packagename; - } - else - { - my $sourcepathref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$packagename, $includepatharrayref, 1); - $sourcefile = $$sourcepathref; - } - - if ( ! -f $sourcefile ) { installer::exiter::exit_program("ERROR: File not found: $sourcefile ($packagename) !", "copy_childproject_files"); } - if ( $onemodule->{'Subdir'} ) - { - $localdestdir = $localdestdir . $installer::globals::separator . $onemodule->{'Subdir'}; - if ( ! -d $localdestdir ) { installer::systemactions::create_directory($localdestdir); } - } - installer::systemactions::copy_one_file($sourcefile, $localdestdir); - # Solaris: unpacking tar.gz files and setting new packagename - if ( $installer::globals::issolarispkgbuild ) { $packagename = unpack_tar_gz_file($packagename, $localdestdir); } - - if (( $installer::globals::isxpdplatform ) && ( $allvariables->{'XPDINSTALLER'} )) - { - installer::xpdinstaller::create_xpd_file_for_childproject($onemodule, $localdestdir, $packagename, $allvariableshashref, $modulesarrayref); - } - } - -} - -###################################################### -# Copying files for system integration. -###################################################### - -sub copy_and_unpack_tar_gz_files -{ - my ($sourcefile, $destdir) = @_; - - my $systemcall = "cd $destdir; cat $sourcefile | gunzip | tar -xf -"; - make_systemcall($systemcall); -} - -###################################################### -# Including child packages into the -# installation set. -###################################################### - -sub put_childprojects_into_installset -{ - my ($newdir, $allvariables, $modulesarrayref, $includepatharrayref) = @_; - - my $infoline = ""; - - my $sopackpath = ""; - if ( $ENV{'SO_PACK'} ) { $sopackpath = $ENV{'SO_PACK'}; } - else { installer::exiter::exit_program("ERROR: Environment variable SO_PACK not set!", "put_childprojects_into_installset"); } - - my $destdir = "$newdir"; - - # adding Java - - my $sourcefile = ""; - - # Finding the modules defined in scp (with flag JAVAMODULE, ADAMODULE, ...) - # Getting name of package from scp-Module - # Copy file into installation set - # Create xpd file and put it into xpd directory - # xpd file has to be created completely from module and package itself (-> no packagelist!) - - if ( $allvariables->{'JAVAPRODUCT'} ) - { - # Collect all modules with flag "JAVAMODULE" - my $allmodules = collect_modules_with_style("JAVAMODULE", $modulesarrayref); - $allmodules = remove_modules_without_package($allmodules); - copy_childproject_files($allmodules, $sopackpath, $destdir, $modulesarrayref, $allvariables, "jre", $includepatharrayref, 1); - } - - # Adding additional required packages (freetype). - # This package names are stored in global array @installer::globals::requiredpackages - - if ( $allvariables->{'ADDREQUIREDPACKAGES'} ) - { - # Collect all modules with flag "REQUIREDPACKAGEMODULE" - my $allmodules = collect_modules_with_style("REQUIREDPACKAGEMODULE", $modulesarrayref); - $allmodules = remove_modules_without_package($allmodules); - copy_childproject_files($allmodules, $sopackpath, $destdir, $modulesarrayref, $allvariables, "requiredpackages", $includepatharrayref, 1); - } - - # Collect all modules with flag "USERLANDMODULE" - my $alluserlandmodules = collect_modules_with_style("USERLANDMODULE", $modulesarrayref); - $alluserlandmodules = remove_modules_without_package($alluserlandmodules); - copy_childproject_files($alluserlandmodules, $sopackpath, $destdir, $modulesarrayref, $allvariables, "", $includepatharrayref, 0); - -} - -###################################################### -# Checking whether the new content is a directory and -# not a package. If it is a directory, the complete -# content of the directory has to be added to the -# array newcontent. -###################################################### - -sub control_subdirectories -{ - my ($content, $subdir) = @_; - - my @newcontent = (); - - for ( my $i = 0; $i <= $#{$content}; $i++ ) - { - if ( -d ${$content}[$i] ) - { - $subdir = ${$content}[$i]; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$subdir); - my $allpackages = installer::systemactions::read_directory(${$content}[$i]); - for ( my $j = 0; $j <= $#{$allpackages}; $j++ ) - { - # Currently only Linux rpm is supported, debian packages cannot be installed via xpd installer - if (( $installer::globals::islinuxbuild ) && ( ! ( ${$allpackages}[$j] =~ /\.rpm\s*$/ ))) { next; } - push(@newcontent, ${$allpackages}[$j]); - } - } - else - { - push(@newcontent, ${$content}[$i]); - } - } - - return (\@newcontent, $subdir); -} - -###################################################### -# Including the system integration files into the -# installation sets. -###################################################### - -sub put_systemintegration_into_installset -{ - my ($newdir, $includepatharrayref, $allvariables, $modulesarrayref) = @_; - - my $destdir = $newdir; - - # adding System integration files - - my $sourcefile = ""; - - # Finding the modules defined in scp (with flag SYSTEMMODULE) - # Getting name of package from scp-Module - # Search package in list off all include files - # Copy file into installation set and unpack it (always tar.gz) - # Create xpd file and put it into xpd directory - # tar.gz can contain a different number of packages -> automatically create hidden sub modules - # xpd file has to be created completely from module and package itself (-> no packagelist!) - - # Collect all modules with flag "SYSTEMMODULE" - my $allmodules = collect_modules_with_style("SYSTEMMODULE", $modulesarrayref); - $allmodules = remove_modules_without_package($allmodules); - - for ( my $i = 0; $i <= $#{$allmodules}; $i++ ) - { - my $onemodule = ${$allmodules}[$i]; - my $packagetarfilename = $onemodule->{'PackageName'}; - - my $infoline = "Including into installation set: $packagetarfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $sourcepathref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$packagetarfilename, $includepatharrayref, 1); - if ( $$sourcepathref eq "" ) { installer::exiter::exit_program("ERROR: Source path not found for $packagetarfilename!", "copy_systemintegration_files"); } - - # Collecting all packages in directory "packages" or "RPMS" - my $oldcontent = installer::systemactions::read_directory($destdir); - - copy_and_unpack_tar_gz_files($$sourcepathref, $destdir); - - # Finding new content -> that is the package name - my ($newcontent, $allcontent ) = installer::systemactions::find_new_content_in_directory($destdir, $oldcontent); - - # special handling, if new content is a directory - my $subdir = ""; - if ( ! $installer::globals::issolarispkgbuild ) { ($newcontent, $subdir) = control_subdirectories($newcontent); } - - # Adding license content into Solaris packages - if (( $installer::globals::issolarispkgbuild ) && ( $installer::globals::englishlicenseset ) && ( ! $variableshashref->{'NO_LICENSE_INTO_COPYRIGHT'} )) { installer::worker::add_license_into_systemintegrationpackages($destdir, $newcontent); } - - if (( $installer::globals::isxpdplatform ) && ( $allvariables->{'XPDINSTALLER'} )) - { - installer::xpdinstaller::create_xpd_file_for_systemintegration($onemodule, $newcontent, $modulesarrayref, $subdir); - } - } -} - -###################################################### -# Analyzing the Unix installation path. -# From the installation path /opt/openofficeorg20 -# is the part /opt relocatable and the part -# openofficeorg20 static. -###################################################### - -sub analyze_rootpath -{ - my ($rootpath, $staticpathref, $relocatablepathref, $allvariables) = @_; - - $rootpath =~ s/\/\s*$//; # removing ending slash - - ############################################################## - # Version 3: "/" is variable and "/opt/openofficeorg20" fixed - ############################################################## - - $$relocatablepathref = "/"; - # Static path has to contain the office directory name. This is replaced in shellscripts. - $$staticpathref = $rootpath . $installer::globals::separator . $installer::globals::officedirhostname; - # For RPM version 3.x it is required, that Prefix is not "/" in spec file. In this case --relocate will not work, - # because RPM 3.x says, that the package is not relocatable. Therefore we have to use Prefix=/opt and for - # all usages of --relocate this path has to be on both sides of the "=": --relocate /opt=<myselectdir>/opt . - if ( $installer::globals::isrpmbuild ) - { - $$relocatablepathref = $rootpath . "\/"; # relocatable path must end with "/", will be "/opt/" - $$staticpathref = $installer::globals::officedirhostname; # to be used as replacement in shell scripts - } - - if ( $installer::globals::isdebbuild ) - { - $$relocatablepathref = ""; - # $$staticpathref is already "/opt/openoffice.org3", no additional $rootpath required. - } - -} - -###################################################### -# Including license and readme into -# Unix installation sets. -###################################################### - -sub put_installsetfiles_into_installset -{ - my ($destdir) = @_; - - # All files for the installation set are saved in the global - # array @installer::globals::installsetfiles - - for ( my $i = 0; $i <= $#installer::globals::installsetfiles; $i++ ) - { - my $onefile = $installer::globals::installsetfiles[$i]; - my $sourcefile = $onefile->{'sourcepath'}; - my $destfile = ""; - $destfile = $destdir . $installer::globals::separator . $onefile->{'Name'}; - installer::systemactions::copy_one_file($sourcefile, $destfile); - - my $infoline = "Adding to installation set \"$destfile\" from source \"$sourcefile\".\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -###################################################### -# Replacing one variable in patchinfo file -###################################################### - -sub replace_one_variable_in_file -{ - my ( $file, $placeholder, $value ) = @_; - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - ${$file}[$i] =~ s/$placeholder/$value/g; - } -} - -###################################################### -# Setting variables in the patchinfo file -###################################################### - -sub set_patchinfo -{ - my ( $patchinfofile, $patchid, $allvariables ) = @_; - - # Setting: PATCHIDPLACEHOLDER and ARCHITECTUREPLACEHOLDER and PATCHCORRECTSPLACEHOLDER - - replace_one_variable_in_file($patchinfofile, "PATCHIDPLACEHOLDER", $patchid); - - my $architecture = ""; - if ( $installer::globals::issolarissparcbuild ) { $architecture = "sparc"; } - if ( $installer::globals::issolarisx86build ) { $architecture = "i386"; } - - replace_one_variable_in_file($patchinfofile, "ARCHITECTUREPLACEHOLDER", $architecture); - - if ( ! $allvariables->{'SOLARISPATCHCORRECTS'} ) { installer::exiter::exit_program("ERROR: No setting for PATCH_CORRECTS in zip list file!", "set_patchinfo"); } - my $patchcorrects = $allvariables->{'SOLARISPATCHCORRECTS'}; - - replace_one_variable_in_file($patchinfofile, "PATCHCORRECTSPLACEHOLDER", $patchcorrects); - - # Setting also PATCH_REQUIRES in patch info file, if entry in zip list file exists - my $requiresstring = ""; - if ( $installer::globals::issolarissparcbuild ) { $requiresstring = "SOLSPARCPATCHREQUIRES"; } - if ( $installer::globals::issolarisx86build ) { $requiresstring = "SOLIAPATCHREQUIRES"; } - - if ( $allvariables->{$requiresstring} ) - { - my $newline = "PATCH_REQUIRES=\"" . $allvariables->{$requiresstring} . "\"" . "\n"; - push(@{$patchinfofile}, $newline); - } -} - -###################################################### -# Finalizing patch: Renaming directory and -# including additional patch files. -###################################################### - -sub finalize_patch -{ - my ( $newepmdir, $allvariables ) = @_; - - my $patchidname = "SOLSPARCPATCHID"; - if ( $installer::globals::issolarisx86build ) { $patchidname = "SOLIAPATCHID"; } - - if ( ! $allvariables->{$patchidname} ) { installer::exiter::exit_program("ERROR: Variable $patchidname not defined in zip list file!", "finalize_patch"); } - my $patchid = $allvariables->{$patchidname}; - installer::systemactions::rename_directory($newepmdir, $patchid); - - # Copying all typical patch files into the patch directory - # All patch file names are stored in @installer::globals::solarispatchfiles - # Location of the file is $installer::globals::patchincludepath - - my $sourcepath = $installer::globals::patchincludepath; - $sourcepath =~ s/\/\s*$//; - - for ( my $i = 0; $i <= $#installer::globals::solarispatchfiles; $i++ ) - { - my $sourcefile = $sourcepath . $installer::globals::separator . $installer::globals::solarispatchfiles[$i]; - my $destfile = $patchid . $installer::globals::separator . $installer::globals::solarispatchfiles[$i]; - installer::systemactions::copy_one_file($sourcefile, $destfile); - } - - # And editing the patchinfo file - - my $patchinfofilename = $patchid . $installer::globals::separator . "patchinfo"; - my $patchinfofile = installer::files::read_file($patchinfofilename); - set_patchinfo($patchinfofile, $patchid, $allvariables); - installer::files::save_file($patchinfofilename, $patchinfofile); -} - -###################################################### -# Finalizing Linux patch: Renaming directory and -# including additional patch files. -###################################################### - -sub finalize_linux_patch -{ - my ( $newepmdir, $allvariables, $includepatharrayref ) = @_; - - # Copying the setup into the patch directory - # and including the list of RPMs into it - - print "... creating patch setup ...\n"; - - installer::logger::include_header_into_logfile("Creating Linux patch setup:"); - - # find and read setup script template - - my $scriptfilename = "linuxpatchscript.sh"; - my $scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptfilename, $includepatharrayref, 0); - if ($$scriptref eq "") { installer::exiter::exit_program("ERROR: Could not find patch script template $scriptfilename!", "finalize_linux_patch"); } - my $scriptfile = installer::files::read_file($$scriptref); - - my $infoline = "Found script file $scriptfilename: $$scriptref \n"; - push( @installer::globals::logfileinfo, $infoline); - - # Collecting all RPMs in the patch directory - - my $fileextension = "rpm"; - my $rpmfiles = installer::systemactions::find_file_with_file_extension($fileextension, $newepmdir); - if ( ! ( $#{$rpmfiles} > -1 )) { installer::exiter::exit_program("ERROR: Could not find rpm in directory $newepmdir!", "finalize_linux_patch"); } - for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$rpmfiles}[$i]); } - - # Searching packagename containing -core01 - my $found_package = 0; - my $searchpackagename = ""; - for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ ) - { - if ( ${$rpmfiles}[$i] =~ /-core01-/ ) - { - $searchpackagename = ${$rpmfiles}[$i]; - $found_package = 1; - if ( $searchpackagename =~ /^\s*(.*?-core01)-.*/ ) { $searchpackagename = $1; } - last; - } - } - - if ( ! $found_package ) { installer::exiter::exit_program("ERROR: No package containing \"-core01\" found in directory \"$newepmdir\"", "finalize_linux_patch"); } - - # Replacing the searchpackagename - for ( my $j = 0; $j <= $#{$scriptfile}; $j++ ) { ${$scriptfile}[$j] =~ s/SEARCHPACKAGENAMEPLACEHOLDER/$searchpackagename/; } - - # Setting the PRODUCTDIRECTORYNAME to $installer::globals::officedirhostname - for ( my $j = 0; $j <= $#{$scriptfile}; $j++ ) { ${$scriptfile}[$j] =~ s/PRODUCTDIRECTORYNAME/$installer::globals::officedirhostname/; } - - # Replacing the productname - my $productname = $allvariables->{'PRODUCTNAME'}; - $productname = lc($productname); - $productname =~ s/ /_/g; # abc office -> abc_office - - $infoline = "Adding productname $productname into Linux patch script\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $j = 0; $j <= $#{$scriptfile}; $j++ ) { ${$scriptfile}[$j] =~ s/PRODUCTNAMEPLACEHOLDER/$productname/; } - - # Saving the file - - my $newscriptfilename = "setup"; - installer::files::save_file($newscriptfilename, $scriptfile); - - $infoline = "Saved Linux patch setup $newscriptfilename \n"; - push( @installer::globals::logfileinfo, $infoline); - - # Setting unix rights 755 - chmod 0755, $newscriptfilename; -} - -1; diff --git a/solenv/bin/modules/installer/existence.pm b/solenv/bin/modules/installer/existence.pm deleted file mode 100644 index 509afe94c..000000000 --- a/solenv/bin/modules/installer/existence.pm +++ /dev/null @@ -1,190 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::existence; - -############################# -# Test of existence -############################# - -sub exists_in_array -{ - my ($searchstring, $arrayref) = @_; - - my $alreadyexists = 0; - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - if ( ${$arrayref}[$i] eq $searchstring) - { - $alreadyexists = 1; - last; - } - } - - return $alreadyexists; -} - -sub exists_in_array_of_hashes -{ - my ($searchkey, $searchvalue, $arrayref) = @_; - - my $valueexists = 0; - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - my $hashref = ${$arrayref}[$i]; - - if ( $hashref->{$searchkey} eq $searchvalue ) - { - $valueexists = 1; - last; - } - } - - return $valueexists; -} - -##################################################################### -# Returning a specified file as base for the new -# configuration file, defined by its "gid" -##################################################################### - -sub get_specified_file -{ - my ($filesarrayref, $searchgid) = @_; - - my $foundfile = 0; - my $onefile; - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - $onefile = ${$filesarrayref}[$i]; - my $filegid = $onefile->{'gid'}; - - if ( $filegid eq $searchgid ) - { - $foundfile = 1; - last; - } - } - - my $errorline = "ERROR: Could not find file $searchgid in list of files!"; - - if ( $installer::globals::patch) { $errorline = "ERROR: Could not find file $searchgid in list of files! intro.bmp must be part of every patch. Please assign the flag PATCH in scp2 project."; } - - if (!($foundfile)) - { - installer::exiter::exit_program($errorline, "get_specified_file"); - } - - return $onefile; -} - -##################################################################### -# Returning a specified file as base for a new file, -# defined by its "Name" -##################################################################### - -sub get_specified_file_by_name -{ - my ($filesarrayref, $searchname) = @_; - - my $foundfile = 0; - my $onefile; - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - $onefile = ${$filesarrayref}[$i]; - my $filename = $onefile->{'Name'}; - - if ( $filename eq $searchname ) - { - $foundfile = 1; - last; - } - } - - if (!($foundfile)) - { - installer::exiter::exit_program("ERROR: Could not find file $searchname in list of files!", "get_specified_file_by_name"); - } - - return $onefile; -} - -##################################################################### -# Checking existence of a specific file, defined by its "Name" -##################################################################### - -sub filename_exists_in_filesarray -{ - my ($filesarrayref, $searchname) = @_; - - my $foundfile = 0; - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - my $filename = $onefile->{'Name'}; - - if ( $filename eq $searchname ) - { - $foundfile = 1; - last; - } - } - - return $foundfile; -} - -##################################################################### -# Checking existence of a specific file, defined by its "gid" -##################################################################### - -sub filegid_exists_in_filesarray -{ - my ($filesarrayref, $searchgid) = @_; - - my $foundfile = 0; - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - my $filegid = $onefile->{'gid'}; - - if ( $filegid eq $searchgid ) - { - $foundfile = 1; - last; - } - } - - return $foundfile; -} - -1; diff --git a/solenv/bin/modules/installer/exiter.pm b/solenv/bin/modules/installer/exiter.pm deleted file mode 100644 index 0eba05761..000000000 --- a/solenv/bin/modules/installer/exiter.pm +++ /dev/null @@ -1,113 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::exiter; - -use installer::files; -use installer::globals; -use installer::logger; -use installer::systemactions; -use installer::worker; - -############################################ -# Exiting the program with an error -# This function is used instead of "die" -############################################ - -sub exit_program -{ - my ($message, $function) = @_; - - # If an installation set is currently created, the directory name is saved in $installer::globals::saveinstalldir - # If this directory name matches with "_inprogress", it has to be renamed into "_witherror" - - if ( $installer::globals::saveinstalldir =~ /_inprogress/ ) { installer::systemactions::rename_string_in_directory($installer::globals::saveinstalldir, "_inprogress", "_witherror"); } - - # Cleaning files from pool tooling - if ( $installer::globals::processhaspoolcheckfile ) { unlink $installer::globals::poolcheckfilename; } - if ( $installer::globals::processhaspoollockfile ) { unlink $installer::globals::poollockfilename; } - - installer::worker::clean_output_tree(); # removing directories created in the output tree - - # If @installer::globals::logfileinfo is not empty, it can be used. - # Otherwise the content of @installer::globals::globallogfileinfo has to be used. - - my $infoline; - - $installer::globals::logfilename = $installer::globals::exitlog . $installer::globals::logfilename; - - if ( ! $installer::globals::globalinfo_copied ) { installer::logger::copy_globalinfo_into_logfile(); } - - if ( $#installer::globals::logfileinfo > -1 ) - { - $infoline = "\n***************************************************************\n"; - push(@installer::globals::logfileinfo, $infoline); - - $infoline = "$message\n"; - push(@installer::globals::logfileinfo, $infoline); - - $infoline = "in function: $function\n"; - push(@installer::globals::logfileinfo, $infoline); - - $infoline = "***************************************************************\n"; - push(@installer::globals::logfileinfo, $infoline); - - installer::files::save_file($installer::globals::logfilename ,\@installer::globals::logfileinfo); - } - else - { - $infoline = "\n***************************************************************\n"; - push(@installer::globals::globallogfileinfo, $infoline); - - $infoline = "$message\n"; - push(@installer::globals::globallogfileinfo, $infoline); - - $infoline = "in function: $function\n"; - push(@installer::globals::globallogfileinfo, $infoline); - - $infoline = "***************************************************************\n"; - push(@installer::globals::globallogfileinfo, $infoline); - - installer::files::save_file($installer::globals::logfilename ,\@installer::globals::globallogfileinfo); - } - installer::logger::print_error("$message\nin function: $function"); - installer::logger::print_error("Saved logfile: $installer::globals::logfilename\n"); - - # Saving the debug info - - if ( $installer::globals::debug ) { installer::logger::savedebug($installer::globals::exitlog); } - - installer::logger::stoptime(); - - if (defined($installer::globals::exithandler)) { - &$installer::globals::exithandler; - } - - exit(-1); -} - -1; diff --git a/solenv/bin/modules/installer/files.pm b/solenv/bin/modules/installer/files.pm deleted file mode 100644 index 6d3801799..000000000 --- a/solenv/bin/modules/installer/files.pm +++ /dev/null @@ -1,219 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::files; - -use installer::exiter; -use installer::logger; - -############################################ -# File Operations -############################################ - -sub check_file -{ - my ($arg) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::check_file : $arg"); } - - if(!( -f $arg )) - { - installer::exiter::exit_program("ERROR: Cannot find file $arg", "check_file"); - } -} - -sub read_file -{ - my ($localfile) = @_; - my @localfile = (); - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::read_file : $localfile"); } - - open( IN, "<$localfile" ) || installer::exiter::exit_program("ERROR: Cannot open file $localfile for reading", "read_file"); - -# Don't use "my @localfile = <IN>" here, because -# perl has a problem with the internal "large_and_huge_malloc" function -# when calling perl using MacOS 10.5 with a perl built with MacOS 10.4 - while ( $line = <IN> ) { - push @localfile, $line; - } - - close( IN ); - - return \@localfile; -} - -########################################### -# Saving files, arrays and hashes -########################################### - -sub save_file -{ - my ($savefile, $savecontent) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::save_file : $savefile : $#{$savecontent}"); } - - if ( open( OUT, ">$savefile" ) ) - { - print OUT @{$savecontent}; - close( OUT); - } - else - { - # it is useless to save a log file, if there is no write access - - if ( $savefile =~ /\.log/ ) - { - print "\n*************************************************\n"; - print "ERROR: Cannot write log file: $savefile"; - print "\n*************************************************\n"; - exit(-1); # exiting the program to avoid endless loops - } - - installer::exiter::exit_program("ERROR: Cannot open file $savefile for writing", "save_file"); - } -} - -sub save_hash -{ - my ($savefile, $hashref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::save_hash : $savefile"); } - - my @printcontent = (); - - my $itemkey; - - foreach $itemkey ( keys %{$hashref} ) - { - my $line = ""; - my $itemvalue = $hashref->{$itemkey}; - $line = $itemkey . "=" . $itemvalue . "\n"; - push(@printcontent, $line); - } - - open( OUT, ">$savefile" ) || installer::exiter::exit_program("ERROR: Cannot open file $savefile for writing", "save_hash"); - print OUT @printcontent; - close( OUT); -} - -sub save_array_of_hashes -{ - my ($savefile, $arrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::save_array_of_hashes : $savefile : $#{$arrayref}"); } - - my @printcontent = (); - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - my $line = ""; - my $hashref = ${$arrayref}[$i]; - my $itemkey; - - foreach $itemkey ( keys %{$hashref} ) - { - my $itemvalue = $hashref->{$itemkey}; - $line = $line . $itemkey . "=" . $itemvalue . "\t"; - } - - $line = $line . "\n"; - - push(@printcontent, $line); - } - - open( OUT, ">$savefile" ) || installer::exiter::exit_program("ERROR: Cannot open file $savefile for writing", "save_array_of_hashes"); - print OUT @printcontent; - close( OUT); -} - -sub save_array_of_hashes_modules -{ - my ($savefile, $arrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::save_array_of_hashes : $savefile : $#{$arrayref}"); } - - my @printcontent = (); - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - my $line = "***************************************************\n"; - my $hashref = ${$arrayref}[$i]; - my $itemkey; - - foreach $itemkey ( keys %{$hashref} ) - { - my $itemvalue = $hashref->{$itemkey}; - $line = $line . $itemkey . "=" . $itemvalue . "\n"; - } - - $line = $line . "\n"; - - push(@printcontent, $line); - } - - open( OUT, ">$savefile" ) || installer::exiter::exit_program("ERROR: Cannot open file $savefile for writing", "save_array_of_hashes"); - print OUT @printcontent; - close( OUT); -} - -########################################### -# Binary file operations -########################################### - -sub read_binary_file -{ - my ($filename) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::read_binary_file : $filename"); } - - my $file; - - open( IN, "<$filename" ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for reading", "read_binary_file"); - binmode IN; - seek IN, 0, 2; - my $length = tell IN; - seek IN, 0, 0; - read IN, $file, $length; - close IN; - - return $file; -} - -sub save_binary_file -{ - my ($file, $filename) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::files::save_binary_file : $filename"); } - - open( OUT, ">$filename" ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for writing", "save_binary_file"); - binmode OUT; - print OUT $file; - close OUT; -} - -1; diff --git a/solenv/bin/modules/installer/followme.pm b/solenv/bin/modules/installer/followme.pm deleted file mode 100644 index c3f921486..000000000 --- a/solenv/bin/modules/installer/followme.pm +++ /dev/null @@ -1,217 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::followme; - -use File::Spec; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::systemactions; - -#################################################### -# Creating a file, that contains all information -# to create a follow up process. -#################################################### - -sub save_followme_info -{ - my ($finalinstalldir, $includepatharrayref, $allvariableshashref, $downloadname, $languagestringref, $languagesarrayref, $current_install_number, $loggingdir, $installlogdir) = @_; - - my $downloadinfofilename = $installer::globals::logfilename; - if ( $installer::globals::updatepack ) { $downloadinfofilename =~ s/log_/log_$current_install_number\_/; } - $downloadinfofilename =~ s/log_/follow_me_/; - - # Creating directory - my $downloadinfodir = installer::systemactions::create_directory_next_to_directory($finalinstalldir, "follow_me"); - - my @filecontent = (); - - push(@filecontent, "finalinstalldir: $finalinstalldir\n"); - push(@filecontent, "downloadname: $downloadname\n"); - push(@filecontent, "currentinstallnumber: $current_install_number\n"); - push(@filecontent, "loggingdir: $loggingdir\n"); - push(@filecontent, "installlogdir: $installlogdir\n"); - push(@filecontent, "languagestring: $$languagestringref\n"); - foreach my $element ( @{$languagesarrayref} ) { push(@filecontent, "languagesarray: $element\n"); } - foreach my $path ( @{$includepatharrayref} ) { push(@filecontent, "includepatharray: $path"); } - foreach my $key ( sort keys %{$allvariableshashref} ) { push(@filecontent, "allvariableshash: $key : $allvariableshashref->{$key}\n"); } - push(@filecontent, "globals:updatepack: $installer::globals::updatepack\n"); - push(@filecontent, "globals:added_english: $installer::globals::added_english\n"); - push(@filecontent, "globals:iswindowsbuild: $installer::globals::iswindowsbuild\n"); - push(@filecontent, "globals:issolarisbuild: $installer::globals::issolarisbuild\n"); - push(@filecontent, "globals:issolarispkgbuild: $installer::globals::issolarispkgbuild\n"); - push(@filecontent, "globals:issolarissparcbuild: $installer::globals::issolarissparcbuild\n"); - push(@filecontent, "globals:issolarisx86build: $installer::globals::issolarisx86build\n"); - push(@filecontent, "globals:isfreebsdpkgbuild: $installer::globals::isfreebsdpkgbuild\n"); - push(@filecontent, "globals:islinuxbuild: $installer::globals::islinuxbuild\n"); - push(@filecontent, "globals:isrpmbuild: $installer::globals::isrpmbuild\n"); - push(@filecontent, "globals:islinuxintelrpmbuild: $installer::globals::islinuxintelrpmbuild\n"); - push(@filecontent, "globals:islinuxppcrpmbuild: $installer::globals::islinuxppcrpmbuild\n"); - push(@filecontent, "globals:islinuxx86_64rpmbuild: $installer::globals::islinuxx86_64rpmbuild\n"); - push(@filecontent, "globals:isdebbuild: $installer::globals::isdebbuild\n"); - push(@filecontent, "globals:islinuxinteldebbuild: $installer::globals::islinuxinteldebbuild\n"); - push(@filecontent, "globals:islinuxppcdebbuild: $installer::globals::islinuxppcdebbuild\n"); - push(@filecontent, "globals:islinuxx86_64debbuild: $installer::globals::islinuxx86_64debbuild\n"); - push(@filecontent, "globals:issolaris: $installer::globals::issolaris\n"); - push(@filecontent, "globals:islinux: $installer::globals::islinux\n"); - push(@filecontent, "globals:unpackpath: $installer::globals::unpackpath\n"); - push(@filecontent, "globals:idttemplatepath: $installer::globals::idttemplatepath\n"); - push(@filecontent, "globals:idtlanguagepath: $installer::globals::idtlanguagepath\n"); - push(@filecontent, "globals:logfilename: $installer::globals::logfilename\n"); - push(@filecontent, "globals:product: $installer::globals::product\n"); - push(@filecontent, "globals:patch: $installer::globals::patch\n"); - push(@filecontent, "globals:languagepack: $installer::globals::languagepack\n"); - push(@filecontent, "globals:helppack: $installer::globals::helppack\n"); - push(@filecontent, "globals:installertypedir: $installer::globals::installertypedir\n"); - push(@filecontent, "globals:max_lang_length: $installer::globals::max_lang_length\n"); - push(@filecontent, "globals:compiler: $installer::globals::compiler\n"); - push(@filecontent, "globals:product: $installer::globals::product\n"); - push(@filecontent, "globals:minor: $installer::globals::minor\n"); - push(@filecontent, "globals:lastminor: $installer::globals::lastminor\n"); - push(@filecontent, "globals:nsisfilename: $installer::globals::nsisfilename\n"); - - # Saving file - installer::files::save_file($downloadinfodir . $installer::globals::separator . $downloadinfofilename, \@filecontent); - installer::logger::print_message( "... creating \"follow me\" info file $downloadinfofilename.\n" ); -} - -#################################################### -# Reading the file, that contains all information -# to create a follow up process. -#################################################### - -sub read_followme_info -{ - my ( $filename ) = @_; - - if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file: $filename", "read_download_info"); } - - installer::logger::print_message( "\n... reading \"follow me\" info file $filename\n" ); - - my %contenthash = (); - - my $finalinstalldir = ""; - my $downloadname = ""; - my $currentinstallnumber = ""; - my $loggingdir = ""; - my $installlogdir = ""; - my $languagestring = ""; - my @includepatharray = (); - my @languagesarray = (); - my %allvariableshash = (); - - # Global variables can be set directly - - my $filecontent = installer::files::read_file($filename); - - # First line has to contain the string "finalinstalldir:". - # Otherwise this is not a correct file. - - - if ( ! ( ${$filecontent}[0] =~ /s*finalinstalldir:\s*(.*?)\s*$/ )) { installer::exiter::exit_program("ERROR: Not a correct download info file: $filename", "read_download_info"); } - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - my $line = ${$filecontent}[$i]; - - if ( $line =~ /^\s*finalinstalldir:\s*(.*?)\s*$/ ) { $finalinstalldir = $1; } - if( $^O =~ /cygwin/i ) { $finalinstalldir =~ s/\\/\//; } - if ( $line =~ /^\s*downloadname:\s*(.*?)\s*$/ ) { $downloadname = $1; } - if ( $line =~ /^\s*currentinstallnumber:\s*(.*?)\s*$/ ) { $currentinstallnumber = $1; } - if ( $line =~ /^\s*loggingdir:\s*(.*?)\s*$/ ) { $loggingdir = $1; } - if( $^O =~ /cygwin/i ) { $loggingdir =~ s/\\/\//; } - if ( $line =~ /^\s*installlogdir:\s*(.*?)\s*$/ ) { $installlogdir = $1; } - if( $^O =~ /cygwin/i ) { $installlogdir =~ s/\\/\//; } - if ( $line =~ /^\s*languagestring:\s*(.*?)\s*$/ ) { $languagestring = $1; } - if ( $line =~ /^\s*languagesarray:\s*(.*?)\s*$/ ) { push(@languagesarray, $1); } - if ( $line =~ /^\s*includepatharray:\s*(.*?)\s*$/ ) - { - my $path = $1; - if( $^O =~ /cygwin/i ) { $path =~ s/\\/\//; } - push(@includepatharray, $path . "\n"); - } - if ( $line =~ /^\s*allvariableshash:\s*(.*?)\s*:\s*(.*?)\s*$/ ) { $allvariableshash{$1} = $2; } - if ( $line =~ /^\s*globals:(.*?)\s*:\s*(.*?)\s*$/ ) - { - my $name = $1; - my $value = $2; - if ( $name eq "updatepack" ) { $installer::globals::updatepack = $value; } - if ( $name eq "added_english" ) { $installer::globals::added_english = $value; } - if ( $name eq "iswindowsbuild" ) { $installer::globals::iswindowsbuild = $value; } - if ( $name eq "issolarisbuild" ) { $installer::globals::issolarisbuild = $value; } - if ( $name eq "issolarispkgbuild" ) { $installer::globals::issolarispkgbuild = $value; } - if ( $name eq "issolarissparcbuild" ) { $installer::globals::issolarissparcbuild = $value; } - if ( $name eq "issolarisx86build" ) { $installer::globals::issolarisx86build = $value; } - if ( $name eq "isfreebsdpkgbuild" ) { $installer::globals::isfreebsdpkgbuild = $value; } - if ( $name eq "islinuxbuild" ) { $installer::globals::islinuxbuild = $value; } - if ( $name eq "isrpmbuild" ) { $installer::globals::isrpmbuild = $value; } - if ( $name eq "islinuxintelrpmbuild" ) { $installer::globals::islinuxintelrpmbuild = $value; } - if ( $name eq "islinuxppcrpmbuild" ) { $installer::globals::islinuxppcrpmbuild = $value; } - if ( $name eq "islinuxx86_64rpmbuild" ) { $installer::globals::islinuxx86_64rpmbuild = $value; } - if ( $name eq "isdebbuild" ) { $installer::globals::isdebbuild = $value; } - if ( $name eq "islinuxinteldebbuild" ) { $installer::globals::islinuxinteldebbuild = $value; } - if ( $name eq "islinuxppcdebbuild" ) { $installer::globals::islinuxppcdebbuild = $value; } - if ( $name eq "islinuxx86_64debbuild" ) { $installer::globals::islinuxx86_64debbuild = $value; } - if ( $name eq "issolaris" ) { $installer::globals::issolaris = $value; } - if ( $name eq "islinux" ) { $installer::globals::islinux = $value; } - if ( $name eq "unpackpath" ) { $installer::globals::unpackpath = $value; } - if( $^O =~ /cygwin/i ) { $installer::globals::unpackpath =~ s/\\/\//; } - if ( $name eq "idttemplatepath" ) { $installer::globals::idttemplatepath = $value; } - if( $^O =~ /cygwin/i ) { $installer::globals::idttemplatepath =~ s/\\/\//; } - if ( $name eq "idtlanguagepath" ) { $installer::globals::idtlanguagepath = $value; } - if( $^O =~ /cygwin/i ) { $installer::globals::idtlanguagepath =~ s/\\/\//; } - if ( $name eq "logfilename" ) { $installer::globals::logfilename = $value; } - if ( $name eq "product" ) { $installer::globals::product = $value; } - if ( $name eq "patch" ) { $installer::globals::patch = $value; } - if ( $name eq "languagepack" ) { $installer::globals::languagepack = $value; } - if ( $name eq "helppack" ) { $installer::globals::helppack = $value; } - if ( $name eq "installertypedir" ) { $installer::globals::installertypedir = $value; } - if ( $name eq "max_lang_length" ) { $installer::globals::max_lang_length = $value; } - if ( $name eq "compiler" ) { $installer::globals::compiler = $value; } - if ( $name eq "product" ) { $installer::globals::product = $value; } - if ( $name eq "minor" ) { $installer::globals::minor = $value; } - if ( $name eq "lastminor" ) { $installer::globals::lastminor = $value; } - if ( $name eq "nsisfilename" ) { $installer::globals::nsisfilename = $value; } - } - } - - $contenthash{'finalinstalldir'} = $finalinstalldir; - $contenthash{'downloadname'} = $downloadname; - $contenthash{'currentinstallnumber'} = $currentinstallnumber; - $contenthash{'loggingdir'} = $loggingdir; - $contenthash{'installlogdir'} = $installlogdir; - $contenthash{'languagestring'} = $languagestring; - $contenthash{'languagesarray'} = \@languagesarray; - $contenthash{'includepatharray'} = \@includepatharray; - $contenthash{'allvariableshash'} = \%allvariableshash; - - return \%contenthash; -} - -1; diff --git a/solenv/bin/modules/installer/globals.pm b/solenv/bin/modules/installer/globals.pm deleted file mode 100644 index c35cad690..000000000 --- a/solenv/bin/modules/installer/globals.pm +++ /dev/null @@ -1,550 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::globals; - -############################################ -# Global settings -############################################ - -BEGIN -{ - $prog="make_installer.pl"; - - @noMSLocaleLangs = ( - "br", - "bs", - "dz", - "gu", - "km", - "nr", - "ns", - "nso", - "rw", - "ss", - "st", - "tg", - "ts", - "tn", - "ve", - "xh", - "zu", - "ne", - "bn", - "bn-BD", - "bn-IN", - "lo", - "cy", - "ku", - "as-IN", - "te-IN", - "ml-IN", - "mr-IN", - "ur-IN", - "ta-IN", - "or-IN", - "ti-ER", - "eo", - "ka", - "ga", - "uk", - "gd", - "my", - "mai", - "brx", - "dgo", - "kok", - "mni", - "ca-XV", - "sat", - "ug", - "om", - "si", - "or", - "oc", - "ml", - "as", - "ast", - "ht", - "jbo", - "fur", - "ny", - "so", - "kab", - "tk" - ); - @items_at_modules = ("Files", "Dirs", "Unixlinks"); - @asianlanguages = ("ja", "ko", "zh-CN", "zh-TW"); - @bidilanguages = ("ar", "he"); - - $ziplistname = ""; - $pathfilename = ""; - $setupscriptname = ""; - $headerfilename = ""; - $shellscriptsfilename = ""; - $product = ""; - $languagelist = ""; - $added_english = 0; - $set_office_start_language = 0; - $solarjavaset = 0; - - $destdir = ""; - $rootpath = ""; - - $required_dotnet_version = "2.0.0.0"; - $productextension = ""; - @languageproducts = (); - $build = ""; - $minor = ""; - $lastminor = ""; - $compiler = ""; - $pro = 0; - $dounzip = 1; - $languages_defined_in_productlist = 0; - $setupscript_defined_in_productlist = 0; - $islinux = 0; - $issolaris = 0; - $ismacosx = 0; - $iswindowsbuild = 0; - $islinuxbuild = 0; - $isrpmbuild = 0; - $isdebbuild = 0; - $islinuxintelrpmbuild = 0; - $islinuxppcrpmbuild = 0; - $islinuxinteldebbuild = 0; - $islinuxppcdebbuild = 0; - $islinuxx86_64rpmbuild = 0; - $islinuxx86_64debbuild = 0; - $issolarisbuild = 0; - $issolarispkgbuild = 0; - $issolarissparcbuild = 0; - $issolarisx86build = 0; - $isfreebsdbuild = 0; - $isfreebsdpkgbuild = 0; - $ismacbuild = 0; - $ismacdmgbuild = 0; - $unpackpath = ""; - $idttemplatepath = ""; - $idtlanguagepath = ""; - $packjobref = ""; - $buildid = "Not set"; - $guidcounter = 1000; # for uniqueness of guids - $fontsfolder = "FontsFolder"; - $fontsfoldername = "Fonts"; - $fontsdirparent = ""; - $fontsdirname = ""; - $fontsdirhostname = "truetype"; - $officefolder = "OfficeFolder"; - $officemenufolder = "OfficeMenuFolder"; - $startupfolder = "StartupFolder"; - $startmenufolder = "StartMenuFolder"; - $desktopfolder = "DesktopFolder"; - $programfilesfolder = "ProgramFilesFolder"; - $commonfilesfolder = "CommonFilesFolder"; - $commonappdatafolder = "CommonAppDataFolder"; - $localappdatafolder = "LocalAppDataFolder"; - $templatefolder = "TemplateFolder"; - $templatefoldername = "Templates"; - $programmenufolder = "ProgramMenuFolder"; - $systemfolder = "SystemFolder"; - $encodinglistname = "msi-encodinglist.txt"; - $msiencoding = ""; # hash reference for msi encodings - $msilanguage = ""; # hash reference for msi languages LCID - $sofficeiconadded = 0; - $temppath = ""; - $globaltempdirname = "ooopackaging"; - $cyg_temppath = ""; - $temppathdefined = 0; - $jdstemppathdefined = 0; - $packageversion = 1; - $packagerevision = 1; - $rpm = ""; - $rpmcommand = ""; - $rpmquerycommand = ""; - $rpminfologged = 0; - $debian = ""; - $installertypedir = ""; - $controlledmakecabversion = "5"; - $saved_packages_path = ""; - $max_lang_length = 50; - $globalblock = "Globals"; - $rootmodulegid = ""; - %alllangmodules = (); - $englishlicenseset = 0; - $englishlicense = ""; - $englishsolarislicensename = "LICENSE"; # _en-US"; - $solarisdontcompress = 0; - $patharray = ""; - - $is_special_epm = 0; - $epm_in_path = 0; - $epm_path = ""; - $epmoutpath = ""; - $upx_in_path = 0; - $upxfile = ""; - $simple = 0; - $simpledefaultuserdir = "\$ORIGIN/.."; - $call_epm = 1; - $packageformat = ""; - $packagename = ""; - $packagelist = ""; - $addpackagelist = ""; - $is_unix_multi = 0; - $unixmultipath = ""; - $unixmultipath_orig = ""; - $alllanguagesinproductarrayref = ""; - $shiptestdirectory = ""; - $makelinuxlinkrpm = 0; - $linuxlinkrpmprocess = 0; - $add_required_package = ""; - $linuxrespin = 0; - @linuxpatchfiles = (); - $linuxlibrarybaselevel = "1"; - $linuxlibrarypatchlevel = "1.1"; - @linuxlinks = (); - @linkrpms = (); - $archiveformat = ""; - $minorupgradekey = ""; - $updatelastsequence = 0; - $updatesequencecounter = 0; - $updatedatabase = 0; - $updatedatabasepath = ""; - $pfffileexists = 0; - $pffcabfilename = "ooobasis3.0_pff.cab"; - $mergemodulenumber = 0; - %allmergemodulefilesequences = (); - %newupdatefiles = (); - %allusedupdatesequences = (); - %mergemodulefiles = (); - $mergefiles_added_into_collector = 0; - $creating_windows_installer_patch = 0; - - $strip = 1; - - $globallogging = 0; - $globalloggingform21 = 1; - $logfilename = "logfile.log"; # the default logfile name for global errors - @logfileinfo = (); - @errorlogfileinfo = (); - @globallogfileinfo = (); - $ignore_error_in_logfile = 0; - $exitlog = ""; - $globalinfo_copied = 0; - $quiet = 0; - $nodownload = 0; - $writetotemp = 0; - $useminor = 0; - $followme_from_directory = 0; - $internal_cabinet_signing = 0; - - $debug = 0; - $debugfilename = "debug.txt"; - $checksumfilename = "checksum.txt"; - @functioncalls = (); - - $ismultilingual = 0; - @multilanguagemodules = (); - $languagemodulesbase = "gid_Module_Root_"; - %alluniquefilenames = (); - %alllcuniquefilenames = (); - %uniquefilenamesequence = (); - %dependfilenames = (); - $isopensourceproduct = 1; - $manufacturer = ""; - $longmanufacturer = ""; - $sundirname = "Oracle"; - $codefilename = "codes.txt"; - $componentfilename = "components.txt"; - $productcode = ""; - $upgradecode = ""; - $msiproductversion = ""; - $msimajorproductversion = ""; - $created_new_component_guid = 0; - @allddffiles = (); - $infodirectory = ""; - @currentcontent = (); - @installsetcontent = (); - %xpdpackageinfo = (); - $signfiles_checked = 0; - $dosign = 0; - $pwfile = ""; - $pwfile = ""; - $pfxfile = ""; - - %mergemodules = (); - %merge_media_line = (); - %merge_allfeature_hash = (); - %merge_alldirectory_hash = (); - %copy_msm_files = (); - $mergefeaturecollected = 0; - $mergedirectoriescollected = 0; - $lastsequence_before_merge = 0; - $lastcabfilename = ""; - - $createdxpddefaultlang = 0; - $xpddir = ""; - $productxpdfile = "setup.xpd"; - $xpd_files_prepared = 0; - $defaultlanguage = ""; - @createdxpdfiles = (); - @allxpdfiles = (); - $isxpdplatform = 0; - $javalanguagepath = ""; - $javasettozero = 0; - $addlicensefile = 1; - $addsystemintegration = 0; - $added_directories = 0; - $makedownload = 1; - $makejds = 1; - $jdsexcludefilename = ""; - $jds_language_controlled = 0; - $correct_jds_language = 0; - @installsetfiles = (); - @binarytableonlyfiles = (); - @allscpactions = (); - $languagepackaddon = "LanguagePack"; - $helppackaddon = "HelpPack"; - $patchaddon = "Patch"; - $ooodownloadfilename = ""; - $downloadfilename = ""; - $downloadfileextension = ""; - $followmeinfofilename = ""; - $oooversionstring = ""; - $shellnewfilesadded = 0; - %multilingual_only_modules = (); - %application_modules = (); - $defaultinstallorder = 1000; - $defaultsystemintinstallorder = 1200; - - $is_copy_only_project = 0; - $is_simple_packager_project = 0; - $patch_user_dir = 0; - $addchildprojects = 0; - $languagepack = 0; - $helppack = 0; - $tab = 0; - $patch = 0; - $patchincludepath = ""; - $refresh_includepathes = 0; - $include_pathes_read = 0; - $patchfilelistname = "patchfilelist.txt"; - @patchfilecollector = (); - $nopatchfilecollector = ""; - @userregistrycollector = (); - $addeduserregitrykeys = 0; - $poolpathset = 0; - $poolpath = 0; - $poollockfilename = ""; - $poolcheckfilename = ""; - %poolshiftedpackages = (); - %poolpackages = (); - %createpackages = (); - $processhaspoolcheckfile = 0; - $processhaspoollockfile = 0; - $newpcfcontentcalculated = 0; - $sessionid = 0; - $sessionidset = 0; - $savelockfilecontent = ""; - $savelockfilename = ""; - $getuidpath = ""; - $getuidpathset = 0; - $newpcfcontent = ""; - %pcfdifflist = (); - @pcfdiffcomment = (); - @epmdifflist = (); - $desktoplinkexists = 0; - $sundirexists = 0; - $analyze_spellcheckerlanguage = 0; - %spellcheckerlanguagehash = (); - %spellcheckerfilehash = (); - $registryrootcomponent = ""; - %allcomponents = (); - %allcomponents_in_this_database = (); - %allshortcomponents = (); - %alluniquedirectorynames = (); - %allregistrycomponents_ = (); - %allregistrycomponents_in_this_database_ = (); - %allshortregistrycomponents = (); - %allregistryidentifier = (); - - $installlocationdirectory = ""; - $installlocationdirectoryset = 0; - $vendordirectory = ""; - $vendordirectoryset = 0; - $officeinstalldirectory = ""; - $officeinstalldirectoryset = 0; - $basisinstalldirectory = ""; - $basisinstalldirectoryset = 0; - $ureinstalldirectory = ""; - $ureinstalldirectoryset = 0; - $rootbrandpackage = ""; - $rootbrandpackageset = 0; - $officedirhostname = ""; - $basisdirhostname = ""; - $uredirhostname = ""; - $sundirhostname = ""; - $officedirgid = ""; - $basisdirgid = ""; - $uredirgid = ""; - $sundirgid = ""; - - %sign_extensions = ("dll" => "1", "exe" => "1", "cab" => "1"); - %treestyles = (); - %installlocations = ("INSTALLLOCATION" => "1"); - %treelayername = (); - %hostnametreestyles = (); - %treeconditions = (); - %usedtreeconditions = (); - %moduledestination = (); - - $one_cab_file = 0; - $fix_number_of_cab_files = 1; - $cab_file_per_component = 0; - $cabfilecompressionlevel = 21; # Using LZX compression, possible values are: 15 | 16 | ... | 21 (best compression) - $number_of_cabfiles = 1; # only for $fix_number_of_cab_files = 1 - $include_cab_in_msi = 0; - $use_packages_for_cabs = 0; - $msidatabasename = ""; - $prepare_winpatch = 0; - $previous_idt_dir = ""; - $updatepack = 0; - $msitranpath = ""; - $insert_file_at_end = 0; - $newfilesexist = 0; - $usesharepointpath = 0; - %newfilescollector = (); - - $saveinstalldir = ""; - $csp_installdir = ""; # global installdir of createsimplepackage() in simplepackage.pm - $csp_installlogdir = ""; # global installlogdir of createsimplepackage() in simplepackage.pm - $csp_languagestring = ""; # global languagestring of createsimplepackage() in simplepackage.pm - $localunpackdir = ""; - $localinstalldirset = 0; - $localinstalldir = ""; - - $javafilename = ""; - $javafilename2 = ""; - $javafilename3 = ""; - $javafile = ""; - $urefile = ""; - - $postprocess_specialepm = 0; - $postprocess_standardepm = 0; - $mergemodules_analyzed = 0; - - $starttime = ""; - - @solarispatchscripts = ("checkinstall", "copyright", "patch_checkinstall", "patch_postinstall", "postinstall", "preinstall", "i.none"); - @solarispatchscriptsforextensions = ("checkinstall", "copyright", "patch_checkinstall", "patch_postinstall_extensions", "postinstall_extensions", "preinstall", "i.none"); - @solarispatchfiles = (".diPatch", "patchinfo"); - @environmentvariables = ( "SOLARVERSION", "GUI", "WORK_STAMP", "OUTPATH", "LOCAL_OUT", "LOCAL_COMMON_OUT" ); - @packagelistitems = ("module", "solarispackagename", "packagename", "copyright", "vendor", "description" ); - @languagepackfeature =(); - @helppackfeature =(); - @featurecollector =(); - $msiassemblyfiles = ""; - $nsisfilename = "Nsis"; - $macinstallfilename = "macinstall.ulf"; - $nsis204 = 0; - $nsis231 = 0; - $unicodensis = 0; - $linuxlinkrpms = ""; - $extensioninstalldir = "gid_Dir_Share_Extension_Install"; - @languagenames = (); - @requiredpackages = (); - %componentcondition = (); - %componentid = (); - %comparecomponentname = (); - %languageproperties = (); - %allcabinets = (); - %allcabinetassigns = (); - %cabfilecounter = (); - %lastsequence = (); - %dontdeletecomponents = (); - %allcalculated_guids = (); - %calculated_component_guids = (); - %base_independent_components = (); - %all_english_languagestrings = (); - %all_required_english_languagestrings = (); - - @forced_properties = ("SERVICETAG_PRODUCTNAME", "SERVICETAG_PRODUCTVERSION", "SERVICETAG_PARENTNAME", "SERVICETAG_SOURCE", "SERVICETAG_URN"); - - @removedirs = (); - @jdsremovedirs = (); - @emptypackages = (); - %fontpackageexists = (); - - $exithandler = undef; - - $plat = $^O; - - if ( $plat =~ /cygwin/i ) - { - $zippath = "zip"; # Has to be in the path: /usr/bin/zip - $checksumfile = "so_checksum"; - $unopkgfile = "unopkg.exe"; - $separator = "/"; - $pathseparator = "\:"; - $libextension = "\.dll"; - $isunix = 0; - $iswin = 1; - $archiveformat = ".zip"; - %savedmapping = (); - %savedrevmapping = (); - %savedrev83mapping = (); - %saved83dirmapping = (); - } - else - { - $zippath = "zip"; # Has to be in the path: /usr/bin/zip - $checksumfile = "so_checksum"; - $unopkgfile = "unopkg"; - $separator = "/"; - $pathseparator = "\:"; - if ( $plat =~ /darwin/i ) - { - $libextension = "\.dylib"; - } - else - { - $libextension = "\.so"; - } - $archiveformat = ".tar.gz"; - $isunix = 1; - $iswin = 0; - } - - if ( $plat =~ /linux/i ) { $islinux = 1; } - if ( $plat =~ /kfreebsd/i ) { $islinux = 1; } - if ( $plat =~ /solaris/i ) { $issolaris = 1; } - if ( $plat =~ /darwin/i ) { $ismacosx = 1; } - - # ToDo: Needs to be expanded for additional platforms - -} - -1; diff --git a/solenv/bin/modules/installer/helppack.pm b/solenv/bin/modules/installer/helppack.pm deleted file mode 100644 index e5b674c93..000000000 --- a/solenv/bin/modules/installer/helppack.pm +++ /dev/null @@ -1,537 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::helppack; - -use installer::converter; -use installer::existence; -use installer::files; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::scpzipfiles; -use installer::scriptitems; -use installer::systemactions; -use installer::worker; - -sub select_help_items -{ - my ( $itemsref, $languagesarrayref, $itemname ) = @_; - - installer::logger::include_header_into_logfile("Selecting items for help pack. Item: $itemname"); - - my @itemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) - { - my $oneitem = ${$itemsref}[$i]; - - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - - if (( $styles =~ /\bHELPPACK\b/ ) || ( $styles =~ /\bFORCEHELPPACK\b/ )) - { - # Files with style "HELPPACK" and "FORCEHELPPACK" also have to be included into the help pack. - # Files with style "HELPPACK" are only included into help packs. - # Files with style "FORCEHELPPACK" are included into help packs and non help packs. They are - # forced, because otherwise they not not be included into helppacks. - - my $ismultilingual = $oneitem->{'ismultilingual'}; - - if ($ismultilingual) - { - my $specificlanguage = ""; - if ( $oneitem->{'specificlanguage'} ) { $specificlanguage = $oneitem->{'specificlanguage'}; } - - for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ ) # iterating over all languages - { - my $onelanguage = ${$languagesarrayref}[$j]; - my $locallang = $onelanguage; - $locallang =~ s/-/_/; - - if ( $specificlanguage eq $onelanguage ) - { - push(@itemsarray, $oneitem); - } - } - } - else - { - push(@itemsarray, $oneitem); - } - } - } - - return \@itemsarray; -} - -sub replace_languagestring_variable -{ - my ($onepackageref, $languagestringref) = @_; - - my $key; - - foreach $key (keys %{$onepackageref}) - { - my $value = $onepackageref->{$key}; - $value =~ s/\%LANGUAGESTRING/$$languagestringref/g; - $onepackageref->{$key} = $value; - } -} - -######################################################### -# Including the license text into the script template -######################################################### - -sub put_license_file_into_script -{ - my ($scriptfile, $licensefile) = @_; - - my $infoline = "Adding licensefile into help pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $includestring = ""; - - for ( my $i = 0; $i <= $#{$licensefile}; $i++ ) - { - $includestring = $includestring . ${$licensefile}[$i]; - } - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/LICENSEFILEPLACEHOLDER/$includestring/; - } -} - -######################################################### -# Creating a tar.gz file from a Solaris package -######################################################### - -sub create_tar_gz_file -{ - my ($installdir, $packagename, $packagestring) = @_; - - $packagename =~ s/\.rpm\s*$//; - my $targzname = $packagename . ".tar.gz"; - $systemcall = "cd $installdir; tar -cf - $packagestring | gzip > $targzname"; - installer::logger::print_message( "... $systemcall ...\n" ); - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return $targzname; -} - -######################################################### -# Determining the name of the package file -######################################################### - -sub get_packagename_from_packagelist -{ - my ( $alldirs, $allvariables, $languagestringref ) = @_; - - # my $packagename = ""; - - # for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) - # { - # if ( ${$alldirs}[$i] =~ /-fonts/ ) { next; } - # if ( ${$alldirs}[$i] =~ /-help/ ) { next; } - # if ( ${$alldirs}[$i] =~ /-res/ ) { next; } - # - # $packagename = ${$alldirs}[$i]; - # last; - # } - - # if ( $packagename eq "" ) { installer::exiter::exit_program("ERROR: Could not find base package in directory $installdir!", "get_packagename_from_packagelist"); } - - my $localproductname = $allvariables->{'PRODUCTNAME'}; - $localproductname = lc($localproductname); - $localproductname =~ s/ //g; - $localproductname =~ s/-/_/g; - - my $packagename = $localproductname . "_" . $$languagestringref; - - return $packagename; -} - -######################################################### -# Determining the name of the package file or the rpm -# in the installation directory. For help packs -# there is only one file in this directory -######################################################### - -sub determine_packagename -{ - my ( $installdir, $allvariables, $languagestringref ) = @_; - - my $packagename = ""; - my $allnames = ""; - - if ( $installer::globals::isrpmbuild ) - { - # determining the rpm file in directory $installdir - - my $fileextension = "rpm"; - my $rpmfiles = installer::systemactions::find_file_with_file_extension($fileextension, $installdir); - if ( ! ( $#{$rpmfiles} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); } - my $rpmsav = [@{$rpmfiles}]; - for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$rpmfiles}[$i]); } - - $packagename = get_packagename_from_packagelist($rpmfiles, $allvariables, $languagestringref); - - my $packagestring = installer::converter::convert_array_to_space_separated_string($rpmfiles); - $packagename = create_tar_gz_file($installdir, $packagename, $packagestring); # only one file - for ( my $i = 0; $i <= $#{$rpmsav}; $i++ ) - { - my $onefile = $installdir . $installer::globals::separator . ${$rpmsav}[$i]; - unlink($onefile); - } - - $allnames = $rpmfiles; - } - - if ( $installer::globals::issolarisbuild ) - { - # determining the Solaris package file in directory $installdir - my $alldirs = installer::systemactions::get_all_directories($installdir); - - if ( ! ( $#{$alldirs} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); } - my $alldirssav = [@{$alldirs}]; - for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$alldirs}[$i]); } - - $packagename = get_packagename_from_packagelist($alldirs, $allvariables, $languagestringref); - my $packagestring = installer::converter::convert_array_to_space_separated_string($alldirs); - $packagename = create_tar_gz_file($installdir, $packagename, $packagestring); # only a file (not a directory) can be included into the shell script - for ( my $i = 0; $i <= $#{$alldirssav}; $i++ ) { installer::systemactions::remove_complete_directory(${$alldirssav}[$i], 1); } - $allnames = $alldirs; - } - - my $infoline = "Found package in installation directory $installdir : $packagename\n"; - push( @installer::globals::logfileinfo, $infoline); - - return ( $packagename, $allnames); -} - -######################################################### -# Including the name of the package file or the rpm -# into the script template -######################################################### - -sub put_packagename_into_script -{ - my ($scriptfile, $packagename, $allnames) = @_; - - my $localpackagename = $packagename; - $localpackagename =~ s/\.tar\.gz//; # making "OOOopenoffice-it-ea.tar.gz" to "OOOopenoffice-it-ea" - my $infoline = "Adding packagename $localpackagename into help pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $installline = ""; - - if ( $installer::globals::issolarisbuild ) { $installline = " /usr/sbin/pkgadd -d \$outdir -a \$adminfile"; } - - if ( $installer::globals::isrpmbuild ) { $installline = " rpm --prefix \$PRODUCTINSTALLLOCATION --replacepkgs -i"; } - - for ( my $i = 0; $i <= $#{$allnames}; $i++ ) - { - if ( $installer::globals::issolarisbuild ) { $installline = $installline . " ${$allnames}[$i]"; } - - if ( $installer::globals::isrpmbuild ) { $installline = $installline . " \$outdir/${$allnames}[$i]"; } - } - - for ( my $j = 0; $j <= $#{$scriptfile}; $j++ ) - { - ${$scriptfile}[$j] =~ s/INSTALLLINES/$installline/; - } -} - -################################################################## -# Including the lowercase product name into the script template -################################################################## - -sub put_productname_into_script -{ - my ($scriptfile, $variableshashref) = @_; - - my $productname = $variableshashref->{'PRODUCTNAME'}; - $productname = lc($productname); - $productname =~ s/\.//g; # openoffice.org -> openofficeorg - - my $infoline = "Adding productname $productname into help pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/PRODUCTNAMEPLACEHOLDER/$productname/; - } -} - -################################################################## -# Including the full product name into the script template -# (name and version) -################################################################## - -sub put_fullproductname_into_script -{ - my ($scriptfile, $variableshashref) = @_; - - my $productname = $variableshashref->{'PRODUCTNAME'}; - my $productversion = ""; - if ( $variableshashref->{'PRODUCTVERSION'} ) { $productversion = $variableshashref->{'PRODUCTVERSION'}; }; - my $fullproductname = $productname . " " . $productversion; - - my $infoline = "Adding full productname \"$fullproductname\" into help pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/FULLPRODUCTNAMELONGPLACEHOLDER/$fullproductname/; - } -} - -################################################################## -# Including the name of the search package (-core01) -# into the script template -################################################################## - -sub put_searchpackage_into_script -{ - my ($scriptfile, $variableshashref) = @_; - - my $basispackageprefix = $variableshashref->{'BASISPACKAGEPREFIX'}; - my $basispackageversion = $variableshashref->{'OOOBASEVERSION'}; - - if ( $installer::globals::issolarisbuild ) { $basispackageversion =~ s/\.//g; } # "3.0" -> "30" - - my $infoline = "Adding basis package prefix $basispackageprefix into help pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - $infoline = "Adding basis package version $basispackageversion into help pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/BASISPACKAGEPREFIXPLACEHOLDER/$basispackageprefix/; - ${$scriptfile}[$i] =~ s/OOOBASEVERSIONPLACEHOLDER/$basispackageversion/; - } - -} - -######################################################### -# Including the linenumber into the script template -######################################################### - -sub put_linenumber_into_script -{ - my ( $scriptfile, $licensefile, $allnames ) = @_; - - my $linenumber = $#{$scriptfile} + $#{$licensefile} + 3; # also adding the content of the license file! - - my $infoline = "Adding linenumber $linenumber into help pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/LINENUMBERPLACEHOLDER/$linenumber/; - } -} - -######################################################### -# Determining the name of the new scriptfile -######################################################### - -sub determine_scriptfile_name -{ - my ( $packagename ) = @_; - - my $scriptfilename = $packagename; - -# if ( $installer::globals::isrpmbuild ) { $scriptfilename =~ s/\.rpm\s*$/\.sh/; } -# if ( $installer::globals::issolarisbuild ) { $scriptfilename =~ s/\.tar\.gz\s*$/\.sh/; } - - $scriptfilename =~ s/\.tar\.gz\s*$/\.sh/; - - my $infoline = "Setting help pack script file name to $scriptfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - return $scriptfilename; -} - -######################################################### -# Saving the script file in the installation directory -######################################################### - -sub save_script_file -{ - my ($installdir, $newscriptfilename, $scriptfile) = @_; - - $newscriptfilename = $installdir . $installer::globals::separator . $newscriptfilename; - installer::files::save_file($newscriptfilename, $scriptfile); - - my $infoline = "Saving script file $newscriptfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - return $newscriptfilename; -} - -######################################################### -# Including the binary package into the script -######################################################### - -sub include_package_into_script -{ - my ( $scriptfilename, $installdir, $packagename ) = @_; - - my $longpackagename = $installdir . $installer::globals::separator . $packagename; - my $systemcall = "cat $longpackagename >>$scriptfilename"; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - my $localcall = "chmod 775 $scriptfilename \>\/dev\/null 2\>\&1"; - system($localcall); - -} - -######################################################### -# Removing the binary package -######################################################### - -sub remove_package -{ - my ( $installdir, $packagename ) = @_; - - my $remove_package = 1; - - if ( $ENV{'DONT_REMOVE_PACKAGE'} ) { $remove_package = 0; } - - if ( $remove_package ) - { - my $longpackagename = $installdir . $installer::globals::separator . $packagename; - unlink $longpackagename; - - my $infoline = "Removing package: $longpackagename \n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -#################################################### -# Unix help packs, that are not part of -# multilingual installation sets, need a -# shell script installer -#################################################### - -sub build_installer_for_helppack -{ - my ($installdir, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref) = @_; - - installer::logger::print_message( "... creating shell script installer ...\n" ); - - installer::logger::include_header_into_logfile("Creating shell script installer:"); - - # find and read setup script template - - my $scriptfilename = "langpackscript.sh"; - my $scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptfilename, $includepatharrayref, 0); - if ($$scriptref eq "") { installer::exiter::exit_program("ERROR: Could not find script file $scriptfilename!", "build_installer_for_helppack"); } - my $scriptfile = installer::files::read_file($$scriptref); - - my $infoline = "Found script file $scriptfilename: $$scriptref \n"; - push( @installer::globals::logfileinfo, $infoline); - - # find and read english license file - my $licenselanguage = "en-US"; # always english ! - my $licensefilename = "LICENSE"; # _" . $licenselanguage; - my $licenseincludepatharrayref = installer::worker::get_language_specific_include_pathes($includepatharrayref, $licenselanguage); - - my $licenseref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $licenseincludepatharrayref, 0); - if ($$licenseref eq "") { installer::exiter::exit_program("ERROR: Could not find License file $licensefilename!", "build_installer_for_helppack"); } - my $licensefile = installer::files::read_file($$licenseref); - - $infoline = "Found licensefile $licensefilename: $$licenseref \n"; - push( @installer::globals::logfileinfo, $infoline); - - # including variables into license file - installer::scpzipfiles::replace_all_ziplistvariables_in_file($licensefile, $allvariableshashref); - - # add license text into script template - put_license_file_into_script($scriptfile, $licensefile); - - # add rpm or package file name into script template - my ( $packagename, $allnames) = determine_packagename($installdir, $allvariableshashref, $languagestringref); - put_packagename_into_script($scriptfile, $packagename, $allnames); - - # add product name into script template - put_productname_into_script($scriptfile, $allvariableshashref); - - # add product name into script template - put_fullproductname_into_script($scriptfile, $allvariableshashref); - - # add product name into script template - put_searchpackage_into_script($scriptfile, $allvariableshashref); - - # replace linenumber in script template - put_linenumber_into_script($scriptfile, $licensefile, $allnames); - - # saving the script file - my $newscriptfilename = determine_scriptfile_name($packagename); - $newscriptfilename = save_script_file($installdir, $newscriptfilename, $scriptfile); - - # include rpm or package into script - include_package_into_script($newscriptfilename, $installdir, $packagename); - - # remove rpm or package - remove_package($installdir, $packagename); -} - -1; diff --git a/solenv/bin/modules/installer/languagepack.pm b/solenv/bin/modules/installer/languagepack.pm deleted file mode 100644 index b7af3bb45..000000000 --- a/solenv/bin/modules/installer/languagepack.pm +++ /dev/null @@ -1,520 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::languagepack; - -use installer::converter; -use installer::existence; -use installer::files; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::scpzipfiles; -use installer::scriptitems; -use installer::systemactions; -use installer::worker; - -#################################################### -# Selecting all files with the correct language -#################################################### - -sub select_language_items -{ - my ( $itemsref, $languagesarrayref, $itemname ) = @_; - - installer::logger::include_header_into_logfile("Selecting languages for language pack. Item: $itemname"); - - my @itemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) - { - my $oneitem = ${$itemsref}[$i]; - - my $ismultilingual = $oneitem->{'ismultilingual'}; - - if (!($ismultilingual)) - { - # Files with style "LANGUAGEPACK" and "FORCELANGUAGEPACK" also have to be included into the language pack. - # Files with style "LANGUAGEPACK" are only included into language packs. - # Files with style "FORCELANGUAGEPACK" are included into language packs and non language packs. They are - # forced, because otherwise they not not be included into languagepacks. - - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - - if (( $styles =~ /\bLANGUAGEPACK\b/ ) || ( $styles =~ /\bFORCELANGUAGEPACK\b/ )) { push(@itemsarray, $oneitem); } - - next; # single language files are not included into language pack - } - - my $specificlanguage = ""; - if ( $oneitem->{'specificlanguage'} ) { $specificlanguage = $oneitem->{'specificlanguage'}; } - - for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ ) # iterating over all languages - { - my $onelanguage = ${$languagesarrayref}[$j]; - my $locallang = $onelanguage; - $locallang =~ s/-/_/; - - if ( $specificlanguage eq $onelanguage ) - { - push(@itemsarray, $oneitem); - } - } - } - - return \@itemsarray; -} - -sub replace_languagestring_variable -{ - my ($onepackageref, $languagestringref) = @_; - - my $key; - - foreach $key (keys %{$onepackageref}) - { - my $value = $onepackageref->{$key}; - $value =~ s/\%LANGUAGESTRING/$$languagestringref/g; - $onepackageref->{$key} = $value; - } -} - -######################################################### -# Including the license text into the script template -######################################################### - -sub put_license_file_into_script -{ - my ($scriptfile, $licensefile) = @_; - - my $infoline = "Adding licensefile into language pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $includestring = ""; - - for ( my $i = 0; $i <= $#{$licensefile}; $i++ ) - { - $includestring = $includestring . ${$licensefile}[$i]; - } - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/LICENSEFILEPLACEHOLDER/$includestring/; - } -} - -######################################################### -# Creating a tar.gz file from a Solaris package -######################################################### - -sub create_tar_gz_file -{ - my ($installdir, $packagename, $packagestring) = @_; - - $packagename =~ s/\.rpm\s*$//; - my $targzname = $packagename . ".tar.gz"; - $systemcall = "cd $installdir; tar -cf - $packagestring | gzip > $targzname"; - installer::logger::print_message( "... $systemcall ...\n" ); - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return $targzname; -} - -######################################################### -# Determining the name of the package file -######################################################### - -sub get_packagename_from_packagelist -{ - my ( $alldirs, $allvariables, $languagestringref ) = @_; - - my $localproductname = $allvariables->{'PRODUCTNAME'}; - $localproductname = lc($localproductname); - $localproductname =~ s/ //g; - $localproductname =~ s/-/_/g; - - my $packagename = $localproductname . "_" . $$languagestringref; - - return $packagename; -} - -######################################################### -# Determining the name of the package file or the rpm -# in the installation directory. For language packs -# there is only one file in this directory -######################################################### - -sub determine_packagename -{ - my ( $installdir, $allvariables, $languagestringref ) = @_; - - my $packagename = ""; - my $allnames = ""; - - if ( $installer::globals::isrpmbuild ) - { - # determining the rpm file in directory $installdir - - my $fileextension = "rpm"; - my $rpmfiles = installer::systemactions::find_file_with_file_extension($fileextension, $installdir); - if ( ! ( $#{$rpmfiles} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); } - my $rpmsav = [@{$rpmfiles}]; - for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$rpmfiles}[$i]); } - - $packagename = get_packagename_from_packagelist($rpmfiles, $allvariables, $languagestringref); - - my $packagestring = installer::converter::convert_array_to_space_separated_string($rpmfiles); - $packagename = create_tar_gz_file($installdir, $packagename, $packagestring); # only one file - for ( my $i = 0; $i <= $#{$rpmsav}; $i++ ) - { - my $onefile = $installdir . $installer::globals::separator . ${$rpmsav}[$i]; - unlink($onefile); - } - - $allnames = $rpmfiles; - } - - if ( $installer::globals::issolarisbuild ) - { - # determining the Solaris package file in directory $installdir - my $alldirs = installer::systemactions::get_all_directories($installdir); - - if ( ! ( $#{$alldirs} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); } - my $alldirssav = [@{$alldirs}]; - for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$alldirs}[$i]); } - - $packagename = get_packagename_from_packagelist($alldirs, $allvariables, $languagestringref); - my $packagestring = installer::converter::convert_array_to_space_separated_string($alldirs); - $packagename = create_tar_gz_file($installdir, $packagename, $packagestring); # only a file (not a directory) can be included into the shell script - for ( my $i = 0; $i <= $#{$alldirssav}; $i++ ) { installer::systemactions::remove_complete_directory(${$alldirssav}[$i], 1); } - $allnames = $alldirs; - } - - my $infoline = "Found package in installation directory $installdir : $packagename\n"; - push( @installer::globals::logfileinfo, $infoline); - - return ( $packagename, $allnames); -} - -######################################################### -# Including the name of the package file or the rpm -# into the script template -######################################################### - -sub put_packagename_into_script -{ - my ($scriptfile, $packagename, $allnames) = @_; - - my $localpackagename = $packagename; - $localpackagename =~ s/\.tar\.gz//; # making "OOOopenoffice-it-ea.tar.gz" to "OOOopenoffice-it-ea" - my $infoline = "Adding packagename $localpackagename into language pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $installline = ""; - - if ( $installer::globals::issolarisbuild ) { $installline = " /usr/sbin/pkgadd -d \$outdir -a \$adminfile"; } - - if ( $installer::globals::isrpmbuild ) { $installline = " rpm --prefix \$PRODUCTINSTALLLOCATION --replacepkgs -i"; } - - for ( my $i = 0; $i <= $#{$allnames}; $i++ ) - { - if ( $installer::globals::issolarisbuild ) { $installline = $installline . " ${$allnames}[$i]"; } - - if ( $installer::globals::isrpmbuild ) { $installline = $installline . " \$outdir/${$allnames}[$i]"; } - } - - for ( my $j = 0; $j <= $#{$scriptfile}; $j++ ) - { - ${$scriptfile}[$j] =~ s/INSTALLLINES/$installline/; - } -} - -################################################################## -# Including the lowercase product name into the script template -################################################################## - -sub put_productname_into_script -{ - my ($scriptfile, $variableshashref) = @_; - - my $productname = $variableshashref->{'PRODUCTNAME'}; - $productname = lc($productname); - $productname =~ s/\.//g; # openoffice.org -> openofficeorg - - my $infoline = "Adding productname $productname into language pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/PRODUCTNAMEPLACEHOLDER/$productname/; - } -} - -################################################################## -# Including the full product name into the script template -# (name and version) -################################################################## - -sub put_fullproductname_into_script -{ - my ($scriptfile, $variableshashref) = @_; - - my $productname = $variableshashref->{'PRODUCTNAME'}; - my $productversion = ""; - if ( $variableshashref->{'PRODUCTVERSION'} ) { $productversion = $variableshashref->{'PRODUCTVERSION'}; }; - my $fullproductname = $productname . " " . $productversion; - - my $infoline = "Adding full productname \"$fullproductname\" into language pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/FULLPRODUCTNAMELONGPLACEHOLDER/$fullproductname/; - } -} - -################################################################## -# Including the name of the search package (-core01) -# into the script template -################################################################## - -sub put_searchpackage_into_script -{ - my ($scriptfile, $variableshashref) = @_; - - my $basispackageprefix = $variableshashref->{'BASISPACKAGEPREFIX'}; - my $basispackageversion = $variableshashref->{'OOOBASEVERSION'}; - - if ( $installer::globals::issolarisbuild ) { $basispackageversion =~ s/\.//g; } # "3.0" -> "30" - - my $infoline = "Adding basis package prefix $basispackageprefix into language pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - $infoline = "Adding basis package version $basispackageversion into language pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/BASISPACKAGEPREFIXPLACEHOLDER/$basispackageprefix/; - ${$scriptfile}[$i] =~ s/OOOBASEVERSIONPLACEHOLDER/$basispackageversion/; - } - -} - -######################################################### -# Including the linenumber into the script template -######################################################### - -sub put_linenumber_into_script -{ - my ( $scriptfile, $licensefile, $allnames ) = @_; - - my $linenumber = $#{$scriptfile} + $#{$licensefile} + 3; # also adding the content of the license file! - - my $infoline = "Adding linenumber $linenumber into language pack script\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/LINENUMBERPLACEHOLDER/$linenumber/; - } -} - -######################################################### -# Determining the name of the new scriptfile -######################################################### - -sub determine_scriptfile_name -{ - my ( $packagename ) = @_; - - my $scriptfilename = $packagename; - - $scriptfilename =~ s/\.tar\.gz\s*$/\.sh/; - - my $infoline = "Setting language pack script file name to $scriptfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - return $scriptfilename; -} - -######################################################### -# Saving the script file in the installation directory -######################################################### - -sub save_script_file -{ - my ($installdir, $newscriptfilename, $scriptfile) = @_; - - $newscriptfilename = $installdir . $installer::globals::separator . $newscriptfilename; - installer::files::save_file($newscriptfilename, $scriptfile); - - my $infoline = "Saving script file $newscriptfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - return $newscriptfilename; -} - -######################################################### -# Including the binary package into the script -######################################################### - -sub include_package_into_script -{ - my ( $scriptfilename, $installdir, $packagename ) = @_; - - my $longpackagename = $installdir . $installer::globals::separator . $packagename; - my $systemcall = "cat $longpackagename >>$scriptfilename"; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - chmod 0775, $scriptfilename; - -} - -######################################################### -# Removing the binary package -######################################################### - -sub remove_package -{ - my ( $installdir, $packagename ) = @_; - - my $remove_package = 1; - - if ( $ENV{'DONT_REMOVE_PACKAGE'} ) { $remove_package = 0; } - - if ( $remove_package ) - { - my $longpackagename = $installdir . $installer::globals::separator . $packagename; - unlink $longpackagename; - - my $infoline = "Removing package: $longpackagename \n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -#################################################### -# Unix language packs, that are not part of -# multilingual installation sets, need a -# shell script installer -#################################################### - -sub build_installer_for_languagepack -{ - my ($installdir, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref) = @_; - - installer::logger::print_message( "... creating shell script installer ...\n" ); - - installer::logger::include_header_into_logfile("Creating shell script installer:"); - - # find and read setup script template - - my $scriptfilename = "langpackscript.sh"; - my $scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptfilename, $includepatharrayref, 0); - if ($$scriptref eq "") { installer::exiter::exit_program("ERROR: Could not find script file $scriptfilename!", "build_installer_for_languagepack"); } - my $scriptfile = installer::files::read_file($$scriptref); - - my $infoline = "Found script file $scriptfilename: $$scriptref \n"; - push( @installer::globals::logfileinfo, $infoline); - - # find and read english license file - my $licenselanguage = "en-US"; # always english ! - my $licensefilename = "LICENSE"; # _" . $licenselanguage; - my $licenseincludepatharrayref = installer::worker::get_language_specific_include_pathes($includepatharrayref, $licenselanguage); - - my $licenseref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $licenseincludepatharrayref, 0); - if ($$licenseref eq "") { installer::exiter::exit_program("ERROR: Could not find License file $licensefilename!", "build_installer_for_languagepack"); } - my $licensefile = installer::files::read_file($$licenseref); - - $infoline = "Found licensefile $licensefilename: $$licenseref \n"; - push( @installer::globals::logfileinfo, $infoline); - - # including variables into license file - installer::scpzipfiles::replace_all_ziplistvariables_in_file($licensefile, $allvariableshashref); - - # add license text into script template - put_license_file_into_script($scriptfile, $licensefile); - - # add rpm or package file name into script template - my ( $packagename, $allnames) = determine_packagename($installdir, $allvariableshashref, $languagestringref); - put_packagename_into_script($scriptfile, $packagename, $allnames); - - # add product name into script template - put_productname_into_script($scriptfile, $allvariableshashref); - - # add product name into script template - put_fullproductname_into_script($scriptfile, $allvariableshashref); - - # add product name into script template - put_searchpackage_into_script($scriptfile, $allvariableshashref); - - # replace linenumber in script template - put_linenumber_into_script($scriptfile, $licensefile, $allnames); - - # saving the script file - my $newscriptfilename = determine_scriptfile_name($packagename); - $newscriptfilename = save_script_file($installdir, $newscriptfilename, $scriptfile); - - # include rpm or package into script - include_package_into_script($newscriptfilename, $installdir, $packagename); - - # remove rpm or package - remove_package($installdir, $packagename); -} - -1; diff --git a/solenv/bin/modules/installer/languages.pm b/solenv/bin/modules/installer/languages.pm deleted file mode 100644 index 591b6b28d..000000000 --- a/solenv/bin/modules/installer/languages.pm +++ /dev/null @@ -1,340 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::languages; - -use installer::converter; -use installer::existence; -use installer::exiter; -use installer::globals; -use installer::remover; -use installer::ziplist; - -############################################################################# -# Analyzing the laguage list parameter and language list from zip list file -############################################################################# - -sub analyze_languagelist -{ - my $first = $installer::globals::languagelist; - - $first =~ s/\_/\,/g; # substituting "_" by ",", in case of dmake definition 01_49 - - # Products are separated by a "#", if defined in zip-list by a "|". But "get_info_about_languages" - # substitutes already "|" to "#". This procedure only knows "#" as product separator. - # Different languages for one product are separated by ",". But on the command line the "_" is used. - # Therefore "_" is replaced by "," at the beginning of this procedure. - - while ($first =~ /^(\S+)\#(\S+?)$/) # Minimal matching, to keep the order of languages - { - $first = $1; - my $last = $2; - unshift(@installer::globals::languageproducts, $last); - } - - unshift(@installer::globals::languageproducts, $first); -} - -#################################################### -# Reading languages from zip list file -#################################################### - -sub get_info_about_languages -{ - my ( $allsettingsarrayref ) = @_; - - my $languagelistref; - - $languagelistref = installer::ziplist::getinfofromziplist($allsettingsarrayref, "languages"); - $installer::globals::languagelist = $$languagelistref; - - if ( $installer::globals::languagelist eq "" ) # not defined on command line and not in product list - { - installer::exiter::exit_program("ERROR: Languages not defined on command line (-l) and not in product list!", "get_info_about_languages"); - } - - # Adapting the separator format from zip list. - # | means new product, , (comma) means more than one language in one product - # On the command line, | is difficult to use. Therefore this script uses hashes - - $installer::globals::languagelist =~ s/\|/\#/g; - - analyze_languagelist(); -} - -############################################################################# -# Checking whether all elements of an array A are also member of array B -############################################################################# - -sub all_elements_of_array1_in_array2 -{ - my ($array1, $array2) = @_; - - my $array2_contains_all_elements_of_array1 = 1; - - for ( my $i = 0; $i <= $#{$array1}; $i++ ) - { - if (! installer::existence::exists_in_array(${$array1}[$i], $array2)) - { - $array2_contains_all_elements_of_array1 = 0; - last; - } - } - - return $array2_contains_all_elements_of_array1; -} - -############################################# -# All languages defined for one product -############################################# - -sub get_all_languages_for_one_product -{ - my ( $languagestring, $allvariables ) = @_; - - my @languagearray = (); - - my $last = $languagestring; - - $installer::globals::ismultilingual = 0; # setting the global variable $ismultilingual ! - if ( $languagestring =~ /\,/ ) { $installer::globals::ismultilingual = 1; } - - while ( $last =~ /^\s*(.+?)\,(.+)\s*$/) # "$" for minimal matching, comma separated list - { - my $first = $1; - $last = $2; - installer::remover::remove_leading_and_ending_whitespaces(\$first); - push(@languagearray, "$first"); - } - - installer::remover::remove_leading_and_ending_whitespaces(\$last); - push(@languagearray, "$last"); - - if ( $installer::globals::iswindowsbuild ) - { - my $furthercheck = 1; - - # For some languages (that are not supported by Windows, english needs to be added to the installation set - # Languages saved in "@installer::globals::noMSLocaleLangs" - - if ( all_elements_of_array1_in_array2(\@languagearray, \@installer::globals::noMSLocaleLangs) ) - { - my $officestartlanguage = $languagearray[0]; - unshift(@languagearray, "en-US"); # am Anfang einfügen! - $installer::globals::ismultilingual = 1; - $installer::globals::added_english = 1; - $installer::globals::set_office_start_language = 1; - # setting the variable PRODUCTLANGUAGE, needed for Linguistic-ForceDefaultLanguage.xcu - $allvariables->{'PRODUCTLANGUAGE'} = $officestartlanguage; - $furthercheck = 0; - } - - # In bilingual installation sets, in which english is the first language, - # the Office start language shall be the second language. - - if ( $furthercheck ) - { - if (( $#languagearray == 1 ) && ( $languagearray[0] eq "en-US" )) - { - my $officestartlanguage = $languagearray[1]; - $installer::globals::set_office_start_language = 1; - # setting the variable PRODUCTLANGUAGE, needed for Linguistic-ForceDefaultLanguage.xcu - $allvariables->{'PRODUCTLANGUAGE'} = $officestartlanguage; - } - } - } - - return \@languagearray; -} - -#################################################################################### -# FAKE: The languages string may contain only "de", "en-US", instead of "01", ... -# But this has to be removed as soon as possible. -# In the future the languages are determined with "en-US" instead "01" -# already on the command line and in the zip list file. -#################################################################################### - -sub fake_languagesstring -{ - my ($stringref) = @_; - - # ATTENTION: This function has to be removed as soon as possible! - - $$stringref =~ s/01/en-US/; - $$stringref =~ s/03/pt/; - $$stringref =~ s/07/ru/; - $$stringref =~ s/30/el/; - $$stringref =~ s/31/nl/; - $$stringref =~ s/33/fr/; - $$stringref =~ s/34/es/; - $$stringref =~ s/35/fi/; - $$stringref =~ s/36/hu/; - $$stringref =~ s/37/ca/; - $$stringref =~ s/39/it/; - $$stringref =~ s/42/cs/; - $$stringref =~ s/43/sk/; - $$stringref =~ s/44/en-GB/; - $$stringref =~ s/45/da/; - $$stringref =~ s/46/sv/; - $$stringref =~ s/47/no/; - $$stringref =~ s/48/pl/; - $$stringref =~ s/49/de/; - $$stringref =~ s/55/pt-BR/; - $$stringref =~ s/66/th/; - $$stringref =~ s/77/et/; - $$stringref =~ s/81/ja/; - $$stringref =~ s/82/ko/; - $$stringref =~ s/86/zh-CN/; - $$stringref =~ s/88/zh-TW/; - $$stringref =~ s/90/tr/; - $$stringref =~ s/91/hi-IN/; - $$stringref =~ s/96/ar/; - $$stringref =~ s/97/he/; -} - -########################################################## -# Converting the language array into a string for output -########################################################## - -sub get_language_string -{ - my ($languagesref) = @_; - - my $newstring = ""; - - for ( my $i = 0; $i <= $#{$languagesref}; $i++ ) - { - $newstring = $newstring . ${$languagesref}[$i] . "_"; - } - - # remove ending underline - - $newstring =~ s/\_\s*$//; - - return \$newstring; -} - -########################################################## -# Analyzing the languages in the languages array and -# returning the most important language -########################################################## - -sub get_default_language -{ - my ($languagesref) = @_; - - return ${$languagesref}[0]; # ToDo, only returning the first language -} - -############################################################# -# Contains the installation set one of the asian languages? -############################################################# - -sub detect_asian_language -{ - my ($languagesref) = @_; - - my $containsasia = 0; - - for ( my $i = 0; $i <= $#{$languagesref}; $i++ ) - { - my $onelang = ${$languagesref}[$i]; - $onelang =~ s/\s*$//; - - for ( my $j = 0; $j <= $#installer::globals::asianlanguages; $j++ ) - { - my $asialang = $installer::globals::asianlanguages[$j]; - $asialang =~ s/\s*$//; - - if ( $onelang eq $asialang ) - { - $containsasia = 1; - last; - } - } - - if ( $containsasia ) { last; } - } - - return $containsasia; -} - -############################################################# -# Contains the installation set only asian languages? -############################################################# - -sub contains_only_asian_languages -{ - my ($languagesref) = @_; - - my $onlyasian = 1; - - for ( my $i = 0; $i <= $#{$languagesref}; $i++ ) - { - my $onelang = ${$languagesref}[$i]; - $onelang =~ s/\s*$//; - - if (! installer::existence::exists_in_array($onelang, \@installer::globals::asianlanguages)) - { - $onlyasian = 0; - last; - } - } - - return $onlyasian; -} - -################################################################ -# Contains the installation set one of the western languages -################################################################ - -sub detect_western_language -{ - my ($languagesref) = @_; - - my $containswestern = 1; - - if ( contains_only_asian_languages($languagesref) ) { $containswestern = 0; } - - return $containswestern; -} - -################################################################ -# Determining the language used by the Java installer -################################################################ - -sub get_java_language -{ - my ( $language ) = @_; - - $javalanguage = $language; - $javalanguage =~ s/\-/\_/; - - return $javalanguage; -} - -1; diff --git a/solenv/bin/modules/installer/logger.pm b/solenv/bin/modules/installer/logger.pm deleted file mode 100644 index 0f1959123..000000000 --- a/solenv/bin/modules/installer/logger.pm +++ /dev/null @@ -1,339 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::logger; - -use installer::files; -use installer::globals; - -#################################################### -# Including header files into the logfile -#################################################### - -sub include_header_into_logfile -{ - my ($message) = @_; - - my $infoline; - - $infoline = "\n" . get_time_string(); - push( @installer::globals::logfileinfo, $infoline); - - $infoline = "######################################################\n"; - push( @installer::globals::logfileinfo, $infoline); - - $infoline = "$message\n"; - push( @installer::globals::logfileinfo, $infoline); - - - $infoline = "######################################################\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -#################################################### -# Including header files into the logfile -#################################################### - -sub include_header_into_globallogfile -{ - my ($message) = @_; - - my $infoline; - - $infoline = "\n" . get_time_string(); - push( @installer::globals::globallogfileinfo, $infoline); - - $infoline = "######################################################\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - $infoline = "$message\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - - $infoline = "######################################################\n"; - push( @installer::globals::globallogfileinfo, $infoline); -} - -#################################################### -# Write timestamp into log file -#################################################### - -sub include_timestamp_into_logfile -{ - my ($message) = @_; - - my $infoline; - my $timestring = get_time_string(); - $infoline = "$message\t$timestring"; - push( @installer::globals::logfileinfo, $infoline); -} - -#################################################### -# Writing all variables content into the log file -#################################################### - -sub log_hashref -{ - my ($hashref) = @_; - - my $infoline = "\nLogging variable settings:\n"; - push(@installer::globals::globallogfileinfo, $infoline); - - my $itemkey; - - foreach $itemkey ( keys %{$hashref} ) - { - my $line = ""; - my $itemvalue = ""; - if ( $hashref->{$itemkey} ) { $itemvalue = $hashref->{$itemkey}; } - $line = $itemkey . "=" . $itemvalue . "\n"; - push(@installer::globals::globallogfileinfo, $line); - } - - $infoline = "\n"; - push(@installer::globals::globallogfileinfo, $infoline); -} - -######################################################### -# Including global logging info into global log array -######################################################### - -sub globallog -{ - my ($message) = @_; - - my $infoline; - - $infoline = "\n" . get_time_string(); - push( @installer::globals::globallogfileinfo, $infoline); - - $infoline = "################################################################\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - $infoline = "$message\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - $infoline = "################################################################\n"; - push( @installer::globals::globallogfileinfo, $infoline); - -} - -############################################################### -# For each product (new language) a new log file is created. -# Therefore the global logging has to be saved in this file. -############################################################### - -sub copy_globalinfo_into_logfile -{ - for ( my $i = 0; $i <= $#installer::globals::globallogfileinfo; $i++ ) - { - push(@installer::globals::logfileinfo, $installer::globals::globallogfileinfo[$i]); - } -} - -############################################################### -# For each product (new language) a new log file is created. -# Therefore the global logging has to be saved in this file. -############################################################### - -sub debuginfo -{ - my ( $message ) = @_; - - $message = $message . "\n"; - push(@installer::globals::functioncalls, $message); -} - -############################################################### -# Saving the debug information. -############################################################### - -sub savedebug -{ - my ( $outputdir ) = @_; - - installer::files::save_file($outputdir . $installer::globals::debugfilename, \@installer::globals::functioncalls); - print_message( "... writing debug file " . $outputdir . $installer::globals::debugfilename . "\n" ); -} - -############################################################### -# Starting the time -############################################################### - -sub starttime -{ - $installer::globals::starttime = time(); -} - -############################################################### -# Convert time string -############################################################### - -sub convert_timestring -{ - my ($secondstring) = @_; - - my $timestring = ""; - - if ( $secondstring < 60 ) # less than a minute - { - if ( $secondstring < 10 ) { $secondstring = "0" . $secondstring; } - $timestring = "00\:$secondstring min\."; - } - elsif ( $secondstring < 3600 ) - { - my $minutes = $secondstring / 60; - my $seconds = $secondstring % 60; - if ( $minutes =~ /(\d*)\.\d*/ ) { $minutes = $1; } - if ( $minutes < 10 ) { $minutes = "0" . $minutes; } - if ( $seconds < 10 ) { $seconds = "0" . $seconds; } - $timestring = "$minutes\:$seconds min\."; - } - else # more than one hour - { - my $hours = $secondstring / 3600; - my $secondstring = $secondstring % 3600; - my $minutes = $secondstring / 60; - my $seconds = $secondstring % 60; - if ( $hours =~ /(\d*)\.\d*/ ) { $hours = $1; } - if ( $minutes =~ /(\d*)\.\d*/ ) { $minutes = $1; } - if ( $hours < 10 ) { $hours = "0" . $hours; } - if ( $minutes < 10 ) { $minutes = "0" . $minutes; } - if ( $seconds < 10 ) { $seconds = "0" . $seconds; } - $timestring = "$hours\:$minutes\:$seconds hours"; - } - - return $timestring; -} - -############################################################### -# Returning time string for logging -############################################################### - -sub get_time_string -{ - my $currenttime = time(); - $currenttime = $currenttime - $installer::globals::starttime; - $currenttime = convert_timestring($currenttime); - $currenttime = localtime() . " \(" . $currenttime . "\)\n"; - return $currenttime; -} - -############################################################### -# Returning the age of a file (in seconds) -############################################################### - -sub get_file_age -{ - my ( $filename ) = @_; - - my $filetime = (stat($filename))[9]; - my $timediff = time() - $filetime; - return $timediff; -} - -############################################################### -# Stopping the time -############################################################### - -sub stoptime -{ - my $infoline = get_time_string(); - print_message( "$infoline" ); -} - -############################################################### -# Set date string, format: yymmdd -############################################################### - -sub set_installation_date -{ - my $datestring = ""; - - my @timearray = localtime(time); - - my $day = $timearray[3]; - my $month = $timearray[4] + 1; - my $year = $timearray[5] - 100; - - if ( $year < 10 ) { $year = "0" . $year; } - if ( $month < 10 ) { $month = "0" . $month; } - if ( $day < 10 ) { $day = "0" . $day; } - - $datestring = $year . $month . $day; - - return $datestring; -} - -############################################################### -# Console output: messages -############################################################### - -sub print_message -{ - my $message = shift; - chomp $message; - my $force = shift || 0; - print "$message\n" if ( $force || ! $installer::globals::quiet ); - return; -} - -sub print_message_without_newline -{ - my $message = shift; - chomp $message; - print "$message" if ( ! $installer::globals::quiet ); - return; -} - -############################################################### -# Console output: warnings -############################################################### - -sub print_warning -{ - my $message = shift; - chomp $message; - print STDERR "WARNING: $message"; - return; -} - -############################################################### -# Console output: errors -############################################################### - -sub print_error -{ - my $message = shift; - chomp $message; - print STDERR "\n**************************************************\n"; - print STDERR "ERROR: $message"; - print STDERR "\n**************************************************\n"; - return; -} - -1; diff --git a/solenv/bin/modules/installer/packagelist.pm b/solenv/bin/modules/installer/packagelist.pm deleted file mode 100644 index 0079b6f10..000000000 --- a/solenv/bin/modules/installer/packagelist.pm +++ /dev/null @@ -1,856 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::packagelist; - -use installer::converter; -use installer::exiter; -use installer::globals; -use installer::remover; -use installer::scriptitems; - -######################################## -# Check existence of module -######################################## - -sub check_module_existence -{ - my ($onegid, $moduleslist) = @_; - - my $foundgid = 0; - - for ( my $i = 0; $i <= $#{$moduleslist}; $i++ ) - { - my $gid = ${$moduleslist}[$i]->{'gid'}; - - if ( $gid eq $onegid ) - { - $foundgid = 1; - last; - } - } - - return $foundgid; -} - -################################################### -# Analyzing the gids, defined in the packagelist -################################################### - -sub analyze_list -{ - my ($packagelist, $moduleslist) = @_; - - @allpackages = (); - - my $moduleshash = get_module_hash($moduleslist); - - for ( my $i = 0; $i <= $#{$packagelist}; $i++ ) - { - my $onepackage = ${$packagelist}[$i]; - - my $onegid = $onepackage->{'module'}; - - installer::remover::remove_leading_and_ending_whitespaces(\$onegid); - - my $moduleexists = check_module_existence($onegid, $moduleslist); - - if ( ! $moduleexists ) { next; } - - my @allmodules = (); - - push(@allmodules, $onegid); - - get_children_with_hash($moduleshash, $onegid, \@allmodules); - - $onepackage->{'allmodules'} = \@allmodules; - - push(@allpackages, $onepackage); - } - - return \@allpackages; -} - -################################################### -# Creating a hash, that contains the module gids -# as keys and the parentids as values -################################################### - -sub get_module_hash -{ - my ($moduleslist) = @_; - - my %modulehash = (); - - for ( my $i = 0; $i <= $#{$moduleslist}; $i++ ) - { - my $gid = ${$moduleslist}[$i]->{'gid'}; - # Containing only modules with parent. Root modules can be ignored. - if ( ${$moduleslist}[$i]->{'ParentID'} ) { $modulehash{$gid} = ${$moduleslist}[$i]->{'ParentID'}; } - } - - return \%modulehash; -} - -######################################################## -# Recursively defined procedure to order -# modules and directories -######################################################## - -sub get_children_with_hash -{ - my ($modulehash, $parentgid, $newitemorder) = @_; - - foreach my $gid ( keys %{$modulehash} ) - { - my $parent = $modulehash->{$gid}; - - if ( $parent eq $parentgid ) - { - push(@{$newitemorder}, $gid); - my $parent = $gid; - get_children_with_hash($modulehash, $parent, $newitemorder); # recursive! - } - } -} - -######################################################## -# Recursively defined procedure to order -# modules and directories -######################################################## - -sub get_children -{ - my ($allitems, $startparent, $newitemorder) = @_; - - for ( my $i = 0; $i <= $#{$allitems}; $i++ ) - { - my $gid = ${$allitems}[$i]->{'gid'}; - my $parent = ""; - if ( ${$allitems}[$i]->{'ParentID'} ) { $parent = ${$allitems}[$i]->{'ParentID'}; } - - if ( $parent eq $startparent ) - { - push(@{$newitemorder}, $gid); - my $parent = $gid; - get_children($allitems, $parent, $newitemorder); # recursive! - } - } -} - -##################################################################### -# All modules below a defined gid_Module_A are collected now for -# each modules defined in the packagelist. Now the modules have -# to be removed, that are part of more than one package. -##################################################################### - -sub remove_multiple_modules_packages -{ - my ($allpackagemodules) = @_; - - # iterating over all packages - - for ( my $i = 0; $i <= $#{$allpackagemodules}; $i++ ) - { - my $onepackage = ${$allpackagemodules}[$i]; - my $allmodules = $onepackage->{'allmodules'}; - - # Comparing each package, with all following packages. If a - # gid for the module is part of more than one package, it is - # removed if the number of modules in the package is greater - # in the current package than in the compare package. - - # Taking all modules from package $i - - my $packagecount = $#{$allmodules}; - - my @optimizedpackage = (); - - # iterating over all modules of this package - - for ( my $j = 0; $j <= $#{$allmodules}; $j++ ) - { - my $onemodule = ${$allmodules}[$j]; # this is the module, that shall be removed or not - - my $put_module_into_new_package = 1; - - # iterating over all other packages - - for ( my $k = 0; $k <= $#{$allpackagemodules}; $k++ ) - { - if ( $k == $i ) { next; } # not comparing equal module - - if (! $put_module_into_new_package) { next; } # do not compare, if already found - - my $comparepackage = ${$allpackagemodules}[$k]; - my $allcomparemodules = $comparepackage->{'allmodules'}; - - my $comparepackagecount = $#{$allcomparemodules}; - - # modules will only be removed from packages, that have more modules - # than the compare package - - if ( $packagecount <= $comparepackagecount ) { next; } # nothing to do, take next package - - # iterating over all modules of this package - - for ( my $m = 0; $m <= $#{$allcomparemodules}; $m++ ) - { - my $onecomparemodule = ${$allcomparemodules}[$m]; - - if ( $onemodule eq $onecomparemodule ) # this $onemodule has to be removed - { - $put_module_into_new_package = 0; - } - } - } - - if ( $put_module_into_new_package ) - { - push(@optimizedpackage, $onemodule) - } - } - - $onepackage->{'allmodules'} = \@optimizedpackage; - } -} - -##################################################################### -# Analyzing all files if they belong to a special package. -# A package is described by a list of modules. -##################################################################### - -sub find_files_for_package -{ - my ($filelist, $onepackage) = @_; - - my @newfilelist = (); - - for ( my $i = 0; $i <= $#{$filelist}; $i++ ) - { - my $onefile = ${$filelist}[$i]; - my $modulesstring = $onefile->{'modules'}; # comma separated modules list - my $moduleslist = installer::converter::convert_stringlist_into_array(\$modulesstring, ","); - - my $includefile = 0; - - # iterating over all modules of this file - - for ( my $j = 0; $j <= $#{$moduleslist}; $j++ ) - { - if ( $includefile ) { next; } - my $filemodule = ${$moduleslist}[$j]; - installer::remover::remove_leading_and_ending_whitespaces(\$filemodule); - - # iterating over all modules of the package - - my $packagemodules = $onepackage->{'allmodules'}; - - for ( my $k = 0; $k <= $#{$packagemodules}; $k++ ) - { - if ( $includefile ) { next; } - my $packagemodule = ${$packagemodules}[$k]; - - if ( $filemodule eq $packagemodule ) - { - $includefile = 1; - last; - } - } - } - - if ( $includefile ) - { - push(@newfilelist, $onefile); - } - } - - return \@newfilelist; -} - -##################################################################### -# Analyzing all links if they belong to a special package. -# A package is described by a list of modules. -# A link is inserted into the package, if the corresponding -# file is also inserted. -##################################################################### - -sub find_links_for_package -{ - my ($linklist, $filelist) = @_; - - # First looking for all links with a FileID. - # Then looking for all links with a ShortcutID. - - my @newlinklist = (); - - for ( my $i = 0; $i <= $#{$linklist}; $i++ ) - { - my $includelink = 0; - - my $onelink = ${$linklist}[$i]; - - my $fileid = ""; - if ( $onelink->{'FileID'} ) { $fileid = $onelink->{'FileID'}; } - - if ( $fileid eq "" ) { next; } # A link with a ShortcutID - - for ( my $j = 0; $j <= $#{$filelist}; $j++ ) # iterating over file list - { - my $onefile = ${$filelist}[$j]; - my $gid = $onefile->{'gid'}; - - if ( $gid eq $fileid ) - { - $includelink = 1; - last; - } - } - - if ( $includelink ) - { - push(@newlinklist, $onelink); - } - } - - # iterating over the new list, because of all links with a ShortcutID - - for ( my $i = 0; $i <= $#{$linklist}; $i++ ) - { - my $includelink = 0; - - my $onelink = ${$linklist}[$i]; - - my $shortcutid = ""; - if ( $onelink->{'ShortcutID'} ) { $shortcutid = $onelink->{'ShortcutID'}; } - - if ( $shortcutid eq "" ) { next; } # A link with a ShortcutID - - for ( my $j = 0; $j <= $#newlinklist; $j++ ) # iterating over newly created link list - { - my $onefilelink = $newlinklist[$j]; - my $gid = $onefilelink->{'gid'}; - - if ( $gid eq $shortcutid ) - { - $includelink = 1; - last; - } - } - - if ( $includelink ) - { - push(@newlinklist, $onelink); - } - } - - return \@newlinklist; -} - -##################################################################### -# Analyzing all directories if they belong to a special package. -# A package is described by a list of modules. -# Directories are included into the package, if they are needed -# by a file or a link included into the package. -# Attention: A directory with the flag CREATE, is only included -# into the root module: -# ($packagename eq $installer::globals::rootmodulegid) -##################################################################### - -sub find_dirs_for_package -{ - my ($dirlist, $onepackage) = @_; - - my @newdirlist = (); - - for ( my $i = 0; $i <= $#{$dirlist}; $i++ ) - { - my $onedir = ${$dirlist}[$i]; - my $modulesstring = $onedir->{'modules'}; # comma separated modules list - my $moduleslist = installer::converter::convert_stringlist_into_array(\$modulesstring, ","); - - my $includedir = 0; - - # iterating over all modules of this dir - - for ( my $j = 0; $j <= $#{$moduleslist}; $j++ ) - { - if ( $includedir ) { last; } - my $dirmodule = ${$moduleslist}[$j]; - installer::remover::remove_leading_and_ending_whitespaces(\$dirmodule); - - # iterating over all modules of the package - - my $packagemodules = $onepackage->{'allmodules'}; - - for ( my $k = 0; $k <= $#{$packagemodules}; $k++ ) - { - my $packagemodule = ${$packagemodules}[$k]; - - if ( $dirmodule eq $packagemodule ) - { - $includedir = 1; - last; - } - } - } - - if ( $includedir ) - { - push(@newdirlist, $onedir); - } - } - - return \@newdirlist; -} - -##################################################################### -# Resolving all variables in the packagename. -##################################################################### - -sub resolve_packagevariables -{ - my ($packagenameref, $variableshashref, $make_lowercase) = @_; - - my $key; - - # Special handling for dictionaries - if ( $$packagenameref =~ /-dict-/ ) - { - if (exists($variableshashref->{'DICTIONARYUNIXPRODUCTNAME'}) ) { $$packagenameref =~ s/\%UNIXPRODUCTNAME/$variableshashref->{'DICTIONARYUNIXPRODUCTNAME'}/g; } - if (exists($variableshashref->{'DICTIONARYBRANDPACKAGEVERSION'}) ) { $$packagenameref =~ s/\%BRANDPACKAGEVERSION/$variableshashref->{'DICTIONARYBRANDPACKAGEVERSION'}/g; } - } - - foreach $key (keys %{$variableshashref}) - { - my $value = $variableshashref->{$key}; - if ( $make_lowercase ) { $value = lc($value); } - $$packagenameref =~ s/\%$key/$value/g; - } -} - -##################################################################### -# Resolving all variables in the packagename. -##################################################################### - -sub resolve_packagevariables2 -{ - my ($packagenameref, $variableshashref, $make_lowercase, $isdict ) = @_; - - my $key; - - # Special handling for dictionaries - if ( $isdict ) - { - if (exists($variableshashref->{'DICTIONARYUNIXPRODUCTNAME'}) ) { $$packagenameref =~ s/\%UNIXPRODUCTNAME/$variableshashref->{'DICTIONARYUNIXPRODUCTNAME'}/g; } - if (exists($variableshashref->{'DICTIONARYBRANDPACKAGEVERSION'}) ) { $$packagenameref =~ s/\%BRANDPACKAGEVERSION/$variableshashref->{'DICTIONARYBRANDPACKAGEVERSION'}/g; } - } - - foreach $key (keys %{$variableshashref}) - { - my $value = $variableshashref->{$key}; - if ( $make_lowercase ) { $value = lc($value); } - $$packagenameref =~ s/\%$key/$value/g; - } -} - -##################################################################### -# New packages system. -##################################################################### - -################################################################## -# Controlling the content of the packagelist -# 1. Items in @installer::globals::packagelistitems must exist -# 2. If a shellscript file is defined, it must exist -################################################################## - -sub check_packagelist -{ - my ($packages) = @_; - - if ( ! ( $#{$packages} > -1 )) { installer::exiter::exit_program("ERROR: No packages defined!", "check_packagelist"); } - - for ( my $i = 0; $i <= $#{$packages}; $i++ ) - { - my $onepackage = ${$packages}[$i]; - - my $element; - - # checking all items that must be defined - - foreach $element (@installer::globals::packagelistitems) - { - if ( ! exists($onepackage->{$element}) ) - { - installer::exiter::exit_program("ERROR in package list: No value for $element !", "check_packagelist"); - } - } - - # checking the existence of the script file, if defined - - if ( $onepackage->{'script'} ) - { - my $scriptfile = $onepackage->{'script'}; - my $gid = $onepackage->{'module'}; - my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptfile, "" , 0); - - if ( $$fileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find script file $scriptfile for module $gid!", "check_packagelist"); } - - my $infoline = "$gid: Using script file: \"$$fileref\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - - $onepackage->{'script'} = $$fileref; - } - } -} - -##################################################################### -# Reading pack info for one module from packinfo file. -##################################################################### - -sub get_packinfo -{ - my ($gid, $filename, $packages, $onelanguage, $islanguagemodule) = @_; - - my $packagelist = installer::files::read_file($filename); - - my @allpackages = (); - - for ( my $i = 0; $i <= $#{$packagelist}; $i++ ) - { - my $line = ${$packagelist}[$i]; - - if ( $line =~ /^\s*\#/ ) { next; } # this is a comment line - - if ( $line =~ /^\s*Start\s*$/i ) # a new package definition - { - my %onepackage = (); - - my $counter = $i + 1; - - while (!( ${$packagelist}[$counter] =~ /^\s*End\s*$/i )) - { - if ( ${$packagelist}[$counter] =~ /^\s*(\S+)\s*\=\s*\"(.*)\"/ ) - { - my $key = $1; - my $value = $2; - $onepackage{$key} = $value; - } - - $counter++; - } - - $onepackage{'islanguagemodule'} = $islanguagemodule; - if ( $islanguagemodule ) - { - $saveonelanguage = $onelanguage; - $saveonelanguage =~ s/_/-/g; - $onepackage{'language'} = $saveonelanguage; - } - - push(@allpackages, \%onepackage); - } - } - - # looking for the packinfo with the correct gid - - my $foundgid = 0; - my $onepackage; - foreach $onepackage (@allpackages) - { - # Adding the language to the module gid for LanguagePacks ! - # Making the module gid language specific: gid_Module_Root -> gir_Module_Root_pt_BR (as defined in scp2) - if ( $onelanguage ne "" ) { $onepackage->{'module'} = $onepackage->{'module'} . "_$onelanguage"; } - - if ( $onepackage->{'module'} eq $gid ) - { - # Resolving the language identifier - my $onekey; - foreach $onekey ( keys %{$onepackage} ) - { - # Some keys require "-" instead of "_" for example in "en-US". All package names do not use underlines. - my $locallang = $onelanguage; - if (( $onekey eq "solarispackagename" ) || - ( $onekey eq "solarisrequires" ) || - ( $onekey eq "packagename" ) || - ( $onekey eq "requires" )) { $locallang =~ s/_/-/g; } # avoiding illegal package abbreviation - $onepackage->{$onekey} =~ s/\%LANGUAGESTRING/$locallang/g; - } - - # Saving the language for the package - my $lang = $onelanguage; - $lang =~ s/_/-/g; - $onepackage->{'specificlanguage'} = $lang; - - push(@{$packages}, $onepackage); - $foundgid = 1; - last; - } - } - - if ( ! $foundgid ) - { - installer::exiter::exit_program("ERROR: Could not find package info for module $gid in file \"$filename\"!", "get_packinfo"); - } -} - -##################################################################### -# Collecting all packages from scp project. -##################################################################### - -sub collectpackages -{ - my ( $allmodules, $languagesarrayref ) = @_; - - installer::logger::include_header_into_logfile("Collecting packages:"); - - my @packages = (); - my %gid_analyzed = (); - - my $onemodule; - foreach $onemodule ( @{$allmodules} ) - { - my $packageinfo = "PackageInfo"; - if (( $installer::globals::tab ) && ( $onemodule->{"TabPackageInfo"} )) { $packageinfo = "TabPackageInfo" } - - if ( $onemodule->{$packageinfo} ) # this is a package module! - { - my $modulegid = $onemodule->{'gid'}; - - my $styles = ""; - if ( $onemodule->{'Styles'} ) { $styles = $onemodule->{'Styles'}; } - - # checking modules with style LANGUAGEMODULE - my $islanguagemodule = 0; - my $onelanguage = ""; - if ( $styles =~ /\bLANGUAGEMODULE\b/ ) - { - $islanguagemodule = 1; - $onelanguage = $onemodule->{'Language'}; # already checked, that it is set. - $onelanguage =~ s/-/_/g; # pt-BR -> pt_BR in scp - } - - # Modules in different languages are listed more than once in multilingual installation sets - if ( exists($gid_analyzed{$modulegid}) ) { next; } - $gid_analyzed{$modulegid} = 1; - - my $packinfofile = $onemodule->{$packageinfo}; - - # The file with package information has to be found in path list - my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$packinfofile, "" , 0); - - if ( $$fileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find file $packinfofile for module $modulegid!", "collectpackages"); } - - my $infoline = "$modulegid: Using packinfo: \"$$fileref\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - - get_packinfo($modulegid, $$fileref, \@packages, $onelanguage, $islanguagemodule); - } - } - - return \@packages; -} - -##################################################################### -# Printing packages content for debugging purposes -##################################################################### - -sub log_packages_content -{ - my ($packages) = @_; - - if ( ! ( $#{$packages} > -1 )) { installer::exiter::exit_program("ERROR: No packages defined!", "print_content"); } - - installer::logger::include_header_into_logfile("Logging packages content:"); - - my $infoline = ""; - - for ( my $i = 0; $i <= $#{$packages}; $i++ ) - { - my $onepackage = ${$packages}[$i]; - - # checking all items that must be defined - - $infoline = "Package $onepackage->{'module'}\n"; - push(@installer::globals::logfileinfo, $infoline); - - my $key; - foreach $key (sort keys %{$onepackage}) - { - if ( $key =~ /^\s*\;/ ) { next; } - - if ( $key eq "allmodules" ) - { - $infoline = "\t$key:\n"; - push(@installer::globals::logfileinfo, $infoline); - my $onemodule; - foreach $onemodule ( @{$onepackage->{$key}} ) - { - $infoline = "\t\t$onemodule\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } - else - { - $infoline = "\t$key: $onepackage->{$key}\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } - - $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - - } -} - -##################################################################### -# Creating assignments from modules to destination pathes. -# This is required for logging in fileinfo file. Otherwise -# the complete destination file would not be known in file list. -# Saved in %installer::globals::moduledestination -##################################################################### - -sub create_module_destination_hash -{ - my ($packages, $allvariables) = @_; - - for ( my $i = 0; $i <= $#{$packages}; $i++ ) - { - my $onepackage = ${$packages}[$i]; - - my $defaultdestination = $onepackage->{'destpath'}; - resolve_packagevariables(\$defaultdestination, $allvariables, 1); - if ( $^O =~ /darwin/i ) { $defaultdestination =~ s/\/opt\//\/Applications\//; } - - foreach my $onemodule ( @{$onepackage->{'allmodules'}} ) - { - $installer::globals::moduledestination{$onemodule} = $defaultdestination; - } - } -} - -##################################################################### -# Adding the default pathes into the files collector for Unixes. -# This is necessary to know the complete destination path in -# fileinfo log file. -##################################################################### - -sub add_defaultpathes_into_filescollector -{ - my ($allfiles) = @_; - - for ( my $i = 0; $i <= $#{$allfiles}; $i++ ) - { - my $onefile = ${$allfiles}[$i]; - - if ( ! $onefile->{'destination'} ) { installer::exiter::exit_program("ERROR: No destination found at file $onefile->{'gid'}!", "add_defaultpathes_into_filescollector"); } - my $destination = $onefile->{'destination'}; - - if ( ! $onefile->{'modules'} ) { installer::exiter::exit_program("ERROR: No modules found at file $onefile->{'gid'}!", "add_defaultpathes_into_filescollector"); } - my $module = $onefile->{'modules'}; - # If modules contains a list of modules, only taking the first one. - if ( $module =~ /^\s*(.*?)\,/ ) { $module = $1; } - - if ( ! exists($installer::globals::moduledestination{$module}) ) { installer::exiter::exit_program("ERROR: No default destination path found for module $module!", "add_defaultpathes_into_filescollector"); } - my $defaultpath = $installer::globals::moduledestination{$module}; - $defaultpath =~ s/\/\s*$//; # removing ending slashes - my $fulldestpath = $defaultpath . $installer::globals::separator . $destination; - - $onefile->{'fulldestpath'} = $fulldestpath; - } -} - -##################################################################### -# Creating list of cabinet files from packages -##################################################################### - -sub prepare_cabinet_files -{ - my ($packages, $allvariables) = @_; - - if ( ! ( $#{$packages} > -1 )) { installer::exiter::exit_program("ERROR: No packages defined!", "print_content"); } - - installer::logger::include_header_into_logfile("Preparing cabinet files:"); - - my $infoline = ""; - - for ( my $i = 0; $i <= $#{$packages}; $i++ ) - { - my $onepackage = ${$packages}[$i]; - - my $cabinetfile = "$onepackage->{'packagename'}\.cab"; - - resolve_packagevariables(\$cabinetfile, $allvariables, 0); - - $installer::globals::allcabinets{$cabinetfile} = 1; - - # checking all items that must be defined - - $infoline = "Package $onepackage->{'module'}\n"; - push(@installer::globals::logfileinfo, $infoline); - - # Assigning the cab file to the module and also to all corresponding sub modules - - my $onemodule; - foreach $onemodule ( @{$onepackage->{'allmodules'}} ) - { - if ( ! exists($installer::globals::allcabinetassigns{$onemodule}) ) - { - $installer::globals::allcabinetassigns{$onemodule} = $cabinetfile; - } - else - { - my $infoline = "Warning: Already existing assignment: $onemodule : $installer::globals::allcabinetassigns{$onemodule}\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Ignoring further assignment: $onemodule : $cabinetfile\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } - } -} - -##################################################################### -# Logging assignments of cabinet files -##################################################################### - -sub log_cabinet_assignments -{ - installer::logger::include_header_into_logfile("Logging cabinet files:"); - - my $infoline = "List of cabinet files:\n"; - push(@installer::globals::logfileinfo, $infoline); - - my $key; - foreach $key ( sort keys %installer::globals::allcabinets ) { push(@installer::globals::logfileinfo, "\t$key\n"); } - - $infoline = "\nList of assignments from modules to cabinet files:\n"; - push(@installer::globals::logfileinfo, $infoline); - - foreach $key ( sort keys %installer::globals::allcabinetassigns ) { push(@installer::globals::logfileinfo, "\t$key : $installer::globals::allcabinetassigns{$key}\n"); } -} - -1; diff --git a/solenv/bin/modules/installer/packagepool.pm b/solenv/bin/modules/installer/packagepool.pm deleted file mode 100644 index 6c1874328..000000000 --- a/solenv/bin/modules/installer/packagepool.pm +++ /dev/null @@ -1,1048 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::packagepool; - -use Digest::MD5; -use installer::exiter; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::worker; - -###################################################### -# Checking the md5sum of a file -###################################################### - -sub get_md5sum -{ - my ($filename) = @_; - - open(FILE, "<$filename") or die "ERROR: Can't open $filename for creating file hash"; - binmode(FILE); - my $digest = Digest::MD5->new->addfile(*FILE)->hexdigest; - close(FILE); - - return $digest; -} - -#################################################### -# Setting a unique sessionid to identify this -# packaging process. -#################################################### - -sub set_sessionid -{ - my $pid = $$; # process id - my $timer = time(); # time - $installer::globals::sessionid = $pid . $timer; - $installer::globals::sessionidset = 1; - my $infoline = "\nPool: Setting session id: $installer::globals::sessionid.\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -#################################################### -# Setting and creating pool path. -#################################################### - -sub set_pool_path -{ - $installer::globals::unpackpath =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes - $installer::globals::poolpath = $installer::globals::unpackpath . $installer::globals::separator . "pool_" . $installer::globals::packageformat; - installer::systemactions::create_directory($installer::globals::poolpath); - $installer::globals::poolpathset = 1; -} - -#################################################### -# Comparing the content of two epm files. -#################################################### - -sub compare_epm_content -{ - my ($oldcontent, $newcontent) = @_; - - my $identical = 1; - my $diffinfo = ""; - - # Removing empty lines and files from $newcontent - - my @newlocalcontent = (); - for ( my $i = 0; $i <= $#{$newcontent}; $i++ ) - { - if ( ${$newcontent}[$i] =~ /^\s*$/ ) { next; } # Removing empty lines from $newcontent. Empty lines are also not included into pcf file, from where $oldcontent was read. - if ( ${$newcontent}[$i] =~ /^\s*f\s+/ ) { next; } # Ignoring files, they can contain temporary pathes - if (( ${$newcontent}[$i] =~ /^\s*%readme\s+/ ) || ( ${$newcontent}[$i] =~ /^\s*%license\s+/ )) { next; } # ignoring license and readme (language specific!) - my $oneline = ${$newcontent}[$i]; - $oneline =~ s/\s*$//; # Removing line ends. Also not included in old epm file, that is read from pcf file. - push(@newlocalcontent, $oneline); - } - - my $oldmember = $#{$oldcontent} + 1; - my $newmember = $#newlocalcontent + 1; - - # comparing the count - if ( $oldmember != $newmember ) - { - $identical = 0; - installer::logger::print_message("\n...... changed length of EPM file\n"); - $diffinfo = "Pool: EPM, different line count: old epm file: $oldmember, new epm file: $newmember\n"; - push(@installer::globals::epmdifflist, $diffinfo); - } - - # comparing the content line for line, so the order must not change - - if ( $identical ) - { - for ( my $i = 0; $i <= $#{$oldcontent}; $i++ ) - { - if ( ${$oldcontent}[$i] ne $newlocalcontent[$i] ) - { - $identical = 0; - my $line = $i + 1; - installer::logger::print_message("\n...... different content in EPM file\n"); - $diffinfo = "Pool: EPM, line $line changed from \"${$oldcontent}[$i]\" to \"$newlocalcontent[$i]\".\n"; - push(@installer::globals::epmdifflist, $diffinfo); - last; - } - } - } - - return $identical; -} - -#################################################### -# Comparing the content of two pcf files. -#################################################### - -sub compare_package_content -{ - my ($oldcontent, $newcontent) = @_; - - my $identical = 1; - my $infoline = ""; - - my $oldmember = scalar keys %{$oldcontent}; - my $newmember = scalar keys %{$newcontent}; - - # comparing the count - - if ( $oldmember != $newmember ) - { - # Logging the difference - $identical = 0; - installer::logger::print_message("\n...... different number of files in packages. New number: $newmember, old number: $oldmember\n"); - $infoline = "Different number of files in packages. New number: $newmember, old number: $oldmember\n"; - push(@installer::globals::pcfdiffcomment, $infoline); - } - - # comparing the keys - - if ( $identical ) - { - my $first = 1; - my $start = "\n"; - foreach my $dest ( keys %{$newcontent} ) - { - if ( ! exists($oldcontent->{$dest}) ) - { - $identical = 0; - installer::logger::print_message("$start...... file only in one package (A): $dest\n"); - $infoline = "File only in existing pool package: $dest\n"; - push(@installer::globals::pcfdiffcomment, $infoline); - if ( $first ) { $start = ""; } - $first = 0; - } - } - - # collecting all differences - if ( ! $identical ) - { - foreach my $dest ( keys %{$oldcontent} ) - { - if ( ! exists($newcontent->{$dest}) ) - { - $identical = 0; - installer::logger::print_message("$start...... file only in one package (B): $dest\n"); - $infoline = "File only in new package: $dest\n"; - push(@installer::globals::pcfdiffcomment, $infoline); - if ( $first ) { $start = ""; } - $first = 0; - } - } - } - } - - # comparing the checksum - - if ( $identical ) - { - my $first = 1; - - foreach my $dest ( keys %{$newcontent} ) - { - if ( $newcontent->{$dest}->{'md5sum'} ne $oldcontent->{$dest}->{'md5sum'} ) - { - $identical = 0; - if ( $first == 1 ) - { - installer::logger::print_message("\n"); - $first = 0; - } - $installer::globals::pcfdifflist{$dest} = 1; - installer::logger::print_message("...... different file: $dest\n"); - # last; - } - - if ( $installer::globals::iswindowsbuild ) - { - if ( $newcontent->{$dest}->{'uniquename'} ne $oldcontent->{$dest}->{'uniquename'} ) - { - $identical = 0; - $installer::globals::pcfdifflist{$dest} = 1; - installer::logger::print_message("\n...... different file: $dest"); - # last; - } - } - } - } - - return $identical; -} - -#################################################### -# Calculating content of pcf file. -#################################################### - -sub calculate_current_content -{ - my ($filesarray, $packagename) = @_; - - installer::logger::include_timestamp_into_logfile("\nCalculating content for package content file ($packagename), start"); - - my %globalcontent = (); - - for ( my $i = 0; $i <= $#{$filesarray}; $i++ ) - { - my %onefilehash = (); - - my $onefile = ${$filesarray}[$i]; - if ( ! $onefile->{'sourcepath'} ) { installer::exiter::exit_program("ERROR: No sourcepath found for file $onefile->{'gid'}", "calculate_current_content"); } - my $source = $onefile->{'sourcepath'}; - if ( $onefile->{'zipfilesource'} ) { $source = $onefile->{'zipfilesource'}; } - if ( ! -f $source ) { installer::exiter::exit_program("ERROR: Sourcefile not found: $source ($onefile->{'gid'})", "calculate_current_content"); } - - # For Windows the unique name inside the cabinet file also has to be saved - my $uniquename = ""; - if ( $installer::globals::iswindowsbuild ) { $uniquename = $onefile->{'uniquename'};} - - my $destination = $onefile->{'destination'}; - my $checksum = get_md5sum($source); - - $onefilehash{'md5sum'} = $checksum; - $onefilehash{'uniquename'} = $uniquename; - - if ( exists($globalcontent{$destination}) ) { installer::exiter::exit_program("ERROR: Destination not unique: $destination ($onefile->{'gid'})", "calculate_current_content"); } - $globalcontent{$destination} = \%onefilehash; - } - - installer::logger::include_timestamp_into_logfile("\nCalculating content for package content file ($packagename), start"); - - return \%globalcontent; -} - -#################################################### -# Writing pcf file. -#################################################### - -sub create_pcfcontent_file -{ - my ($realpackagename, $md5sum, $filesize, $fullpackagename, $pkgversion, $epmfilecontent, $pcffilename) = @_; - - my @content = (); - my $oneline = "PackageName: $realpackagename\n"; - push(@content, $oneline); - - $oneline = "md5sum: $md5sum\n"; - push(@content, $oneline); - - $oneline = "FileSize: $filesize\n"; - push(@content, $oneline); - - $oneline = "FullPackageName: $fullpackagename\n"; - push(@content, $oneline); - - $oneline = "PkgVersion: $pkgversion\n"; - push(@content, $oneline); - - foreach my $dest (keys %{$installer::globals::newpcfcontent} ) - { - $oneline = "Files:\t$dest\t$installer::globals::newpcfcontent->{$dest}->{'md5sum'}\t$installer::globals::newpcfcontent->{$dest}->{'uniquename'}\n"; - push(@content, $oneline); - } - - for ( my $i = 0; $i <= $#{$epmfilecontent}; $i++ ) - { - if ( ${$epmfilecontent}[$i] =~ /^\s*$/ ) { next; } # avoiding empty lines - if ( ${$epmfilecontent}[$i] =~ /^\s*f\s+/ ) { next; } # ignoring files, because they can contain temporary pathes - if (( ${$epmfilecontent}[$i] =~ /^\s*%readme\s+/ ) || ( ${$epmfilecontent}[$i] =~ /^\s*%license\s+/ )) { next; } # ignoring license and readme (language specific!) - $oneline = "EPM:\t${$epmfilecontent}[$i]"; - push(@content, $oneline); - } - - installer::files::save_file($pcffilename, \@content); -} - -####################################################### -# Reading the content of the package content file. -####################################################### - -sub read_pcf_content -{ - my ($pcffilename) = @_; - - my %allcontent = (); - my @epmfile = (); - my $realpackagename = ""; - - my $content = installer::files::read_file($pcffilename); - - for ( my $i = 0; $i <= $#{$content}; $i++ ) - { - my $line = ${$content}[$i]; - - if ( $line =~ /^\s*PackageName\:\s*(.*?)\s*$/ ) - { - $realpackagename = $1; - $installer::globals::xpdpackageinfo{'RealPackageName'} = $realpackagename; - next; - } - - if ( $line =~ /^\s*FullPackageName\:\s*(.*?)\s*$/ ) - { - $installer::globals::xpdpackageinfo{'FullPackageName'} = $1; - next; - } - - if ( $line =~ /^\s*FileSize\:\s*(.*?)\s*$/ ) - { - $installer::globals::xpdpackageinfo{'FileSize'} = $1; - next; - } - - if ( $line =~ /^\s*PkgVersion\:\s*(.*?)\s*$/ ) - { - $installer::globals::xpdpackageinfo{'PkgVersion'} = $1; - next; - } - - if ( $line =~ /^\s*md5sum\:\s*(.*?)\s*$/ ) - { - $installer::globals::xpdpackageinfo{'md5sum'} = $1; - next; - } - - if ( $line =~ /^\s*Files:\t(.+?)\t(.+?)\t(.*?)\s*$/ ) - { - my $destination = $1; - my $checksum = $2; - my $uniquename = $3; - - my %onefilehash = (); - $onefilehash{'md5sum'} = $checksum; - $onefilehash{'uniquename'} = $uniquename; - - $allcontent{$destination} = \%onefilehash; - next; - } - - if ( $line =~ /^\s*EPM:\t(.*?)\s*$/ ) # A line can be empty in epm file - { - my $epmcontent = $1; - push(@epmfile, $epmcontent); - next; - } - } - - if ( $realpackagename eq "" ) { installer::exiter::exit_program("ERROR: Real package name not found in pcf file: \"$pcffilename\"", "read_pcf_content"); } - - return ($realpackagename, \%allcontent, \@epmfile); -} - -#################################################### -# Checking, if a specific package can be -# created at the moment. -#################################################### - -sub check_package_availability -{ - my ($packagename) = @_; - - my $package_is_available = 1; - - my $checkfilename = $installer::globals::poolpath . $installer::globals::separator . $packagename . ".pcf.check"; - my $lockfilename = $installer::globals::poolpath . $installer::globals::separator . $packagename . ".pcf.lock"; - - if (( -f $checkfilename ) || ( -f $lockfilename )) { $package_is_available = 0; } - - return $package_is_available; -} - -#################################################### -# Check, if the existence of the check or lock -# file requires an exit of packaging process. -#################################################### - -sub check_pool_exit -{ - my ( $lockfilename, $timecounter ) = @_; - - # How old is this lock file? - my $timeage = installer::logger::get_file_age($lockfilename); - - # if ( $timeage > 1800 ) # file is older than half an hour - if ( $timeage > 3600 ) # file is older than an hour - { - my $timestring = installer::logger::convert_timestring($timeage); - my $infoline = "\nPool: Attention: \"$lockfilename\" is too old ($timestring). Removing file!\n"; - installer::logger::print_message( "... $infoline" ); - push( @installer::globals::logfileinfo, $infoline); - unlink $lockfilename; - # installer::exiter::exit_program("ERROR: Waiting too long for removal of lock file \"$lockfilename\"", "check_pool_exit (packagepool)"); - } - else - { - my $filecontent = installer::files::read_file($lockfilename); - my $waittime = $timecounter * 10; - $waittime = installer::logger::convert_timestring($waittime); - my $infoline = "\nPool: Warning: \"$lockfilename\" blocks this process for $waittime. Lock content: \"${$filecontent}[0]\"\n"; - installer::logger::print_message( "... $infoline" ); - push( @installer::globals::logfileinfo, $infoline); - } -} - -############################################################################ -# This function logs some information, that can be used to find -# pool problems. -############################################################################ - -sub log_pool_info -{ - my ( $file_exists ) = @_; - - my $infoline = ""; - - # Content saved in - # $installer::globals::savelockfilecontent = installer::files::read_file($filename); - # $installer::globals::savelockfilename = $filename; - - if ( $file_exists ) - { - $infoline = "\nPool Problem: Lock file \"$installer::globals::savelockfilename\" belongs to another process. This process has session id: $installer::globals::sessionid .\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "Content of Lock file:\n"; - push( @installer::globals::logfileinfo, $infoline); - foreach my $line ( @{$installer::globals::savelockfilecontent} ) { push( @installer::globals::logfileinfo, $line); } - } - else - { - $infoline = "\nPool Problem: Lock file \"$installer::globals::savelockfilename\" does not exist anymore (this process has session id: $installer::globals::sessionid) .\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -############################################################################ -# Checking, if this process is the owner of the lock file in the pool. -# This can be determined by the Process ID, that is written at the -# beginning of the first line into the lock file. -############################################################################ - -sub process_is_owner -{ - my ( $filename ) = @_; - - my $process_is_owner = 0; - - $installer::globals::savelockfilecontent = installer::files::read_file($filename); - $installer::globals::savelockfilename = $filename; - - if ( ${$installer::globals::savelockfilecontent}[0] =~ /^\s*\Q$installer::globals::sessionid\E\s+/ ) { $process_is_owner = 1; } - - return $process_is_owner; -} - -#################################################### -# Removing a package from installation set, if -# there were pooling problems. -#################################################### - -sub remove_package_from_installset -{ - my ($newpackagepath) = @_; - - my $infoline = "Pool problem: Removing package \"$newpackagepath\" from installation set!\n"; - push(@installer::globals::logfileinfo, $infoline); - - if ( -f $newpackagepath ) { unlink $newpackagepath; } - if ( -d $newpackagepath ) { installer::systemactions::remove_complete_directory($newpackagepath, 1); } - - # Keeping the content of @installer::globals::installsetcontent up to date. Removing the last package. - pop(@installer::globals::installsetcontent); -} - -#################################################### -# Check, if the package is in the pool and if -# there are no changes in the package. -#################################################### - -sub package_is_up_to_date -{ - my ($allvariables, $onepackage, $packagename, $newepmcontent, $filesinpackage, $installdir, $subdir, $languagestringref) = @_; - - installer::logger::print_message_without_newline( "... checking pool package $packagename ..." ); - - installer::logger::include_header_into_logfile("Checking package in pool: $packagename"); - - if ( ! $installer::globals::poolpathset ) { installer::packagepool::set_pool_path(); } - if ( ! $installer::globals::sessionidset ) { installer::packagepool::set_sessionid(); } - - my $infoline = ""; - # Resetting some variables for this package - my $package_is_up_to_date = 0; - my $realpackagename = ""; - my $oldepmcontent = ""; - my $waited_for_check = 0; - my $waited_for_lock = 0; - $installer::globals::newpcfcontentcalculated = 0; - %installer::globals::pcfdifflist = (); - @installer::globals::pcfdiffcomment = (); - @installer::globals::epmdifflist = (); - - # Reading the package content file, if this file exists (extension *.pcf) - my $filename = $installer::globals::poolpath . $installer::globals::separator . $packagename . ".pcf"; - my $checkfilename = $installer::globals::poolpath . $installer::globals::separator . $packagename . ".pcf.check"; - my $lockfilename = $installer::globals::poolpath . $installer::globals::separator . $packagename . ".pcf.lock"; - # Saving name in global variable, so that this file can be removed somewhere else (at the end of "put_content_into_pool"). - $installer::globals::poolcheckfilename = $checkfilename; - $installer::globals::poollockfilename = $lockfilename; - - my @checkfilecontent = ("$installer::globals::sessionid $installer::globals::product $$languagestringref $checkfilename"); # $$ is the process id - my @lockfilecontent = ("$installer::globals::sessionid $installer::globals::product $$languagestringref $lockfilename"); # $$ is the process id - - # Waiting, step 1 - # Checking, if another process checks this package at the moment - my $timecounter = 0; - while ( -f $checkfilename ) - { - $timecounter++; - - # including an exit to enable creation of other packages - if (( $timecounter == 1 ) && ( ! exists($installer::globals::poolshiftedpackages{$packagename}) )) - { - $package_is_up_to_date = 3; # repeat this package later - return $package_is_up_to_date; - } - - $infoline = "Pool: $checkfilename exists. WAITING 10 seconds ($timecounter).\n"; - if ( $timecounter == 1 ) { installer::logger::print_message( "\n" ); } - installer::logger::print_message( "... $infoline" ); - push( @installer::globals::logfileinfo, $infoline); - # if ( $timecounter % 50 == 0 ) { check_pool_exit($checkfilename, $timecounter); } - if ( $timecounter % 100 == 0 ) { check_pool_exit($checkfilename, $timecounter); } - sleep 10; # process sleeps 10 seconds - $waited_for_check = 1; - } - - # Creating file, showing that this package is checked at the moment by this process. No other process can reach this. - installer::files::save_file($checkfilename, \@checkfilecontent); # Creating the Lock, to check this package. This blocks all other processes. - $installer::globals::processhaspoolcheckfile = 1; - - # Check, if the Lock file creation was really successful - if ( ! -f $checkfilename ) - { - $infoline = "Pool problem: Pool lock file \"$checkfilename\" could not be created successfully or was removed by another process (A)!\n"; - push( @installer::globals::logfileinfo, $infoline); - log_pool_info(0); - $package_is_up_to_date = 4; # repeat this package - return $package_is_up_to_date; - } - - if ( ! process_is_owner($checkfilename) ) - { - $infoline = "Pool problem: Pool lock file \"$checkfilename\" belongs to another process (A)!\n"; - push( @installer::globals::logfileinfo, $infoline); - log_pool_info(1); - $package_is_up_to_date = 4; # repeat this package - return $package_is_up_to_date; - } - - $infoline = "Pool: Created file: $checkfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - if ( $waited_for_check ) { installer::logger::print_message( "... $infoline" ); } - - # Waiting, step 2 - # Checking, if another process creates this package at the moment - $timecounter = 0; - while ( -f $lockfilename ) - { - $timecounter++; - $infoline = "Pool: $lockfilename exists. WAITING 10 seconds ($timecounter).\n"; - if ( $timecounter == 1 ) { installer::logger::print_message( "\n" ); } - installer::logger::print_message( "... $infoline" ); - push( @installer::globals::logfileinfo, $infoline); - # if ( $timecounter % 50 == 0 ) { check_pool_exit($lockfilename, $timecounter); } - if ( $timecounter % 100 == 0 ) { check_pool_exit($lockfilename, $timecounter); } - sleep 10; # process sleeps 10 seconds - $waited_for_lock = 1; - } - - # No lock file exists, therefore no process creates this package at the moment. Check can be done now. - if ( $waited_for_lock ) { installer::logger::print_message( "... Pool: Proceeding, $lockfilename was removed.\n" ); } - - my $package_already_exists = 0; - - if ( -f $filename ) - { - # Calculating content for pcf file - $installer::globals::newpcfcontent = calculate_current_content($filesinpackage, $packagename); - $installer::globals::newpcfcontentcalculated = 1; - - # reading the existing pcf file - ($realpackagename, $oldpcfcontent, $oldepmcontent) = read_pcf_content($filename); - - # First check: Package has to exist in pool (directories on Solaris) - my $fullpackage = $installer::globals::poolpath . $installer::globals::separator . $realpackagename; - if ( $installer::globals::issolarisbuild ) { $fullpackage = $fullpackage . ".tar"; } - if ( -f $fullpackage ) - { - $package_already_exists = 1; - # Second check: Only files - my $content_is_identical = compare_package_content($oldpcfcontent, $installer::globals::newpcfcontent); - - # Third check for Unix: Changes in the epm file? - if (( $content_is_identical ) && ( ! $installer::globals::iswindowsbuild )) - { - $content_is_identical = compare_epm_content($oldepmcontent, $newepmcontent); - } - - if ( $content_is_identical ) { $package_is_up_to_date = 1; } - } - } - - if ( $package_is_up_to_date ) - { - $infoline = "Pool: $packagename: No new content, using existing package\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::logger::print_message( "... using package from pool\n" ); - } - else - { - if ( $package_already_exists ) - { - $infoline = "Pool: $packagename: Contains new content, creating new package. Differences:\n"; - push( @installer::globals::logfileinfo, $infoline); - foreach my $dest ( sort keys %installer::globals::pcfdifflist ) { push( @installer::globals::logfileinfo, "$dest\n"); } - foreach my $dest ( @installer::globals::pcfdiffcomment ) { push( @installer::globals::logfileinfo, "$dest"); } - foreach my $dest ( @installer::globals::epmdifflist ) { push( @installer::globals::logfileinfo, "$dest"); } - } - else - { - $infoline = "Pool: $packagename: Does not exist in pool.\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - installer::logger::print_message( "... packaging required\n" ); - %installer::globals::xpdpackageinfo = (); # reset the filled hash, because the package cannot be used. - - # Creating lock mechanism, so that other processes do not create this package, too. - installer::files::save_file($lockfilename, \@lockfilecontent); # Creating the Lock, to create this package (Lock for check still exists). - $installer::globals::processhaspoollockfile = 1; - - # Check if creation of Lock file was really successful - - if ( ! -f $lockfilename ) - { - $infoline = "Pool problem: Pool lock file \"$lockfilename\" could not be created successfully or was removed by another process (D)!\n"; - push( @installer::globals::logfileinfo, $infoline); - log_pool_info(0); - $package_is_up_to_date = 4; # repeat this package - return $package_is_up_to_date; - } - - if ( ! process_is_owner($lockfilename) ) - { - $infoline = "Pool problem: Pool lock file \"$lockfilename\" belongs to another process (D)!\n"; - push( @installer::globals::logfileinfo, $infoline); - log_pool_info(1); - $package_is_up_to_date = 4; # repeat this package - return $package_is_up_to_date; - } - - $infoline = "Pool: Created file: $lockfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - my $newpackagepath = ""; - - if ( $package_is_up_to_date ) - { - # Before the package is copied into the installation set, it has to be checked, if this process is really the owner of this lock file.. - # Check, if lock file still exists and if this process is the owner. - - if ( ! -f $checkfilename ) - { - $infoline = "Pool problem: Pool lock file \"$checkfilename\" was removed by another process (B)!\n"; - push( @installer::globals::logfileinfo, $infoline); - log_pool_info(0); - $package_is_up_to_date = 4; # repeat this package - return $package_is_up_to_date; - } - - if ( ! process_is_owner($checkfilename) ) - { - $infoline = "Pool problem: Pool lock file \"$checkfilename\" belongs to another process (B)!\n"; - push( @installer::globals::logfileinfo, $infoline); - log_pool_info(1); - $package_is_up_to_date = 4; # repeat this package - return $package_is_up_to_date; - } - - # Copying the package from the pool into the installation set - $newpackagepath = copy_package_from_pool($installdir, $subdir, $realpackagename); - } - - # Before the lock file in the pool can be removed, it has to be checked, if this process is still the owner of this lock file. - # Check, if lock file still exists and if this process is the owner. - if ( ! -f $checkfilename ) - { - $infoline = "Pool problem: Pool lock file \"$checkfilename\" was removed by another process (C)!\n"; - push( @installer::globals::logfileinfo, $infoline); - log_pool_info(0); - - # removing new package from installation set - if ( $newpackagepath ne "" ) { remove_package_from_installset($newpackagepath); } # A file was copied and a problem occurred with pooling - - $package_is_up_to_date = 4; # repeat this package - return $package_is_up_to_date; - } - - if ( ! process_is_owner($checkfilename) ) - { - $infoline = "Pool problem: Pool lock file \"$checkfilename\" belongs to another process (C)!\n"; - push( @installer::globals::logfileinfo, $infoline); - log_pool_info(1); - - # removing new package from installation set - if ( $newpackagepath ne "" ) { remove_package_from_installset($newpackagepath); } # A file was copied and a problem occurred with pooling - - $package_is_up_to_date = 4; # repeat this package - return $package_is_up_to_date; - } - - # Removing the check file, releasing this package for the next process. - # The Lock to create this package still exists, if required. - unlink $checkfilename; - $installer::globals::processhaspoolcheckfile = 0; - $infoline = "Pool: Removing file: $checkfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - # Last chance before packaging starts, to check, if this process is really still owner - # of the packaging lock file. If not, this packaging process can be repeated. - if ( $installer::globals::processhaspoollockfile ) - { - if ( ! -f $lockfilename ) - { - $infoline = "Pool problem: Pool lock file \"$lockfilename\" was removed by another process (E)!\n"; - push( @installer::globals::logfileinfo, $infoline); - log_pool_info(0); - $package_is_up_to_date = 4; # repeat this package - return $package_is_up_to_date; - } - - if ( ! process_is_owner($lockfilename) ) - { - $infoline = "Pool problem: Pool lock file \"$lockfilename\" belongs to another process (E)!\n"; - push( @installer::globals::logfileinfo, $infoline); - log_pool_info(1); - $package_is_up_to_date = 4; # repeat this package - return $package_is_up_to_date; - } - } - - # Collecting log information - if ( $package_is_up_to_date == 1 ) { $installer::globals::poolpackages{$packagename} = 1; } - if ( $package_is_up_to_date == 0 ) - { - my @packreasons = (); - if ( $package_already_exists ) - { - $infoline = "\t\tPool: $packagename: Contains new content, creating new package. Differences:\n"; - push( @packreasons, $infoline); - foreach my $dest ( sort keys %installer::globals::pcfdifflist ) { push( @packreasons, "\t\t$dest\n"); } - foreach my $dest ( @installer::globals::pcfdiffcomment ) { push( @packreasons, "\t\t$dest"); } - foreach my $dest ( @installer::globals::epmdifflist ) { push( @packreasons, "\t\t$dest"); } - } - else - { - $infoline = "\t\tPool: $packagename: Does not exist in pool.\n"; - push( @packreasons, $infoline); - } - - $installer::globals::createpackages{$packagename} = \@packreasons; - } - - return $package_is_up_to_date; -} - -################################################### -# Determine, which package was created newly -################################################### - -sub determine_new_packagename -{ - my ( $dir ) = @_; - - my ($newcontent, $allcontent) = installer::systemactions::find_new_content_in_directory($dir, \@installer::globals::installsetcontent); - @installer::globals::installsetcontent = (); - foreach my $element ( @{$allcontent} ) { push(@installer::globals::installsetcontent, $element); } - - my $newentriesnumber = $#{$newcontent} + 1; - if ( $newentriesnumber > 1 ) - { - my $newpackages = ""; - foreach my $onepackage ( @{$newcontent} ) { $newpackages = $newpackages . " " . $onepackage; } - installer::exiter::exit_program("ERROR: More than one new package in directory $dir ($newpackages)", "determine_new_packagename (packagepool)"); - } - elsif ( $newentriesnumber < 1 ) - { - installer::exiter::exit_program("ERROR: No new package in directory $dir", "determine_new_packagename (packagepool)"); - } - my $newpackage = ${$newcontent}[0]; - - return $newpackage; -} - -#################################################### -# Including content into the package pool -#################################################### - -sub put_content_into_pool -{ - my ($packagename, $installdir, $subdir, $filesinpackage, $epmfilecontent) = @_; - - my $infoline = ""; - - my $fullinstalldir = $installdir . $installer::globals::separator . $subdir; - my $fullrealpackagename = determine_new_packagename($fullinstalldir); - my $realpackagename = $fullrealpackagename; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$realpackagename); - - installer::logger::include_header_into_logfile("Adding content into the package pool: $realpackagename (PackageName: $packagename)"); - - # Calculating content for pcf file, if not already done in "package_is_up_to_date" - if ( ! $installer::globals::newpcfcontentcalculated ) - { - $installer::globals::newpcfcontent = calculate_current_content($filesinpackage, $packagename); - $installer::globals::newpcfcontentcalculated = 1; - } - - # Determining md5sum and FileSize for the new package and saving in pcf file - my $md5sum = installer::xpdinstaller::get_md5_value($fullrealpackagename); - my $filesize = installer::xpdinstaller::get_size_value($fullrealpackagename); - my $fullpackagename = installer::xpdinstaller::get_fullpkgname_value($fullrealpackagename); - my $pkgversion = installer::xpdinstaller::get_pkgversion_value($fullrealpackagename); - - # Put package content file (pcf) into pool - my $pcffilename = $installer::globals::poolpath . $installer::globals::separator . $packagename . ".pcf"; - create_pcfcontent_file($realpackagename, $md5sum, $filesize, $fullpackagename, $pkgversion, $epmfilecontent, $pcffilename); - - # Creating xpd info - $installer::globals::xpdpackageinfo{'FileSize'} = $filesize; - $installer::globals::xpdpackageinfo{'FullPackageName'} = $fullpackagename; - $installer::globals::xpdpackageinfo{'md5sum'} = $md5sum; - $installer::globals::xpdpackageinfo{'RealPackageName'} = $realpackagename; - $installer::globals::xpdpackageinfo{'PkgVersion'} = $pkgversion; - - # Put package into pool - $infoline = "Pool: Adding package \"$packagename\" into pool.\n"; - push( @installer::globals::logfileinfo, $infoline); - - # Copying with unique name, containing PID. Only renaming if everything was fine. - my $realdestination = ""; - my $uniquedestination = ""; - if ( -f $fullrealpackagename ) - { - $realdestination = $installer::globals::poolpath . $installer::globals::separator . $realpackagename; - $uniquedestination = $realdestination . "." . $installer::globals::sessionid; - installer::systemactions::copy_one_file($fullrealpackagename, $uniquedestination); - } - - # Copying Solaris packages (as tar files) - if ( -d $fullrealpackagename ) - { - my $tarfilename = $packagename . ".tar"; - my $fulltarfilename = $fullinstalldir . $installer::globals::separator . $tarfilename; - my $size = installer::worker::tar_package($fullinstalldir, $packagename, $tarfilename, $installer::globals::getuidpath); - if (( ! -f $fulltarfilename ) || ( ! ( $size > 0 ))) { installer::exiter::exit_program("ERROR: Missing file: $fulltarfilename", "put_content_into_pool"); } - $realdestination = $installer::globals::poolpath . $installer::globals::separator . $tarfilename; - $uniquedestination = $realdestination . "." . $installer::globals::sessionid; - installer::systemactions::copy_one_file($fulltarfilename, $uniquedestination); - unlink $fulltarfilename; - } - - # Before the new package is renamed in the pool, it has to be checked, if this process still has the lock for this package. - # Check, if lock file still exists and if this process is the owner. Otherwise a pool error occurred. - if ( ! -f $installer::globals::poollockfilename ) - { - unlink $uniquedestination; # removing file from pool - log_pool_info(0); - installer::exiter::exit_program("ERROR: Pool lock file \"$installer::globals::poollockfilename\" was removed by another process (F)!", "put_content_into_pool"); - } - - if ( ! process_is_owner($installer::globals::poollockfilename) ) - { - unlink $uniquedestination; # removing file from pool - log_pool_info(1); - installer::exiter::exit_program("ERROR: Pool lock file \"$installer::globals::poollockfilename\" belongs to another process (F)!", "put_content_into_pool"); - } - - # Renaming the file in the pool (atomic step) - rename($uniquedestination, $realdestination); - - $infoline = "Pool: Renamed file: \"$uniquedestination\" to \"$realdestination\".\n"; - push( @installer::globals::logfileinfo, $infoline); - - # Before the lock file in the pool can be removed, it has to be checked, if this process is still the owner of this lock file. - # Check, if lock file still exists and if this process is the owner. Otherwise a pool error occurred. - if ( ! -f $installer::globals::poollockfilename ) - { - log_pool_info(0); - installer::exiter::exit_program("ERROR: Pool lock file \"$installer::globals::poollockfilename\" was removed by another process (G)!", "put_content_into_pool"); - } - - if ( ! process_is_owner($installer::globals::poollockfilename) ) - { - log_pool_info(1); - installer::exiter::exit_program("ERROR: Pool lock file \"$installer::globals::poollockfilename\" belongs to another process (G)!", "put_content_into_pool"); - } - - # Removing lock file, so that other processes can use this package now - unlink $installer::globals::poollockfilename; - $installer::globals::processhaspoollockfile = 0; - $infoline = "Pool: Removing file: $installer::globals::poollockfilename\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -################################################################### -# Copying a package from the pool into the installation set -################################################################### - -sub copy_package_from_pool -{ - my ($installdir, $subdir, $packagename) = @_; - - my $infoline = "Pool: Using package \"$packagename\" from pool.\n"; - push( @installer::globals::logfileinfo, $infoline); - my $sourcefile = $installer::globals::poolpath . $installer::globals::separator . $packagename; - if ( $installer::globals::issolarisbuild ) { $sourcefile = $sourcefile . ".tar"; } - if ( ! -f $sourcefile ) { installer::exiter::exit_program("ERROR: Missing package in package pool: \"$sourcefile\"", "copy_package_from_pool"); } - my $destination = $installdir . $installer::globals::separator . $subdir; - if ( ! -d $destination ) { installer::systemactions::create_directory($destination); } - my $destinationfile = $destination . $installer::globals::separator . $packagename; - if ( $installer::globals::issolarisbuild ) { $destinationfile = $destinationfile . ".tar"; } - if ( -f $sourcefile ) { installer::systemactions::copy_one_file($sourcefile, $destinationfile); } - # Unpacking for Solaris - if ( $installer::globals::issolarisbuild ) - { - my $tarfilename = $packagename . ".tar"; - installer::worker::untar_package($destination, $tarfilename, $installer::globals::getuidpath); - unlink $destinationfile; - $destinationfile =~ s/.tar\s*$//; - } - - # Keeping the content of @installer::globals::installsetcontent up to date (with full pathes): - push(@installer::globals::installsetcontent, $destinationfile); - - return $destinationfile; -} - -################################################################### -# Counting keys in hash -################################################################### - -sub get_count -{ - my ( $hashref ) = @_; - - my $counter = 0; - foreach my $onekey ( keys %{$hashref} ) { $counter++; } - return $counter; -} - -################################################################### -# Logging some pool information -################################################################### - -sub log_pool_statistics -{ - my $infoline = ""; - - installer::logger::include_header_into_logfile("Pool statistics:"); - - # Info collected in global hashes - # %installer::globals::createpackages - # %installer::globals::poolpackages - - my $pool_packages = get_count(\%installer::globals::poolpackages); - my $created_packages = get_count(\%installer::globals::createpackages); - - $infoline = "Number of packages from pool: $pool_packages\n"; - push( @installer::globals::logfileinfo, $infoline); - - foreach my $packagename ( sort keys(%installer::globals::poolpackages) ) - { - $infoline = "\t$packagename\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - $infoline = "\nNumber of packages that were created: $created_packages\n"; - push( @installer::globals::logfileinfo, $infoline); - - foreach my $packagename ( sort keys(%installer::globals::createpackages) ) - { - $infoline = "\t$packagename\n"; - push( @installer::globals::logfileinfo, $infoline); - my $reason = $installer::globals::createpackages{$packagename}; - - for ( my $i = 0; $i <= $#{$reason}; $i++ ) - { - $infoline = "${$reason}[$i]"; - push( @installer::globals::logfileinfo, $infoline); - } - } -} - -1; diff --git a/solenv/bin/modules/installer/parameter.pm b/solenv/bin/modules/installer/parameter.pm deleted file mode 100644 index 2a9698630..000000000 --- a/solenv/bin/modules/installer/parameter.pm +++ /dev/null @@ -1,668 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::parameter; - -use Cwd; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::remover; -use installer::systemactions; - -############################################ -# Parameter Operations -############################################ - -sub usage -{ - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::parameter::usage"); } - - print <<Ende; --------------------------------------------------------------------------------- -$installer::globals::prog -The following parameter are needed: --f: Path to the product list (required) --s: Path to the setup script (optional, if defined in product list) --i: Install path of the product (/opt/openofficeorg20) (optional) --p: Product from product list to be created (required) --l: Language of the product (comma and hash) (optional, defined in productlist) --b: Build, e.g. srx645 (optional) --m: Minor, e.g. m10 (optional) --simple: Path to do a simple install to --c: Compiler, e.g. wntmsci8, unxlngi5, unxsols4, ... (optional) --u: Path, in which zipfiles are unpacked (optional) --msitemplate: Source of the msi file templates (Windows compiler only) --msilanguage: Source of the msi file templates (Windows compiler only) --javalanguage: Source of the Java language files (opt., non-Windows only) --buildid: Current BuildID (optional) --pro: Product version --format: Package format --debian: Create Debian packages for Linux --dontunzip: do not unzip all files with flag ARCHIVE --dontcallepm : do not call epm to create install sets (opt., non-Windows only) --ispatchedepm : Usage of a patched (non-standard) epm (opt., non-Windows only) --copyproject : is set for projects that are only used for copying (optional) --languagepack : do create a languagepack, no product pack (optional) --helppack : do create a helppack, no product pack (optional) --patch : do create a patch (optional) --patchinc: Source for the patch include files (Solaris only) --dontstrip: No file stripping (Unix only) --log : Logging all available information (optional) --debug : Collecting debug information - -Examples for Windows: - -perl make_epmlist.pl -f zip.lst -p OfficeFAT -l en-US - -u /export/unpack -buildid 8712 - -msitemplate /export/msi_files - -msilanguage /export/msi_languages - -Examples for Non-Windows: - -perl make_epmlist.pl -f zip.lst -p OfficeFAT -l en-US -format rpm - -u /export/unpack -buildid 8712 -ispatchedepm --------------------------------------------------------------------------------- -Ende - exit(-1); -} - -######################################### -# Writing all parameter into logfile -######################################### - -sub saveparameter -{ - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::parameter::saveparameter"); } - - my $include = ""; - - installer::logger::globallog("Command line arguments:"); - - for ( my $i = 0; $i <= $#ARGV; $i++ ) - { - $include = $ARGV[$i] . "\n"; - push(@installer::globals::globallogfileinfo, $include); - } - - # also saving global settings: - - $include = "Separator: $installer::globals::separator\n"; - push(@installer::globals::globallogfileinfo, $include); - -} - -##################################### -# Reading parameter -##################################### - -sub getparameter -{ - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::parameter::getparameter"); } - - while ( $#ARGV >= 0 ) - { - my $param = shift(@ARGV); - - if ($param eq "-f") { $installer::globals::ziplistname = shift(@ARGV); } - elsif ($param eq "-s") { $installer::globals::setupscriptname = shift(@ARGV); } - elsif ($param eq "-p") { $installer::globals::product = shift(@ARGV); } - elsif ($param eq "-l") { $installer::globals::languagelist = shift(@ARGV); } - elsif ($param eq "-b") { $installer::globals::build = shift(@ARGV); } - elsif ($param eq "-m") { $installer::globals::minor = shift(@ARGV); } - elsif ($param eq "-dontunzip") { $installer::globals::dounzip = 0; } - elsif ($param eq "-c") { $installer::globals::compiler = shift(@ARGV); } - elsif ($param eq "-pro") { $installer::globals::pro = 1; } - elsif ($param eq "-format") { $installer::globals::packageformat = shift(@ARGV); } - elsif ($param eq "-log") { $installer::globals::globallogging = 1; } - elsif ($param eq "-quiet") { $installer::globals::quiet = 1; } - elsif ($param eq "-verbose") { $installer::globals::quiet = 0; } - elsif ($param eq "-debug") { $installer::globals::debug = 1; } - elsif ($param eq "-tab") { $installer::globals::tab = 1; } - elsif ($param eq "-u") { $installer::globals::unpackpath = shift(@ARGV); } - elsif ($param eq "-i") { $installer::globals::rootpath = shift(@ARGV); } - elsif ($param eq "-dontcallepm") { $installer::globals::call_epm = 0; } - elsif ($param eq "-msitemplate") { $installer::globals::idttemplatepath = shift(@ARGV); } - elsif ($param eq "-msilanguage") { $installer::globals::idtlanguagepath = shift(@ARGV); } - elsif ($param eq "-patchinc") { $installer::globals::patchincludepath = shift(@ARGV); } - elsif ($param eq "-javalanguage") { $installer::globals::javalanguagepath = shift(@ARGV); } - elsif ($param eq "-buildid") { $installer::globals::buildid = shift(@ARGV); } - elsif ($param eq "-copyproject") { $installer::globals::is_copy_only_project = 1; } - elsif ($param eq "-languagepack") { $installer::globals::languagepack = 1; } - elsif ($param eq "-helppack") { $installer::globals::helppack = 1;} - elsif ($param eq "-patch") { $installer::globals::patch = 1; } - elsif ($param eq "-debian") { $installer::globals::debian = 1; } - elsif ($param eq "-dontstrip") { $installer::globals::strip = 0; } - elsif ($param eq "-destdir") # new parameter for simple installer - { - $installer::globals::rootpath ne "" && die "must set destdir before -i or -simple"; - $installer::globals::destdir = Cwd::realpath( shift @ARGV ); - } - elsif ($param eq "-simple") # new parameter for simple installer - { - $installer::globals::simple = 1; - $installer::globals::call_epm = 0; - $installer::globals::makedownload = 0; - $installer::globals::makejds = 0; - $installer::globals::strip = 0; - my $path = shift(@ARGV); - $path =~ s/^\Q$installer::globals::destdir\E//; - $installer::globals::rootpath = $path; - } - else - { - installer::logger::print_error( "unknown parameter: $param" ); - usage(); - exit(-1); - } - } - - # Usage of simple installer (not for Windows): - # $PERL -w $SOLARENV/bin/make_installer.pl \ - # -f openoffice.lst -l en-US -p OpenOffice \ - # -buildid $BUILD -rpm \ - # -destdir /tmp/nurk -simple $INSTALL_PATH -} - -############################################ -# Controlling the fundamental parameter -# (required for every process) -############################################ - -sub control_fundamental_parameter -{ - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::parameter::control_fundamental_parameter"); } - - if ($installer::globals::product eq "") - { - installer::logger::print_error( "Product name not set!" ); - usage(); - exit(-1); - } -} - -########################################################## -# The path parameters can be relative or absolute. -# This function creates absolute pathes. -########################################################## - -sub make_path_absolute -{ - my ($pathref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::parameter::make_path_absolute : $$pathref"); } - - if ( $installer::globals::isunix ) - { - if (!($$pathref =~ /^\s*\//)) # this is a relative unix path - { - $$pathref = cwd() . $installer::globals::separator . $$pathref; - } - } - - if ( $installer::globals::iswin ) - { - if ( $^O =~ /cygwin/i ) - { - if ( $$pathref !~ /^\s*\// && $$pathref !~ /^\s*\w\:/ ) # not an absolute POSIX or DOS path - { - $$pathref = cwd() . $installer::globals::separator . $$pathref; - } - my $p = $$pathref; - chomp( $p ); - my $q = ''; - # Avoid the $(LANG) problem. - if ($p =~ /(\A.*)(\$\(.*\Z)/) { - $p = $1; - $q = $2; - } - $p =~ s/\\/\\\\/g; - chomp( $p = qx{cygpath -w "$p"} ); - $$pathref = $p.$q; - # Use windows paths, but with '/'s. - $$pathref =~ s/\\/\//g; - } - else - { - if (!($$pathref =~ /^\s*\w\:/)) # this is a relative windows path (no dos drive) - { - $$pathref = cwd() . $installer::globals::separator . $$pathref; - - $$pathref =~ s/\//\\/g; - } - } - } - $$pathref =~ s/[\/\\]\s*$//; # removing ending slashes -} - -################################################## -# Setting some global parameters -# This has to be expanded with furher platforms -################################################## - -sub setglobalvariables -{ - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::parameter::setglobalvariables"); } - - # Setting the installertype directory corresponding to the environment variable PKGFORMAT - # The global variable $installer::globals::packageformat can only contain one package format. - # If PKGFORMAT cotains more than one format (for example "rpm deb") this is splitted in the - # makefile calling the perl program. - $installer::globals::installertypedir = $installer::globals::packageformat; - - if ( $installer::globals::compiler =~ /wnt(msc|gcc)i/ ) - { - $installer::globals::iswindowsbuild = 1; - } - - if ( $installer::globals::compiler =~ /unxso[lg][siux]/ ) - { - $installer::globals::issolarisbuild = 1; - if ( $installer::globals::packageformat eq "pkg" ) - { - $installer::globals::issolarispkgbuild = 1; - $installer::globals::epmoutpath = "packages"; - $installer::globals::isxpdplatform = 1; - } - } - - if (( $installer::globals::compiler =~ /unxmacxi/ ) || ( $installer::globals::compiler =~ /unxmacxp/ )) - { - $installer::globals::ismacbuild = 1; - - if ( $installer::globals::packageformat eq "dmg" ) - { - $installer::globals::ismacdmgbuild = 1; - } - } - - if ( $installer::globals::compiler =~ /unxobsd/ ) - { - $installer::globals::epmoutpath = "openbsd"; - } - - if ( $installer::globals::compiler =~ /unxfbsd/ ) - { - $installer::globals::isfreebsdbuild = 1; - - if ( $installer::globals::packageformat eq "bsd" ) - { - $installer::globals::epmoutpath = "freebsd"; - $installer::globals::isfreebsdpkgbuild = 1; - } - } - - if ( $installer::globals::compiler =~ /unxso[lg]s/ ) { $installer::globals::issolarissparcbuild = 1; } - - if ( $installer::globals::compiler =~ /unxso[lg]i/ ) { $installer::globals::issolarisx86build = 1; } - - if ($ENV{OS} eq 'AIX') - { - if ( $installer::globals::packageformat eq "rpm" ) - { - $installer::globals::isrpmbuild = 1; - $installer::globals::isxpdplatform = 1; - $installer::globals::epmoutpath = "RPMS"; - } - if ( $installer::globals::rpm eq "" ) { installer::exiter::exit_program("ERROR: Environment variable \"\$RPM\" has to be defined!", "setglobalvariables"); } - } - - if ($ENV{OS} eq 'LINUX') - { - $installer::globals::islinuxbuild = 1; - if ( $installer::globals::packageformat eq "rpm" ) - { - $installer::globals::isrpmbuild = 1; - $installer::globals::isxpdplatform = 1; - $installer::globals::epmoutpath = "RPMS"; - if ( $installer::globals::compiler =~ /unxlngi/ ) - { - $installer::globals::islinuxintelrpmbuild = 1; - } - if ( $installer::globals::compiler =~ /unxlngppc/ ) - { - $installer::globals::islinuxppcrpmbuild = 1; - } - if ( $installer::globals::compiler =~ /unxlngx/ ) - { - $installer::globals::islinuxx86_64rpmbuild = 1; - } - - if ( $installer::globals::rpm eq "" ) { installer::exiter::exit_program("ERROR: Environment variable \"\$RPM\" has to be defined!", "setglobalvariables"); } - } - - # Creating Debian packages ? - if (( $installer::globals::packageformat eq "deb" ) || ( $installer::globals::debian )) - { - $installer::globals::debian = 1; - $installer::globals::packageformat = "deb"; - my $message = "Creating Debian packages"; - installer::logger::print_message( $message ); - push(@installer::globals::globallogfileinfo, $message); - $installer::globals::isrpmbuild = 0; - $installer::globals::isdebbuild = 1; - $installer::globals::epmoutpath = "DEBS"; - if ( $installer::globals::compiler =~ /unxlngi/ ) - { - $installer::globals::islinuxinteldebbuild = 1; - } - if ( $installer::globals::compiler =~ /unxlngppc/ ) - { - $installer::globals::islinuxppcdebbuild = 1; - } - if ( $installer::globals::compiler =~ /unxlngx/ ) - { - $installer::globals::islinuxx86_64debbuild = 1; - } - } - } - - # Defaulting to native package format for epm - - if ( ! $installer::globals::packageformat ) { $installer::globals::packageformat = "native"; } - - # extension, if $installer::globals::pro is set - if ($installer::globals::pro) { $installer::globals::productextension = ".pro"; } - - # no languages defined as parameter - if ($installer::globals::languagelist eq "") { $installer::globals::languages_defined_in_productlist = 1; } - - # setting and creating the unpackpath - - if ($installer::globals::unpackpath eq "") # unpackpath not set - { - $installer::globals::unpackpath = cwd(); - } - - if ( $installer::globals::localunpackdir ne "" ) { $installer::globals::unpackpath = $installer::globals::localunpackdir; } - - if (!($installer::globals::unpackpath eq "")) - { - make_path_absolute(\$installer::globals::unpackpath); - } - - $installer::globals::unpackpath =~ s/\Q$installer::globals::separator\E\s*$//; - - if (! -d $installer::globals::unpackpath ) # create unpackpath - { - installer::systemactions::create_directory($installer::globals::unpackpath); - } - - # setting jds exclude file list - - if ( $installer::globals::isrpmbuild ) - { - $installer::globals::jdsexcludefilename = "jds_excludefiles_linux.txt"; - } - if ( $installer::globals::issolarissparcbuild ) - { - $installer::globals::jdsexcludefilename = "jds_excludefiles_solaris_sparc.txt"; - } - if ( $installer::globals::issolarisx86build ) - { - $installer::globals::jdsexcludefilename = "jds_excludefiles_solaris_intel.txt"; - } - - # setting and creating the temppath - - if (( $ENV{'TMP'} ) || ( $ENV{'TEMP'} ) || ( $ENV{'TMPDIR'} )) - { - if ( $ENV{'TMP'} ) { $installer::globals::temppath = $ENV{'TMP'}; } - elsif ( $ENV{'TEMP'} ) { $installer::globals::temppath = $ENV{'TEMP'}; } - elsif ( $ENV{'TMPDIR'} ) { $installer::globals::temppath = $ENV{'TMPDIR'}; } - $installer::globals::temppath =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes - $installer::globals::temppath = $installer::globals::temppath . $installer::globals::separator . $installer::globals::globaltempdirname; - installer::systemactions::create_directory_with_privileges($installer::globals::temppath, "777"); - my $dirsave = $installer::globals::temppath; - - if ( $installer::globals::compiler =~ /^unxmac/ ) - { - chmod 0777, $installer::globals::temppath; - } - - $installer::globals::temppath = $installer::globals::temppath . $installer::globals::separator . "i"; - $installer::globals::temppath = installer::systemactions::create_pid_directory($installer::globals::temppath); - push(@installer::globals::removedirs, $installer::globals::temppath); - - if ( ! -d $installer::globals::temppath ) { installer::exiter::exit_program("ERROR: Failed to create directory $installer::globals::temppath ! Possible reason: Wrong privileges in directory $dirsave .", "setglobalvariables"); } - - $installer::globals::jdstemppath = $installer::globals::temppath; - $installer::globals::jdstemppath =~ s/i_/j_/; - push(@installer::globals::jdsremovedirs, $installer::globals::jdstemppath); - $installer::globals::temppath = $installer::globals::temppath . $installer::globals::separator . $installer::globals::compiler . $installer::globals::productextension; - installer::systemactions::create_directory($installer::globals::temppath); - if ( $^O =~ /cygwin/i ) - { - $installer::globals::cyg_temppath = $installer::globals::temppath; - $installer::globals::cyg_temppath =~ s/\\/\\\\/g; - chomp( $installer::globals::cyg_temppath = qx{cygpath -w "$installer::globals::cyg_temppath"} ); - } - $installer::globals::temppathdefined = 1; - $installer::globals::jdstemppathdefined = 1; - } - else - { - $installer::globals::temppathdefined = 0; - $installer::globals::jdstemppathdefined = 0; - } - - # only one cab file, if Windows msp patches shall be prepared - if ( $installer::globals::prepare_winpatch ) { $installer::globals::number_of_cabfiles = 1; } - -} - -############################################ -# Controlling the parameter that are -# required for special processes -############################################ - -sub control_required_parameter -{ - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::parameter::control_required_parameter"); } - - if (!($installer::globals::is_copy_only_project)) - { - ############################################################################################## - # idt template path. Only required for Windows build ($installer::globals::compiler =~ /wntmsci/) - # for the creation of the msi database. - ############################################################################################## - - if (($installer::globals::idttemplatepath eq "") && ($installer::globals::iswindowsbuild)) - { - installer::logger::print_error( "idt template path not set (-msitemplate)!" ); - usage(); - exit(-1); - } - - ############################################################################################## - # idt language path. Only required for Windows build ($installer::globals::compiler =~ /wntmsci/) - # for the creation of the msi database. - ############################################################################################## - - if (($installer::globals::idtlanguagepath eq "") && ($installer::globals::iswindowsbuild)) - { - installer::logger::print_error( "idt language path not set (-msilanguage)!" ); - usage(); - exit(-1); - } - - # Analyzing the idt template path - - if (!($installer::globals::idttemplatepath eq "")) # idttemplatepath set, relative or absolute? - { - make_path_absolute(\$installer::globals::idttemplatepath); - } - - installer::remover::remove_ending_pathseparator(\$installer::globals::idttemplatepath); - - # Analyzing the idt language path - - if (!($installer::globals::idtlanguagepath eq "")) # idtlanguagepath set, relative or absolute? - { - make_path_absolute(\$installer::globals::idtlanguagepath); - } - - installer::remover::remove_ending_pathseparator(\$installer::globals::idtlanguagepath); - - # In the msi template directory a files "codes.txt" has to exist, in which the ProductCode - # and the UpgradeCode for the product are defined. - # The name "codes.txt" can be overwritten in Product definition with CODEFILENAME (msiglobal.pm) - - if (( $installer::globals::iswindowsbuild ) && ( $installer::globals::packageformat ne "archive" ) && ( $installer::globals::packageformat ne "installed" )) - { - $installer::globals::codefilename = $installer::globals::idttemplatepath . $installer::globals::separator . $installer::globals::codefilename; - installer::files::check_file($installer::globals::codefilename); - $installer::globals::componentfilename = $installer::globals::idttemplatepath . $installer::globals::separator . $installer::globals::componentfilename; - installer::files::check_file($installer::globals::componentfilename); - } - - } - - ####################################### - # Patch currently only available - # for Solaris packages and Linux - ####################################### - - if (( $installer::globals::patch ) && ( ! $installer::globals::issolarispkgbuild ) && ( ! $installer::globals::isrpmbuild ) && ( ! $installer::globals::isdebbuild ) && ( ! $installer::globals::iswindowsbuild ) && ( ! $installer::globals::ismacdmgbuild )) - { - installer::logger::print_error( "Sorry, Patch flag currently only available for Solaris pkg, Linux RPM and Windows builds!" ); - usage(); - exit(-1); - } - - if (( $installer::globals::patch ) && ( $installer::globals::issolarispkgbuild ) && ( ! $installer::globals::patchincludepath )) - { - installer::logger::print_error( "Solaris patch requires parameter -patchinc !" ); - usage(); - exit(-1); - } - - if (( $installer::globals::patch ) && ( $installer::globals::issolarispkgbuild ) && ( $installer::globals::patchincludepath )) - { - make_path_absolute(\$installer::globals::patchincludepath); - $installer::globals::patchincludepath = installer::converter::make_path_conform($installer::globals::patchincludepath); - } - - ####################################### - # Testing existence of files - # also for copy-only projects - ####################################### - - if ($installer::globals::ziplistname eq "") - { - installer::logger::print_error( "ERROR: Zip list file has to be defined (Parameter -f) !" ); - usage(); - exit(-1); - } - else - { - installer::files::check_file($installer::globals::ziplistname); - } - - if ($installer::globals::setupscriptname eq "") { $installer::globals::setupscript_defined_in_productlist = 1; } - else { installer::files::check_file($installer::globals::setupscriptname); } # if the setupscript file is defined, it has to exist - -} - -################################################ -# Writing parameter to shell and into logfile -################################################ - -sub outputparameter -{ - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::parameter::outputparameter"); } - - my $element; - - my @output = (); - - push(@output, "\n########################################################\n"); - push(@output, "$installer::globals::prog, version 1.0\n"); - push(@output, "Product list file: $installer::globals::ziplistname\n"); - if (!($installer::globals::setupscript_defined_in_productlist)) - { - push(@output, "Setup script: $installer::globals::setupscriptname\n"); - } - else - { - push(@output, "Taking setup script from solver\n"); - } - push(@output, "Unpackpath: $installer::globals::unpackpath\n"); - push(@output, "Compiler: $installer::globals::compiler\n"); - push(@output, "Product: $installer::globals::product\n"); - push(@output, "BuildID: $installer::globals::buildid\n"); - push(@output, "Build: $installer::globals::build\n"); - if ( $installer::globals::minor ) { push(@output, "Minor: $installer::globals::minor\n"); } - else { push(@output, "No minor set\n"); } - if ( $installer::globals::pro ) { push(@output, "Product version\n"); } - else { push(@output, "Non-Product version\n"); } - if ( $installer::globals::rootpath eq "" ) { push(@output, "Using default installpath\n"); } - else { push(@output, "Installpath: $installer::globals::rootpath\n"); } - push(@output, "Package format: $installer::globals::packageformat\n"); - if (!($installer::globals::idttemplatepath eq "")) { push(@output, "msi templatepath: $installer::globals::idttemplatepath\n"); } - if ((!($installer::globals::idttemplatepath eq "")) && (!($installer::globals::iswindowsbuild))) { push(@output, "msi template path will be ignored for non Windows builds!\n"); } - if (!($installer::globals::idtlanguagepath eq "")) { push(@output, "msi languagepath: $installer::globals::idtlanguagepath\n"); } - if ((!($installer::globals::idtlanguagepath eq "")) && (!($installer::globals::iswindowsbuild))) { push(@output, "msi language path will be ignored for non Windows builds!\n"); } - if ((!($installer::globals::iswindowsbuild)) && ( $installer::globals::call_epm )) { push(@output, "Calling epm\n"); } - if ((!($installer::globals::iswindowsbuild)) && (!($installer::globals::call_epm))) { push(@output, "Not calling epm\n"); } - if (!($installer::globals::javalanguagepath eq "")) { push(@output, "Java language path: $installer::globals::javalanguagepath\n"); } - if ((!($installer::globals::javalanguagepath eq "")) && ($installer::globals::iswindowsbuild)) { push(@output, "Java language path will be ignored for Windows builds!\n"); } - if ( $installer::globals::patchincludepath ) { push(@output, "Patch include path: $installer::globals::patchincludepath\n"); } - if ( $installer::globals::globallogging ) { push(@output, "Complete logging activated\n"); } - if ( $installer::globals::debug ) { push(@output, "Debug is activated\n"); } - if ( $installer::globals::tab ) { push(@output, "TAB version\n"); } - if ( $installer::globals::strip ) { push(@output, "Stripping files\n"); } - else { push(@output, "No file stripping\n"); } - if ( $installer::globals::debian ) { push(@output, "Linux: Creating Debian packages\n"); } - if ( $installer::globals::dounzip ) { push(@output, "Unzip ARCHIVE files\n"); } - else { push(@output, "Not unzipping ARCHIVE files\n"); } - if (!($installer::globals::languages_defined_in_productlist)) - { - push(@output, "Languages:\n"); - foreach $element (@installer::globals::languageproducts) { push(@output, "\t$element\n"); } - } - else - { - push(@output, "Languages defined in $installer::globals::ziplistname\n"); - } - if ( $installer::globals::is_copy_only_project ) { push(@output, "This is a copy only project!\n"); } - if ( $installer::globals::languagepack ) { push(@output, "Creating language pack!\n"); } - if ( $installer::globals::helppack ) { push(@output, "Creating help pack!\n"); } - if ( $installer::globals::patch ) { push(@output, "Creating patch!\n"); } - push(@output, "########################################################\n"); - - # output into shell and into logfile - - for ( my $i = 0; $i <= $#output; $i++ ) - { - installer::logger::print_message( $output[$i] ); - push(@installer::globals::globallogfileinfo, $output[$i]); - } -} - -1; diff --git a/solenv/bin/modules/installer/pathanalyzer.pm b/solenv/bin/modules/installer/pathanalyzer.pm deleted file mode 100644 index aab3e8654..000000000 --- a/solenv/bin/modules/installer/pathanalyzer.pm +++ /dev/null @@ -1,75 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::pathanalyzer; - -use installer::globals; - -########################################### -# Path analyzer -########################################### - -sub get_path_from_fullqualifiedname -{ - my ($longfilenameref) = @_; - - if ( $$longfilenameref =~ /\Q$installer::globals::separator\E/ ) # Is there a separator in the path? Otherwise the path is empty. - { - if ( $$longfilenameref =~ /^\s*(.*\Q$installer::globals::separator\E)(.+)/ ) - { - $$longfilenameref = $1; - } - } - else - { - $$longfilenameref = ""; # there is no path - } -} - -sub make_absolute_filename_to_relative_filename -{ - my ($longfilenameref) = @_; - - if ( $installer::globals::isunix ) - { - if ( $$longfilenameref =~ /^.*\/(\S.+\S?)/ ) - { - $$longfilenameref = $1; - } - } - - if ( $installer::globals::iswin ) - { - # Either '/' or '\'. It would be possible to use $installer::globals::separator. - if ( $$longfilenameref =~ /^.*[\/\\](\S.+\S?)/ ) - { - $$longfilenameref = $1; - } - } -} - -1; diff --git a/solenv/bin/modules/installer/profiles.pm b/solenv/bin/modules/installer/profiles.pm deleted file mode 100644 index 50fd96ae7..000000000 --- a/solenv/bin/modules/installer/profiles.pm +++ /dev/null @@ -1,231 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::profiles; - -use installer::converter; -use installer::existence; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::remover; -use installer::systemactions; - -############################# -# Profiles -############################# - -####################################################### -# Sorting the content of a profile -####################################################### - -sub sorting_profile -{ - my ($profilesref) = @_; - - my @profile = (); - my @definedsections = (); - - for ( my $i = 0; $i <= $#{$profilesref}; $i++ ) - { - my $line = ${$profilesref}[$i]; - - if ( $line =~ /^\s*(\[.*\])\s*$/ ) # this is a section (every second line) - { - my $section = $1; - - if (!(installer::existence::exists_in_array($section, \@definedsections))) - { - my $sectionline = $section . "\n"; - push(@definedsections, $section); - push(@profile, $sectionline); - - for ( my $j = 0; $j <= $#{$profilesref}; $j++ ) - { - my $oneline = ${$profilesref}[$j]; - installer::remover::remove_leading_and_ending_whitespaces(\$oneline); - - if ( $oneline eq $section ) - { - my $nextline = ${$profilesref}[$j+1]; - push(@profile, $nextline); - } - } - } - } - } - - return \@profile; -} - -##################################################################### -# Adding the newly created profile into the file list -##################################################################### - -sub add_profile_into_filelist -{ - my ($filesarrayref, $oneprofile, $completeprofilename, $allvariables) = @_; - - my %profile = (); - - # Taking the base data from the "gid_File_Lib_Vcl" - - my $vclgid = "gid_File_Lib_Vcl"; - if ( $allvariables->{'GLOBALFILEGID'} ) { $vclgid = $allvariables->{'GLOBALFILEGID'}; } - my $vclfile = installer::existence::get_specified_file($filesarrayref, $vclgid); - - # copying all base data - installer::converter::copy_item_object($vclfile, \%profile); - - # and overriding all new values - - $profile{'ismultilingual'} = 0; - $profile{'sourcepath'} = $completeprofilename; - $profile{'Name'} = $oneprofile->{'Name'}; - $profile{'UnixRights'} = "444"; - $profile{'gid'} = $oneprofile->{'gid'}; - $profile{'Dir'} = $oneprofile->{'Dir'}; - $profile{'destination'} = $oneprofile->{'destination'}; - $profile{'Styles'} = ""; - if ( $oneprofile->{'Styles'} ) { $profile{'Styles'} = $oneprofile->{'Styles'}; } - $profile{'modules'} = $oneprofile->{'ModuleID'}; # Profiles can only be added completely to a module - - push(@{$filesarrayref}, \%profile); -} - -################################################### -# Including Windows line ends in ini files -# Profiles on Windows shall have \r\n line ends -################################################### - -sub include_windows_lineends -{ - my ($onefile) = @_; - - for ( my $i = 0; $i <= $#{$onefile}; $i++ ) - { - ${$onefile}[$i] =~ s/\r?\n$/\r\n/; - } -} - -#################################### -# Create profiles -#################################### - -sub create_profiles -{ - my ($profilesref, $profileitemsref, $filesarrayref, $languagestringref, $allvariables) = @_; - - my $infoline; - - my $profilesdir = installer::systemactions::create_directories("profiles", $languagestringref); - - installer::logger::include_header_into_logfile("Creating profiles:"); - - # Attention: The module dependencies from ProfileItems have to be ignored, because - # the Profile has to be installed completely with all of its content and the correct name. - # Only complete profiles can belong to a specified module, but not ProfileItems! - - # iterating over all files - - for ( my $i = 0; $i <= $#{$profilesref}; $i++ ) - { - my $oneprofile = ${$profilesref}[$i]; - my $dir = $oneprofile->{'Dir'}; - if ( $dir eq "PREDEFINED_CONFIGDIR" ) { next; } # ignoring the profile sversion file - - my $profilegid = $oneprofile->{'gid'}; - my $profilename = $oneprofile->{'Name'}; - - my $localprofilesdir = $profilesdir . $installer::globals::separator . $profilegid; # uniqueness guaranteed by gid - if ( ! -d $localprofilesdir ) { installer::systemactions::create_directory($localprofilesdir); } - - my @onefile = (); - my $profileempty = 1; - - for ( my $j = 0; $j <= $#{$profileitemsref}; $j++ ) - { - my $oneprofileitem = ${$profileitemsref}[$j]; - - my $styles = ""; - if ( $oneprofileitem->{'Styles'} ) { $styles = $oneprofileitem->{'Styles'}; } - if ( $styles =~ /\bINIFILETABLE\b/ ) { next; } # these values are written during installation, not during packing - - my $profileid = $oneprofileitem->{'ProfileID'}; - - if ( $profileid eq $profilegid ) - { - my $section = $oneprofileitem->{'Section'}; - my $key = $oneprofileitem->{'Key'}; - my $value = $oneprofileitem->{'Value'}; - for (my $pk = 1; $pk <= 50; $pk++) - { - my $key = "ValueList" . $pk; - if ( $oneprofileitem->{$key} ) - { $value = $value . " " . $oneprofileitem->{$key} } - } - my $order = $oneprofileitem->{'Order'}; # ignoring order at the moment - - my $line = "[" . $section . "]" . "\n"; - push(@onefile, $line); - $line = $key . "=" . $value . "\n"; - push(@onefile, $line); - - $profileempty = 0; - } - } - - if ( $profileempty ) { next; } # ignoring empty profiles - - # Sorting the array @onefile - my $onefileref = sorting_profile(\@onefile); - - if ( $installer::globals::iswin && $installer::globals::plat =~ /cygwin/i) # Windows line ends only for Cygwin - { - include_windows_lineends($onefileref); - } - - # Saving the profile as a file - $completeprofilename = $localprofilesdir . $installer::globals::separator . $profilename; - - installer::files::save_file($completeprofilename, $onefileref); - - # Adding the file to the filearray - # Some data are set now, others are taken from the file "soffice.exe" ("soffice.bin") - add_profile_into_filelist($filesarrayref, $oneprofile, $completeprofilename, $allvariables); - - $infoline = "Created Profile: $completeprofilename\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - $infoline = "\n"; - push( @installer::globals::logfileinfo, $infoline); -} - - -1; diff --git a/solenv/bin/modules/installer/remover.pm b/solenv/bin/modules/installer/remover.pm deleted file mode 100644 index 2c039ec6f..000000000 --- a/solenv/bin/modules/installer/remover.pm +++ /dev/null @@ -1,82 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::remover; - -use installer::globals; - -############################################ -# Remover -############################################ - -sub remove_leading_and_ending_whitespaces -{ - my ( $stringref ) = @_; - - $$stringref =~ s/^\s+//; - $$stringref =~ s/\s+$//; -} - -sub remove_leading_and_ending_quotationmarks -{ - my ( $stringref ) = @_; - - $$stringref =~ s/^\s*\"//; - $$stringref =~ s/\"\s*$//; -} - -sub remove_leading_and_ending_slashes -{ - my ( $stringref ) = @_; - - $$stringref =~ s/^\s*\///g; - $$stringref =~ s/\/\s*$//g; -} - -sub remove_ending_slashes -{ - my ( $stringref ) = @_; - - $$stringref =~ s/\/\s*$//g; -} - -sub remove_leading_and_ending_pathseparators -{ - my ( $stringref ) = @_; - - $$stringref =~ s/^\s*\Q$installer::globals::separator\E//; - $$stringref =~ s/\Q$installer::globals::separator\E\s*$//; -} - -sub remove_ending_pathseparator -{ - my ( $stringref ) = @_; - - $$stringref =~ s/\Q$installer::globals::separator\E\s*$//; -} - -1; diff --git a/solenv/bin/modules/installer/scppatchsoname.pm b/solenv/bin/modules/installer/scppatchsoname.pm deleted file mode 100644 index 888cfeb59..000000000 --- a/solenv/bin/modules/installer/scppatchsoname.pm +++ /dev/null @@ -1,213 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::scppatchsoname; - -use installer::files; -use installer::globals; -use installer::logger; -use installer::setupscript; -use installer::systemactions; - -######################################################################################## -# The length of the new string must be identical with the length of the old string -######################################################################################## - -sub change_length_of_string -{ - my ($newstringref, $oldstring) = @_; - - while ( length($$newstringref) < length($oldstring) ) - { - $$newstringref = $$newstringref . chr(0); - } -} - -######################################################################################## -# The length of the new string must be identical with the length of the old string -######################################################################################## - -sub change_length_of_string_with_letter -{ - my ($newstringref, $oldstring, $onestring) = @_; - - while ( length($$newstringref) < length($oldstring) ) - { - $$newstringref = $$newstringref . $onestring; - } -} - -######################################################################################## -# Converting a string to a unicode string -######################################################################################## - -sub convert_to_unicode -{ - my ($string) = @_; - - my $unicodestring = ""; - - my $stringlength = length($string); - - for ( my $i = 0; $i < $stringlength; $i++ ) - { - $unicodestring = $unicodestring . substr($string, $i, 1); - $unicodestring = $unicodestring . chr(0); - } - - return $unicodestring; -} - -######################################################################################## -# Replacing the so name in all files with flag PATCH_SO_NAME -######################################################################################## - -sub replace_productname_in_file -{ - my ($sourcepath, $destpath, $variableshashref, $onefilehash, $styles) = @_; - - my $onefile = installer::files::read_binary_file($sourcepath); - - # searching for "x" - - my $onestring = "x" . chr(0); - my $replacestring = ""; - for ( my $i = 1; $i <= 80; $i++ ) { $replacestring .= $onestring; } - - my $productname = $variableshashref->{'PRODUCTNAME'} . " " . $variableshashref->{'PRODUCTVERSION'}; - if ( exists($onefilehash->{'FileDescription'}) ) { $productname = $onefilehash->{'FileDescription'}; } - my $unicode_productname = convert_to_unicode($productname); - - change_length_of_string(\$unicode_productname, $replacestring); - - my $found1 = $onefile =~ s/$replacestring/$unicode_productname/sg; - - my $found2 = 0; - - if ( $styles =~ /\bPATCH_SO_NAME_Z\b/ ) - { - # searching for "z" - - $onestring = "z" . chr(0); - $replacestring = ""; - for ( my $i = 1; $i <= 80; $i++ ) { $replacestring .= $onestring; } - - my $productname2 = $variableshashref->{'PRODUCTNAME'} . " " . $variableshashref->{'PRODUCTVERSION'}; - if ( exists($onefilehash->{'FileDescriptionZ'}) ) { $productname2 = $onefilehash->{'FileDescriptionZ'}; } - my $unicode_productname2 = convert_to_unicode($productname2); - - change_length_of_string_with_letter(\$unicode_productname2, $replacestring, $onestring); - - $found2 = $onefile =~ s/$replacestring/$unicode_productname2/sg; - } - - installer::files::save_binary_file($onefile, $destpath); - - my $found = $found1 + $found2; - - return $found; -} - -######################################################### -# Analyzing files with flag PATCH_SO_NAME -######################################################### - -sub resolving_patchsoname_flag -{ - my ($filesarrayref, $variableshashref, $item, $languagestringref) = @_; - - my $diritem = lc($item); - - my $replacedirbase = installer::systemactions::create_directories("patchsoname_$diritem", $languagestringref); - - installer::logger::include_header_into_logfile("$item with flag PATCH_SO_NAME:"); - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - my $styles = ""; - - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - - if ( $styles =~ /\bPATCH_SO_NAME\b/ ) - { - # Language specific subdirectory - - my $onelanguage = $onefile->{'specificlanguage'}; - my $filedescription = ""; - - if ($onelanguage eq "") - { - $onelanguage = "00"; # files without language into directory "00" - } - - my $replacedir = $replacedirbase . $installer::globals::separator . $onelanguage . $installer::globals::separator; - installer::systemactions::create_directory($replacedir); # creating language specific directories - - # copy files and edit them with the variables defined in the zip.lst - - my $onefilename = $onefile->{'Name'}; - my $sourcepath = $onefile->{'sourcepath'}; - my $destinationpath = $replacedir . $onefilename; - my $movepath = $destinationpath . ".orig"; - - my $copysuccess = installer::systemactions::copy_one_file($sourcepath, $movepath); - - if ( $copysuccess ) - { - # Now the file can be patch (binary!) - my $found = replace_productname_in_file($movepath, $destinationpath, $variableshashref, $onefile, $styles); - - if ($found == 0) - { - my $infoline = "Did not patch the file $destinationpath\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - my $infoline = "Successfully patched $destinationpath, Count: $found\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - # Saving the original source, where the file was found - $onefile->{'originalsourcepath'} = $onefile->{'sourcepath'}; - - # Saving the original source, where the file was found - $onefile->{'originalsourcepath'} = $onefile->{'sourcepath'}; - - # Writing the new sourcepath into the hashref, even if it was no copied - - $onefile->{'sourcepath'} = $destinationpath; - } - } - - my $infoline = "\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -1; diff --git a/solenv/bin/modules/installer/scpzipfiles.pm b/solenv/bin/modules/installer/scpzipfiles.pm deleted file mode 100644 index 8854b3d7e..000000000 --- a/solenv/bin/modules/installer/scpzipfiles.pm +++ /dev/null @@ -1,183 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::scpzipfiles; - -use installer::files; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::systemactions; - -######################################################################################## -# Replacing all zip list variables in setup script and files with flag scpzip_replace -######################################################################################## - -sub replace_all_ziplistvariables_in_file -{ - my ( $fileref, $variableshashref ) = @_; - - for ( my $i = 0; $i <= $#{$fileref}; $i++ ) - { - my $line = ${$fileref}[$i]; - - if ( $line =~ /^.*\$\{\w+\}.*$/ ) # only occurrence of ${abc} - { - my $key; - - foreach $key (keys %{$variableshashref}) - { - my $value = $variableshashref->{$key}; - $key = '${' . $key . '}'; - $line =~ s/\Q$key\E/$value/g; - ${$fileref}[$i] = $line; - } - } - } -} - -######################################################################################## -# Replacing all zip list variables in rtf files. In rtf files -# the brackets are masked. -######################################################################################## - -sub replace_all_ziplistvariables_in_rtffile -{ - my ( $fileref, $variablesref, $onelanguage, $loggingdir ) = @_; - - for ( my $i = 0; $i <= $#{$fileref}; $i++ ) - { - my $line = ${$fileref}[$i]; - - if ( $line =~ /^.*\$\\\{\w+\\\}.*$/ ) # only occurrence of $\{abc\} - { - for ( my $j = 0; $j <= $#{$variablesref}; $j++ ) - { - my $variableline = ${$variablesref}[$j]; - - my ($key, $value); - - if ( $variableline =~ /^\s*([\w-]+?)\s+(.*?)\s*$/ ) - { - $key = $1; - $value = $2; - $key = '$\{' . $key . '\}'; - } - - $line =~ s/\Q$key\E/$value/g; - - ${$fileref}[$i] = $line; - } - } - } -} - -######################################################### -# Analyzing files with flag SCPZIP_REPLACE -# $item can be "File" or "ScpAction" -######################################################### - -sub resolving_scpzip_replace_flag -{ - my ($filesarrayref, $variableshashref, $item, $languagestringref) = @_; - - my $diritem = lc($item); - - my $replacedirbase = installer::systemactions::create_directories("replace_$diritem", $languagestringref); - - installer::logger::include_header_into_logfile("$item with flag SCPZIP:"); - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - my $styles = ""; - - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - - if ( $styles =~ /\bSCPZIP_REPLACE\b/ ) - { - # Language specific subdirectory - - my $onelanguage = $onefile->{'specificlanguage'}; - - if ($onelanguage eq "") - { - $onelanguage = "00"; # files without language into directory "00" - } - - my $replacedir = $replacedirbase . $installer::globals::separator . $onelanguage . $installer::globals::separator; - installer::systemactions::create_directory($replacedir); # creating language specific directories - - # copy files and edit them with the variables defined in the zip.lst - - my $longfilename = 0; - - my $onefilename = $onefile->{'Name'}; - my $sourcepath = $onefile->{'sourcepath'}; - - if ( $onefilename =~ /^\s*\Q$installer::globals::separator\E/ ) # filename begins with a slash, for instance /registry/schema/org/openoffice/VCL.xcs - { - $onefilename =~ s/^\s*\Q$installer::globals::separator\E//; - $longfilename = 1; - } - - my $destinationpath = $replacedir . $onefilename; - my $movepath = $destinationpath . ".orig"; - - if ( $longfilename ) # the destination directory has to be created before copying - { - my $destdir = $movepath; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$destdir); - installer::systemactions::create_directory_structure($destdir); - } - - my $copysuccess = installer::systemactions::copy_one_file($sourcepath, $movepath); - - if ( $copysuccess ) - { - # Now the file can be edited - # ToDo: How about binary patching? - - my $onefileref = installer::files::read_file($movepath); - replace_all_ziplistvariables_in_file($onefileref, $variableshashref); - installer::files::save_file($destinationpath ,$onefileref); - } - - # Saving the original source, where the file was found - $onefile->{'originalsourcepath'} = $onefile->{'sourcepath'}; - - # Writing the new sourcepath into the hashref, even if it was no copied - - $onefile->{'sourcepath'} = $destinationpath; - } - } - - my $infoline = "\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -1; diff --git a/solenv/bin/modules/installer/scriptitems.pm b/solenv/bin/modules/installer/scriptitems.pm deleted file mode 100644 index d627622cc..000000000 --- a/solenv/bin/modules/installer/scriptitems.pm +++ /dev/null @@ -1,2960 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::scriptitems; - -use installer::converter; -use installer::existence; -use installer::exiter; -use installer::globals; -use installer::languages; -use installer::logger; -use installer::pathanalyzer; -use installer::remover; -use installer::systemactions; - -################################################################ -# Resolving the GID for the directories defined in setup script -################################################################ - -sub resolve_all_directory_names -{ - my ($directoryarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::resolve_all_directory_names : $#{$directoryarrayref}"); } - - # After this procedure the hash shall contain the complete language - # dependent path, not only the language dependent HostName. - - my ($key, $value, $parentvalue, $parentgid, $parentdirectoryhashref); - - for ( my $i = 0; $i <= $#{$directoryarrayref}; $i++ ) - { - my $directoryhashref = ${$directoryarrayref}[$i]; - my $gid = $directoryhashref-> {'gid'}; - my $parentid = $directoryhashref-> {'ParentID'}; - - if ( $parentid ne "PREDEFINED_PROGDIR" ) - { - # find the array of the parentid, which has to be defined before in setup script - # and is therefore listed before in this array - - for ( my $j = 0; $j <= $i; $j++ ) - { - $parentdirectoryhashref = ${$directoryarrayref}[$j]; - $parentgid = $parentdirectoryhashref->{'gid'}; - - if ( $parentid eq $parentgid) - { - last; - } - } - - # and now we can put the path together - # But take care of the languages! - - my $dirismultilingual = $directoryhashref->{'ismultilingual'}; - my $parentismultilingual = $parentdirectoryhashref->{'ismultilingual'}; - - # First: Both directories are language independent or both directories are language dependent - - if ((( ! $dirismultilingual ) && ( ! $parentismultilingual )) || - (( $dirismultilingual ) && ( $parentismultilingual ))) - { - foreach $key (keys %{$directoryhashref}) - { - # the key ("HostName (en-US)") must be usable for both hashes - - if ( $key =~ /\bHostName\b/ ) - { - $parentvalue = ""; - $value = $directoryhashref->{$key}; - if ( $parentdirectoryhashref->{$key} ) { $parentvalue = $parentdirectoryhashref->{$key}; } - - # It is possible, that in scp project, a directory is defined in more languages than - # the directory parent (happened after automatic generation of macros.inc). - # Therefore this is checked now and written with a warning into the logfile. - # This is no error, because (in most cases) the concerned language is not build. - - if ($parentvalue eq "") - { - $directoryhashref->{$key} = "FAILURE"; - my $infoline = "WARNING: No hostname for $parentid with \"$key\". Needed by child directory $gid !\n"; - push( @installer::globals::globallogfileinfo, $infoline); - } - else - { - $directoryhashref->{$key} = $parentvalue . $installer::globals::separator . $value; - } - } - } - } - - # Second: The directory is language dependent, the parent not - - if (( $dirismultilingual ) && ( ! $parentismultilingual )) - { - $parentvalue = $parentdirectoryhashref->{'HostName'}; # there is only one - - foreach $key (keys %{$directoryhashref}) # the current directory - { - if ( $key =~ /\bHostName\b/ ) - { - $value = $directoryhashref->{$key}; - $directoryhashref->{$key} = $parentvalue . $installer::globals::separator . $value; - } - } - } - - # Third: The directory is not language dependent, the parent is language dependent - - if (( ! $dirismultilingual ) && ( $parentismultilingual )) - { - $value = $directoryhashref->{'HostName'}; # there is only one - delete($directoryhashref->{'HostName'}); - - foreach $key (keys %{$parentdirectoryhashref}) # the parent directory - { - if ( $key =~ /\bHostName\b/ ) - { - $parentvalue = $parentdirectoryhashref->{$key}; # there is only one - $directoryhashref->{$key} = $parentvalue . $installer::globals::separator . $value; - } - } - - $directoryhashref->{'ismultilingual'} = 1; # now this directory is also language dependent - } - } - } -} - -############################################################################# -# Files with flag DELETE_ONLY do not need to be packed into installation set -############################################################################# - -sub remove_delete_only_files_from_productlists -{ - my ($productarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_delete_only_files_from_productlists : $#{$productarrayref}"); } - - my @newitems = (); - - for ( my $i = 0; $i <= $#{$productarrayref}; $i++ ) - { - my $oneitem = ${$productarrayref}[$i]; - my $styles = ""; - - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - - if (!($styles =~ /\bDELETE_ONLY\b/)) - { - push(@newitems, $oneitem); - } - } - - return \@newitems; -} - -############################################################################# -# Files with flag NOT_IN_SUITE do not need to be packed into -# Suite installation sets -############################################################################# - -sub remove_notinsuite_files_from_productlists -{ - my ($productarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_notinsuite_files_from_productlists : $#{$productarrayref}"); } - - my @newitems = (); - - for ( my $i = 0; $i <= $#{$productarrayref}; $i++ ) - { - my $oneitem = ${$productarrayref}[$i]; - my $styles = ""; - - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - - if (!($styles =~ /\bNOT_IN_SUITE\b/)) - { - push(@newitems, $oneitem); - } - else - { - my $infoline = "INFO: Flag NOT_IN_SUITE \-\> Removing $oneitem->{'gid'} from file list.\n"; - push( @installer::globals::globallogfileinfo, $infoline); - } - } - - return \@newitems; -} - -############################################################################# -# Files with flag NOT_IN_SUITE do not need to be packed into -# Suite installation sets -############################################################################# - -sub remove_office_start_language_files -{ - my ($productarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_notinsuite_files_from_productlists : $#{$productarrayref}"); } - - my @newitems = (); - - for ( my $i = 0; $i <= $#{$productarrayref}; $i++ ) - { - my $oneitem = ${$productarrayref}[$i]; - my $styles = ""; - - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - - if (!($styles =~ /\bSET_OFFICE_LANGUAGE\b/)) - { - push(@newitems, $oneitem); - } - else - { - my $infoline = "INFO: Flag SET_OFFICE_LANGUAGE \-\> Removing $oneitem->{'gid'} from file list.\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - return \@newitems; -} - -############################################################################# -# Registryitems for Uninstall have to be removed -############################################################################# - -sub remove_uninstall_regitems_from_script -{ - my ($registryarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_uninstall_regitems_from_script : $#{$registryarrayref}"); } - - my @newitems = (); - - for ( my $i = 0; $i <= $#{$registryarrayref}; $i++ ) - { - my $oneitem = ${$registryarrayref}[$i]; - my $subkey = ""; - - if ( $oneitem->{'Subkey'} ) { $subkey = $oneitem->{'Subkey'}; } - - if ( $subkey =~ /Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall/ ) { next; } - - push(@newitems, $oneitem); - } - - return \@newitems; -} - -############################################################################## -# Searching the language module for a specified language -############################################################################## - -sub get_languagespecific_module -{ - my ( $lang, $modulestring ) = @_; - - my $langmodulestring = ""; - - my $module; - foreach $module ( keys %installer::globals::alllangmodules ) - { - if (( $installer::globals::alllangmodules{$module} eq $lang ) && ( $modulestring =~ /\b$module\b/ )) - { - $langmodulestring = "$langmodulestring,$module"; - } - } - - $langmodulestring =~ s/^\s*,//; - - if ( $langmodulestring eq "" ) { installer::exiter::exit_program("ERROR: No language pack module found for language $lang in string \"$modulestring\"!", "get_languagespecific_module"); } - - return $langmodulestring; -} - -############################################################################## -# Removing all items in product lists which do not have the correct languages -############################################################################## - -sub resolving_all_languages_in_productlists -{ - my ($productarrayref, $languagesarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::resolving_all_languages_in_productlists : $#{$productarrayref} : $#{$languagesarrayref}"); } - - my @itemsinalllanguages = (); - - my ($key, $value); - - for ( my $i = 0; $i <= $#{$productarrayref}; $i++ ) - { - my $oneitem = ${$productarrayref}[$i]; - - my $ismultilingual = $oneitem->{'ismultilingual'}; - - if (!($ismultilingual)) # nothing to do with single language items - { - $oneitem->{'specificlanguage'} = ""; - push(@itemsinalllanguages, $oneitem); - } - else #all language dependent files - { - for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ ) # iterating over all languages - { - my $onelanguage = ${$languagesarrayref}[$j]; - - my %oneitemhash = (); - - foreach $key (keys %{$oneitem}) - { - if ( $key =~ /\(\S+\)/ ) # this are the language dependent keys - { - if ( $key =~ /\(\Q$onelanguage\E\)/ ) - { - $value = $oneitem->{$key}; - $oneitemhash{$key} = $value; - } - } - else - { - $value = $oneitem->{$key}; - $oneitemhash{$key} = $value; - } - } - - $oneitemhash{'specificlanguage'} = $onelanguage; - - if ( $oneitemhash{'haslanguagemodule'} ) - { - my $langmodulestring = get_languagespecific_module($onelanguage, $oneitemhash{'modules'}); - $oneitemhash{'modules'} = $langmodulestring; - } - - push(@itemsinalllanguages, \%oneitemhash); - } - } - } - - return \@itemsinalllanguages; -} - -################################################################################ -# Removing all modules, that have the flag LANGUAGEMODULE, but do not -# have the correct language -################################################################################ - -sub remove_not_required_language_modules -{ - my ($modulesarrayref, $languagesarrayref) = @_; - - my @allmodules = (); - - for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ ) - { - my $module = ${$modulesarrayref}[$i]; - my $styles = ""; - if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; } - - if ( $styles =~ /\bLANGUAGEMODULE\b/ ) - { - if ( ! exists($module->{'Language'}) ) { installer::exiter::exit_program("ERROR: \"$module->{'gid'}\" has flag LANGUAGEMODULE, but does not know its language!", "remove_not_required_language_modules"); } - my $modulelanguage = $module->{'Language'}; - # checking, if language is required - my $doinclude = 0; - for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ ) - { - my $onelanguage = ${$languagesarrayref}[$j]; - if ( $onelanguage eq $modulelanguage ) - { - $doinclude = 1; - last; - } - } - - if ( $doinclude ) { push(@allmodules, $module); } - } - else - { - push(@allmodules, $module); - } - } - - return \@allmodules; -} - -################################################################################ -# Removing all modules, that have a spellchecker language that is not -# required for this product (spellchecker selection). -# All required spellchecker languages are stored in -# %installer::globals::spellcheckerlanguagehash -################################################################################ - -sub remove_not_required_spellcheckerlanguage_modules -{ - my ($modulesarrayref) = @_; - - my $infoline = ""; - my @allmodules = (); - - for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ ) - { - my $module = ${$modulesarrayref}[$i]; - if ( $module->{'Spellcheckerlanguage'} ) # selecting modules with Spellcheckerlanguage - { - if ( exists($installer::globals::spellcheckerlanguagehash{$module->{'Spellcheckerlanguage'}}) ) - { - push(@allmodules, $module); - } - else - { - $infoline = "Spellchecker selection: Removing module $module->{'gid'}\n"; - push( @installer::globals::logfileinfo, $infoline); - - # Collecting all files at modules that are removed - - if ( $module->{'Files'} ) - { - if ( $module->{'Files'} =~ /^\s*\((.*?)\)\s*$/ ) - { - my $filelist = $1; - - my $filelisthash = installer::converter::convert_stringlist_into_hash(\$filelist, ","); - foreach my $onefile ( keys %{$filelisthash} ) { $installer::globals::spellcheckerfilehash{$onefile} = 1; } - } - } - } - } - else - { - push(@allmodules, $module); - } - } - - return \@allmodules; -} - -################################################################################ -# Removing all modules, that belong to a module that was removed -# in "remove_not_required_spellcheckerlanguage_modules" because of the -# spellchecker language. The files belonging to the modules are collected -# in %installer::globals::spellcheckerfilehash. -################################################################################ - -sub remove_not_required_spellcheckerlanguage_files -{ - my ($filesarrayref) = @_; - - my @filesarray = (); - my $infoline = ""; - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - if ( exists($installer::globals::spellcheckerfilehash{$onefile->{'gid'}}) ) - { - $infoline = "Spellchecker selection: Removing file $onefile->{'gid'}\n"; - push( @installer::globals::logfileinfo, $infoline); - next; - } - push(@filesarray, $onefile); - } - - return \@filesarray; -} - -################################################################################ -# Looking for directories without correct HostName -################################################################################ - -sub checking_directories_with_corrupt_hostname -{ - my ($dirsref, $languagesarrayref) = @_; - - for ( my $i = 0; $i <= $#{$dirsref}; $i++ ) - { - my $onedir = ${$dirsref}[$i]; - - my $hostname = ""; - - if ( $onedir->{'HostName'} ) { $hostname = $onedir->{'HostName'}; } - - if ( $hostname eq "" ) - { - my $langstring = ""; - for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ ) { $langstring .= ${$languagesarrayref}[$j] . " "; } - installer::exiter::exit_program("ERROR: HostName not defined for $onedir->{'gid'} for specified language. Probably you wanted to create an installation set, in a language not defined in scp2 project. You selected the following language(s): $langstring", "checking_directories_with_corrupt_hostname"); - } - - if ( $hostname eq "FAILURE" ) - { - installer::exiter::exit_program("ERROR: Could not create HostName for $onedir->{'gid'} (missing language at parent). See logfile warning for more info!", "checking_directories_with_corrupt_hostname"); - } - } -} - -################################################################################ -# Setting global properties -################################################################################ - -sub set_global_directory_hostnames -{ - my ($dirsref, $allvariables) = @_; - - for ( my $i = 0; $i <= $#{$dirsref}; $i++ ) - { - my $onedir = ${$dirsref}[$i]; - my $styles = ""; - if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; } - - if ( $styles =~ /\bOFFICEDIRECTORY\b/ ) - { - $installer::globals::officedirhostname = $onedir->{'HostName'}; - $installer::globals::officedirgid = $onedir->{'gid'}; - $allvariables->{'OFFICEDIRECTORYHOSTNAME'} = $installer::globals::officedirhostname; - } - if ( $styles =~ /\bSUNDIRECTORY\b/ ) - { - $installer::globals::sundirhostname = $onedir->{'HostName'}; - $installer::globals::sundirgid = $onedir->{'gid'}; - $allvariables->{'SUNDIRECTORYHOSTNAME'} = $installer::globals::sundirhostname; - } - } -} - -######################################################## -# Recursively defined procedure to order -# modules and directories -######################################################## - -sub get_children -{ - my ($allitems, $startparent, $newitemorder) = @_; - - for ( my $i = 0; $i <= $#{$allitems}; $i++ ) - { - my $gid = ${$allitems}[$i]->{'gid'}; - my $parent = ""; - if ( ${$allitems}[$i]->{'ParentID'} ) { $parent = ${$allitems}[$i]->{'ParentID'}; } - - if ( $parent eq $startparent ) - { - push(@{$newitemorder}, ${$allitems}[$i]); - my $parent = $gid; - get_children($allitems, $parent, $newitemorder); # recursive! - } - } -} - -################################################################################ -# Using different HostName for language packs -################################################################################ - -sub use_langpack_hostname -{ - my ($dirsref) = @_; - - for ( my $i = 0; $i <= $#{$dirsref}; $i++ ) - { - my $onedir = ${$dirsref}[$i]; - if (( $onedir->{'LangPackHostName'} ) && ( $onedir->{'LangPackHostName'} ne "" )) { $onedir->{'HostName'} = $onedir->{'LangPackHostName'}; } - } -} - -################################################################################ -# Using different HostName for language packs -################################################################################ - -sub use_patch_hostname -{ - my ($dirsref) = @_; - - for ( my $i = 0; $i <= $#{$dirsref}; $i++ ) - { - my $onedir = ${$dirsref}[$i]; - if (( $onedir->{'PatchHostName'} ) && ( $onedir->{'PatchHostName'} ne "" )) { $onedir->{'HostName'} = $onedir->{'PatchHostName'}; } - } -} - -################################################################################ -# Using different HostName for language packs -################################################################################ - -sub use_langpack_copy_scpaction -{ - my ($scpactionsref) = @_; - - for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ ) - { - my $onescpaction = ${$scpactionsref}[$i]; - if (( $onescpaction->{'LangPackCopy'} ) && ( $onescpaction->{'LangPackCopy'} ne "" )) { $onescpaction->{'Copy'} = $onescpaction->{'LangPackCopy'}; } - } -} - -################################################################################ -# Using different HostName for language packs -################################################################################ - -sub use_patch_copy_scpaction -{ - my ($scpactionsref) = @_; - - for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ ) - { - my $onescpaction = ${$scpactionsref}[$i]; - if (( $onescpaction->{'PatchCopy'} ) && ( $onescpaction->{'PatchCopy'} ne "" )) { $onescpaction->{'Copy'} = $onescpaction->{'PatchCopy'}; } - } -} - -################################################################################ -# Shifting parent directories of URE and Basis layer, so that -# these directories are located below the Brand layer. -# Style: SHIFT_BASIS_INTO_BRAND_LAYER -################################################################################ - -sub shift_basis_directory_parents -{ - my ($dirsref) = @_; - - my @alldirs = (); - my @savedirs = (); - my @shifteddirs = (); - - my $officedirgid = ""; - - for ( my $i = 0; $i <= $#{$dirsref}; $i++ ) - { - my $onedir = ${$dirsref}[$i]; - my $styles = ""; - if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; } - - if ( $styles =~ /\bOFFICEDIRECTORY\b/ ) { $officedirgid = $onedir->{'gid'}; } - } - - if ( $officedirgid ne "" ) - { - for ( my $i = 0; $i <= $#{$dirsref}; $i++ ) - { - my $onedir = ${$dirsref}[$i]; - my $styles = ""; - if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; } - - if (( $styles =~ /\bBASISDIRECTORY\b/ ) || ( $styles =~ /\bUREDIRECTORY\b/ )) - { - $onedir->{'ParentID'} = $officedirgid; - } - } - - # Sorting directories - my $startgid = "PREDEFINED_PROGDIR"; - get_children($dirsref, $startgid, \@alldirs); - } - - return \@alldirs; -} - -################################################################################ -# Setting the name of the directory with style OFFICEDIRECTORY. -# The name can be defined in property OFFICEDIRECTORYNAME. -################################################################################ - -sub set_officedirectory_name -{ - my ($dirsref, $officedirname) = @_; - - for ( my $i = 0; $i <= $#{$dirsref}; $i++ ) - { - my $onedir = ${$dirsref}[$i]; - my $styles = ""; - if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; } - if ( $styles =~ /\bOFFICEDIRECTORY\b/ ) - { - $onedir->{'HostName'} = $officedirname; - last; - } - } -} - -################################################################################ -# Simplifying the name for language dependent items from "Name (xy)" to "Name" -################################################################################ - -sub changing_name_of_language_dependent_keys -{ - my ($itemsarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::changing_name_of_language_dependent_keys : $#{$itemsarrayref}"); } - - # Changing key for multilingual items from "Name ( )" to "Name" or "HostName ( )" to "HostName" - - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - my $onelanguage = $oneitem->{'specificlanguage'}; - - if (!($onelanguage eq "" )) # language dependent item - { - my $itemkey; - - foreach $itemkey (keys %{$oneitem}) - { - if ( $itemkey =~ /^\s*(\S+?)\s+\(\S+\)\s*$/ ) - { - my $newitemkey = $1; - my $itemvalue = $oneitem->{$itemkey}; - $oneitem->{$newitemkey} = $itemvalue; - delete($oneitem->{$itemkey}); - } - } - } - } -} - -################################################################################ -# Collecting language specific names for language packs -################################################################################ - -sub collect_language_specific_names -{ - my ($itemsarrayref) = @_; - - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - - if ( $styles =~ /\bUSELANGUAGENAME\b/ ) - { - my $language = ""; - if ( $oneitem->{'Language'} ) { $language = $oneitem->{'Language'}; } - my $specificlanguage = ""; - if ( $oneitem->{'specificlanguage'} ) { $specificlanguage = $oneitem->{'specificlanguage'}; } - - if (( $language ne "" ) && ( $language eq $specificlanguage )) - { - if (! installer::existence::exists_in_array($oneitem->{'Name'}, \@installer::globals::languagenames )) - { - push(@installer::globals::languagenames, $oneitem->{'Name'}); - } - } - } - } -} - -################################################################################ -# Replacement of setup variables in ConfigurationItems and ProfileItems -# <productkey>, <buildid>, <sequence_languages>, <productcode>, <upgradecode>, <productupdate> -################################################################################ - -sub replace_setup_variables -{ - my ($itemsarrayref, $languagestringref, $hashref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::replace_setup_variables : $#{$itemsarrayref} : $$languagestringref : $hashref->{'PRODUCTNAME'}"); } - - my $languagesstring = $$languagestringref; - $languagesstring =~ s/\_/ /g; # replacing underscore with whitespace - # $languagesstring is "01 49" instead of "en-US de" - installer::languages::fake_languagesstring(\$languagesstring); - - my $productname = $hashref->{'PRODUCTNAME'}; - my $productversion = $hashref->{'PRODUCTVERSION'}; - my $userdirproductversion = ""; - if ( $hashref->{'USERDIRPRODUCTVERSION'} ) { $userdirproductversion = $hashref->{'USERDIRPRODUCTVERSION'}; } - my $productkey = $productname . " " . $productversion; - - # string $buildid, which is used to replace the setup variable <buildid> - - my $localminor = "flat"; - if ( $installer::globals::minor ne "" ) { $localminor = $installer::globals::minor; } - else { $localminor = $installer::globals::lastminor; } - - my $localbuild = $installer::globals::build; - - if ( $localbuild =~ /^\s*(\w+?)(\d+)\s*$/ ) { $localbuild = $2; } # using "680" instead of "src680" - - my $buildidstring = `$ENV{'SRC_ROOT'}/g -s log -n 1 --pretty=format:%h-`; - if (!$buildidstring) { - $buildidstring = $localbuild . $localminor . "(Build:" . $installer::globals::buildid . ")"; - } - else { - $buildidstring = substr($buildidstring, 0, -1); - } - - if ( $localminor =~ /^\s*\w(\d+)\w*\s*$/ ) { $localminor = $1; } - - my $updateid = $productname . "_" . $userdirproductversion . "_" . $$languagestringref; - $updateid =~ s/ /_/g; - - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - my $value = $oneitem->{'Value'}; - - $value =~ s/\<buildid\>/$buildidstring/; - $value =~ s/\<sequence_languages\>/$languagesstring/; - $value =~ s/\<productkey\>/$productkey/; - $value =~ s/\<productcode\>/$installer::globals::productcode/; - $value =~ s/\<upgradecode\>/$installer::globals::upgradecode/; - $value =~ s/\<alllanguages\>/$languagesstring/; - $value =~ s/\<productmajor\>/$localbuild/; - $value =~ s/\<productminor\>/$localminor/; - $value =~ s/\<productbuildid\>/$installer::globals::buildid/; - $value =~ s/\<sourceid\>/$installer::globals::build/; - $value =~ s/\<updateid\>/$updateid/; - $value =~ s/\<pkgformat\>/$installer::globals::packageformat/; - $value =~ s/\<vendor\>/$ENV{'OOO_VENDOR'}/; - $value =~ s/\<buildversion\>/$ENV{'BUILD_VER_STRING'}/; - - $oneitem->{'Value'} = $value; - } -} - -################################################################################ -# By defining variable LOCALUSERDIR in *.lst it is possible to change -# the standard destination of user directory defined in scp2 ($SYSUSERCONFIG). -################################################################################ - -sub replace_userdir_variable -{ - my ($itemsarrayref) = @_; - - my $userdir = ""; - if ( $allvariableshashref->{'LOCALUSERDIR'} ) { $userdir = $allvariableshashref->{'LOCALUSERDIR'}; } - else { $userdir = $installer::globals::simpledefaultuserdir; } - - if ( $userdir ne "" ) - { - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - $oneitem->{'Value'} =~ s/\$SYSUSERCONFIG/$userdir/; - } - } -} - -##################################################################################### -# Files and ConfigurationItems are not included for all languages. -# For instance asian fonts. These can be removed, if no "Name" is found. -# ConfigurationItems are not always defined in the linguistic configuration file. -# The "Key" cannot be found for them. -##################################################################################### - -sub remove_non_existent_languages_in_productlists -{ - my ($itemsarrayref, $languagestringref, $searchkey, $itemtype) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_non_existent_languages_in_productlists : $#{$itemsarrayref} : $$languagestringref : $searchkey : $itemtype"); } - - # Removing of all non existent files, for instance asian fonts - - installer::logger::include_header_into_logfile("Removing for this language $$languagestringref:"); - - my @allexistentitems = (); - - my $infoline; - - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - my $oneitemname = ""; # $searchkey is "Name" for files and "Key" for ConfigurationItems - - if ( $oneitem->{$searchkey} ) { $oneitemname = $oneitem->{$searchkey} } - - my $itemtoberemoved = 0; - - if ($oneitemname eq "") # for instance asian font in english installation set - { - $itemtoberemoved = 1; - } - - if ($itemtoberemoved) - { - $infoline = "WARNING: Language $$languagestringref: No $itemtype packed for $oneitem->{'gid'}!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - push(@allexistentitems, $oneitem); - } - } - - $infoline = "\n"; - push( @installer::globals::logfileinfo, $infoline); - - return \@allexistentitems; -} - -######################################################################## -# Input is the directory gid, output the "HostName" of the directory -######################################################################## - -sub get_Directoryname_From_Directorygid -{ - my ($dirsarrayref ,$searchgid, $onelanguage, $oneitemgid) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_Directoryname_From_Directorygid : $#{$dirsarrayref} : $searchgid : $onelanguage"); } - - my $directoryname = ""; - my $onedirectory; - my $foundgid = 0; - - for ( my $i = 0; $i <= $#{$dirsarrayref}; $i++ ) - { - $onedirectory = ${$dirsarrayref}[$i]; - my $directorygid = $onedirectory->{'gid'}; - - if ($directorygid eq $searchgid) - { - $foundgid = 1; - last; - } - } - - if (!($foundgid)) - { - installer::exiter::exit_program("ERROR: Gid $searchgid not defined in $installer::globals::setupscriptname", "get_Directoryname_From_Directorygid"); - } - - if ( ! ( $onedirectory->{'ismultilingual'} )) # the directory is not language dependent - { - $directoryname = $onedirectory->{'HostName'}; - } - else - { - $directoryname = $onedirectory->{"HostName ($onelanguage)"}; - } - - # gid_Dir_Template_Wizard_Letter is defined as language dependent directory, but the file gid_Dir_Template_Wizard_Letter - # is not language dependent. Therefore $onelanguage is not defined. But which language is the correct language for the - # directory? - # Perhaps better solution: In scp it must be forbidden to have a language independent file in a language dependent directory. - - if (( ! $directoryname ) && ( $onelanguage eq "" )) - { - installer::exiter::exit_program("ERROR (in scp): Directory $searchgid is language dependent, but not $oneitemgid inside this directory", "get_Directoryname_From_Directorygid"); - } - - return \$directoryname; -} - -################################################################## -# Getting destination direcotory for links, files and profiles -################################################################## - -sub get_Destination_Directory_For_Item_From_Directorylist # this is used for Files, Profiles and Links -{ - my ($itemarrayref, $dirsarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist : $#{$itemarrayref} : $#{$dirsarrayref}"); } - - for ( my $i = 0; $i <= $#{$itemarrayref}; $i++ ) - { - my $oneitem = ${$itemarrayref}[$i]; - my $oneitemgid = $oneitem->{'gid'}; - my $directorygid = $oneitem->{'Dir'}; # for instance gid_Dir_Program - my $netdirectorygid = ""; - my $onelanguage = $oneitem->{'specificlanguage'}; - my $ispredefinedprogdir = 0; - my $ispredefinedconfigdir = 0; - - my $oneitemname = $oneitem->{'Name'}; - - if ( $oneitem->{'NetDir'} ) { $netdirectorygid = $oneitem->{'NetDir'}; } - - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$oneitemname); # making /registry/schema/org/openoffice/VCL.xcs to VCL.xcs - - my $searchdirgid; - - if ( $netdirectorygid eq "" ) # if NetDir is defined, it is privileged - { - $searchdirgid = $directorygid - } - else - { - $searchdirgid = $netdirectorygid - } - - if ($searchdirgid =~ /PREDEFINED_PROGDIR/) # the root directory is not defined in setup script - { - $ispredefinedprogdir = 1; - } - - if ($searchdirgid =~ /PREDEFINED_CONFIGDIR/) # the root directory is not defined in setup script - { - $ispredefinedconfigdir = 1; - } - - my $destfilename; - - if ((!( $ispredefinedprogdir )) && (!( $ispredefinedconfigdir ))) - { - my $directorynameref = get_Directoryname_From_Directorygid($dirsarrayref, $searchdirgid, $onelanguage, $oneitemgid); - $destfilename = $$directorynameref . $installer::globals::separator . $oneitemname; - } - else - { - $destfilename = $oneitemname; - } - - $oneitem->{'destination'} = $destfilename; - } -} - -########################################################################## -# Searching a file in a list of pathes -########################################################################## - -sub get_sourcepath_from_filename_and_includepath_classic -{ - my ($searchfilenameref, $includepatharrayref, $write_logfile) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic : $$searchfilenameref : $#{$includepatharrayref} : $write_logfile"); } - - my ($onefile, $includepath, $infoline); - - my $foundsourcefile = 0; - - for ( my $j = 0; $j <= $#{$includepatharrayref}; $j++ ) - { - $includepath = ${$includepatharrayref}[$j]; - installer::remover::remove_leading_and_ending_whitespaces(\$includepath); - - $onefile = $includepath . $installer::globals::separator . $$searchfilenameref; - - if ( -f $onefile ) - { - $foundsourcefile = 1; - last; - } - } - - if (!($foundsourcefile)) - { - $onefile = ""; # the sourcepath has to be empty - if ( $write_logfile) - { - if ( $ENV{'DEFAULT_TO_ENGLISH_FOR_PACKING'} ) - { - $infoline = "WARNING: Source for $$searchfilenameref not found!\n"; # Important message in log file - } - else - { - $infoline = "ERROR: Source for $$searchfilenameref not found!\n"; # Important message in log file - } - - push( @installer::globals::logfileinfo, $infoline); - } - } - else - { - if ( $write_logfile) - { - $infoline = "SUCCESS: Source for $$searchfilenameref: $onefile\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - return \$onefile; -} - -########################################################################## -# Input is one file name, output the complete absolute path of this file -########################################################################## - -sub get_sourcepath_from_filename_and_includepath -{ - my ($searchfilenameref, $unused, $write_logfile) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_sourcepath_from_filename_and_includepath : $$searchfilenameref : $#{$includepatharrayref} : $write_logfile"); } - - my ($onefile, $includepath, $infoline); - - my $foundsourcefile = 0; - my $foundnewname = 0; - - for ( my $j = 0; $j <= $#installer::globals::allincludepathes; $j++ ) - { - my $allfiles = $installer::globals::allincludepathes[$j]; - - if ( exists( $allfiles->{$$searchfilenameref} )) - { - $onefile = $allfiles->{'includepath'} . $installer::globals::separator . $$searchfilenameref; - $foundsourcefile = 1; - last; - } - } - - if (!($foundsourcefile)) # testing with lowercase filename - { - # Attention: README01.html is copied for Windows to readme01.html, not case sensitive - - for ( my $j = 0; $j <= $#installer::globals::allincludepathes; $j++ ) - { - my $allfiles = $installer::globals::allincludepathes[$j]; - - my $newfilename = $$searchfilenameref; - $newfilename =~ s/readme/README/; # special handling for readme files - $newfilename =~ s/license/LICENSE/; # special handling for license files - - if ( exists( $allfiles->{$newfilename} )) - { - $onefile = $allfiles->{'includepath'} . $installer::globals::separator . $newfilename; - $foundsourcefile = 1; - $foundnewname = 1; - last; - } - } - } - - if (!($foundsourcefile)) - { - $onefile = ""; # the sourcepath has to be empty - if ( $write_logfile) - { - if ( $ENV{'DEFAULT_TO_ENGLISH_FOR_PACKING'} ) - { - $infoline = "WARNING: Source for $$searchfilenameref not found!\n"; # Important message in log file - } - else - { - $infoline = "ERROR: Source for $$searchfilenameref not found!\n"; # Important message in log file - } - - push( @installer::globals::logfileinfo, $infoline); - } - } - else - { - if ( $write_logfile) - { - if (!($foundnewname)) - { - $infoline = "SUCCESS: Source for $$searchfilenameref: $onefile\n"; - } - else - { - $infoline = "SUCCESS/WARNING: Special handling for $$searchfilenameref: $onefile\n"; - } - push( @installer::globals::logfileinfo, $infoline); - } - } - - return \$onefile; -} - -############################################################## -# Determining, whether a specified directory is language -# dependent -############################################################## - -sub determine_directory_language_dependency -{ - my($directorygid, $dirsref) = @_; - - my $is_multilingual = 0; - - for ( my $i = 0; $i <= $#{$dirsref}; $i++ ) - { - my $onedir = ${$dirsref}[$i]; - my $gid = $onedir->{'gid'}; - - if ( $gid eq $directorygid ) - { - $is_multilingual = $onedir->{'ismultilingual'}; - last; - } - } - - return $is_multilingual; -} - -############################################################## -# Getting all source pathes for all files to be packed -# $item can be "Files" or "ScpActions" -############################################################## - -sub get_Source_Directory_For_Files_From_Includepathlist -{ - my ($filesarrayref, $includepatharrayref, $dirsref, $item) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_Source_Directory_For_Files_From_Includepathlist : $#{$filesarrayref} : $#{$includepatharrayref} : $item"); } - - installer::logger::include_header_into_logfile("$item:"); - - my $infoline = ""; - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - my $onelanguage = $onefile->{'specificlanguage'}; - - if ( ! $onefile->{'Name'} ) { installer::exiter::exit_program("ERROR: $item without name ! GID: $onefile->{'gid'} ! Language: $onelanguage", "get_Source_Directory_For_Files_From_Includepathlist"); } - - my $onefilename = $onefile->{'Name'}; - if ( $item eq "ScpActions" ) { $onefilename =~ s/\//$installer::globals::separator/g; } - $onefilename =~ s/^\s*\Q$installer::globals::separator\E//; # filename begins with a slash, for instance /registry/schema/org/openoffice/VCL.xcs - - my $styles = ""; - my $file_can_miss = 0; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - if ( $styles =~ /\bFILE_CAN_MISS\b/ ) { $file_can_miss = 1; } - - if (( $installer::globals::languagepack ) && ( ! $onefile->{'ismultilingual'} ) && ( ! ( $styles =~ /\bFORCELANGUAGEPACK\b/ ))) { $file_can_miss = 1; } - if (( $installer::globals::helppack ) && ( ! $onefile->{'ismultilingual'} ) && ( ! ( $styles =~ /\bFORCEHELPPACK\b/ ))) { $file_can_miss = 1; } - - my $sourcepathref = ""; - - if ( $file_can_miss ) { $sourcepathref = get_sourcepath_from_filename_and_includepath(\$onefilename, $includepatharrayref, 0); } - else { $sourcepathref = get_sourcepath_from_filename_and_includepath(\$onefilename, $includepatharrayref, 1); } - - $onefile->{'sourcepath'} = $$sourcepathref; # This $$sourcepathref is empty, if no source was found - - # defaulting to english for multilingual files if DEFAULT_TO_ENGLISH_FOR_PACKING is set - - if ( $ENV{'DEFAULT_TO_ENGLISH_FOR_PACKING'} ) - { - if (( ! $onefile->{'sourcepath'} ) && ( $onefile->{'ismultilingual'} )) - { - my $oldname = $onefile->{'Name'}; - my $oldlanguage = $onefile->{'specificlanguage'}; - my $newlanguage = "en-US"; - $onefilename = $onefile->{'Name'}; - $onefilename =~ s/$oldlanguage\./$newlanguage\./; # Example: tplwizfax_it.zip -> tplwizfax_en-US.zip - $onefilename =~ s/^\s*\Q$installer::globals::separator\E//; # filename begins with a slash, for instance /registry/schema/org/openoffice/VCL.xcs - $sourcepathref = get_sourcepath_from_filename_and_includepath(\$onefilename, $includepatharrayref, 1); - $onefile->{'sourcepath'} = $$sourcepathref; # This $$sourcepathref is empty, if no source was found - - if ($onefile->{'sourcepath'}) # defaulting to english was successful - { - $infoline = "WARNING: Using $onefilename instead of $oldname\n"; - push( @installer::globals::logfileinfo, $infoline); - print " $infoline"; - - # If the directory, in which the new file is installed, is not language dependent, - # the filename has to be changed to avoid installation conflicts - # No mechanism for resource files! - # -> implementing for the content of ARCHIVE files - - if ( $onefile->{'Styles'} =~ /\bARCHIVE\b/ ) - { - my $directorygid = $onefile->{'Dir'}; - my $islanguagedependent = determine_directory_language_dependency($directorygid, $dirsref); - - if ( ! $islanguagedependent ) - { - $onefile->{'Styles'} =~ s/\bARCHIVE\b/ARCHIVE, RENAME_TO_LANGUAGE/; # Setting new flag RENAME_TO_LANGUAGE - $infoline = "Setting flag RENAME_TO_LANGUAGE: File $onefile->{'Name'} in directory: $directorygid\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - } - else - { - $infoline = "WARNING: Using $onefile->{'Name'} instead of $oldname was not successful\n"; - push( @installer::globals::logfileinfo, $infoline); - $onefile->{'Name'} = $oldname; # Switching back to old file name - } - } - } - } - - $infoline = "\n"; # empty line after listing of all files - push( @installer::globals::logfileinfo, $infoline); -} - -################################################################################# -# Removing files, that shall not be included into languagepacks -# (because of rpm conflicts) -################################################################################# - -sub remove_Files_For_Languagepacks -{ - my ($itemsarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_Files_For_Languagepacks : $#{$filesarrayref}"); } - - my $infoline; - - my @newitemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - my $gid = $oneitem->{'gid'}; - - # scp Todo: Remove asap after removal of old setup - - if (( $gid eq "gid_File_Extra_Fontunxpsprint" ) || - ( $gid eq "gid_File_Extra_Migration_Lang" )) - { - $infoline = "ATTENTION: Removing item $oneitem->{'gid'} from the installation set.\n"; - push( @installer::globals::logfileinfo, $infoline); - - next; - } - - push(@newitemsarray, $oneitem); - } - - return \@newitemsarray; -} - -################################################################################# -# Files, whose source directory is not found, are removed now (this is an ERROR) -################################################################################# - -sub remove_Files_Without_Sourcedirectory -{ - my ($filesarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_Files_Without_Sourcedirectory : $#{$filesarrayref}"); } - - my $infoline; - - my $error_occurred = 0; - my @missingfiles = (); - push(@missingfiles, "ERROR: The following files could not be found: \n"); - - my @newfilesarray = (); - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - my $sourcepath = $onefile->{'sourcepath'}; - - if ($sourcepath eq "") - { - my $styles = $onefile->{'Styles'}; - my $filename = $onefile->{'Name'}; - - if ( ! $installer::globals::languagepack && !$installer::globals::helppack) - { - $infoline = "ERROR: Removing file $filename from file list.\n"; - push( @installer::globals::logfileinfo, $infoline); - - push(@missingfiles, "ERROR: File not found: $filename\n"); - $error_occurred = 1; - - next; # removing this file from list, if sourcepath is empty - } - elsif ( $installer::globals::languagepack ) # special case for language packs - { - if (( $onefile->{'ismultilingual'} ) || ( $styles =~ /\bFORCELANGUAGEPACK\b/ )) - { - $infoline = "ERROR: Removing file $filename from file list.\n"; - push( @installer::globals::logfileinfo, $infoline); - - push(@missingfiles, "ERROR: File not found: $filename\n"); - $error_occurred = 1; - - next; # removing this file from list, if sourcepath is empty - } - else - { - $infoline = "INFO: Removing file $filename from file list. It is not language dependent.\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "INFO: It is not language dependent and can be ignored in language packs.\n"; - push( @installer::globals::logfileinfo, $infoline); - - next; # removing this file from list, if sourcepath is empty - } - } - else # special case for help packs - { - if (( $onefile->{'ismultilingual'} ) || ( $styles =~ /\bFORCEHELPPACK\b/ )) - { - $infoline = "ERROR: Removing file $filename from file list.\n"; - push( @installer::globals::logfileinfo, $infoline); - - push(@missingfiles, "ERROR: File not found: $filename\n"); - $error_occured = 1; - - next; # removing this file from list, if sourcepath is empty - } - else - { - $infoline = "INFO: Removing file $filename from file list. It is not language dependent.\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "INFO: It is not language dependent and can be ignored in help packs.\n"; - push( @installer::globals::logfileinfo, $infoline); - - next; # removing this file from list, if sourcepath is empty - } - } - } - - push(@newfilesarray, $onefile); - } - - $infoline = "\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( $error_occurred ) - { - for ( my $i = 0; $i <= $#missingfiles; $i++ ) { print "$missingfiles[$i]"; } - installer::exiter::exit_program("ERROR: Missing files", "remove_Files_Without_Sourcedirectory"); - } - - return \@newfilesarray; -} - -############################################################################ -# License and Readme files in the default language have to be installed -# in the directory with flag OFFICEDIRECTORY. If this is not defined -# they have to be installed in the installation root. -############################################################################ - -sub get_office_directory_gid_and_hostname -{ - my ($dirsarrayref) = @_; - - my $foundofficedir = 0; - my $gid = ""; - my $hostname = ""; - - for ( my $i = 0; $i <= $#{$dirsarrayref}; $i++ ) - { - my $onedir = ${$dirsarrayref}[$i]; - if ( $onedir->{'Styles'} ) - { - my $styles = $onedir->{'Styles'}; - - if ( $styles =~ /\bOFFICEDIRECTORY\b/ ) - { - $foundofficedir = 1; - $gid = $onedir->{'gid'}; - $hostname = $onedir->{'HostName'}; - last; - } - } - } - - return ($foundofficedir, $gid, $hostname); -} - -############################################################################ -# License and Readme files in the default language have to be installed -# in the installation root (next to the program dir). This is in scp -# project done by a post install basic script -############################################################################ - -sub add_License_Files_into_Installdir -{ - my ($filesarrayref, $dirsarrayref, $languagesarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::add_License_Files_into_Installdir : $#{$filesarrayref} : $#{$languagesarrayref}"); } - - my $infoline; - - my @newfilesarray = (); - - my $defaultlanguage = installer::languages::get_default_language($languagesarrayref); - - my ($foundofficedir, $officedirectorygid, $officedirectoryhostname) = get_office_directory_gid_and_hostname($dirsarrayref); - - # copy all files from directory share/readme, that contain the default language in their name - # without default language into the installation root. This makes the settings of the correct - # file names superfluous. On the other hand this requires a dependency to the directory - # share/readme - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - my $destination = $onefile->{'destination'}; - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - - if ( ( $destination =~ /share\Q$installer::globals::separator\Ereadme\Q$installer::globals::separator\E(\w+?)_?$defaultlanguage\.?(\w*)\s*/ ) - || (( $styles =~ /\bROOTLICENSEFILE\b/ ) && ( $destination =~ /\Q$installer::globals::separator\E?(\w+?)_?$defaultlanguage\.?(\w*?)\s*$/ )) ) - { - my $filename = $1; - my $extension = $2; - - my $newfilename; - - if ( $extension eq "" ) { $newfilename = $filename; } - else { $newfilename = $filename . "\." . $extension; } - - my %newfile = (); - my $newfile = \%newfile; - - installer::converter::copy_item_object($onefile, $newfile); - - $newfile->{'gid'} = $onefile->{'gid'} . "_Copy"; - $newfile->{'Name'} = $newfilename; - $newfile->{'ismultilingual'} = "0"; - $newfile->{'specificlanguage'} = ""; - $newfile->{'haslanguagemodule'} = "0"; - - if ( defined $newfile->{'InstallName'} ) - { - if ( $newfile->{'InstallName'} =~ /^\s*(.*?)_$defaultlanguage\.?(\w*?)\s*$/ ) - { - my $localfilename = $1; - my $localextension = $2; - - if ( $localextension eq "" ) { $newfile->{'InstallName'} = $localfilename; } - else { $newfile->{'InstallName'} = $localfilename . "\." . $localextension; } - } - } - - $newfile->{'removelangfromfile'} = "1"; # Important for files with an InstallName, because language also has to be removed there. - - if ( $foundofficedir ) - { - $newfile->{'Dir'} = $officedirectorygid; - $newfile->{'destination'} = $officedirectoryhostname . $installer::globals::separator . $newfilename; - } - else - { - $newfile->{'Dir'} = "PREDEFINED_PROGDIR"; - $newfile->{'destination'} = $newfilename; - } - - # Also setting "modules=gid_Module_Root_Brand" (module with style: ROOT_BRAND_PACKAGE) - if ( $installer::globals::rootbrandpackageset ) - { - $newfile->{'modules'} = $installer::globals::rootbrandpackage; - } - - push(@newfilesarray, $newfile); - - $infoline = "New files: Adding file $newfilename for the installation root to the file list. Language: $defaultlanguage\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( defined $newfile->{'InstallName'} ) - { - $infoline = "New files: Using installation name: $newfile->{'InstallName'}\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - # Collecting license and readme file for the installation set - - push(@installer::globals::installsetfiles, $newfile); - $infoline = "New files: Adding file $newfilename to the file collector for the installation set. Language: $defaultlanguage\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - push(@newfilesarray, $onefile); - } - - return \@newfilesarray; -} - -############################################################################ -# Removing files with flag ONLY_ASIA_LANGUAGE, only if no asian -# language is part of the product. -# This special files are connected to the root module and are not -# included into a language pack (would lead to conflicts!). -# But this files shall only be included into the product, if the -# product contains at least one asian language. -############################################################################ - -sub remove_onlyasialanguage_files_from_productlists -{ - my ($filesarrayref) = @_; - - my $infoline; - - my @newfilesarray = (); - my $returnfilesarrayref; - - my $containsasianlanguage = installer::languages::detect_asian_language($installer::globals::alllanguagesinproductarrayref); - - my $alllangstring = installer::converter::convert_array_to_comma_separated_string($installer::globals::alllanguagesinproductarrayref); - $infoline = "\nLanguages in complete product: $alllangstring\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( ! $containsasianlanguage ) - { - $infoline = "Product does not contain asian language -> removing files\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - if ( $styles =~ /\bONLY_ASIA_LANGUAGE\b/ ) - { - $infoline = "Flag ONLY_ASIA_LANGUAGE: Removing file $onefile->{'Name'} from files collector!\n"; - push( @installer::globals::logfileinfo, $infoline); - next; - } - - push(@newfilesarray, $onefile); - } - - $returnfilesarrayref = \@newfilesarray; - } - else - { - $returnfilesarrayref = $filesarrayref; - - $infoline = "Product contains asian language -> Nothing to do\n"; - push( @installer::globals::logfileinfo, $infoline); - - } - - return $returnfilesarrayref; -} - -############################################################################ -# Removing files with flag ONLY_WESTERN_LANGUAGE, only if no western -# language is part of the product. -# This special files are connected to the root module and are not -# included into a language pack (would lead to conflicts!). -# But this files shall only be included into the product, if the -# product contains at least one western language. -############################################################################ - -sub remove_onlywesternlanguage_files_from_productlists -{ - my ($filesarrayref) = @_; - - my $infoline; - - my @newfilesarray = (); - my $returnfilesarrayref; - - my $containswesternlanguage = installer::languages::detect_western_language($installer::globals::alllanguagesinproductarrayref); - - my $alllangstring = installer::converter::convert_array_to_comma_separated_string($installer::globals::alllanguagesinproductarrayref); - $infoline = "\nLanguages in complete product: $alllangstring\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( ! $containswesternlanguage ) - { - $infoline = "Product does not contain western language -> removing files\n"; - push( @installer::globals::logfileinfo, $infoline); - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - if ( $styles =~ /\bONLY_WESTERN_LANGUAGE\b/ ) - { - $infoline = "Flag ONLY_WESTERN_LANGUAGE: Removing file $onefile->{'Name'} from files collector!\n"; - push( @installer::globals::logfileinfo, $infoline); - next; - } - - push(@newfilesarray, $onefile); - } - - $returnfilesarrayref = \@newfilesarray; - } - else - { - $returnfilesarrayref = $filesarrayref; - - $infoline = "Product contains western language -> Nothing to do\n"; - push( @installer::globals::logfileinfo, $infoline); - - } - - return $returnfilesarrayref; -} - -############################################################################ -# Some files are included for more than one language and have the same -# name and the same destination directory for all languages. This would -# lead to conflicts, if the filenames are not changed. -# In scp project this files must have the flag MAKE_LANG_SPECIFIC -# For this files, the language is included into the filename. -############################################################################ - -sub make_filename_language_specific -{ - my ($filesarrayref) = @_; - - my $infoline = ""; - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - - if ( $onefile->{'ismultilingual'} ) - { - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - if ( $styles =~ /\bMAKE_LANG_SPECIFIC\b/ ) - { - my $language = $onefile->{'specificlanguage'}; - my $olddestination = $onefile->{'destination'}; - my $oldname = $onefile->{'Name'}; - - # Including the language into the file name. - # But be sure, to include the language before the file extension. - - my $fileextension = ""; - - if ( $onefile->{'Name'} =~ /(\.\w+?)\s*$/ ) { $fileextension = $1; } - if ( $fileextension ne "" ) - { - $onefile->{'Name'} =~ s/\Q$fileextension\E\s*$/_$language$fileextension/; - $onefile->{'destination'} =~ s/\Q$fileextension\E\s*$/_$language$fileextension/; - } - - $infoline = "Flag MAKE_LANG_SPECIFIC:\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "Changing name from $oldname to $onefile->{'Name'} !\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "Changing destination from $olddestination to $onefile->{'destination'} !\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - } -} - -############################################################################ -# Removing all scpactions, that have no name. -# See: FlatLoaderZip -############################################################################ - -sub remove_scpactions_without_name -{ - my ($itemsarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_scpactions_without_name : $#{$itemsarrayref}"); } - - my $infoline; - - my @newitemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - my $name = ""; - - if ( $oneitem->{'Name'} ) { $name = $oneitem->{'Name'}; } - - if ( $name eq "" ) - { - $infoline = "ATTENTION: Removing scpaction $oneitem->{'gid'} from the installation set.\n"; - push( @installer::globals::logfileinfo, $infoline); - next; - } - - push(@newitemsarray, $oneitem); - } - - return \@newitemsarray; -} - -############################################################################ -# Because of the item "File" the source name must be "Name". Therefore -# "Copy" is changed to "Name" and "Name" is changed to "DestinationName". -############################################################################ - -sub change_keys_of_scpactions -{ - my ($itemsarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::change_keys_of_scpactions : $#{$itemsarrayref}"); } - - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - - my $key; - - # First Name to DestinationName, then deleting Name - foreach $key (keys %{$oneitem}) - { - if ( $key =~ /\bName\b/ ) - { - my $value = $oneitem->{$key}; - my $oldkey = $key; - $key =~ s/Name/DestinationName/; - $oneitem->{$key} = $value; - delete($oneitem->{$oldkey}); - } - } - - # Second Copy to Name, then deleting Copy - foreach $key (keys %{$oneitem}) - { - if ( $key =~ /\bCopy\b/ ) - { - my $value = $oneitem->{$key}; - my $oldkey = $key; - $key =~ s/Copy/Name/; - $oneitem->{$key} = $value; - delete($oneitem->{$oldkey}); - } - } - } -} - -############################################################################ -# Removing all xpd only items from installation set (scpactions with -# the style XPD_ONLY), except an xpd installation set is created -############################################################################ - -sub remove_Xpdonly_Items -{ - my ($itemsarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_Xpdonly_Items : $#{$itemsarrayref}"); } - - my $infoline; - - my @newitemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - - if ( $styles =~ /\bXPD_ONLY\b/ ) - { - $infoline = "Removing \"xpd only\" item $oneitem->{'gid'} from the installation set.\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - next; - } - - push(@newitemsarray, $oneitem); - } - - $infoline = "\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - return \@newitemsarray; -} - -############################################################################ -# Removing all language pack files from installation set (files with -# the style LANGUAGEPACK), except this is a language pack. -############################################################################ - -sub remove_Languagepacklibraries_from_Installset -{ - my ($itemsarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_Languagepacklibraries_from_Installset : $#{$itemsarrayref}"); } - - my $infoline; - - my @newitemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - - if ( $styles =~ /\bLANGUAGEPACK\b/ ) - { - $infoline = "Removing language pack file $oneitem->{'gid'} from the installation set.\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - next; - } - - push(@newitemsarray, $oneitem); - } - - $infoline = "\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - return \@newitemsarray; -} - -############################################################################ -# Removing all help pack files from installation set (files with -# the style HELPPACK), except this is a help pack. -############################################################################ - -sub remove_Helppacklibraries_from_Installset -{ - my ($itemsarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_Helppacklibraries_from_Installset : $#{$itemsarrayref}"); } - - my $infoline; - - my @newitemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - - if ( $styles =~ /\bHELPPACK\b/ ) - { - $infoline = "Removing help pack file $oneitem->{'gid'} from the installation set.\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - next; - } - - push(@newitemsarray, $oneitem); - } - - $infoline = "\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - return \@newitemsarray; -} - -############################################################################ -# Removing all files with flag PATCH_ONLY from installation set. -# This function is not called during patch creation. -############################################################################ - -sub remove_patchonlyfiles_from_Installset -{ - my ($itemsarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_patchonlyfiles_from_Installset : $#{$itemsarrayref}"); } - - my $infoline; - - my @newitemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - - if ( $styles =~ /\bPATCH_ONLY\b/ ) - { - $infoline = "Removing file with flag PATCH_ONLY $oneitem->{'gid'} from the installation set.\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - next; - } - - push(@newitemsarray, $oneitem); - } - - $infoline = "\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - return \@newitemsarray; -} - -############################################################################ -# Removing all files with flag TAB_ONLY from installation set. -# This function is not called during tab creation. -############################################################################ - -sub remove_tabonlyfiles_from_Installset -{ - my ($itemsarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_tabonlyfiles_from_Installset : $#{$itemsarrayref}"); } - - my $infoline; - - my @newitemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - - if ( $styles =~ /\bTAB_ONLY\b/ ) - { - $infoline = "Removing tab only file $oneitem->{'gid'} from the installation set.\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - next; - } - - push(@newitemsarray, $oneitem); - } - - $infoline = "\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - return \@newitemsarray; -} - -############################################################################### -# Removing all files with flag ONLY_INSTALLED_PRODUCT from installation set. -# This function is not called for PKGFORMAT installed and archive. -############################################################################### - -sub remove_installedproductonlyfiles_from_Installset -{ - my ($itemsarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_installedproductonlyfiles_from_Installset : $#{$itemsarrayref}"); } - - my $infoline; - - my @newitemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ ) - { - my $oneitem = ${$itemsarrayref}[$i]; - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - - if ( $styles =~ /\bONLY_INSTALLED_PRODUCT\b/ ) - { - $infoline = "Removing file $oneitem->{'gid'} from the installation set. This file is only required for PKGFORMAT archive or installed).\n"; - push( @installer::globals::globallogfileinfo, $infoline); - next; - } - - push(@newitemsarray, $oneitem); - } - - $infoline = "\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - return \@newitemsarray; -} - -############################################################################ -# Some files cotain a $ in their name. epm conflicts with such files. -# Solution: Renaming this files, converting "$" to "$$" -############################################################################ - -sub quoting_illegal_filenames -{ - my ($filesarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::rename_illegal_filenames : $#{$filesarrayref}"); } - - # This function has to be removed as soon as possible! - - installer::logger::include_header_into_logfile("Renaming illegal filenames:"); - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - my $filename = $onefile->{'Name'}; - - if ( $filename =~ /\$/ ) - { - my $sourcepath = $onefile->{'sourcepath'}; - my $destpath = $onefile->{'destination'}; - - # sourcepath and destination have to be quoted for epm list file - - $destpath =~ s/\$/\$\$/g; - $sourcepath =~ s/\$/\$\$/g; - - my $infoline = "ATTENTION: Files: Quoting sourcepath $onefile->{'sourcepath'} to $sourcepath\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "ATTENTION: Files: Quoting destination path $onefile->{'destination'} to $destpath\n"; - push( @installer::globals::logfileinfo, $infoline); - - $onefile->{'sourcepath'} = $sourcepath; - $onefile->{'destination'} = $destpath; - } - } -} - -############################################################################ -# Removing multiple occurrences of same module. -############################################################################ - -sub optimize_list -{ - my ( $longlist ) = @_; - my %tmpHash; - - $longlist =~ s/^\s+//; - $longlist =~ s/\s+$//; - $longlist =~ s/\s*,\s*/,/g; - - @tmpHash{split /,/, $longlist} = (); - return join(",", sort keys %tmpHash); -} - -####################################################################### -# Collecting all directories needed for the epm list -# 1. Looking for all destination paths in the files array -# 2. Looking for directories with CREATE flag in the directory array -####################################################################### - -################################## -# Collecting directories: Part 1 -################################## - -sub collect_directories_from_filesarray -{ - my ($filesarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::collect_directories_from_filesarray : $#{$filesarrayref}"); } - - my @alldirectories = (); - my %alldirectoryhash = (); - - my $predefinedprogdir_added = 0; - - # Preparing this already as hash, although the only needed value at the moment is the HostName - # But also adding: "specificlanguage" and "Dir" (for instance gid_Dir_Program) - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - my $destinationpath = $onefile->{'destination'}; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationpath); - $destinationpath =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes or backslashes - - do - { - if (!exists($alldirectoryhash{$destinationpath})) - { - my %directoryhash = (); - $directoryhash{'HostName'} = $destinationpath; - $directoryhash{'specificlanguage'} = $onefile->{'specificlanguage'}; - $directoryhash{'Dir'} = $onefile->{'Dir'}; - $directoryhash{'modules'} = $onefile->{'modules'}; # NEW, saving modules - - $predefinedprogdir_added ||= $onefile->{'Dir'} eq "PREDEFINED_PROGDIR"; - - $alldirectoryhash{$destinationpath} = \%directoryhash; - } - else - { - # Adding the modules to the module list! - $alldirectoryhash{$destinationpath}->{'modules'} .= "," . $onefile->{'modules'}; - } - } while ($destinationpath =~ s/(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/$1/); # as long as the path contains slashes - } - - # if there is no file in the root directory PREDEFINED_PROGDIR, it has to be included into the directory array now - # HostName= specificlanguage= Dir=PREDEFINED_PROGDIR - - if (! $predefinedprogdir_added ) - { - my %directoryhash = (); - $directoryhash{'HostName'} = ""; - $directoryhash{'specificlanguage'} = ""; - $directoryhash{'modules'} = ""; # ToDo? - $directoryhash{'Dir'} = "PREDEFINED_PROGDIR"; - - push(@alldirectories, \%directoryhash); - } - - # Creating directory array - foreach my $destdir ( sort keys %alldirectoryhash ) - { - $alldirectoryhash{$destdir}->{'modules'} = optimize_list($alldirectoryhash{$destdir}->{'modules'}); - push(@alldirectories, $alldirectoryhash{$destdir}); - } - - return (\@alldirectories, \%alldirectoryhash); -} - -################################## -# Collecting directories: Part 2 -################################## - -sub collect_directories_with_create_flag_from_directoryarray -{ - my ($directoryarrayref, $alldirectoryhash) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::collect_directories_with_create_flag_from_directoryarray : $#{$directoryarrayref}"); } - - my $alreadyincluded = 0; - my @alldirectories = (); - - for ( my $i = 0; $i <= $#{$directoryarrayref}; $i++ ) - { - my $onedir = ${$directoryarrayref}[$i]; - my $styles = ""; - $newdirincluded = 0; - - if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; } - - if ( $styles =~ /\bCREATE\b/ ) - { - my $directoryname = ""; - - if ( $onedir->{'HostName'} ) { $directoryname = $onedir->{'HostName'}; } - else { installer::exiter::exit_program("ERROR: No directory name (HostName) set for specified language in gid $onedir->{'gid'}", "collect_directories_with_create_flag_from_directoryarray"); } - - $alreadyincluded = 0; - if ( exists($alldirectoryhash->{$directoryname}) ) { $alreadyincluded = 1; } - - if (!($alreadyincluded)) - { - my %directoryhash = (); - $directoryhash{'HostName'} = $directoryname; - $directoryhash{'specificlanguage'} = $onedir->{'specificlanguage'}; - $directoryhash{'Dir'} = $onedir->{'gid'}; - $directoryhash{'Styles'} = $onedir->{'Styles'}; - - # saving also the modules - if ( ! $onedir->{'modules'} ) { installer::exiter::exit_program("ERROR: No assigned modules found for directory $onedir->{'gid'}", "collect_directories_with_create_flag_from_directoryarray"); } - $directoryhash{'modules'} = $onedir->{'modules'}; - - $alldirectoryhash->{$directoryname} = \%directoryhash; - $newdirincluded = 1; - - # Problem: The $destinationpath can be share/registry/schema/org/openoffice - # but not all directories contain files and will be added to this list. - # Therefore the path has to be analyzed. - - while ( $directoryname =~ /(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/ ) # as long as the path contains slashes - { - $directoryname = $1; - - $alreadyincluded = 0; - if ( exists($alldirectoryhash->{$directoryname}) ) { $alreadyincluded = 1; } - - if (!($alreadyincluded)) - { - my %directoryhash = (); - - $directoryhash{'HostName'} = $directoryname; - $directoryhash{'specificlanguage'} = $onedir->{'specificlanguage'}; - $directoryhash{'Dir'} = $onedir->{'gid'}; - if ( ! $installer::globals::iswindowsbuild ) { $directoryhash{'Styles'} = "(CREATE)"; } # Exeception for Windows? - - # saving also the modules - $directoryhash{'modules'} = $onedir->{'modules'}; - - $alldirectoryhash->{$directoryname} = \%directoryhash; - $newdirincluded = 1; - } - else - { - # Adding the modules to the module list! - $alldirectoryhash->{$directoryname}->{'modules'} = $alldirectoryhash->{$directoryname}->{'modules'} . "," . $onedir->{'modules'}; - } - } - } - else - { - # Adding the modules to the module list! - $alldirectoryhash->{$directoryname}->{'modules'} = $alldirectoryhash->{$directoryname}->{'modules'} . "," . $onedir->{'modules'}; - - while ( $directoryname =~ /(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/ ) # as long as the path contains slashes - { - $directoryname = $1; - # Adding the modules to the module list! - $alldirectoryhash->{$directoryname}->{'modules'} = $alldirectoryhash->{$directoryname}->{'modules'} . "," . $onedir->{'modules'}; - } - } - } - - # Saving the styles for already added directories in function collect_directories_from_filesarray - - if (( ! $newdirincluded ) && ( $styles ne "" )) - { - $styles =~ s/\bWORKSTATION\b//; - $styles =~ s/\bCREATE\b//; - - if (( ! ( $styles =~ /^\s*\(\s*\)\s*$/ )) && ( ! ( $styles =~ /^\s*\(\s*\,\s*\)\s*$/ )) && ( ! ( $styles =~ /^\s*$/ ))) # checking, if there are styles left - { - my $directoryname = ""; - if ( $onedir->{'HostName'} ) { $directoryname = $onedir->{'HostName'}; } - else { installer::exiter::exit_program("ERROR: No directory name (HostName) set for specified language in gid $onedir->{'gid'}", "collect_directories_with_create_flag_from_directoryarray"); } - - if ( exists($alldirectoryhash->{$directoryname}) ) - { - $alldirectoryhash->{$directoryname}->{'Styles'} = $styles; - } - } - } - } - - # Creating directory array - foreach my $destdir ( sort keys %{$alldirectoryhash} ) - { - $alldirectoryhash->{$destdir}->{'modules'} = optimize_list($alldirectoryhash->{$destdir}->{'modules'}); - push(@alldirectories, $alldirectoryhash->{$destdir}); - } - - return (\@alldirectories, \%alldirectoryhash); -} - -################################################# -# Determining the destination file of a link -################################################# - -sub get_destination_file_path_for_links -{ - my ($linksarrayref, $filesarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_destination_file_path_for_links : $#{$linksarrayref} : $#{$filesarrayref}"); } - - my $infoline; - - for ( my $i = 0; $i <= $#{$linksarrayref}; $i++ ) - { - my $fileid = ""; - my $onelink = ${$linksarrayref}[$i]; - if ( $onelink->{'FileID'} ) { $fileid = $onelink->{'FileID'}; } - - if (!( $fileid eq "" )) - { - my $foundfile = 0; - - for ( my $j = 0; $j <= $#{$filesarrayref}; $j++ ) - { - my $onefile = ${$filesarrayref}[$j]; - my $filegid = $onefile->{'gid'}; - - if ( $filegid eq $fileid ) - { - $foundfile = 1; - $onelink->{'destinationfile'} = $onefile->{'destination'}; - last; - } - } - - if (!($foundfile)) - { - $infoline = "Warning: FileID $fileid for Link $onelink->{'gid'} not found!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - } - - $infoline = "\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -################################################# -# Determining the destination link of a link -################################################# - -sub get_destination_link_path_for_links -{ - my ($linksarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_destination_link_path_for_links : $#{$linksarrayref}"); } - - my $infoline; - - for ( my $i = 0; $i <= $#{$linksarrayref}; $i++ ) - { - my $shortcutid = ""; - my $onelink = ${$linksarrayref}[$i]; - if ( $onelink->{'ShortcutID'} ) { $shortcutid = $onelink->{'ShortcutID'}; } - - if (!( $shortcutid eq "" )) - { - my $foundlink = 0; - - for ( my $j = 0; $j <= $#{$linksarrayref}; $j++ ) - { - my $destlink = ${$linksarrayref}[$j]; - $shortcutgid = $destlink->{'gid'}; - - if ( $shortcutgid eq $shortcutid ) - { - $foundlink = 1; - $onelink->{'destinationfile'} = $destlink->{'destination'}; # making key 'destinationfile' - last; - } - } - - if (!($foundlink)) - { - $infoline = "Warning: ShortcutID $shortcutid for Link $onelink->{'gid'} not found!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - } - - $infoline = "\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -################################################################################### -# Items with flag WORKSTATION are not needed (here: links and configurationitems) -################################################################################### - -sub remove_workstation_only_items -{ - my ($itemarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_workstation_only_items : $#{$itemarrayref}"); } - - my @newitemarray = (); - - for ( my $i = 0; $i <= $#{$itemarrayref}; $i++ ) - { - my $oneitem = ${$itemarrayref}[$i]; - my $styles = $oneitem->{'Styles'}; - - if (( $styles =~ /\bWORKSTATION\b/ ) && - (!( $styles =~ /\bNETWORK\b/ )) && - (!( $styles =~ /\bSTANDALONE\b/ ))) - { - next; # removing this link, it is only needed for a workstation installation - } - - push(@newitemarray, $oneitem); - } - - return \@newitemarray; -} - -################################################ -# Resolving relative path in links -################################################ - -sub resolve_links_with_flag_relative -{ - my ($linksarrayref) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::resolve_links_with_flag_relative : $#{$linksarrayref}"); } - - # Before this step is: - # destination=program/libsalhelperC52.so.3, this will be the name of the link - # destinationfile=program/libsalhelperC52.so.3, this will be the linked file or name - # If the flag RELATIVE is set, the pathes have to be analyzed. If the flag is not set - # (this will not occur in the future?) destinationfile has to be an absolute path name - - for ( my $i = 0; $i <= $#{$linksarrayref}; $i++ ) - { - my $onelink = ${$linksarrayref}[$i]; - my $styles = $onelink->{'Styles'}; - - if ( $styles =~ /\bRELATIVE\b/ ) - { - # ToDo: This is only a simple not sufficient mechanism - - my $destination = $onelink->{'destination'}; - my $destinationfile = $onelink->{'destinationfile'}; - - my $destinationpath = $destination; - - installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationpath); - - my $destinationfilepath = $destinationfile; - - # it is possible, that the destinationfile is no longer part of the files collector - if ($destinationfilepath) { installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationfilepath); } - else { $destinationfilepath = ""; } - - if ( $destinationpath eq $destinationfilepath ) - { - # link and file are in the same directory - # Therefore the path of the file can be removed - - my $newdestinationfile = $destinationfile; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$newdestinationfile); - - $onelink->{'destinationfile'} = $newdestinationfile; - } - } - } -} - -######################################################################## -# This function is a helper of function "assigning_modules_to_items" -######################################################################## - -sub insert_for_item ($$$) -{ - my ($hash, $item, $id) = @_; - - if (!defined $hash->{$item}) - { - my @gids = (); - $hash->{$item} = \@gids; - } - my $gid_list = $hash->{$item}; - push @{$gid_list}, $id; - $hash->{$item} = $gid_list; -} - -sub build_modulegids_table -{ - my ($modulesref, $itemname) = @_; - - my %module_lookup_table = (); - - # build map of item names to list of respective module gids - # containing these items - for my $onemodule (@{$modulesref}) - { - next if ( ! defined $onemodule->{$itemname} ); - # these are the items contained in this module - # eg. Files = (gid_a_b_c,gid_d_e_f) - my $module_gids = $onemodule->{$itemname}; - - # prune outer brackets - $module_gids =~ s|^\s*\(||g; - $module_gids =~ s|\)\s*$||g; - for my $id (split (/,/, $module_gids)) - { - chomp $id; - insert_for_item(\%module_lookup_table, lc ($id), $onemodule->{'gid'}); - } - } - - return \%module_lookup_table; -} - -######################################################################## -# Items like files do not know their modules -# This function is a helper of function "assigning_modules_to_items" -######################################################################## - -sub get_string_of_modulegids_for_itemgid -{ - my ($module_lookup_table, $modulesref, $itemgid, $itemname) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_string_of_modulegids_for_itemgid : $#{$modulesref} : $itemgid : $itemname"); } - - my $allmodules = ""; - my $haslanguagemodule = 0; - my %foundmodules = (); - - my $gid_list = $module_lookup_table->{lc($itemgid)}; - - for my $gid (@{$gid_list}) - { - $foundmodules{$gid} = 1; - $allmodules = $allmodules . "," . $gid; - # Is this module a language module? This info should be stored at the file. - if ( exists($installer::globals::alllangmodules{$gid}) ) { $haslanguagemodule = 1; } - } - - $allmodules =~ s/^\s*\,//; # removing leading comma - - # Check: All modules or no module must have flag LANGUAGEMODULE - if ( $haslanguagemodule ) - { - my $isreallylanguagemodule = installer::worker::key_in_a_is_also_key_in_b(\%foundmodules, \%installer::globals::alllangmodules); - if ( ! $isreallylanguagemodule ) { installer::exiter::exit_program("ERROR: \"$itemgid\" is assigned to modules with flag \"LANGUAGEMODULE\" and also to modules without this flag! Modules: $allmodules", "get_string_of_modulegids_for_itemgid"); } - } - - return ($allmodules, $haslanguagemodule); -} - -######################################################## -# Items like files do not know their modules -# This function add the {'modules'} to these items -######################################################## - -sub assigning_modules_to_items -{ - my ($modulesref, $itemsref, $itemname) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::assigning_modules_to_items : $#{$modulesref} : $#{$itemsref} : $itemname"); } - - my $infoline = ""; - my $languageassignmenterror = 0; - my @languageassignmenterrors = (); - - my $module_lookup_table = build_modulegids_table($modulesref, $itemname); - - for my $oneitem (@{$itemsref}) - { - my $itemgid = $oneitem->{'gid'}; - - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - if (( $itemname eq "Dirs" ) && ( ! ( $styles =~ /\bCREATE\b/ ))) { next; } - - if ( $itemgid eq "" ) - { - installer::exiter::exit_program("ERROR in item collection: No gid for item $oneitem->{'Name'}", "assigning_modules_to_items"); - } - - # every item can belong to many modules - - my ($modulegids, $haslanguagemodule) = get_string_of_modulegids_for_itemgid($module_lookup_table, $modulesref, $itemgid, $itemname); - - if ($modulegids eq "") - { - installer::exiter::exit_program("ERROR in file collection: No module found for $itemname $itemgid", "assigning_modules_to_items"); - } - - $oneitem->{'modules'} = $modulegids; - $oneitem->{'haslanguagemodule'} = $haslanguagemodule; - - # Important check: "ismultilingual" and "haslanguagemodule" must have the same value ! - if (( $oneitem->{'ismultilingual'} ) && ( ! $oneitem->{'haslanguagemodule'} )) - { - $infoline = "Error: \"$oneitem->{'gid'}\" is multi lingual, but not in language pack (Assigned module: $modulegids)!\n"; - push( @installer::globals::globallogfileinfo, $infoline); - push( @languageassignmenterrors, $infoline ); - $languageassignmenterror = 1; - } - if (( $oneitem->{'haslanguagemodule'} ) && ( ! $oneitem->{'ismultilingual'} )) - { - $infoline = "Error: \"$oneitem->{'gid'}\" is in language pack, but not multi lingual (Assigned module: $modulegids)!\n"; - push( @installer::globals::globallogfileinfo, $infoline); - push( @languageassignmenterrors, $infoline ); - $languageassignmenterror = 1; - } - } - - if ($languageassignmenterror) - { - for ( my $i = 0; $i <= $#languageassignmenterrors; $i++ ) { print "$languageassignmenterrors[$i]"; } - installer::exiter::exit_program("ERROR: Incorrect assignments for language packs.", "assigning_modules_to_items"); - } - -} - -################################################################################################# -# Root path (for instance /opt/openofficeorg20) needs to be added to directories, files and links -################################################################################################# - -sub add_rootpath_to_directories -{ - my ($dirsref, $rootpath) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::add_rootpath_to_directories : $#{$dirsref} : $rootpath"); } - - for ( my $i = 0; $i <= $#{$dirsref}; $i++ ) - { - my $onedir = ${$dirsref}[$i]; - my $dir = ""; - - if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; } - - if (!($dir =~ /\bPREDEFINED_/ )) - { - my $hostname = $onedir->{'HostName'}; - $hostname = $rootpath . $installer::globals::separator . $hostname; - $onedir->{'HostName'} = $hostname; - } - - # added - - if ( $dir =~ /\bPREDEFINED_PROGDIR\b/ ) - { - my $hostname = $onedir->{'HostName'}; - if ( $hostname eq "" ) { $onedir->{'HostName'} = $rootpath; } - else { $onedir->{'HostName'} = $rootpath . $installer::globals::separator . $hostname; } - } - } -} - -sub add_rootpath_to_files -{ - my ($filesref, $rootpath) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::add_rootpath_to_files : $#{$filesref} : $rootpath"); } - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - my $destination = $onefile->{'destination'}; - $destination = $rootpath . $installer::globals::separator . $destination; - $onefile->{'destination'} = $destination; - } -} - -sub add_rootpath_to_links -{ - my ($linksref, $rootpath) = @_; - - if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::add_rootpath_to_links : $#{$linksref} : $rootpath"); } - - for ( my $i = 0; $i <= $#{$linksref}; $i++ ) - { - my $onelink = ${$linksref}[$i]; - my $styles = $onelink->{'Styles'}; - - my $destination = $onelink->{'destination'}; - $destination = $rootpath . $installer::globals::separator . $destination; - $onelink->{'destination'} = $destination; - - if (!($styles =~ /\bRELATIVE\b/ )) # for absolute links - { - my $destinationfile = $onelink->{'destinationfile'}; - $destinationfile = $rootpath . $installer::globals::separator . $destinationfile; - $onelink->{'destinationfile'} = $destinationfile; - } - } -} - -################################################################################# -# Collecting all parent gids -################################################################################# - -sub collect_all_parent_feature -{ - my ($modulesref) = @_; - - my @allparents = (); - - my $found_root_module = 0; - - for ( my $i = 0; $i <= $#{$modulesref}; $i++ ) - { - my $onefeature = ${$modulesref}[$i]; - - my $parentgid = ""; - if ( $onefeature->{'ParentID'} ) - { - $parentgid = $onefeature->{'ParentID'}; - } - - if ( $parentgid ne "" ) - { - if (! installer::existence::exists_in_array($parentgid, \@allparents)) - { - push(@allparents, $parentgid); - } - } - - # Setting the global root module - - if ( $parentgid eq "" ) - { - if ( $found_root_module ) { installer::exiter::exit_program("ERROR: Only one module without ParentID or with empty ParentID allowed ($installer::globals::rootmodulegid, $onefeature->{'gid'}).", "collect_all_parent_feature"); } - $installer::globals::rootmodulegid = $onefeature->{'gid'}; - $found_root_module = 1; - $infoline = "Setting Root Module: $installer::globals::rootmodulegid\n"; - push( @installer::globals::globallogfileinfo, $infoline); - } - - if ( ! $found_root_module ) { installer::exiter::exit_program("ERROR: Could not define root module. No module without ParentID or with empty ParentID exists.", "collect_all_parent_feature"); } - - } - - return \@allparents; -} - -################################################################################# -# Checking for every feature, whether it has children -################################################################################# - -sub set_children_flag -{ - my ($modulesref) = @_; - - my $allparents = collect_all_parent_feature($modulesref); - - for ( my $i = 0; $i <= $#{$modulesref}; $i++ ) - { - my $onefeature = ${$modulesref}[$i]; - my $gid = $onefeature->{'gid'}; - - # is this gid a parent? - - if ( installer::existence::exists_in_array($gid, $allparents) ) - { - $onefeature->{'has_children'} = 1; - } - else - { - $onefeature->{'has_children'} = 0; - } - } -} - -################################################################################# -# All modules, that use a template module, do now get the assignments of -# the template module. -################################################################################# - -sub resolve_assigned_modules -{ - my ($modulesref) = @_; - - # collecting all template modules - - my %directaccess = (); - - for ( my $i = 0; $i <= $#{$modulesref}; $i++ ) - { - my $onefeature = ${$modulesref}[$i]; - my $styles = ""; - if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; } - if ( $styles =~ /\bTEMPLATEMODULE\b/ ) { $directaccess{$onefeature->{'gid'}} = $onefeature; } - - # also looking for module with flag ROOT_BRAND_PACKAGE, to save is for further usage - if ( $styles =~ /\bROOT_BRAND_PACKAGE\b/ ) - { - $installer::globals::rootbrandpackage = $onefeature->{'gid'}; - $installer::globals::rootbrandpackageset = 1; - } - } - - # looking, where template modules are assigned - - for ( my $i = 0; $i <= $#{$modulesref}; $i++ ) - { - my $onefeature = ${$modulesref}[$i]; - if ( $onefeature->{'Assigns'} ) - { - my $templategid = $onefeature->{'Assigns'}; - - if ( ! exists($directaccess{$templategid}) ) - { - installer::exiter::exit_program("ERROR: Did not find definition of assigned template module \"$templategid\"", "resolve_assigned_modules"); - } - - # Currently no merging of Files, Dirs, ... - # This has to be included here, if it is required - my $item; - foreach $item (@installer::globals::items_at_modules) - { - if ( exists($directaccess{$templategid}->{$item}) ) { $onefeature->{$item} = $directaccess{$templategid}->{$item}; } - } - } - } -} - -################################################################################# -# Removing the template modules from the list, after all -# assignments are transferred to the "real" modules. -################################################################################# - -sub remove_template_modules -{ - my ($modulesref) = @_; - - my @modules = (); - - for ( my $i = 0; $i <= $#{$modulesref}; $i++ ) - { - my $onefeature = ${$modulesref}[$i]; - my $styles = ""; - if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; } - if ( $styles =~ /\bTEMPLATEMODULE\b/ ) { next; } - - push(@modules, $onefeature); - } - - return \@modules; -} - -################################################################################# -# Collecting all modules with flag LANGUAGEMODULE in a global -# collector. -################################################################################# - -sub collect_all_languagemodules -{ - my ($modulesref) = @_; - - for ( my $i = 0; $i <= $#{$modulesref}; $i++ ) - { - my $onefeature = ${$modulesref}[$i]; - my $styles = ""; - if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; } - if ( $styles =~ /\bLANGUAGEMODULE\b/ ) - { - if ( ! exists($onefeature->{'Language'}) ) { installer::exiter::exit_program("ERROR: \"$onefeature->{'gid'}\" has flag LANGUAGEMODULE, but does not know its language!", "collect_all_languagemodules"); } - $installer::globals::alllangmodules{$onefeature->{'gid'}} = $onefeature->{'Language'}; - # Collecting also the english names, that are used for nsis unpack directory for language packs - my $lang = $onefeature->{'Language'}; - my $name = ""; - foreach my $localkey ( keys %{$onefeature} ) - { - if ( $localkey =~ /^\s*Name\s*\(\s*en-US\s*\)\s*$/ ) - { - $installer::globals::all_english_languagestrings{$lang} = $onefeature->{$localkey}; - } - } - } - } -} - -################################################################################# -# Selecting from all collected english language strings those, that are really -# required in this installation set. -################################################################################# - -sub select_required_language_strings -{ - my ($modulesref) = @_; - - for ( my $i = 0; $i <= $#{$modulesref}; $i++ ) - { - my $onefeature = ${$modulesref}[$i]; - my $styles = ""; - if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; } - if ( $styles =~ /\bLANGUAGEMODULE\b/ ) - { - if ( ! exists($onefeature->{'Language'}) ) { installer::exiter::exit_program("ERROR: \"$onefeature->{'gid'}\" has flag LANGUAGEMODULE, but does not know its language!", "select_required_language_strings"); } - my $lang = $onefeature->{'Language'}; - - if (( exists($installer::globals::all_english_languagestrings{$lang}) ) && ( ! exists($installer::globals::all_required_english_languagestrings{$lang}) )) - { - $installer::globals::all_required_english_languagestrings{$lang} = $installer::globals::all_english_languagestrings{$lang}; - } - } - } -} - -##################################################################################### -# Unixlinks are not always required. For Linux RPMs and Solaris Packages they are -# created dynamically. Exception: For package formats "installed" or "archive". -# In scp2 this unixlinks have the flag LAYERLINK. -##################################################################################### - -sub filter_layerlinks_from_unixlinks -{ - my ( $unixlinksref ) = @_; - - my @alllinks = (); - - for ( my $i = 0; $i <= $#{$unixlinksref}; $i++ ) - { - my $isrequired = 1; - - my $onelink = ${$unixlinksref}[$i]; - my $styles = ""; - if ( $onelink->{'Styles'} ) { $styles = $onelink->{'Styles'}; } - - if ( $styles =~ /\bLAYERLINK\b/ ) - { - # Platforms, that do not need the layer links - if (( $installer::globals::isrpmbuild ) || ( $installer::globals::issolarispkgbuild )) - { - $isrequired = 0; - } - - # Package formats, that need the layer link (platform independent) - if (( $installer::globals::packageformat eq "installed" ) || ( $installer::globals::packageformat eq "archive" )) - { - $isrequired = 1; - } - } - - if ( $isrequired ) { push(@alllinks, $onelink); } - } - - return \@alllinks; -} - -1; diff --git a/solenv/bin/modules/installer/setupscript.pm b/solenv/bin/modules/installer/setupscript.pm deleted file mode 100644 index 4e2fbf662..000000000 --- a/solenv/bin/modules/installer/setupscript.pm +++ /dev/null @@ -1,510 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::setupscript; - -use installer::existence; -use installer::exiter; -use installer::globals; -use installer::logger; -use installer::remover; -use installer::scriptitems; -use installer::ziplist; - -####################################################### -# Set setup script name, if not defined as parameter -####################################################### - -sub set_setupscript_name -{ - my ( $allsettingsarrayref, $includepatharrayref ) = @_; - - my $scriptnameref = installer::ziplist::getinfofromziplist($allsettingsarrayref, "script"); - - my $scriptname = $$scriptnameref; - - if ( $scriptname eq "" ) # not defined on command line and not in product list - { - installer::exiter::exit_program("ERROR: Setup script not defined on command line (-l) and not in product list!", "set_setupscript_name"); - } - - if ( $installer::globals::compiler =~ /wnt/ ) - { - $scriptname .= ".inf"; - } - else - { - $scriptname .= ".ins"; - } - - # and now the complete path for the setup script is needed - # The log file cannot be used, because this is the language independent section - - $scriptnameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptname, $includepatharrayref, 1); - - $installer::globals::setupscriptname = $$scriptnameref; - - if ( $installer::globals::setupscriptname eq "" ) - { - installer::exiter::exit_program("ERROR: Script $scriptname not found!", "set_setupscript_name"); - } -} - -##################################################################### -# Reading script variables from installation object of script file -##################################################################### - -sub get_all_scriptvariables_from_installation_object -{ - my ($scriptref) = @_; - - my @installobjectvariables; - - for ( my $i = 0; $i <= $#{$scriptref}; $i++ ) - { - my $line = ${$scriptref}[$i]; - - if ( $line =~ /^\s*Installation\s+\w+\s*$/ ) # should be the first line - { - my $counter = $i+1; - my $installline = ${$scriptref}[$counter]; - - while (!($installline =~ /^\s*End\s*$/ )) - { - if ( $installline =~ /^\s*(\w+)\s+\=\s*(.*?)\s*\;\s*$/ ) - { - my $key = $1; - my $value = $2; - - # removing leading and ending " in $value - - if ( $value =~ /^\s*\"(.*)\"\s*$/ ) - { - $value = $1; - } - - $key = "\%" . uc($key); # $key is %PRODUCTNAME - - my $input = $key . " " . $value . "\n"; # $key can only be the first word - - push(@installobjectvariables ,$input); - } - - $counter++; - $installline = ${$scriptref}[$counter]; - } - } - - last; # not interesting after installation object - } - - return \@installobjectvariables; -} - -###################################################################### -# Including LCPRODUCTNAME into the array -###################################################################### - -sub add_lowercase_productname_setupscriptvariable -{ - my ( $variablesref ) = @_; - - for ( my $j = 0; $j <= $#{$variablesref}; $j++ ) - { - my $variableline = ${$variablesref}[$j]; - - my ($key, $value); - - if ( $variableline =~ /^\s*\%(\w+?)\s+(.*?)\s*$/ ) - { - $key = $1; - $value = $2; - - if ( $key eq "PRODUCTNAME" ) - { - my $newline = "\%LCPRODUCTNAME " . lc($value) . "\n"; - push(@{$variablesref} ,$newline); - my $original = $value; - $value =~ s/\s*//g; - $newline = "\%ONEWORDPRODUCTNAME " . $value . "\n"; - push(@{$variablesref} ,$newline); - $newline = "\%LCONEWORDPRODUCTNAME " . lc($value) . "\n"; - push(@{$variablesref} ,$newline); - $value = $original; - $value =~ s/\s*$//g; - $value =~ s/^\s*//g; - $value =~ s/ /\%20/g; - $newline = "\%MASKEDPRODUCTNAME " . $value . "\n"; - push(@{$variablesref} ,$newline); - $value = $original; - $value =~ s/\s/\_/g; - $newline = "\%UNIXPRODUCTNAME " . lc($value) . "\n"; - push(@{$variablesref} ,$newline); - $newline = "\%SYSTEMINTUNIXPACKAGENAME " . lc($value) . "\n"; - push(@{$variablesref} ,$newline); - $newline = "\%UNIXPACKAGENAME " . lc($value) . "\n"; - push(@{$variablesref} ,$newline); - $value = $original; - $value =~ s/\s/\_/g; - $value =~ s/\.//g; - $newline = "\%WITHOUTDOTUNIXPRODUCTNAME " . lc($value) . "\n"; - push(@{$variablesref} ,$newline); - $newline = "\%WITHOUTDOTUNIXPACKAGENAME " . lc($value) . "\n"; - push(@{$variablesref} ,$newline); - $newline = "\%SOLARISBRANDPACKAGENAME " . lc($value) . "\n"; - push(@{$variablesref} ,$newline); - $value = $original; - } - elsif ( $key eq "PRODUCTEXTENSION" ) - { - my $newline = "\%LCPRODUCTEXTENSION " . lc($value) . "\n"; - push(@{$variablesref} ,$newline); - } - elsif ( $key eq "PRODUCTVERSION" ) - { - $value =~ s/\.//g; - my $newline = "\%WITHOUTDOTPRODUCTVERSION " . $value . "\n"; - push(@{$variablesref} ,$newline); - } - elsif ( $key eq "OOOBASEVERSION" ) - { - $value =~ s/\.//g; - my $newline = "\%WITHOUTDOTOOOBASEVERSION " . $value . "\n"; - push(@{$variablesref} ,$newline); - } - - } - } -} - -###################################################################### -# Resolving the new introduced lowercase script variables -###################################################################### - -sub resolve_lowercase_productname_setupscriptvariable -{ - my ( $variablesref ) = @_; - - my %variables = (); - - # First step: Collecting variables - - for ( my $j = 0; $j <= $#{$variablesref}; $j++ ) - { - my $variableline = ${$variablesref}[$j]; - - my ($key, $value); - - if ( $variableline =~ /^\s*\%(\w+?)\s+(.*?)\s*$/ ) - { - $key = $1; - $value = $2; - $variables{$key} = $value; - } - } - - # Second step: Resolving variables - - for ( my $j = 0; $j <= $#{$variablesref}; $j++ ) - { - if ( ${$variablesref}[$j] =~ /\$\{(.*?)\}/ ) - { - my $key = $1; - ${$variablesref}[$j] =~ s/\$\{\Q$key\E\}/$variables{$key}/g; - } - } - -} - -###################################################################### -# Replacing all setup script variables inside the setup script file -###################################################################### - -sub replace_all_setupscriptvariables_in_script -{ - my ( $scriptref, $variablesref ) = @_; - - installer::logger::include_header_into_globallogfile("Replacing variables in setup script (start)"); - - # make hash of variables to be substituted if they appear in the script - my %subs; - for ( my $j = 0; $j <= $#{$variablesref}; $j++ ) - { - my $variableline = ${$variablesref}[$j]; - - if ( $variableline =~ /^\s*(\%\w+?)\s+(.*?)\s*$/ ) - { - $subs{$1}= $2; - } - } - - # This is far faster than running a regexp for each line - my $bigstring = ''; - for my $line (@{$scriptref}) { $bigstring = $bigstring . $line; } - - foreach my $key (sort { length ($b) <=> length ($a) } keys %subs) - { - # Attention: It must be possible to substitute "%PRODUCTNAMEn", "%PRODUCTNAME%PRODUCTVERSIONabc" - my $value = $subs{$key}; - $bigstring =~ s/$key/$value/g; - } - - my @newlines = split /\n/, $bigstring; - $scriptref = \@newlines; - - # now check for any mis-named '%' variables that we have left - my $num = 0; - for my $check (@newlines) - { - $num++; - if ( $check =~ /^.*\%\w+.*$/ ) - { - if (( $check =~ /%1/ ) || ( $check =~ /%2/ ) || ( $check =~ /%verify/ )) { next; } - my $infoline = "WARNING: mis-named or un-known '%' variable in setup script at line $num:\n$check\n"; - push( @installer::globals::globallogfileinfo, $infoline); - } - } - - installer::logger::include_header_into_globallogfile("Replacing variables in setup script (end)"); - - return $scriptref; -} - -####################################################################### -# Collecting all items of the type "searchitem" from the setup script -####################################################################### - -sub get_all_items_from_script -{ - my ($scriptref, $searchitem) = @_; - - my @allitemarray = (); - - my ($itemkey, $itemvalue); - - for ( my $i = 0; $i <= $#{$scriptref}; $i++ ) - { - my $line = ${$scriptref}[$i]; - - next unless ($line =~ /^\s*\Q$searchitem\E\s+(\S+)\s*$/); - my $gid = $1; - - my %oneitemhash = (); - my $ismultilang = 0; - - $oneitemhash{'gid'} = $gid; - - while (!( $line =~ /^\s*End\s*$/ )) - { - if ( $i >= $#{$scriptref} ) { - installer::exiter::exit_program("Invalid setup script file. End of file reached before 'End' line of '$searchitem' section.", "get_all_items_from_script"); - } - $line = ${$scriptref}[++$i]; - - if ( $line =~ /^\s*(.+?)\=\s*(.+?)\;\s*$/ ) # only oneliner! - { - $itemkey = $1; - $itemvalue = $2; - - $itemkey =~ s/\s+$//; - $itemvalue =~ s/\s+$//; - - installer::remover::remove_leading_and_ending_quotationmarks(\$itemvalue); - - $oneitemhash{$itemkey} = $itemvalue; - - $ismultilang ||= $itemkey =~ /^\S+\s+\(\S+\)$/; - } - elsif (($searchitem eq "Module") && - ($line =~ /^\s*.+?\s*\=\s*\(/) && - (!($line =~ /\)\;\s*$/))) # more than one line, for instance files at modules! - { - $line =~ /^\s*(.+?)\s*\=\s*(.+?)\s*$/; # the first line - $itemkey = $1; - $itemvalue = $2; - - # collecting the complete itemvalue - do - { - if ( $i >= $#{$scriptref} ) { - installer::exiter::exit_program("Invalid setup script file. Premature end of file.", "get_all_items_from_script"); - } - $line = ${$scriptref}[++$i]; - installer::remover::remove_leading_and_ending_whitespaces(\$line); - $itemvalue .= $line; - } while (!($line =~ /\)\;\s*$/)); - - # removing ending ";" - $itemvalue =~ s/\;\s*$//; - - $oneitemhash{$itemkey} = $itemvalue; - - $ismultilang ||= $itemkey =~ /^\S+\s+\(\S+\)$/; - } - } - - $oneitemhash{'ismultilingual'} = $ismultilang+0; - - push(@allitemarray, \%oneitemhash); - } - - return \@allitemarray; -} - -###################################################################### -# Collecting all folder at folderitems, that are predefined values -# For example: PREDEFINED_AUTOSTART -###################################################################### - -sub add_predefined_folder -{ - my ( $folderitemref, $folderref ) = @_; - - for ( my $i = 0; $i <= $#{$folderitemref}; $i++ ) - { - my $folderitem = ${$folderitemref}[$i]; - my $folderid = $folderitem->{'FolderID'}; - - if ( $folderid =~ /PREDEFINED_/ ) - { - if (! installer::existence::exists_in_array_of_hashes("gid", $folderid, $folderref)) - { - my %folder = (); - $folder{'ismultilingual'} = "0"; - $folder{'Name'} = ""; - $folder{'gid'} = $folderid; - - push(@{$folderref}, \%folder); - } - } - } -} - -##################################################################################### -# If folderitems are non-advertised, the component needs to have a registry key -# below HKCU as key path. Therefore it is required, to mark the file belonging -# to a non-advertised shortcut, that a special userreg_xxx registry key can be -# created during packing process. -##################################################################################### - -sub prepare_non_advertised_files -{ - my ( $folderitemref, $filesref ) = @_; - - for ( my $i = 0; $i <= $#{$folderitemref}; $i++ ) - { - my $folderitem = ${$folderitemref}[$i]; - my $styles = ""; - if ( $folderitem->{'Styles'} ) { $styles = $folderitem->{'Styles'}; } - - if ( $styles =~ /\bNON_ADVERTISED\b/ ) - { - my $fileid = $folderitem->{'FileID'}; - if ( $folderitem->{'ComponentIDFile'} ) { $fileid = $folderitem->{'ComponentIDFile'}; } - my $onefile = installer::worker::find_file_by_id($filesref, $fileid); - - # Attention: If $onefile with "FileID" is not found, this is not always an error. - # FileID can also contain an executable file, for example msiexec.exe. - if ( $onefile ne "" ) { $onefile->{'needs_user_registry_key'} = 1; } - } - } -} - -##################################################################################### -# Adding all variables defined in the installation object into the hash -# of all variables from the zip list file. -# This is needed if variables are defined in the installation object, -# but not in the zip list file. -# If there is a definition in the zip list file and in the installation -# object, the installation object is more important -##################################################################################### - -sub add_installationobject_to_variables -{ - my ($allvariables, $allscriptvariablesref) = @_; - - for ( my $i = 0; $i <= $#{$allscriptvariablesref}; $i++ ) - { - my $line = ${$allscriptvariablesref}[$i]; - - if ( $line =~ /^\s*\%(\w+)\s+(.*?)\s*$/ ) - { - my $key = $1; - my $value = $2; - - $allvariables->{$key} = $value; # overwrite existing values from zip.lst - } - } -} - -##################################################################################### -# Adding all variables, that must be defined, but are not defined until now. -# List of this varibles: @installer::globals::forced_properties -##################################################################################### - -sub add_forced_properties -{ - my ($allvariables) = @_; - - my $property; - foreach $property ( @installer::globals::forced_properties ) - { - if ( ! exists($allvariables->{$property}) ) { $allvariables->{$property} = ""; } - } -} - -##################################################################################### -# Some properties are created automatically. It should be possible to -# overwrite them, with PRESET properties. For example UNIXPRODUCTNAME -# with PRESETUNIXPRODUCTNAME, if this is defined and the automatic process -# does not deliver the desired results. -##################################################################################### - -sub replace_preset_properties -{ - my ($allvariables) = @_; - - # SOLARISBRANDPACKAGENAME - # needs to be replaced by - # PRESETSOLARISBRANDPACKAGENAME - - my @presetproperties = (); - push(@presetproperties, "SOLARISBRANDPACKAGENAME"); - push(@presetproperties, "SYSTEMINTUNIXPACKAGENAME"); - - - foreach $property ( @presetproperties ) - { - my $presetproperty = "PRESET" . $property; - if (( exists($allvariables->{$presetproperty}) ) && ( $allvariables->{$presetproperty} ne "" )) - { - $allvariables->{$property} = $allvariables->{$presetproperty}; - } - } -} - -1; diff --git a/solenv/bin/modules/installer/simplepackage.pm b/solenv/bin/modules/installer/simplepackage.pm deleted file mode 100755 index ad0658ff8..000000000 --- a/solenv/bin/modules/installer/simplepackage.pm +++ /dev/null @@ -1,817 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::simplepackage; - -use Cwd; -use File::Copy; -use installer::download; -use installer::exiter; -use installer::globals; -use installer::logger; -use installer::strip; -use installer::systemactions; -use installer::worker; - -#################################################### -# Checking if the simple packager is required. -# This can be achieved by setting the global -# variable SIMPLE_PACKAGE in *.lst file or by -# setting the environment variable SIMPLE_PACKAGE. -#################################################### - -sub check_simple_packager_project -{ - my ( $allvariables ) = @_; - - if (( $installer::globals::packageformat eq "installed" ) || - ( $installer::globals::packageformat eq "archive" )) - { - $installer::globals::is_simple_packager_project = 1; - $installer::globals::patch_user_dir = 1; - } - elsif( $installer::globals::packageformat eq "dmg" ) - { - $installer::globals::is_simple_packager_project = 1; - } -} - -#################################################### -# Detecting the directory with extensions -#################################################### - -sub get_extensions_dir -{ - my ( $subfolderdir ) = @_; - - my $extensiondir = $subfolderdir . $installer::globals::separator; - if ( $installer::globals::officedirhostname ne "" ) { $extensiondir = $extensiondir . $installer::globals::officedirhostname . $installer::globals::separator; } - my $extensionsdir = $extensiondir . "share" . $installer::globals::separator . "extensions"; - my $preregdir = $extensiondir . "share" . $installer::globals::separator . "prereg" . $installer::globals::separator . "bundled"; - - return ( $extensionsdir, $preregdir ); -} - -#################################################### -# Registering extensions -#################################################### - -sub register_extensions -{ - my ($officedir, $languagestringref, $preregdir) = @_; - - my $infoline = ""; - - if ( $preregdir eq "" ) - { - $infoline = "ERROR: Failed to determine directory \"prereg\" for extension registration! Please check your installation set.\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program($infoline, "register_extensions"); - } - - my $programdir = $officedir . $installer::globals::separator; - if ( $installer::globals::officedirhostname ne "" ) { $programdir = $programdir . $installer::globals::officedirhostname . $installer::globals::separator; } - $programdir = $programdir . "program"; - - my $from = cwd(); - chdir($programdir); - - my $unopkgfile = $installer::globals::unopkgfile; - - my $unopkgexists = 1; - if (( $installer::globals::languagepack ) && ( ! -f $unopkgfile )) - { - $unopkgexists = 0; - $infoline = "Language packs do not contain unopkg!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - if (( $installer::globals::helppack ) && ( ! -f $unopkgfile )) - { - $unopkgexists = 0; - $infoline = "Help packs do not contain unopkg!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - if ( ! -f $unopkgfile ) - { - $unopkgexists = 0; - $infoline = "Info: File $unopkgfile does not exist! Extensions cannot be registered.\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - if ( $unopkgexists ) - { - my $currentdir = cwd(); - print "... current dir: $currentdir ...\n"; - $infoline = "Current dir: $currentdir\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( ! -f $unopkgfile ) { installer::exiter::exit_program("ERROR: $unopkgfile not found!", "register_extensions"); } - - my $systemcall = "JFW_PLUGIN_DO_NOT_CHECK_ACCESSIBILITY=1 " . $unopkgfile . " sync --verbose" . " -env:UNO_JAVA_JFW_ENV_JREHOME=true 2\>\&1 |"; - - print "... $systemcall ...\n"; - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - my @unopkgoutput = (); - - open (UNOPKG, $systemcall); - while (<UNOPKG>) - { - my $lastline = $_; - push(@unopkgoutput, $lastline); - } - close (UNOPKG); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - if ($returnvalue) - { - # Writing content of @unopkgoutput only in the error case into the log file. Sometimes it - # contains strings like "Error" even in the case of success. This causes a packaging error - # when the log file is analyzed at the end, even if there is no real error. - for ( my $j = 0; $j <= $#unopkgoutput; $j++ ) { push( @installer::globals::logfileinfo, "$unopkgoutput[$j]"); } - - $infoline = "ERROR: Could not execute \"$systemcall\"!\nExitcode: '$returnvalue'\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: $systemcall failed!", "register_extensions"); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - chdir($from); -} - -######################################################################## -# Getting the translation file for the Mac Language Pack installer -######################################################################## - -sub get_mac_translation_file -{ - my $translationfilename = $installer::globals::maclangpackfilename; - if ( ! -f $translationfilename ) { installer::exiter::exit_program("ERROR: Could not find language file $translationfilename!", "get_mac_translation_file"); } - my $translationfile = installer::files::read_file($translationfilename); - - my $infoline = "Reading translation file: $translationfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - return $translationfile; -} - -################################################################## -# Collecting all identifier from ulf file -################################################################## - -sub get_identifier -{ - my ( $translationfile ) = @_; - - my @identifier = (); - - for ( my $i = 0; $i <= $#{$translationfile}; $i++ ) - { - my $oneline = ${$translationfile}[$i]; - - if ( $oneline =~ /^\s*\[(.+)\]\s*$/ ) - { - my $identifier = $1; - push(@identifier, $identifier); - } - } - - return \@identifier; -} - -############################################################## -# Returning the complete block in all languages -# for a specified string -############################################################## - -sub get_language_block_from_language_file -{ - my ($searchstring, $languagefile) = @_; - - my @language_block = (); - - for ( my $i = 0; $i <= $#{$languagefile}; $i++ ) - { - if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ ) - { - my $counter = $i; - - push(@language_block, ${$languagefile}[$counter]); - $counter++; - - while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ ))) - { - push(@language_block, ${$languagefile}[$counter]); - $counter++; - } - - last; - } - } - - return \@language_block; -} - -############################################################## -# Returning a specific language string from the block -# of all translations -############################################################## - -sub get_language_string_from_language_block -{ - my ($language_block, $language) = @_; - - my $newstring = ""; - - for ( my $i = 0; $i <= $#{$language_block}; $i++ ) - { - if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) - { - $newstring = $1; - last; - } - } - - if ( $newstring eq "" ) - { - $language = "en-US"; # defaulting to english - - for ( my $i = 0; $i <= $#{$language_block}; $i++ ) - { - if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) - { - $newstring = $1; - last; - } - } - } - - return $newstring; -} - -######################################################################## -# Localizing the script for the Mac Language Pack installer -######################################################################## - -sub localize_scriptfile -{ - my ($scriptfile, $translationfile, $languagestringref) = @_; - - my $onelanguage = $$languagestringref; - if ( $onelanguage =~ /^\s*(.*?)_/ ) { $onelanguage = $1; } - - # Analyzing the ulf file, collecting all Identifier - my $allidentifier = get_identifier($translationfile); - - for ( my $i = 0; $i <= $#{$allidentifier}; $i++ ) - { - my $identifier = ${$allidentifier}[$i]; - my $language_block = get_language_block_from_language_file($identifier, $translationfile); - my $newstring = get_language_string_from_language_block($language_block, $onelanguage); - - # removing mask - $newstring =~ s/\\\'/\'/g; - - replace_one_variable_in_shellscript($scriptfile, $newstring, $identifier); - } -} - -################################################################################# -# Replacing one variable in Mac shell script -################################################################################# - -sub replace_one_variable_in_shellscript -{ - my ($scriptfile, $variable, $searchstring) = @_; - - for ( my $i = 0; $i <= $#{$scriptfile}; $i++ ) - { - ${$scriptfile}[$i] =~ s/\[$searchstring\]/$variable/g; - } -} - -############################################# -# Replacing variables in Mac shell script -############################################# - -sub replace_variables_in_scriptfile -{ - my ($scriptfile, $volume_name, $volume_name_app, $allvariables) = @_; - - replace_one_variable_in_shellscript($scriptfile, $volume_name, "FULLPRODUCTNAME" ); - replace_one_variable_in_shellscript($scriptfile, $volume_name_app, "FULLAPPPRODUCTNAME" ); - replace_one_variable_in_shellscript($scriptfile, $allvariables->{'PRODUCTNAME'}, "PRODUCTNAME" ); - replace_one_variable_in_shellscript($scriptfile, $allvariables->{'PRODUCTVERSION'}, "PRODUCTVERSION" ); - - my $scriptname = lc($allvariables->{'PRODUCTNAME'}) . "\.script"; - if ( $allvariables->{'PRODUCTNAME'} eq "LibreOffice" ) { $scriptname = "org.libreoffice.script"; } - - replace_one_variable_in_shellscript($scriptfile, $scriptname, "SEARCHSCRIPTNAME" ); -} - -############################################# -# Creating the "simple" package. -# "zip" for Windows -# "tar.gz" for all other platforms -# additionally "dmg" on Mac OS X -############################################# - -sub create_package -{ - my ( $installdir, $archivedir, $packagename, $allvariables, $includepatharrayref, $languagestringref, $format ) = @_; - - installer::logger::print_message( "... creating $installer::globals::packageformat file ...\n" ); - installer::logger::include_header_into_logfile("Creating $installer::globals::packageformat file:"); - - # moving dir into temporary directory - my $pid = $$; # process id - my $tempdir = $installdir . "_temp" . "." . $pid; - my $systemcall = ""; - my $from = ""; - my $makesystemcall = 1; - my $return_to_start = 0; - installer::systemactions::rename_directory($installdir, $tempdir); - - # creating new directory with original name - installer::systemactions::create_directory($archivedir); - - my $archive = $archivedir . $installer::globals::separator . $packagename . $format; - - if ( $archive =~ /zip$/ ) - { - $from = cwd(); - $return_to_start = 1; - chdir($tempdir); - $systemcall = "$installer::globals::zippath -qr $archive ."; - - # Using Archive::Zip fails because of very long path names below "share/uno_packages/cache" - # my $packzip = Archive::Zip->new(); - # $packzip->addTree("."); # after changing into $tempdir - # $packzip->writeToFileNamed($archive); - # $makesystemcall = 0; - } - elsif ( $archive =~ /dmg$/ ) - { - my $folder = (( -l "$tempdir/$packagename/Applications" ) or ( -l "$tempdir/$packagename/opt" )) ? $packagename : "\."; - - if ( $allvariables->{'PACK_INSTALLED'} ) { - $folder = $packagename; - } - - # my $volume_name = $allvariables->{'PRODUCTNAME'} . ' ' . $allvariables->{'PRODUCTVERSION'}; # Adding PRODUCTVERSION makes this difficult to maintain! - my $volume_name = $allvariables->{'PRODUCTNAME'}; - my $volume_name_classic = $allvariables->{'PRODUCTNAME'} . ' ' . $allvariables->{'PRODUCTVERSION'}; - my $volume_name_classic_app = $volume_name; # "app" should not contain version number - # $volume_name = $volume_name . ' ' . $allvariables->{'PRODUCTEXTENSION'} if $allvariables->{'PRODUCTEXTENSION'}; # Adding PRODUCTEXTENSION makes this difficult to maintain! - $volume_name_classic = $volume_name_classic . ' ' . $allvariables->{'PRODUCTEXTENSION'} if $allvariables->{'PRODUCTEXTENSION'}; - $volume_name_classic_app = $volume_name_classic_app . ' ' . $allvariables->{'PRODUCTEXTENSION'} if $allvariables->{'PRODUCTEXTENSION'}; - if ( $allvariables->{'DMG_VOLUMEEXTENSION'} ) { - $volume_name = $volume_name . ' ' . $allvariables->{'DMG_VOLUMEEXTENSION'}; - $volume_name_classic = $volume_name_classic . ' ' . $allvariables->{'DMG_VOLUMEEXTENSION'}; - $volume_name_classic_app = $volume_name_classic_app . ' ' . $allvariables->{'DMG_VOLUMEEXTENSION'}; - } - - my $sla = 'sla.r'; - my $ref = ""; - - if ( ! $allvariables->{'HIDELICENSEDIALOG'} ) - { - installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$sla, $includepatharrayref, 0); - } - - my $localtempdir = $tempdir; - - if (( $installer::globals::languagepack ) || ( $installer::globals::helppack ) || ( $installer::globals::patch )) - { - $localtempdir = "$tempdir/$packagename"; - if ( $installer::globals::helppack ) { $volume_name = "$volume_name Help Pack"; } - if ( $installer::globals::languagepack ) - { - $volume_name = "$volume_name Language Pack"; - $volume_name_classic = "$volume_name_classic Language Pack"; - $volume_name_classic_app = "$volume_name_classic_app Language Pack"; - } - if ( $installer::globals::patch ) - { - $volume_name = "$volume_name Patch"; - $volume_name_classic = "$volume_name_classic Patch"; - $volume_name_classic_app = "$volume_name_classic_app Patch"; - } - - # Create tar ball named tarball.tar.bz2 - # my $appfolder = $localtempdir . "/" . $volume_name . "\.app"; - my $appfolder = $localtempdir . "/" . $volume_name_classic_app . "\.app"; - my $contentsfolder = $appfolder . "/Contents"; - my $tarballname = "tarball.tar.bz2"; - - my $localfrom = cwd(); - chdir $appfolder; - - $systemcall = "tar -cjf $tarballname Contents/"; - - print "... $systemcall ...\n"; - my $localreturnvalue = system($systemcall); - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($localreturnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - my $sourcefile = $appfolder . "/" . $tarballname; - my $destfile = $contentsfolder . "/" . $tarballname; - - installer::systemactions::remove_complete_directory($contentsfolder); - installer::systemactions::create_directory($contentsfolder); - - installer::systemactions::copy_one_file($sourcefile, $destfile); - unlink($sourcefile); - - # Copy two files into installation set next to the tar ball - # 1. "osx_install.applescript" - # 2 "OpenOffice.org Languagepack" - - my $scriptrealfilename = "osx_install.applescript"; - my $scriptfilename = ""; - if ( $installer::globals::languagepack ) { $scriptfilename = "osx_install_languagepack.applescript"; } - if ( $installer::globals::helppack ) { $scriptfilename = "osx_install_helppack.applescript"; } - if ( $installer::globals::patch ) { $scriptfilename = "osx_install_patch.applescript"; } - my $scripthelpersolverfilename = "mac_install.script"; - # my $scripthelperrealfilename = $volume_name; - my $scripthelperrealfilename = $volume_name_classic_app; - my $translationfilename = $installer::globals::macinstallfilename; - - # Finding both files in solver - - my $scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$scriptfilename, $includepatharrayref, 0); - if ($$scriptref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script $scriptfilename!", "create_package"); } - my $scripthelperref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$scripthelpersolverfilename, $includepatharrayref, 0); - if ($$scripthelperref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script $scripthelpersolverfilename!", "create_package"); } - my $translationfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$translationfilename, $includepatharrayref, 0); - if ($$translationfileref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script translation file $translationfilename!", "create_package"); } - - $scriptfilename = $contentsfolder . "/" . $scriptrealfilename; - $scripthelperrealfilename = $contentsfolder . "/" . $scripthelperrealfilename; - - installer::systemactions::copy_one_file($$scriptref, $scriptfilename); - installer::systemactions::copy_one_file($$scripthelperref, $scripthelperrealfilename); - - # Replacing variables in script $scriptfilename - # Localizing script $scriptfilename - my $scriptfilecontent = installer::files::read_file($scriptfilename); - my $translationfilecontent = installer::files::read_file($$translationfileref); - localize_scriptfile($scriptfilecontent, $translationfilecontent, $languagestringref); - # replace_variables_in_scriptfile($scriptfilecontent, $volume_name, $allvariables); - replace_variables_in_scriptfile($scriptfilecontent, $volume_name_classic, $volume_name_classic_app, $allvariables); - installer::files::save_file($scriptfilename, $scriptfilecontent); - - chmod 0775, $scriptfilename; - chmod 0775, $scripthelperrealfilename; - - # Copy also Info.plist and icon file - # Finding both files in solver - my $iconfile = "ooo3_installer.icns"; - my $iconfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$iconfile, $includepatharrayref, 0); - if ($$iconfileref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script icon file $iconfile!", "create_package"); } - my $subdir = $contentsfolder . "/" . "Resources"; - if ( ! -d $subdir ) { installer::systemactions::create_directory($subdir); } - $destfile = $subdir . "/" . $iconfile; - installer::systemactions::copy_one_file($$iconfileref, $destfile); - - my $infoplistfile = "Info.plist.langpack"; - my $installname = "Info.plist"; - my $infoplistfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$infoplistfile, $includepatharrayref, 0); - if ($$infoplistfileref eq "") { installer::exiter::exit_program("ERROR: Could not find Apple script Info.plist: $infoplistfile!", "create_package"); } - $destfile = $contentsfolder . "/" . $installname; - installer::systemactions::copy_one_file($$infoplistfileref, $destfile); - - # Replacing variables in Info.plist - $scriptfilecontent = installer::files::read_file($destfile); - # replace_one_variable_in_shellscript($scriptfilecontent, $volume_name, "FULLPRODUCTNAME" ); - replace_one_variable_in_shellscript($scriptfilecontent, $volume_name_classic_app, "FULLAPPPRODUCTNAME" ); # OpenOffice.org Language Pack - installer::files::save_file($destfile, $scriptfilecontent); - - chdir $localfrom; - } - - $systemcall = "cd $localtempdir && hdiutil makehybrid -hfs -hfs-openfolder $folder $folder -hfs-volume-name \"$volume_name\" -ov -o $installdir/tmp && hdiutil convert -ov -format UDZO $installdir/tmp.dmg -o $archive && "; - if (( $ref ne "" ) && ( $$ref ne "" )) { - $systemcall .= "hdiutil unflatten $archive && Rez -a $$ref -o $archive && hdiutil flatten $archive &&"; - } - $systemcall .= "rm -f $installdir/tmp.dmg"; - } - else - { - # getting the path of the getuid.so (only required for Solaris and Linux) - my $getuidlibrary = ""; - my $ldpreloadstring = ""; - if (( $installer::globals::issolarisbuild ) || ( $installer::globals::islinuxbuild )) - { - $getuidlibrary = installer::download::get_path_for_library($includepatharrayref); - if ( $getuidlibrary ne "" ) { $ldpreloadstring = "LD_PRELOAD=" . $getuidlibrary; } - } - - $systemcall = "cd $tempdir; $ldpreloadstring tar -cf - . | gzip > $archive"; - } - - if ( $makesystemcall ) - { - print "... $systemcall ...\n"; - my $returnvalue = system($systemcall); - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - if ( $return_to_start ) { chdir($from); } - - print "... removing $tempdir ...\n"; - installer::systemactions::remove_complete_directory($tempdir); -} - -#################################################### -# Main method for creating the simple package -# installation sets -#################################################### - -sub create_simple_package -{ - my ( $filesref, $dirsref, $scpactionsref, $linksref, $unixlinksref, $loggingdir, $languagestringref, $shipinstalldir, $allsettingsarrayref, $allvariables, $includepatharrayref ) = @_; - - # Creating directories - - my $current_install_number = ""; - my $infoline = ""; - - installer::logger::print_message( "... creating installation directory ...\n" ); - installer::logger::include_header_into_logfile("Creating installation directory"); - - $installer::globals::csp_installdir = installer::worker::create_installation_directory($shipinstalldir, $languagestringref, \$current_install_number); - $installer::globals::csp_installlogdir = installer::systemactions::create_directory_next_to_directory($installer::globals::csp_installdir, "log"); - - my $installdir = $installer::globals::csp_installdir; - my $installlogdir = $installer::globals::csp_installlogdir; - - # Setting package name (similar to the download name) - my $packagename = ""; - - if ( $installer::globals::packageformat eq "archive" || - $installer::globals::packageformat eq "dmg" ) - { - $installer::globals::csp_languagestring = $$languagestringref; - - my $locallanguage = $installer::globals::csp_languagestring; - - if ( $allvariables->{'OOODOWNLOADNAME'} ) - { - $packagename = installer::download::set_download_filename(\$locallanguage, $allvariables); - } - else - { - $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "downloadname"); - if ( $installer::globals::languagepack ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "langpackdownloadname"); } - if ( $installer::globals::helppack ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "helppackdownloadname"); } - if ( $installer::globals::patch ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "patchdownloadname"); } - $packagename = installer::download::resolve_variables_in_downloadname($allvariables, $$downloadname, \$locallanguage); - } - } - - # Work around Windows problems with long pathnames (see issue 50885) by - # putting the to-be-archived installation tree into the temp directory - # instead of the module output tree (unless LOCALINSTALLDIR dictates - # otherwise, anyway); can be removed once issue 50885 is fixed: - my $tempinstalldir = $installdir; - if ( $installer::globals::iswindowsbuild && - $installer::globals::packageformat eq "archive" && - !$installer::globals::localinstalldirset ) - { - $tempinstalldir = File::Temp::tempdir; - } - - # Creating subfolder in installdir, which shall become the root of package or zip file - my $subfolderdir = ""; - if ( $packagename ne "" ) { $subfolderdir = $tempinstalldir . $installer::globals::separator . $packagename; } - else { $subfolderdir = $tempinstalldir; } - - if ( ! -d $subfolderdir ) { installer::systemactions::create_directory($subfolderdir); } - - # Create directories, copy files and ScpActions - - installer::logger::print_message( "... creating directories ...\n" ); - installer::logger::include_header_into_logfile("Creating directories:"); - - for ( my $i = 0; $i <= $#{$dirsref}; $i++ ) - { - my $onedir = ${$dirsref}[$i]; - - if ( $onedir->{'HostName'} ) - { - my $destdir = $subfolderdir . $installer::globals::separator . $onedir->{'HostName'}; - - if ( ! -d $destdir ) - { - if ( $^O =~ /cygwin/i ) # Cygwin performance check - { - $infoline = "Try to create directory $destdir\n"; - push(@installer::globals::logfileinfo, $infoline); - # Directories in $dirsref are sorted and all parents were added -> "mkdir" works without parent creation! - if ( ! ( -d $destdir )) { mkdir($destdir, 0775); } - } - else - { - installer::systemactions::create_directory_structure($destdir); - } - } - } - } - - # stripping files ?! - if (( $installer::globals::strip ) && ( ! $installer::globals::iswindowsbuild )) { installer::strip::strip_libraries($filesref, $languagestringref); } - - # copy Files - installer::logger::print_message( "... copying files ...\n" ); - installer::logger::include_header_into_logfile("Copying files:"); - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - - if (( $onefile->{'Styles'} ) && ( $onefile->{'Styles'} =~ /\bBINARYTABLE_ONLY\b/ )) { next; } - if (( $installer::globals::patch ) && ( $onefile->{'Styles'} ) && ( ! ( $onefile->{'Styles'} =~ /\bPATCH\b/ ))) { next; } - if (( $installer::globals::patch ) && ( $installer::globals::packageformat eq "dmg" )) { push(@installer::globals::patchfilecollector, "$onefile->{'destination'}\n"); } - - my $source = $onefile->{'sourcepath'}; - my $destination = $onefile->{'destination'}; - $destination = $subfolderdir . $installer::globals::separator . $destination; - - # Replacing $$ by $ is necessary to install files with $ in its name (back-masquerading) - # Otherwise, the following shell command does not work and the file list is not correct - $source =~ s/\$\$/\$/; - $destination =~ s/\$\$/\$/; - - if ( $^O =~ /cygwin/i ) # Cygwin performance, do not use copy_one_file. "chmod -R" at the end - { - my $copyreturn = copy($source, $destination); - - if ($copyreturn) - { - $infoline = "Copy: $source to $destination\n"; - $returnvalue = 1; - } - else - { - $infoline = "ERROR: Could not copy $source to $destination $!\n"; - $returnvalue = 0; - } - - push(@installer::globals::logfileinfo, $infoline); - } - else - { - installer::systemactions::copy_one_file($source, $destination); - - if ( ! $installer::globals::iswindowsbuild ) - { - # see issue 102274 - if ( $onefile->{'UnixRights'} ) - { - chmod oct($onefile->{'UnixRights'}), $destination; - } - } - } - } - - # creating Links - - installer::logger::print_message( "... creating links ...\n" ); - installer::logger::include_header_into_logfile("Creating links:"); - - for ( my $i = 0; $i <= $#{$linksref}; $i++ ) - { - my $onelink = ${$linksref}[$i]; - - if (( $installer::globals::patch ) && ( $onelink->{'Styles'} ) && ( ! ( $onelink->{'Styles'} =~ /\bPATCH\b/ ))) { next; } - - my $destination = $onelink->{'destination'}; - $destination = $subfolderdir . $installer::globals::separator . $destination; - my $destinationfile = $onelink->{'destinationfile'}; - - my $localcall = "ln -sf \'$destinationfile\' \'$destination\' \>\/dev\/null 2\>\&1"; - system($localcall); - - $infoline = "Creating link: \"ln -sf $destinationfile $destination\"\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - for ( my $i = 0; $i <= $#{$unixlinksref}; $i++ ) - { - my $onelink = ${$unixlinksref}[$i]; - - if (( $installer::globals::patch ) && ( $onelink->{'Styles'} ) && ( ! ( $onelink->{'Styles'} =~ /\bPATCH\b/ ))) { next; } - - my $target = $onelink->{'Target'}; - my $destination = $subfolderdir . $installer::globals::separator . $onelink->{'destination'}; - - my $localcall = "ln -sf \'$target\' \'$destination\' \>\/dev\/null 2\>\&1"; - system($localcall); - - $infoline = "Creating Unix link: \"ln -sf $target $destination\"\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - # Setting privileges for cygwin globally - - if ( $^O =~ /cygwin/i ) - { - installer::logger::print_message( "... changing privileges in $subfolderdir ...\n" ); - installer::logger::include_header_into_logfile("Changing privileges in $subfolderdir:"); - - my $localcall = "chmod -R 755 " . "\"" . $subfolderdir . "\""; - system($localcall); - } - - installer::logger::print_message( "... removing superfluous directories ...\n" ); - installer::logger::include_header_into_logfile("Removing superfluous directories:"); - - my ( $extensionfolder, $preregdir ) = get_extensions_dir($subfolderdir); - installer::systemactions::remove_empty_dirs_in_folder($extensionfolder); - - # Registering the extensions - - installer::logger::print_message( "... registering extensions ...\n" ); - installer::logger::include_header_into_logfile("Registering extensions:"); - register_extensions($subfolderdir, $languagestringref, $preregdir); - - if ( $installer::globals::compiler =~ /^unxmacx/ ) - { - installer::worker::put_scpactions_into_installset("$installdir/$packagename"); - } - - # Creating archive file - if ( $installer::globals::packageformat eq "archive" ) - { - create_package($tempinstalldir, $installdir, $packagename, $allvariables, $includepatharrayref, $languagestringref, $installer::globals::archiveformat); - } - elsif ( $installer::globals::packageformat eq "dmg" ) - { - create_package($installdir, $installdir, $packagename, $allvariables, $includepatharrayref, $languagestringref, ".dmg"); - } - - # Analyzing the log file - - installer::worker::clean_output_tree(); # removing directories created in the output tree - installer::worker::analyze_and_save_logfile($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number); -} - -1; diff --git a/solenv/bin/modules/installer/sorter.pm b/solenv/bin/modules/installer/sorter.pm deleted file mode 100644 index 1b24f8954..000000000 --- a/solenv/bin/modules/installer/sorter.pm +++ /dev/null @@ -1,116 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::sorter; - -######################################### -# Sorting an array of hashes -######################################### - -sub sorting_array_of_hashes -{ - my ($arrayref, $sortkey) = @_; - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - my $onehashunder = ${$arrayref}[$i]; - my $sortvalueunder = $onehashunder->{$sortkey}; - - for ( my $j = $i + 1; $j <= $#{$arrayref}; $j++ ) - { - my $onehashover = ${$arrayref}[$j]; - my $sortvalueover = $onehashover->{$sortkey}; - - if ( $sortvalueunder gt $sortvalueover) - { - ${$arrayref}[$i] = $onehashover; - ${$arrayref}[$j] = $onehashunder; - - $onehashunder = $onehashover; - $sortvalueunder = $sortvalueover; - } - } - } -} - -###################################################### -# Sorting an array of hashes with a numerical value -###################################################### - -sub sort_array_of_hashes_numerically -{ - my ($arrayref, $sortkey) = @_; - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - my $onehashunder = ${$arrayref}[$i]; - my $sortvalueunder = $onehashunder->{$sortkey}; - - for ( my $j = $i + 1; $j <= $#{$arrayref}; $j++ ) - { - my $onehashover = ${$arrayref}[$j]; - my $sortvalueover = $onehashover->{$sortkey}; - - if ( $sortvalueunder > $sortvalueover) - { - ${$arrayref}[$i] = $onehashover; - ${$arrayref}[$j] = $onehashunder; - - $onehashunder = $onehashover; - $sortvalueunder = $sortvalueover; - } - } - } -} - -######################################### -# Sorting an array of of strings -######################################### - -sub sorting_array_of_strings -{ - my ($arrayref) = @_; - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - my $onestringunder = ${$arrayref}[$i]; - - for ( my $j = $i + 1; $j <= $#{$arrayref}; $j++ ) - { - my $onestringover = ${$arrayref}[$j]; - - if ( $onestringunder gt $onestringover) - { - ${$arrayref}[$i] = $onestringover; - ${$arrayref}[$j] = $onestringunder; - $onestringunder = $onestringover; - } - } - } -} - -1; diff --git a/solenv/bin/modules/installer/strip.pm b/solenv/bin/modules/installer/strip.pm deleted file mode 100644 index a447427ea..000000000 --- a/solenv/bin/modules/installer/strip.pm +++ /dev/null @@ -1,139 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::strip; - -use installer::converter; -use installer::existence; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::systemactions; - -##################################################################### -# Checking whether a file has to be stripped -##################################################################### - -sub need_to_strip -{ - my ( $filename ) = @_; - - my $strip = 0; - - # Check using the "file" command - - open (FILE, "file $filename |"); - my $fileoutput = <FILE>; - close (FILE); - - if (( $fileoutput =~ /not stripped/i ) && ( $fileoutput =~ /\bELF\b/ )) { $strip = 1; } - - return $strip -} - -##################################################################### -# Checking whether a file has to be stripped -##################################################################### - -sub do_strip -{ - my ( $filename ) = @_; - - my $systemcall = "strip" . " " . $filename; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not strip $filename!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "SUCCESS: Stripped library $filename!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -##################################################################### -# Resolving all variables in the packagename. -##################################################################### - -sub strip_libraries -{ - my ( $filelist, $languagestringref ) = @_; - - installer::logger::include_header_into_logfile("Stripping files:"); - - my $strippeddirbase = installer::systemactions::create_directories("stripped", $languagestringref); - - if (! installer::existence::exists_in_array($strippeddirbase, \@installer::globals::removedirs)) - { - push(@installer::globals::removedirs, $strippeddirbase); - } - - for ( my $i = 0; $i <= $#{$filelist}; $i++ ) - { - my $sourcefilename = ${$filelist}[$i]->{'sourcepath'}; - - if ( need_to_strip($sourcefilename) ) - { - my $shortfilename = $sourcefilename; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$shortfilename); - - $infoline = "Strip: $shortfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - # copy file into directory for stripped libraries - - my $onelanguage = ${$filelist}[$i]->{'specificlanguage'}; - - # files without language into directory "00" - - if ($onelanguage eq "") { $onelanguage = "00"; } - - my $strippeddir = $strippeddirbase . $installer::globals::separator . $onelanguage; - installer::systemactions::create_directory($strippeddir); # creating language specific subdirectories - - my $destfilename = $strippeddir . $installer::globals::separator . $shortfilename; - installer::systemactions::copy_one_file($sourcefilename, $destfilename); - - # change sourcepath in files collector - - ${$filelist}[$i]->{'sourcepath'} = $destfilename; - - # strip file - - do_strip($destfilename); - } - } -} - -1; diff --git a/solenv/bin/modules/installer/substfilenamefiles.pm b/solenv/bin/modules/installer/substfilenamefiles.pm deleted file mode 100644 index 8a5736cc7..000000000 --- a/solenv/bin/modules/installer/substfilenamefiles.pm +++ /dev/null @@ -1,165 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::substfilenamefiles; - -use installer::exiter; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::systemactions; - -######################################################### -# Analyzing files with flag SUBST_FILENAME -######################################################### - -sub resolving_subst_filename_flag -{ - my ($filesarrayref, $variableshashref, $languagestringref) = @_; - - my $replacedirbase = installer::systemactions::create_directories("change_filename", $languagestringref); - - installer::logger::include_header_into_logfile("Files with flag SUBST_FILENAME:"); - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - my $styles = ""; - - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - - if ( $styles =~ /\bSUBST_FILENAME\b/ ) - { - # Files with flag SUBST_FILENAME must have a "Substitute" key - if (( ! $onefile->{'Substitute'} ) && ( ! $onefile->{'InstallName'} )) - { - installer::exiter::exit_program("ERROR: SUBST_FILENAME is set, but no Substitute and no InstallName defined at file $onefile->{'gid'}!", "resolving_subst_filename_flag"); - } - - # Language specific subdirectory - my $onelanguage = $onefile->{'specificlanguage'}; - - if ($onelanguage eq "") - { - $onelanguage = "00"; # files without language into directory "00" - } - - my $replacedir = $replacedirbase . $installer::globals::separator . $onelanguage . $installer::globals::separator; - installer::systemactions::create_directory($replacedir); # creating language specific directories - - # copy files and edit them with the variables defined in the zip.lst - - my $longfilename = 0; - - my $onefilename = $onefile->{'Name'}; - - my $sourcepath = $onefile->{'sourcepath'}; - - if ( $onefilename =~ /\Q$installer::globals::separator\E/ ) # filename begins with a slash, for instance /registry/schema/org/openoffice/VCL.xcs - { - $onefilename =~ s/^\s*\Q$installer::globals::separator\E//; - $longfilename = 1; - } - - my $destinationpath = $replacedir . $onefilename; - my $movepath = $destinationpath . ".orig"; - my $destdir = $replacedir; - - if ( $longfilename ) # the destination directory has to be created before copying - { - $destdir = $movepath; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$destdir); - installer::systemactions::create_directory_structure($destdir); - } - - my $copysuccess = installer::systemactions::copy_one_file($sourcepath, $movepath); - - if ( $copysuccess ) - { - if ( $onefile->{'Substitute'} ) - { - my $substitute = $onefile->{'Substitute'}; - - my $newfilename = $destinationpath; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$newfilename); - eval '$newfilename =~ ' . "$substitute"; - - my $longnewfilename = $destdir . $newfilename; - - $copysuccess = installer::systemactions::copy_one_file($movepath, $longnewfilename); - - # Saving the new file name - $onefile->{'Name'} = $newfilename; - - # Saving the new destination - my $newdest = $onefile->{'destination'}; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$newdest); - $onefile->{'destination'} = $newdest . $newfilename; - - # Saving the original source, where the file was found - $onefile->{'originalsourcepath'} = $onefile->{'sourcepath'}; - - # Writing the new sourcepath into the hashref, even if it was not copied - $onefile->{'sourcepath'} = $longnewfilename; - } - else - { - if ( $onefile->{'InstallName'} ) - { - my $installname = $onefile->{'InstallName'}; - - my $newfilename = $destinationpath; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$newfilename); - - my $longnewfilename = $destdir . $installname; - - $copysuccess = installer::systemactions::copy_one_file($movepath, $longnewfilename); - - # Saving the new file name - $onefile->{'Name'} = $installname; - - # Saving the new destination - my $newdest = $onefile->{'destination'}; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$newdest); - $onefile->{'destination'} = $newdest . $installname; - - # Saving the original source, where the file was found - $onefile->{'originalsourcepath'} = $onefile->{'sourcepath'}; - - # Writing the new sourcepath into the hashref, even if it was not copied - $onefile->{'sourcepath'} = $longnewfilename; - } - } - } - } - } - - my $infoline = "\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -1; diff --git a/solenv/bin/modules/installer/systemactions.pm b/solenv/bin/modules/installer/systemactions.pm deleted file mode 100644 index a83283aef..000000000 --- a/solenv/bin/modules/installer/systemactions.pm +++ /dev/null @@ -1,1636 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::systemactions; - -use Cwd; -use File::Copy; -use installer::converter; -use installer::exiter; -use installer::globals; -use installer::pathanalyzer; -use installer::remover; - -###################################################### -# Creating a new direcotory -###################################################### - -sub create_directory -{ - my ($directory) = @_; - - create_directory_with_privileges( $directory, "755" ); -} - -###################################################### -# Creating a new direcotory with defined privileges -###################################################### - -sub create_directory_with_privileges -{ - my ($directory, $privileges) = @_; - - my $returnvalue = 1; - my $infoline = ""; - my $localprivileges = oct("0".$privileges); # changes "777" to 0777 - - if (!(-d $directory)) - { - $returnvalue = mkdir($directory, $localprivileges); - - if ($returnvalue) - { - $infoline = "\nCreated directory: $directory\n"; - push(@installer::globals::logfileinfo, $infoline); - - chmod $localprivileges, $directory; - } - else - { - # New solution in parallel packing: It is possible, that the directory now exists, although it - # was not created in this process. There is only an important error, if the directory does not - # exist now. - - $infoline = "\nDid not succeed in creating directory: \"$directory\". Further attempts will follow.\n"; - push(@installer::globals::logfileinfo, $infoline); - - if (!(-d $directory)) - { - # Problem with parallel packaging? -> Try a little harder, before exiting. - # Did someone else remove the parent directory in the meantime? - my $parentdir = $directory; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$parentdir); - if (!(-d $parentdir)) - { - $returnvalue = mkdir($directory, $localprivileges); - - if ($returnvalue) - { - $infoline = "\nAttention: Successfully created parent directory (should already be created before): $parentdir\n"; - push(@installer::globals::logfileinfo, $infoline); - - chmod $localprivileges, $parentdir; - } - else - { - $infoline = "\Error: \"$directory\" could not be created. Even the parent directory \"$parentdir\" does not exist and could not be created.\n"; - push(@installer::globals::logfileinfo, $infoline); - if ( -d $parentdir ) - { - $infoline = "\nAttention: Finally the parent directory \"$parentdir\" exists, but I could not create it.\n"; - push(@installer::globals::logfileinfo, $infoline); - } - else - { - # Now it is time to exit, even the parent could not be created. - installer::exiter::exit_program("ERROR: Could not create parent directory \"$parentdir\"", "create_directory_with_privileges"); - } - } - } - - # At this point we have to assume, that the parent directory exist. - # Trying once more to create the desired directory - - $returnvalue = mkdir($directory, $localprivileges); - - if ($returnvalue) - { - $infoline = "\nAttention: Created directory \"$directory\" in the second try.\n"; - push(@installer::globals::logfileinfo, $infoline); - - chmod $localprivileges, $directory; - } - else - { - if ( -d $directory ) - { - $infoline = "\nAttention: Finally the directory \"$directory\" exists, but I could not create it.\n"; - push(@installer::globals::logfileinfo, $infoline); - } - else - { - # It is time to exit, even the second try failed. - installer::exiter::exit_program("ERROR: Failed to create the directory: $directory", "create_directory_with_privileges"); - } - } - } - else - { - $infoline = "\nAnother process created this directory in exactly this moment :-) : $directory\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } - } - else - { - $infoline = "\nAlready existing directory, did not create: $directory\n"; - push(@installer::globals::logfileinfo, $infoline); - - chmod $localprivileges, $directory; - } -} - -###################################################### -# Removing a new direcotory -###################################################### - -sub remove_empty_directory -{ - my ($directory) = @_; - - my $returnvalue = 1; - - if (-d $directory) - { - my $systemcall = "rmdir $directory"; - - $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not remove \"$directory\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Removed \"$directory\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } -} - -####################################################################### -# Calculating the number of languages in the string -####################################################################### - -sub get_number_of_langs -{ - my ($languagestring) = @_; - - my $number = 1; - - my $workstring = $languagestring; - - while ( $workstring =~ /^\s*(.*)_(.*?)\s*$/ ) - { - $workstring = $1; - $number++; - } - - return $number; -} - -####################################################################### -# Creating the directories, in which files are generated or unzipped -####################################################################### - -sub create_directories -{ - my ($newdirectory, $languagesref) =@_; - - $installer::globals::unpackpath =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes - - my $path = ""; - - if (( $newdirectory eq "uno" ) || ( $newdirectory eq "zip" ) || ( $newdirectory eq "cab" ) || ( $newdirectory =~ /rdb\s*$/i )) # special handling for zip files, cab files and services file because of performance reasons - { - if ( $installer::globals::temppathdefined ) { $path = $installer::globals::temppath; } - else { $path = $installer::globals::unpackpath; } - $path =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes - $path = $path . $installer::globals::separator; - } - elsif ( ( $newdirectory eq "jds" ) ) - { - if ( $installer::globals::jdstemppathdefined ) { $path = $installer::globals::jdstemppath; } - else { $path = $installer::globals::unpackpath; } - $path =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes - $path = $path . $installer::globals::separator; - installer::systemactions::create_directory($path); - } - else - { - $path = $installer::globals::unpackpath . $installer::globals::separator; - - # special handling, if LOCALINSTALLDIR is set - if (( $installer::globals::localinstalldirset ) && ( $newdirectory eq "install" )) - { - $installer::globals::localinstalldir =~ s/\Q$installer::globals::separator\E\s*$//; - $path = $installer::globals::localinstalldir . $installer::globals::separator; - } - } - - $infoline = "create_directories: Using $path for $newdirectory !\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($newdirectory eq "unzip" ) # special handling for common directory - { - $path = $path . ".." . $installer::globals::separator . "common" . $installer::globals::productextension . $installer::globals::separator; - create_directory($path); - - $path = $path . $newdirectory . $installer::globals::separator; - create_directory($path); - } - else - { - my $localproductname = $installer::globals::product; - my $localproductsubdir = ""; - - if ( $installer::globals::product =~ /^\s*(.+?)\_\_(.+?)\s*$/ ) - { - $localproductname = $1; - $localproductsubdir = $2; - } - - if ( $installer::globals::languagepack ) { $path = $path . $localproductname . "_languagepack" . $installer::globals::separator; } - elsif ( $installer::globals::helppack ) { $path = $path . $localproductname . "_helppack" . $installer::globals::separator; } - elsif ( $installer::globals::patch ) { $path = $path . $localproductname . "_patch" . $installer::globals::separator; } - else { $path = $path . $localproductname . $installer::globals::separator; } - - create_directory($path); - - if ( $localproductsubdir ) - { - $path = $path . $localproductsubdir . $installer::globals::separator; - create_directory($path); - } - - $path = $path . $installer::globals::installertypedir . $installer::globals::separator; - create_directory($path); - - $path = $path . $newdirectory . $installer::globals::separator; - create_directory($path); - - my $locallanguagesref = ""; - - if ( $$languagesref ) { $locallanguagesref = $$languagesref; } - - if ($newdirectory eq "install" && $installer::globals::ooodownloadfilename ne "" ) - { - # put packages into versioned path; needed only on linux (fdo#30837) - $path = $path . "$installer::globals::ooodownloadfilename" . $installer::globals::separator; - create_directory($path); - } - else - { - if ($locallanguagesref ne "") # this will be a path like "01_49", for Profiles and ConfigurationFiles, idt-Files - { - - my $languagestring = $$languagesref; - - if (length($languagestring) > $installer::globals::max_lang_length ) - { - my $number_of_languages = get_number_of_langs($languagestring); - chomp(my $shorter = `echo $languagestring | md5sum | sed -e "s/ .*//g"`); - my $id = substr($shorter, 0, 8); # taking only the first 8 digits - $languagestring = "lang_" . $number_of_languages . "_id_" . $id; - } - - $path = $path . $languagestring . $installer::globals::separator; - create_directory($path); - } - } - } - - installer::remover::remove_ending_pathseparator(\$path); - - $path = installer::converter::make_path_conform($path); - - return $path; -} - -######################## -# Copying one file -######################## - -sub copy_one_file -{ - my ($source, $dest) = @_; - - my ($returnvalue, $infoline); - - my $copyreturn = copy($source, $dest); - - if ($copyreturn) - { - $infoline = "Copy: $source to $dest\n"; - $returnvalue = 1; - } - else - { - $infoline = "ERROR: Could not copy $source to $dest $!\n"; - $returnvalue = 0; - } - - push(@installer::globals::logfileinfo, $infoline); - - if ( !$returnvalue ) { - return $returnvalue; - } - - # taking care of file attributes - if ($installer::globals::iswin && -f $dest) { - my $mode = -x $source ? 0775 : 0664; - my $mode_str = sprintf("%o", $mode); - my $chmodreturn = chmod($mode, $dest); - if ($chmodreturn) - { - $infoline = "chmod $mode_str, $dest\n"; - $returnvalue = 1; - } - else - { - $infoline = "WARNING: Could not chmod $dest: $!\n"; - $returnvalue = 0; - } - - push(@installer::globals::logfileinfo, $infoline); - } - - return $returnvalue; -} - -########################## -# Hard linking one file -########################## - -sub hardlink_one_file -{ - my ($source, $dest) = @_; - - my ($returnvalue, $infoline); - - my $copyreturn = link($source, $dest); - - if ($copyreturn) - { - $infoline = "Link: $source to $dest\n"; - $returnvalue = 1; - } - else - { - $infoline = "ERROR: Could not link $source to $dest\n"; - $returnvalue = 0; - } - - push(@installer::globals::logfileinfo, $infoline); - - return $returnvalue; -} - -########################## -# Soft linking one file -########################## - -sub softlink_one_file -{ - my ($source, $dest) = @_; - - my ($returnvalue, $infoline); - - my $linkreturn = symlink($source, $dest); - - if ($linkreturn) - { - $infoline = "Symlink: $source to $dest\n"; - $returnvalue = 1; - } - else - { - $infoline = "ERROR: Could not symlink $source to $dest\n"; - $returnvalue = 0; - } - - push(@installer::globals::logfileinfo, $infoline); - - return $returnvalue; -} - -######################## -# Renaming one file -######################## - -sub rename_one_file -{ - my ($source, $dest) = @_; - - my ($returnvalue, $infoline); - - my $renamereturn = rename($source, $dest); - - if ($renamereturn) - { - $infoline = "Rename: $source to $dest\n"; - $returnvalue = 1; - } - else - { - $infoline = "ERROR: Could not rename $source to $dest\n"; - $returnvalue = 0; - } - - push(@installer::globals::logfileinfo, $infoline); - - return $returnvalue; -} - -########################################## -# Copying all files from one directory -# to another directory -########################################## - -sub copy_directory -{ - my ($sourcedir, $destdir) = @_; - - my @sourcefiles = (); - - $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; - $destdir =~ s/\Q$installer::globals::separator\E\s*$//; - - my $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Copying files from directory $sourcedir to directory $destdir\n"; - push(@installer::globals::logfileinfo, $infoline); - - opendir(DIR, $sourcedir); - @sourcefiles = readdir(DIR); - closedir(DIR); - - my $onefile; - - foreach $onefile (@sourcefiles) - { - if ((!($onefile eq ".")) && (!($onefile eq ".."))) - { - my $sourcefile = $sourcedir . $installer::globals::separator . $onefile; - my $destfile = $destdir . $installer::globals::separator . $onefile; - if ( -f $sourcefile ) # only files, no directories - { - copy_one_file($sourcefile, $destfile); - } - } - } -} - -########################################## -# Copying all files from one directory -# to another directory -########################################## - -sub is_empty_dir -{ - my ($dir) = @_; - - my $directory_is_empty = 1; - my @sourcefiles = (); - - opendir(DIR, $dir); - @sourcefiles = readdir(DIR); - closedir(DIR); - - my $onefile; - my @realcontent = (); - - foreach $onefile (@sourcefiles) - { - if ((!($onefile eq ".")) && (!($onefile eq ".."))) - { - push(@realcontent, $onefile); - } - } - - if ( $#realcontent > -1 ) { $directory_is_empty = 0; } - - return $directory_is_empty; -} - -##################################################################### -# Creating hard links to a complete directory with sub directories. -##################################################################### - -sub hardlink_complete_directory -{ - my ($sourcedir, $destdir) = @_; - - my @sourcefiles = (); - - $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; - $destdir =~ s/\Q$installer::globals::separator\E\s*$//; - - if ( ! -d $destdir ) { create_directory($destdir); } - - my $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Creating hard links for all files from directory $sourcedir to directory $destdir\n"; - push(@installer::globals::logfileinfo, $infoline); - - opendir(DIR, $sourcedir); - @sourcefiles = readdir(DIR); - closedir(DIR); - - my $onefile; - - foreach $onefile (@sourcefiles) - { - if ((!($onefile eq ".")) && (!($onefile eq ".."))) - { - my $source = $sourcedir . $installer::globals::separator . $onefile; - my $dest = $destdir . $installer::globals::separator . $onefile; - if ( -f $source ) # only files, no directories - { - hardlink_one_file($source, $dest); - } - if ( -d $source ) # recursive - { - hardlink_complete_directory($source, $dest); - } - } - } -} - -##################################################################### -# Creating hard links to a complete directory with sub directories. -##################################################################### - -sub softlink_complete_directory -{ - my ($sourcedir, $destdir, $depth) = @_; - - my @sourcefiles = (); - - $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; - $destdir =~ s/\Q$installer::globals::separator\E\s*$//; - - if ( ! -d $destdir ) { create_directory($destdir); } - - my $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Creating soft links for all files from directory $sourcedir to directory $destdir\n"; - push(@installer::globals::logfileinfo, $infoline); - - opendir(DIR, $sourcedir); - @sourcefiles = readdir(DIR); - closedir(DIR); - - my $onefile; - - foreach $onefile (@sourcefiles) - { - if ((!($onefile eq ".")) && (!($onefile eq ".."))) - { - my $source = $sourcedir . $installer::globals::separator . $onefile; - my $dest = $destdir . $installer::globals::separator . $onefile; - if ( -f $source ) # only files, no directories - { - my $localsource = $source; - if ( $depth > 0 ) { for ( my $i = 1; $i <= $depth; $i++ ) { $localsource = "../" . $localsource; } } - softlink_one_file($localsource, $dest); - } - if ( -d $source ) # recursive - { - my $newdepth = $depth + 1; - softlink_complete_directory($source, $dest, $newdepth); - } - } - } -} - -##################################################### -# Copying a complete directory with sub directories. -##################################################### - -sub copy_complete_directory -{ - my ($sourcedir, $destdir) = @_; - - my @sourcefiles = (); - - $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; - $destdir =~ s/\Q$installer::globals::separator\E\s*$//; - - if ( ! -d $destdir ) { create_directory($destdir); } - - my $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Copying files from directory $sourcedir to directory $destdir\n"; - push(@installer::globals::logfileinfo, $infoline); - - opendir(DIR, $sourcedir); - @sourcefiles = readdir(DIR); - closedir(DIR); - - my $onefile; - - foreach $onefile (@sourcefiles) - { - if ((!($onefile eq ".")) && (!($onefile eq ".."))) - { - my $source = $sourcedir . $installer::globals::separator . $onefile; - my $dest = $destdir . $installer::globals::separator . $onefile; - if ( -f $source ) # only files, no directories - { - copy_one_file($source, $dest); - } - if ( -d $source ) # recursive - { - if ((!( $source =~ /packages\/SUNW/ )) && (!( $source =~ /packages\/OOO/ ))) # do not copy complete Solaris packages! - { - copy_complete_directory($source, $dest); - } - } - } - } -} - -##################################################################################### -# Copying a complete directory with sub directories, but not the CVS directories. -##################################################################################### - -sub copy_complete_directory_without_cvs -{ - my ($sourcedir, $destdir) = @_; - - my @sourcefiles = (); - - $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; - $destdir =~ s/\Q$installer::globals::separator\E\s*$//; - - if ( ! -d $destdir ) { create_directory($destdir); } - - my $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Copying files from directory $sourcedir to directory $destdir (without CVS)\n"; - push(@installer::globals::logfileinfo, $infoline); - - opendir(DIR, $sourcedir); - @sourcefiles = readdir(DIR); - closedir(DIR); - - my $onefile; - - foreach $onefile (@sourcefiles) - { - if ((!($onefile eq ".")) && (!($onefile eq "..")) && (!($onefile eq "CVS"))) - { - my $source = $sourcedir . $installer::globals::separator . $onefile; - my $dest = $destdir . $installer::globals::separator . $onefile; - if ( -f $source ) # only files, no directories - { - copy_one_file($source, $dest); - } - if ( -d $source ) # recursive - { - copy_complete_directory_without_cvs($source, $dest); - } - } - } -} - -##################################################### -# Copying all files with a specified file extension -# from one directory to another directory. -##################################################### - -sub copy_directory_with_fileextension -{ - my ($sourcedir, $destdir, $extension) = @_; - - my @sourcefiles = (); - - $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; - $destdir =~ s/\Q$installer::globals::separator\E\s*$//; - - $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Copying files with extension $extension from directory $sourcedir to directory $destdir\n"; - push(@installer::globals::logfileinfo, $infoline); - - opendir(DIR, $sourcedir); - @sourcefiles = readdir(DIR); - closedir(DIR); - - my $onefile; - - foreach $onefile (@sourcefiles) - { - if ((!($onefile eq ".")) && (!($onefile eq ".."))) - { - if ( $onefile =~ /\.$extension\s*$/ ) # only copying specified files - { - my $sourcefile = $sourcedir . $installer::globals::separator . $onefile; - my $destfile = $destdir . $installer::globals::separator . $onefile; - if ( -f $sourcefile ) # only files, no directories - { - copy_one_file($sourcefile, $destfile); - } - } - } - } -} - -######################################################### -# Copying all files without a specified file extension -# from one directory to another directory. -######################################################### - -sub copy_directory_except_fileextension -{ - my ($sourcedir, $destdir, $extension) = @_; - - my @sourcefiles = (); - - $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//; - $destdir =~ s/\Q$installer::globals::separator\E\s*$//; - - $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Copying files without extension $extension from directory $sourcedir to directory $destdir\n"; - push(@installer::globals::logfileinfo, $infoline); - - opendir(DIR, $sourcedir); - @sourcefiles = readdir(DIR); - closedir(DIR); - - my $onefile; - - foreach $onefile (@sourcefiles) - { - if ((!($onefile eq ".")) && (!($onefile eq ".."))) - { - if ( ! ( $onefile =~ /\.$extension\s*$/ )) # only copying not having the specified extension - { - my $sourcefile = $sourcedir . $installer::globals::separator . $onefile; - my $destfile = $destdir . $installer::globals::separator . $onefile; - if ( -f $sourcefile ) # only files, no directories - { - copy_one_file($sourcefile, $destfile); - } - } - } - } -} - -######################################################## -# Renaming all files with a specified file extension -# in a specified directory. -# Example: "Feature.idt.01" -> "Feature.idt" -######################################################## - -sub rename_files_with_fileextension -{ - my ($dir, $extension) = @_; - - my @sourcefiles = (); - - $dir =~ s/\Q$installer::globals::separator\E\s*$//; - - my $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Renaming files with extension \"$extension\" in the directory $dir\n"; - push(@installer::globals::logfileinfo, $infoline); - - opendir(DIR, $dir); - @sourcefiles = readdir(DIR); - closedir(DIR); - - my $onefile; - - foreach $onefile (@sourcefiles) - { - if ((!($onefile eq ".")) && (!($onefile eq ".."))) - { - if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ ) # only renaming specified files - { - my $destfile = $1; - my $sourcefile = $dir . $installer::globals::separator . $onefile; - $destfile = $dir . $installer::globals::separator . $destfile; - if ( -f $sourcefile ) # only files, no directories - { - rename_one_file($sourcefile, $destfile); - } - } - } - } -} - -######################################################## -# Finding all files with a specified file extension -# in a specified directory. -######################################################## - -sub find_file_with_file_extension -{ - my ($extension, $dir) = @_; - - my @allfiles = (); - - $dir =~ s/\Q$installer::globals::separator\E\s*$//; - - my $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Searching files with extension \"$extension\" in the directory $dir\n"; - push(@installer::globals::logfileinfo, $infoline); - - opendir(DIR, $dir); - @sourcefiles = sort readdir(DIR); - closedir(DIR); - - my $onefile; - - foreach $onefile (@sourcefiles) - { - if ((!($onefile eq ".")) && (!($onefile eq ".."))) - { - if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ ) - { - push(@allfiles, $onefile) - } - } - } - - return \@allfiles; -} - -############################################################## -# Creating a unique directory, for example "01_inprogress_7" -# in the install directory. -############################################################## - -sub make_numbered_dir -{ - my ($newstring, $olddir) = @_; - - my $basedir = $olddir; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir); - - my $alldirs = get_all_directories($basedir); - - # searching for the highest number extension - - my $maxnumber = 0; - - for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) - { - if ( ${$alldirs}[$i] =~ /\_(\d+)\s*$/ ) - { - my $number = $1; - if ( $number > $maxnumber ) { $maxnumber = $number; } - } - } - - my $newnumber = $maxnumber + 1; - - my $newdir = $olddir . "_" . $newstring . "_" . $newnumber; - - my $returndir = ""; - - if ( move($olddir, $newdir) ) - { - $infoline = "\nMoved directory from $olddir to $newdir\n"; - push(@installer::globals::logfileinfo, $infoline); - $returndir = $newdir; - } - else - { - $infoline = "\nATTENTION: Could not move directory from $olddir to $newdir, \"make_numbered_dir\"\n"; - push(@installer::globals::logfileinfo, $infoline); - $returndir = $olddir; - } - - return $returndir; -} - -############################################################## -# Determining the highest number in the install directory. -############################################################## - -sub determine_maximum_number -{ - my ($dir, $languagestringref) = @_; - - my $basedir = $dir; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir); - - my $alldirs = get_all_directories($basedir); - - my $maxnumber = 1; - - # In control.pm the installation directory is determined as: - # $installer::globals::build . "_" . $installer::globals::lastminor . "_" . - # "native_inprogress-number_" . $$languagesref . "\." . $installer::globals::buildid; - - # searching for the highest number extension after the first "-", which belongs to - # $installer::globals::build, $installer::globals::lastminor and $installer::globals::buildid - # In this step not looking for the language! - - my @correctbuildiddirs = (); - - for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) - { - my $onedir = ${$alldirs}[$i]; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$onedir); - - if ( $onedir =~ /^\s*\Q$installer::globals::build\E\_\Q$installer::globals::lastminor\E\_(.*?)\-(\d+)\_(.*?)\.\Q$installer::globals::buildid\E\s*$/ ) - { - my $number = $2; - if ( $number > $maxnumber ) { $maxnumber = $number; } - push(@correctbuildiddirs, $onedir); - } - } - - # From all directories with correct $installer::globals::build, $installer::globals::lastminor - # and $installer::globals::buildid, those directories, which already have the maximum number - # have to be selected - - my @maximumnumberdirs = (); - - for ( my $i = 0; $i <= $#correctbuildiddirs; $i++ ) - { - my $onedir = $correctbuildiddirs[$i]; - - if ( $onedir =~ /^\s*(.*?)\-(\d+)\_(.*?)\.(.*?)\s*$/ ) - { - my $number = $2; - - if ( $number == $maxnumber ) - { - push(@maximumnumberdirs, $onedir); - } - } - } - - # @maximumnumberdirs contains only those directories with correct $installer::globals::build, - # $installer::globals::lastminor and $installer::globals::buildid, which already have the maximum number. - # If the current language is part of this directory, the number has to be increased. - - my $increase_counter = 0; - - for ( my $i = 0; $i <= $#maximumnumberdirs; $i++ ) - { - my $onedir = $maximumnumberdirs[$i]; - - if ( $onedir =~ /^\s*(.*?)\-(\d+)\_(.*?)\.(.*?)\s*$/ ) - { - my $number = $2; - my $languagestring = $3; - - if ( $languagestring eq $$languagestringref ) - { - $increase_counter = 1; - } - } - } - - if ( $increase_counter ) - { - $maxnumber = $maxnumber + 1; - } - - return $maxnumber; -} - -##################################################################################### -# Renaming a directory by exchanging a string, for example from "01_inprogress_7" -# to "01_witherror_7". -##################################################################################### - -sub rename_string_in_directory -{ - my ($olddir, $oldstring, $newstring) = @_; - - my $newdir = $olddir; - my $infoline = ""; - - $newdir =~ s/$oldstring/$newstring/g; - - if (( -d $newdir ) && ( $olddir ne $newdir )) { remove_complete_directory($newdir, 1); } - - if ( move($olddir, $newdir) ) - { - $infoline = "\nMoved directory from $olddir to $newdir\n"; - push(@installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "\nATTENTION: Could not move directory from $olddir to $newdir, \"rename_string_in_directory\"\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - return $newdir; -} - -###################################################### -# Returning the complete directory name, -# input is the first part of the directory name. -###################################################### - -sub get_directoryname -{ - my ($searchdir, $startstring) = @_; - - my $dirname = ""; - my $founddir = 0; - my $direntry; - - opendir(DIR, $searchdir); - - foreach $direntry (readdir (DIR)) - { - next if $direntry eq "."; - next if $direntry eq ".."; - - if (( -d $direntry ) && ( $direntry =~ /^\s*\Q$startstring\E/ )) - { - $dirname = $direntry; - $founddir = 1; - last; - } - } - - closedir(DIR); - - if ( ! $founddir ) { installer::exiter::exit_program("ERROR: Did not find directory beginning with $startstring in directory $searchdir", "get_directoryname"); } - - return $dirname; -} - - -################################### -# Renaming a directory -################################### - -sub rename_directory -{ - my ($olddir, $newdir) = @_; - - my $infoline = ""; - - if ( move($olddir, $newdir) ) - { - $infoline = "\nMoved directory from $olddir to $newdir\n"; - push(@installer::globals::logfileinfo, $infoline); - } - else - { - installer::exiter::exit_program("ERROR: Could not move directory from $olddir to $newdir $!", "rename_directory"); - } - - return $newdir; -} - -############################################################## -# Creating a directory next to an existing directory -############################################################## - -sub create_directory_next_to_directory -{ - my ($topdir, $dirname) = @_; - - my $basedir = $topdir; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir); - - $basedir =~ s/\Q$installer::globals::separator\E\s*$//; - - my $newdir = $basedir . $installer::globals::separator . $dirname; - - create_directory($newdir); - - return $newdir; -} - -############################################################## -# Collecting all directories inside a directory -############################################################## - -sub get_all_directories -{ - my ($basedir) = @_; - - my @alldirs = (); - my $direntry; - - $basedir =~ s/\Q$installer::globals::separator\E\s*$//; - - opendir(DIR, $basedir); - - foreach $direntry (readdir (DIR)) - { - next if $direntry eq "."; - next if $direntry eq ".."; - - my $completeentry = $basedir . $installer::globals::separator . $direntry; - - if ( -d $completeentry ) { push(@alldirs, $completeentry); } - } - - closedir(DIR); - - return \@alldirs; -} - -############################################################## -# Collecting all directories inside a directory -# Returning without path -############################################################## - -sub get_all_directories_without_path -{ - my ($basedir) = @_; - - my @alldirs = (); - my $direntry; - - $basedir =~ s/\Q$installer::globals::separator\E\s*$//; - - opendir(DIR, $basedir); - - foreach $direntry (readdir (DIR)) - { - next if $direntry eq "."; - next if $direntry eq ".."; - - my $completeentry = $basedir . $installer::globals::separator . $direntry; - - if ( -d $completeentry ) { push(@alldirs, $direntry); } - } - - closedir(DIR); - - return \@alldirs; -} - -############################################################## -# Collecting all files inside one directory -############################################################## - -sub get_all_files_from_one_directory -{ - my ($basedir) = @_; - - my @allfiles = (); - my $direntry; - - $basedir =~ s/\Q$installer::globals::separator\E\s*$//; - - opendir(DIR, $basedir); - - foreach $direntry (readdir (DIR)) - { - next if $direntry eq "."; - next if $direntry eq ".."; - - my $completeentry = $basedir . $installer::globals::separator . $direntry; - - if ( -f $completeentry ) { push(@allfiles, $completeentry); } - } - - closedir(DIR); - - return \@allfiles; -} - -############################################################## -# Collecting all files inside one directory -############################################################## - -sub get_all_files_from_one_directory_without_path -{ - my ($basedir) = @_; - - my @allfiles = (); - my $direntry; - - $basedir =~ s/\Q$installer::globals::separator\E\s*$//; - - opendir(DIR, $basedir); - - foreach $direntry (readdir (DIR)) - { - next if $direntry eq "."; - next if $direntry eq ".."; - - my $completeentry = $basedir . $installer::globals::separator . $direntry; - - if ( -f $completeentry ) { push(@allfiles, $direntry); } - } - - closedir(DIR); - - return \@allfiles; -} - -############################################################## -# Collecting all files and directories inside one directory -############################################################## - -sub read_directory -{ - my ($basedir) = @_; - - my @allcontent = (); - my $direntry; - - $basedir =~ s/\Q$installer::globals::separator\E\s*$//; - - opendir(DIR, $basedir); - - foreach $direntry (readdir (DIR)) - { - next if $direntry eq "."; - next if $direntry eq ".."; - - my $completeentry = $basedir . $installer::globals::separator . $direntry; - - if (( -f $completeentry ) || ( -d $completeentry )) { push(@allcontent, $completeentry); } - } - - closedir(DIR); - - return \@allcontent; -} - -############################################################## -# Finding the new content in a directory -############################################################## - -sub find_new_content_in_directory -{ - my ( $basedir, $oldcontent ) = @_; - - my @newcontent = (); - my @allcontent = (); - - my $direntry; - - $basedir =~ s/\Q$installer::globals::separator\E\s*$//; - - opendir(DIR, $basedir); - - foreach $direntry (readdir (DIR)) - { - next if $direntry eq "."; - next if $direntry eq ".."; - - my $completeentry = $basedir . $installer::globals::separator . $direntry; - - if (( -f $completeentry ) || ( -d $completeentry )) - { - push(@allcontent, $completeentry); - if (! installer::existence::exists_in_array($completeentry, $oldcontent)) - { - push(@newcontent, $completeentry); - } - } - } - - closedir(DIR); - - return (\@newcontent, \@allcontent); -} - -############################################################## -# Trying to create a directory, no error if this fails -############################################################## - -sub try_to_create_directory -{ - my ($directory) = @_; - - my $returnvalue = 1; - my $created_directory = 0; - - if (!(-d $directory)) - { - $returnvalue = mkdir($directory, 0775); - - if ($returnvalue) - { - $created_directory = 1; - $infoline = "\nCreated directory: $directory\n"; - push(@installer::globals::logfileinfo, $infoline); - - chmod 0775, $directory; - } - else - { - $created_directory = 0; - } - } - else - { - $created_directory = 1; - } - - return $created_directory; -} - -############################################################## -# Creating a complete directory structure -############################################################## - -sub create_directory_structure -{ - my ($directory) = @_; - - if ( ! try_to_create_directory($directory) ) - { - my $parentdir = $directory; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$parentdir); - - my $infoline = "INFO: Did not create directory $directory\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Now trying to create parent directory $parentdir\n"; - push(@installer::globals::logfileinfo, $infoline); - - create_directory_structure($parentdir); # recursive - } - - create_directory($directory); # now it has to succeed -} - -###################################################### -# Removing a complete directory with subdirectories -###################################################### - -sub remove_complete_directory -{ - my ($directory, $start) = @_; - - my @content = (); - my $infoline = ""; - - $directory =~ s/\Q$installer::globals::separator\E\s*$//; - - if ( -d $directory ) - { - if ( $start ) - { - $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Removing directory $directory\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - opendir(DIR, $directory); - @content = readdir(DIR); - closedir(DIR); - - my $oneitem; - - foreach $oneitem (@content) - { - if ((!($oneitem eq ".")) && (!($oneitem eq ".."))) - { - my $item = $directory . $installer::globals::separator . $oneitem; - - if ( -f $item || -l $item ) # deleting files or links - { - unlink($item); - } - - if ( -d $item ) # recursive - { - remove_complete_directory($item, 0); - } - } - } - - # try to remove empty directory - - my $returnvalue = rmdir $directory; - - if ( ! $returnvalue ) - { - $infoline = "Warning: Problem with removing empty dir $directory\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - # try a little bit harder (sometimes there is a performance problem) - if ( -d $directory ) - { - for ( my $j = 1; $j <= 3; $j++ ) - { - if ( -d $directory ) - { - $infoline = "\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Warning (Try $j): Problems with removing directory $directory\n"; - push(@installer::globals::logfileinfo, $infoline); - - $returnvalue = rmdir $directory; - - if ( $returnvalue ) - { - $infoline = "Successfully removed empty dir $directory\n"; - push(@installer::globals::logfileinfo, $infoline); - } else { - $infoline = "Warning: rmdir $directory failed.\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } - } - } - } -} - -###################################################### -# Creating a unique directory with number extension -###################################################### - -sub create_unique_directory -{ - my ($directory) = @_; - - $directory =~ s/\Q$installer::globals::separator\E\s*$//; - $directory = $directory . "_INCREASINGNUMBER"; - - my $counter = 1; - my $created = 0; - my $localdirectory = ""; - - do - { - $localdirectory = $directory; - $localdirectory =~ s/INCREASINGNUMBER/$counter/; - $counter++; - - if ( ! -d $localdirectory ) - { - create_directory($localdirectory); - $created = 1; - } - } - while ( ! $created ); - - return $localdirectory; -} - -###################################################### -# Creating a unique directory with pid extension -###################################################### - -sub create_pid_directory -{ - my ($directory) = @_; - - $directory =~ s/\Q$installer::globals::separator\E\s*$//; - my $pid = $$; # process id - my $time = time(); # time - - $directory = $directory . "_" . $pid . $time; - - if ( ! -d $directory ) { create_directory($directory); } - else { installer::exiter::exit_program("ERROR: Directory $directory already exists!", "create_pid_directory"); } - - return $directory; -} - -############################################################## -# Reading all files from a directory and its subdirectories -############################################################## - -sub read_complete_directory -{ - my ($directory, $pathstring, $filecollector) = @_; - - my @content = (); - opendir(DIR, $directory); - @content = readdir(DIR); - closedir(DIR); - - my $onefile; - - foreach $onefile (@content) - { - if ((!($onefile eq ".")) && (!($onefile eq ".."))) - { - my $completefilename = $directory . $installer::globals::separator . $onefile; - my $sep = ""; - if ( $pathstring ne "" ) { $sep = $installer::globals::separator; } - - if ( ! -d $completefilename ) # only files, no directories - { - my $content = $pathstring . $sep . $onefile; - push(@{$filecollector}, $content); - } - else # recursive for directories - { - my $newpathstring = $pathstring . $sep . $onefile; - read_complete_directory($completefilename, $newpathstring, $filecollector); - } - } - } -} - -############################################################## -# Reading all files from a directory and its subdirectories -# Version 2 -############################################################## - -sub read_full_directory { - my ( $currentdir, $pathstring, $collector ) = @_; - my $item; - my $fullname; - local *DH; - - unless (opendir(DH, $currentdir)) - { - return; - } - while (defined ($item = readdir(DH))) - { - next if($item eq "." or $item eq ".."); - $fullname = $currentdir . $installer::globals::separator . $item; - my $sep = ""; - if ( $pathstring ne "" ) { $sep = $installer::globals::separator; } - - if( -d $fullname) - { - my $newpathstring = $pathstring . $sep . $item; - read_full_directory($fullname, $newpathstring, $collector) if(-d $fullname); - } - else - { - my $content = $pathstring . $sep . $item; - push(@{$collector}, $content); - } - } - closedir(DH); - return -} - -############################################################## -# Removing all empty directories below a specified directory -############################################################## - -sub remove_empty_dirs_in_folder -{ - my ( $dir ) = @_; - - my @content = (); - my $infoline = ""; - - $dir =~ s/\Q$installer::globals::separator\E\s*$//; - - if ( -d $dir ) - { - opendir(DIR, $dir); - @content = readdir(DIR); - closedir(DIR); - - my $oneitem; - - foreach $oneitem (@content) - { - if ((!($oneitem eq ".")) && (!($oneitem eq ".."))) - { - my $item = $dir . $installer::globals::separator . $oneitem; - - if ( -d $item ) # recursive - { - remove_empty_dirs_in_folder($item); - } - } - } - - # try to remove empty directory - my $returnvalue = rmdir $dir; - - if ( $returnvalue ) - { - $infoline = "Successfully removed empty dir $dir\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - } - -} - -1; diff --git a/solenv/bin/modules/installer/upx.pm b/solenv/bin/modules/installer/upx.pm deleted file mode 100644 index 155564bba..000000000 --- a/solenv/bin/modules/installer/upx.pm +++ /dev/null @@ -1,156 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::upx; - -use installer::converter; -use installer::existence; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::scriptitems; -use installer::systemactions; - -##################################################################### -# Checking whether a file has to be stripped -##################################################################### - -sub is_upx_candidate -{ - my ( $filename, $onefile ) = @_; - - my $useupx = 0; - - if (( $filename =~ /\.so\s*$/ ) || - ( $filename =~ /\.dll\s*$/ ) || - ( $filename =~ /\.exe\s*$/ ) || - ( $filename =~ /\.bin\s*$/ )) - { - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - if ( ! ( $styles =~ /\bDONT_UPX\b/ )) { $useupx = 1; } - } - - return $useupx; -} - -##################################################################### -# Checking whether a file has to be stripped -##################################################################### - -sub do_upx -{ - my ( $filename ) = @_; - - my $compression = "9"; - my $systemcall = $installer::globals::upxfile . " -" . $compression . " " . $filename; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "WARNING: Could not successfully upx $filename! Using original file.\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "SUCCESS: upx $filename!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return $returnvalue; -} - -##################################################################### -# Using upx to decrease file size -##################################################################### - -sub upx_on_libraries -{ - my ( $filelist, $languagestringref) = @_; - - installer::logger::include_header_into_logfile("UPX'ing files:"); - my $infoline = ""; - - if ( ! $installer::globals::upx_in_path ) - { - $infoline = "\n\nWarning: This is an UPX product, but upx was not found in PATH!\n\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Using upx: $installer::globals::upxfile\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $upxdirbase = installer::systemactions::create_directories("upx", $languagestringref); - - if (! installer::existence::exists_in_array($upxdirbase, \@installer::globals::removedirs)) - { - push(@installer::globals::removedirs, $upxdirbase); - } - - for ( my $i = 0; $i <= $#{$filelist}; $i++ ) - { - my $sourcefilename = ${$filelist}[$i]->{'sourcepath'}; - - if ( is_upx_candidate($sourcefilename, ${$filelist}[$i]) ) - { - my $shortfilename = $sourcefilename; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$shortfilename); - - $infoline = "\nUpx: $shortfilename"; - push( @installer::globals::logfileinfo, $infoline); - - # copy file into directory for stripped libraries - my $onelanguage = ${$filelist}[$i]->{'specificlanguage'}; - - # files without language into directory "00" - if ($onelanguage eq "") { $onelanguage = "00"; } - - my $upxdir = $upxdirbase . $installer::globals::separator . $onelanguage; - installer::systemactions::create_directory($upxdir); # creating language specific subdirectories - - my $destfilename = $upxdir . $installer::globals::separator . $shortfilename; - installer::systemactions::copy_one_file($sourcefilename, $destfilename); - - # change sourcepath in files collector - ${$filelist}[$i]->{'sourcepath'} = $destfilename; - - # do upx on file - my $return = do_upx($destfilename); - - # Using original file, if upx was not successful (no reason for error) - if ( $return ) { ${$filelist}[$i]->{'sourcepath'} = $sourcefilename; } - } - } - } -} - -1; diff --git a/solenv/bin/modules/installer/windows/admin.pm b/solenv/bin/modules/installer/windows/admin.pm deleted file mode 100644 index c071c21cc..000000000 --- a/solenv/bin/modules/installer/windows/admin.pm +++ /dev/null @@ -1,899 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::admin; - -use File::Copy; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::pathanalyzer; -use installer::systemactions; -use installer::worker; -use installer::windows::idtglobal; - -################################################################################# -# Unpacking cabinet files with expand -################################################################################# - -sub unpack_cabinet_file -{ - my ($cabfilename, $unpackdir) = @_; - - my $infoline = "Unpacking cabinet file: $cabfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $expandfile = "expand.exe"; # Has to be in the path - - # expand.exe has to be located in the system directory. - # Cygwin has another tool expand.exe, that converts tabs to spaces. This cannot be used of course. - # But this wrong expand.exe is typically in the PATH before this expand.exe, to unpack - # cabinet files. - - if ( $^O =~ /cygwin/i ) - { - $expandfile = qx(cygpath -u "$ENV{WINDIR}"/System32/expand.exe); - chomp $expandfile; - } - - my $expandlogfile = $unpackdir . $installer::globals::separator . "expand.log"; - - # exclude cabinet file - - my $systemcall = ""; - if ( $^O =~ /cygwin/i ) { - my $localunpackdir = qx{cygpath -w "$unpackdir"}; - chomp ($localunpackdir); - $localunpackdir =~ s/\\/\\\\/g; - $cabfilename =~ s/\\/\\\\/g; - $cabfilename =~ s/\s*$//g; - $systemcall = $expandfile . " " . $cabfilename . " -F:\* " . $localunpackdir . " \> " . $expandlogfile; - } - else - { - $systemcall = $expandfile . " " . $cabfilename . " -F:\* " . $unpackdir . " \> " . $expandlogfile; - } - - my $returnvalue = system($systemcall); - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Could not extract cabinet file: $mergemodulehash->{'cabinetfile'} !", "change_file_table"); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -################################################################################# -# Include tables into a msi database -################################################################################# - -sub include_tables_into_pcpfile -{ - my ($fullmsidatabasepath, $workdir, $tables) = @_; - - my $msidb = "msidb.exe"; # Has to be in the path - my $infoline = ""; - my $systemcall = ""; - my $returnvalue = ""; - - # Make all table 8+3 conform - my $alltables = installer::converter::convert_stringlist_into_array(\$tables, " "); - - for ( my $i = 0; $i <= $#{$alltables}; $i++ ) - { - my $tablename = ${$alltables}[$i]; - $tablename =~ s/\s*$//; - my $namelength = length($tablename); - if ( $namelength > 8 ) - { - my $newtablename = substr($tablename, 0, 8); # name, offset, length - my $oldfile = $workdir . $installer::globals::separator . $tablename . ".idt"; - my $newfile = $workdir . $installer::globals::separator . $newtablename . ".idt"; - if ( -f $newfile ) { unlink $newfile; } - installer::systemactions::copy_one_file($oldfile, $newfile); - my $savfile = $oldfile . ".orig"; - installer::systemactions::copy_one_file($oldfile, $savfile); - } - } - - # Import of tables - - $systemcall = $msidb . " -d " . $fullmsidatabasepath . " -f " . $workdir . " -i " . $tables; - - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Could not include tables into msi database: $fullmsidatabasepath !", "include_tables_into_pcpfile"); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -################################################################################# -# Extracting tables from msi database -################################################################################# - -sub extract_tables_from_pcpfile -{ - my ($fullmsidatabasepath, $workdir, $tablelist) = @_; - - my $msidb = "msidb.exe"; # Has to be in the path - my $infoline = ""; - my $systemcall = ""; - my $returnvalue = ""; - - my $localfullmsidatabasepath = $fullmsidatabasepath; - - # Export of all tables by using "*" - - if ( $^O =~ /cygwin/i ) { - # Copying the msi database locally guarantees the format of the directory. - # Otherwise it is defined in the file of UPDATE_DATABASE_LISTNAME - - my $msifilename = $localfullmsidatabasepath; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$msifilename); - my $destdatabasename = $workdir . $installer::globals::separator . $msifilename; - installer::systemactions::copy_one_file($localfullmsidatabasepath, $destdatabasename); - $localfullmsidatabasepath = $destdatabasename; - - chomp( $localfullmsidatabasepath = qx{cygpath -w "$localfullmsidatabasepath"} ); - chomp( $workdir = qx{cygpath -w "$workdir"} ); - - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - $localfullmsidatabasepath =~ s/\\/\\\\/g; - $workdir =~ s/\\/\\\\/g; - - # and if there are still slashes, they also need to be double backslash - $localfullmsidatabasepath =~ s/\//\\\\/g; - $workdir =~ s/\//\\\\/g; - } - - $systemcall = $msidb . " -d " . $localfullmsidatabasepath . " -f " . $workdir . " -e $tablelist"; - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Could not exclude tables from pcp file: $localfullmsidatabasepath !", "extract_tables_from_pcpfile"); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -################################################################################ -# Analyzing the content of Directory.idt -################################################################################# - -sub analyze_directory_file -{ - my ($filecontent) = @_; - - my %table = (); - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; } - - if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - my $dir = $1; - my $parent = $2; - my $name = $3; - - if ( $name =~ /^\s*(.*?)\s*\:\s*(.*?)\s*$/ ) { $name = $2; } - if ( $name =~ /^\s*(.*?)\s*\|\s*(.*?)\s*$/ ) { $name = $2; } - - my %helphash = (); - $helphash{'Directory_Parent'} = $parent; - $helphash{'DefaultDir'} = $name; - $table{$dir} = \%helphash; - } - } - - return \%table; -} - -################################################################################# -# Analyzing the content of Component.idt -################################################################################# - -sub analyze_component_file -{ - my ($filecontent) = @_; - - my %table = (); - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; } - - if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - my $component = $1; - my $dir = $3; - - $table{$component} = $dir; - } - } - - return \%table; -} - -################################################################################# -# Analyzing the full content of Component.idt -################################################################################# - -sub analyze_keypath_component_file -{ - my ($filecontent) = @_; - - my %keypathtable = (); - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; } - - if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - my $component = $1; - my $keypath = $6; - - $keypathtable{$keypath} = $component; - } - } - - return (\%keypathtable); - -} - -################################################################################# -# Analyzing the content of Registry.idt -################################################################################# - -sub analyze_registry_file -{ - my ($filecontent) = @_; - - my %table = (); - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; } - - if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - my $registry = $1; - my $root = $2; - my $key = $3; - my $name = $4; - my $value = $5; - my $component = $6; - - my %helphash = (); - $helphash{'Root'} = $root; - $helphash{'Key'} = $key; - $helphash{'Name'} = $name; - $helphash{'Value'} = $value; - $helphash{'Component'} = $component; - - $table{$registry} = \%helphash; - } - } - - return \%table; -} - -################################################################################# -# Analyzing the content of File.idt -################################################################################# - -sub analyze_file_file -{ - my ($filecontent) = @_; - - my %table = (); - my %fileorder = (); - my $maxsequence = 0; - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; } - - if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - my $file = $1; - my $comp = $2; - my $filename = $3; - my $sequence = $8; - - if ( $filename =~ /^\s*(.*?)\s*\|\s*(.*?)\s*$/ ) { $filename = $2; } - - my %helphash = (); - $helphash{'Component'} = $comp; - $helphash{'FileName'} = $filename; - $helphash{'Sequence'} = $sequence; - - $table{$file} = \%helphash; - - $fileorder{$sequence} = $file; - - if ( $sequence > $maxsequence ) { $maxsequence = $sequence; } - } - } - - return (\%table, \%fileorder, $maxsequence); -} - -#################################################################################### -# Recursively creating the directory tree -#################################################################################### - -sub create_directory_tree -{ - my ($parent, $pathcollector, $fulldir, $dirhash) = @_; - - foreach my $dir ( keys %{$dirhash} ) - { - if (( $dirhash->{$dir}->{'Directory_Parent'} eq $parent ) && ( $dirhash->{$dir}->{'DefaultDir'} ne "." )) - { - my $dirname = $dirhash->{$dir}->{'DefaultDir'}; - # Create the directory - my $newdir = $fulldir . $installer::globals::separator . $dirname; - if ( ! -f $newdir ) { mkdir $newdir; } - # Saving in collector - $pathcollector->{$dir} = $newdir; - # Iteration - create_directory_tree($dir, $pathcollector, $newdir, $dirhash); - } - } -} - -#################################################################################### -# Creating the directory tree -#################################################################################### - -sub create_directory_structure -{ - my ($dirhash, $targetdir) = @_; - - my %fullpathhash = (); - - my @startparents = ("TARGETDIR", "INSTALLLOCATION"); - - foreach $dir (@startparents) { create_directory_tree($dir, \%fullpathhash, $targetdir, $dirhash); } - - # Also adding the pathes of the startparents - foreach $dir (@startparents) - { - if ( ! exists($fullpathhash{$dir}) ) { $fullpathhash{$dir} = $targetdir; } - } - - return \%fullpathhash; -} - -#################################################################################### -# Copying files into installation set -#################################################################################### - -sub copy_files_into_directory_structure -{ - my ($fileorder, $filehash, $componenthash, $fullpathhash, $maxsequence, $unpackdir, $installdir, $dirhash) = @_; - - my $unopkgfile = ""; - - for ( my $i = 1; $i <= $maxsequence; $i++ ) - { - if ( exists($fileorder->{$i}) ) - { - my $file = $fileorder->{$i}; - if ( ! exists($filehash->{$file}->{'Component'}) ) { installer::exiter::exit_program("ERROR: Did not find component for file: \"$file\".", "copy_files_into_directory_structure"); } - my $component = $filehash->{$file}->{'Component'}; - if ( ! exists($componenthash->{$component}) ) { installer::exiter::exit_program("ERROR: Did not find directory for component: \"$component\".", "copy_files_into_directory_structure"); } - my $dirname = $componenthash->{$component}; - if ( ! exists($fullpathhash->{$dirname}) ) { installer::exiter::exit_program("ERROR: Did not find full directory path for dir: \"$dirname\".", "copy_files_into_directory_structure"); } - my $destdir = $fullpathhash->{$dirname}; - if ( ! exists($filehash->{$file}->{'FileName'}) ) { installer::exiter::exit_program("ERROR: Did not find \"FileName\" for file: \"$file\".", "copy_files_into_directory_structure"); } - my $destfile = $filehash->{$file}->{'FileName'}; - - $destfile = $destdir . $installer::globals::separator . $destfile; - my $sourcefile = $unpackdir . $installer::globals::separator . $file; - - if ( ! -f $sourcefile ) - { - # It is possible, that this was an unpacked file - # Looking in the dirhash, to find the subdirectory in the installation set (the id is $dirname) - # subdir is not recursively analyzed, only one directory. - - my $oldsourcefile = $sourcefile; - my $subdir = ""; - if ( exists($dirhash->{$dirname}->{'DefaultDir'}) ) { $subdir = $dirhash->{$dirname}->{'DefaultDir'} . $installer::globals::separator; } - my $realfilename = $filehash->{$file}->{'FileName'}; - my $localinstalldir = $installdir; - - $localinstalldir =~ s/\\\s*$//; - $localinstalldir =~ s/\/\s*$//; - - $sourcefile = $localinstalldir . $installer::globals::separator . $subdir . $realfilename; - - if ( ! -f $sourcefile ) - { - installer::exiter::exit_program("ERROR: File not found: \"$oldsourcefile\" (or \"$sourcefile\").", "copy_files_into_directory_structure"); - } - } - - my $copyreturn = copy($sourcefile, $destfile); - - if ( ! $copyreturn) # only logging problems - { - my $infoline = "ERROR: Could not copy $sourcefile to $destfile (insufficient disc space for $destfile ?)\n"; - $returnvalue = 0; - push(@installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program($infoline, "copy_files_into_directory_structure"); - } - - if ( $destfile =~ /unopkg\.exe\s*$/ ) { $unopkgfile = $destfile; } - } - } - - return $unopkgfile; -} - - -############################################################### -# Setting the time string for the -# Summary Information stream in the -# msi database of the admin installations. -############################################################### - -sub get_sis_time_string -{ - # Syntax: <yyyy/mm/dd hh:mm:ss> - my $second = (localtime())[0]; - my $minute = (localtime())[1]; - my $hour = (localtime())[2]; - my $day = (localtime())[3]; - my $month = (localtime())[4]; - my $year = 1900 + (localtime())[5]; - - $month++; # zero based month - - if ( $second < 10 ) { $second = "0" . $second; } - if ( $minute < 10 ) { $minute = "0" . $minute; } - if ( $hour < 10 ) { $hour = "0" . $hour; } - if ( $day < 10 ) { $day = "0" . $day; } - if ( $month < 10 ) { $month = "0" . $month; } - - my $timestring = $year . "/" . $month . "/" . $day . " " . $hour . ":" . $minute . ":" . $second; - - return $timestring; -} - -############################################################### -# Windows registry entries containing properties are not set -# correctly during msp patch process. The properties are -# empty or do get their default values. This destroys the -# values of many entries in Windows registry. -# This can be fixed by removing all entries in Registry table, -# containing a property before starting msimsp.exe. -############################################################### - -sub remove_properties_from_registry_table -{ - my ($registryhash, $componentkeypathhash, $registryfilecontent) = @_; - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Start remove_properties_from_registry_table"); - - my @registrytable = (); - - # Registry hash - # Collecting all RegistryItems with values containing a property: [...] - # To which component do they belong - # Is this after removal an empty component? Create a replacement, so that - # no Component has to be removed. - # Is this RegistryItem a KeyPath of a component. Then it cannot be removed. - - my %problemitems = (); - my %problemcomponents = (); - my %securecomponents = (); - my $changevalue = ""; - my $changeroot = ""; - my $infoline = ""; - - my $newitemcounter = 0; - my $olditemcounter = 0; - - foreach my $regitem ( keys %{$registryhash} ) - { - my $value = ""; - if ( exists($registryhash->{$regitem}->{'Value'}) ) { $value = $registryhash->{$regitem}->{'Value'}; } - - if ( $value =~ /^.*(\[.*?\]).*$/ ) - { - my $property = $1; - - # Collecting registry item - $problemitems{$regitem} = 1; # "1" -> can be removed - if ( exists($componentkeypathhash->{$regitem}) ) { $problemitems{$regitem} = 2; } # "2" -> cannot be removed, KeyPath - - # Collecting component (and number of problematic registry items - # my $component = $registryhash->{$regitem}->{'Component'}; - # if ( exists($problemcomponents{$regitem}) ) { $problemcomponents{$regitem} = $problemcomponents{$regitem} + 1; } - # else { $problemcomponents{$regitem} = 1; } - } - else - { - # Collecting all components with secure regisry items - my $component = ""; - if ( exists($registryhash->{$regitem}->{'Component'}) ) { $component = $registryhash->{$regitem}->{'Component'}; } - if ( $component eq "" ) { installer::exiter::exit_program("ERROR: Did not find component for registry item \"$regitem\".", "remove_properties_from_registry_table"); } - $securecomponents{$component} = 1; - } - - # Searching for change value - my $localkey = ""; - if ( exists($registryhash->{$regitem}->{'Key'}) ) { $localkey = $registryhash->{$regitem}->{'Key'}; } - if (( $localkey =~ /^\s*(Software\\.*\\)StartMenu\s*$/ ) && ( $changevalue eq "" )) - { - $changevalue = $1; - $changeroot = $registryhash->{$regitem}->{'Root'}; - } - - $olditemcounter++; - } - - my $removecounter = 0; - my $renamecounter = 0; - - foreach my $regitem ( keys %{$registryhash} ) - { - my $value = ""; - if ( exists($registryhash->{$regitem}->{'Value'}) ) { $value = $registryhash->{$regitem}->{'Value'}; } - - if ( $value =~ /^.*(\[.*?\]).*$/ ) - { - # Removing registry items, that are no KeyPath and that belong to components, - # that have other secure registry items. - - my $component = ""; - if ( exists($registryhash->{$regitem}->{'Component'}) ) { $component = $registryhash->{$regitem}->{'Component'}; } - if ( $component eq "" ) { installer::exiter::exit_program("ERROR: Did not find component for registry item (2) \"$regitem\".", "remove_properties_from_registry_table"); } - - if (( $problemitems{$regitem} == 1 ) && ( exists($securecomponents{$component}) )) - { - # remove complete registry item - delete($registryhash->{$regitem}); - $removecounter++; - $infoline = "Removing registry item: $regitem : $value\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - # Changing values of registry items, that are KeyPath or that contain to - # components with only unsecure registry items. - - if (( $problemitems{$regitem} == 2 ) || ( ! exists($securecomponents{$component}) )) - { - # change value of registry item - if ( $changevalue eq "" ) { installer::exiter::exit_program("ERROR: Did not find good change value for registry items", "remove_properties_from_registry_table"); } - - my $oldkey = ""; - if ( exists($registryhash->{$regitem}->{'Key'}) ) { $oldkey = $registryhash->{$regitem}->{'Key'}; }; - my $oldname = ""; - if ( exists($registryhash->{$regitem}->{'Name'}) ) { $oldname = $registryhash->{$regitem}->{'Name'}; } - my $oldvalue = ""; - if ( exists($registryhash->{$regitem}->{'Value'}) ) { $oldvalue = $registryhash->{$regitem}->{'Value'}; } - - $registryhash->{$regitem}->{'Key'} = $changevalue . "RegistryItem"; - $registryhash->{$regitem}->{'Root'} = $changeroot; - $registryhash->{$regitem}->{'Name'} = $regitem; - $registryhash->{$regitem}->{'Value'} = 1; - $renamecounter++; - - $infoline = "Changing registry item: $regitem\n"; - $infoline = "Old: $oldkey : $oldname : $oldvalue\n"; - $infoline = "New: $registryhash->{$regitem}->{'Key'} : $registryhash->{$regitem}->{'Name'} : $registryhash->{$regitem}->{'Value'}\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - } - } - - $infoline = "Number of removed registry items: $removecounter\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "Number of changed registry items: $renamecounter\n"; - push( @installer::globals::logfileinfo, $infoline); - - # Creating the new content of Registry table - # First three lines from $registryfilecontent - # All further files from changed $registryhash - - for ( my $i = 0; $i <= 2; $i++ ) { push(@registrytable, ${$registryfilecontent}[$i]); } - - foreach my $regitem ( keys %{$registryhash} ) - { - my $root = ""; - if ( exists($registryhash->{$regitem}->{'Root'}) ) { $root = $registryhash->{$regitem}->{'Root'}; } - else { installer::exiter::exit_program("ERROR: Did not find root in registry table for item: \"$regitem\".", "remove_properties_from_registry_table"); } - my $localkey = ""; - if ( exists($registryhash->{$regitem}->{'Key'}) ) { $localkey = $registryhash->{$regitem}->{'Key'}; } - my $name = ""; - if ( exists($registryhash->{$regitem}->{'Name'}) ) { $name = $registryhash->{$regitem}->{'Name'}; } - my $value = ""; - if ( exists($registryhash->{$regitem}->{'Value'}) ) { $value = $registryhash->{$regitem}->{'Value'}; } - my $comp = ""; - if ( exists($registryhash->{$regitem}->{'Component'}) ) { $comp = $registryhash->{$regitem}->{'Component'}; } - - my $oneline = $regitem . "\t" . $root . "\t" . $localkey . "\t" . $name . "\t" . $value . "\t" . $comp . "\n"; - push(@registrytable, $oneline); - - $newitemcounter++; - } - - $infoline = "Number of registry items: $newitemcounter. Old value: $olditemcounter.\n"; - push( @installer::globals::logfileinfo, $infoline); - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: End remove_properties_from_registry_table"); - - return (\@registrytable); -} - -############################################################### -# Writing content of administrative installations into -# Summary Information Stream of msi database. -# This is required for example for following -# patch processes using Windows Installer service. -############################################################### - -sub write_sis_info -{ - my ($msidatabase) = @_ ; - - if ( ! -f $msidatabase ) { installer::exiter::exit_program("ERROR: Cannot find file $msidatabase", "write_sis_info"); } - - my $msiinfo = "msiinfo.exe"; # Has to be in the path - my $infoline = ""; - my $systemcall = ""; - my $returnvalue = ""; - - # Required setting for administrative installations: - # -w 4 (source files are unpacked), wordcount - # -s <date of admin installation>, LastPrinted, Syntax: <yyyy/mm/dd hh:mm:ss> - # -l <person_making_admin_installation>, LastSavedBy - - my $wordcount = 4; # Unpacked files - my $lastprinted = get_sis_time_string(); - my $lastsavedby = "Installer"; - - my $localmsidatabase = $msidatabase; - - if( $^O =~ /cygwin/i ) - { - $localmsidatabase = qx{cygpath -w "$localmsidatabase"}; - $localmsidatabase =~ s/\\/\\\\/g; - $localmsidatabase =~ s/\s*$//g; - } - - $systemcall = $msiinfo . " " . "\"" . $localmsidatabase . "\"" . " -w " . $wordcount . " -s " . "\"" . $lastprinted . "\"" . " -l $lastsavedby"; - push(@installer::globals::logfileinfo, $systemcall); - $returnvalue = system($systemcall); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push(@installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program($infoline, "write_sis_info"); - } -} - -#################################################### -# Detecting the directory with extensions -#################################################### - -sub get_extensions_dir -{ - my ( $unopkgfile ) = @_; - - my $localbranddir = $unopkgfile; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$localbranddir); # "program" dir in brand layer - installer::pathanalyzer::get_path_from_fullqualifiedname(\$localbranddir); # root dir in brand layer - $localbranddir =~ s/\Q$installer::globals::separator\E\s*$//; - my $extensiondir = $localbranddir . $installer::globals::separator . "share" . $installer::globals::separator . "extensions"; - - return $extensiondir; -} - -############################################################## -# Removing all empty directories below a specified directory -############################################################## - -sub remove_empty_dirs_in_folder -{ - my ( $dir, $firstrun ) = @_; - - if ( $firstrun ) - { - print "Removing superfluous directories\n"; - } - - my @content = (); - - $dir =~ s/\Q$installer::globals::separator\E\s*$//; - - if ( -d $dir ) - { - opendir(DIR, $dir); - @content = readdir(DIR); - closedir(DIR); - - my $oneitem; - - foreach $oneitem (@content) - { - if ((!($oneitem eq ".")) && (!($oneitem eq ".."))) - { - my $item = $dir . $installer::globals::separator . $oneitem; - - if ( -d $item ) # recursive - { - remove_empty_dirs_in_folder($item, 0); - } - } - } - - # try to remove empty directory - my $returnvalue = rmdir $dir; - } -} - -#################################################################################### -# Simulating an administrative installation -#################################################################################### - -sub make_admin_install -{ - my ($databasepath, $targetdir) = @_; - - # Create helper directory - - installer::logger::print_message( "... installing $databasepath in directory $targetdir ...\n" ); - - my $helperdir = $targetdir . $installer::globals::separator . "installhelper"; - installer::systemactions::create_directory($helperdir); - - # Get File.idt, Component.idt and Directory.idt from database - - my $tablelist = "File Directory Component Registry"; - extract_tables_from_pcpfile($databasepath, $helperdir, $tablelist); - - # Unpack all cab files into $helperdir, cab files must be located next to msi database - my $installdir = $databasepath; - - if ( $^O =~ /cygwin/i ) { $installdir =~ s/\\/\//g; } # backslash to slash - - installer::pathanalyzer::get_path_from_fullqualifiedname(\$installdir); - - if ( $^O =~ /cygwin/i ) { $installdir =~ s/\//\\/g; } # slash to backslash - - my $databasefilename = $databasepath; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$databasefilename); - - my $cabfiles = installer::systemactions::find_file_with_file_extension("cab", $installdir); - - if ( $#{$cabfiles} < 0 ) { installer::exiter::exit_program("ERROR: Did not find any cab file in directory $installdir", "make_admin_install"); } - - # Set unpackdir - my $unpackdir = $helperdir . $installer::globals::separator . "unpack"; - installer::systemactions::create_directory($unpackdir); - - for ( my $i = 0; $i <= $#{$cabfiles}; $i++ ) - { - my $cabfile = ""; - if ( $^O =~ /cygwin/i ) - { - $cabfile = $installdir . ${$cabfiles}[$i]; - } - else - { - $cabfile = $installdir . $installer::globals::separator . ${$cabfiles}[$i]; - } - unpack_cabinet_file($cabfile, $unpackdir); - } - - # Reading tables - my $filename = $helperdir . $installer::globals::separator . "Directory.idt"; - my $filecontent = installer::files::read_file($filename); - my $dirhash = analyze_directory_file($filecontent); - - $filename = $helperdir . $installer::globals::separator . "Component.idt"; - my $componentfilecontent = installer::files::read_file($filename); - my $componenthash = analyze_component_file($componentfilecontent); - - $filename = $helperdir . $installer::globals::separator . "File.idt"; - $filecontent = installer::files::read_file($filename); - my ( $filehash, $fileorder, $maxsequence ) = analyze_file_file($filecontent); - - # Creating the directory structure - my $fullpathhash = create_directory_structure($dirhash, $targetdir); - - # Copying files - my $unopkgfile = copy_files_into_directory_structure($fileorder, $filehash, $componenthash, $fullpathhash, $maxsequence, $unpackdir, $installdir, $dirhash); - - my $msidatabase = $targetdir . $installer::globals::separator . $databasefilename; - installer::systemactions::copy_one_file($databasepath, $msidatabase); - - if ( $unopkgfile ne "" ) - { - # Removing empty dirs in extension folder - my $extensionfolder = get_extensions_dir($unopkgfile); - if ( -d $extensionfolder ) { remove_empty_dirs_in_folder($extensionfolder, 1); } - } - - # Editing registry table because of wrong Property value - # my $registryfilename = $helperdir . $installer::globals::separator . "Registry.idt"; - # my $componentfilename = $helperdir . $installer::globals::separator . "Component.idt"; - # my $componentkeypathhash = analyze_keypath_component_file($componentfilecontent); - - # my $registryfilecontent = installer::files::read_file($registryfilename); - # my $registryhash = analyze_registry_file($registryfilecontent); - - # $registryfilecontent = remove_properties_from_registry_table($registryhash, $componentkeypathhash, $registryfilecontent); - - # installer::files::save_file($registryfilename, $registryfilecontent); - # $tablelist = "Registry"; - # include_tables_into_pcpfile($msidatabase, $helperdir, $tablelist); - - # Saving info in Summary Information Stream of msi database (required for following patches) - write_sis_info($msidatabase); - - return $msidatabase; -} - -1; diff --git a/solenv/bin/modules/installer/windows/assembly.pm b/solenv/bin/modules/installer/windows/assembly.pm deleted file mode 100644 index 1a2869075..000000000 --- a/solenv/bin/modules/installer/windows/assembly.pm +++ /dev/null @@ -1,365 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::assembly; - -use installer::files; -use installer::globals; -use installer::worker; -use installer::windows::idtglobal; - -############################################################## -# Returning the first module of a file from the -# comma separated list of modules. -############################################################## - -sub get_msiassembly_feature -{ - my ( $onefile ) = @_; - - my $module = ""; - - if ( $onefile->{'modules'} ) { $module = $onefile->{'modules'}; } - - # If modules contains a list of modules, only taking the first one. - - if ( $module =~ /^\s*(.*?)\,/ ) { $module = $1; } - - # Attention: Maximum feature length is 38! - installer::windows::idtglobal::shorten_feature_gid(\$module); - - return $module; -} - -############################################################## -# Returning the component of a file. -############################################################## - -sub get_msiassembly_component -{ - my ( $onefile ) = @_; - - my $component = ""; - - $component = $onefile->{'componentname'}; - - return $component; -} - -############################################################## -# Returning the file name as manifest file -############################################################## - -sub get_msiassembly_filemanifest -{ - my ( $onefile ) = @_; - - my $filemanifest = ""; - - $filemanifest = $onefile->{'uniquename'}; - - return $filemanifest; -} - - -############################################################## -# Returning the file application -############################################################## - -sub get_msiassembly_fileapplication -{ - my ( $onefile ) = @_; - - my $fileapplication = ""; - - return $fileapplication; -} - -############################################################## -# Returning the file attributes -############################################################## - -sub get_msiassembly_attributes -{ - my ( $onefile ) = @_; - - my $fileattributes = ""; - - if ( $onefile->{'Attributes'} ne "" ) { $fileattributes = $onefile->{'Attributes'}; } - - return $fileattributes; -} - -############################################################## -# Returning the file object for the msiassembly table. -############################################################## - -sub get_msiassembly_file -{ - my ( $filesref, $filename ) = @_; - - my $foundfile = 0; - my $onefile; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - $onefile = ${$filesref}[$i]; - my $name = $onefile->{'Name'}; - - if ( $name eq $filename ) - { - $foundfile = 1; - last; - } - } - - # It does not need to exist. For example products that do not contain the libraries. - if (! $foundfile ) { $onefile = ""; } - - return $onefile; -} - -############################################################## -# Returning the file object for the msiassembly table. -############################################################## - -sub get_msiassembly_file_by_gid -{ - my ( $filesref, $gid ) = @_; - - my $foundfile = 0; - my $onefile; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - $onefile = ${$filesref}[$i]; - my $filegid = $onefile->{'gid'}; - - if ( $filegid eq $gid ) - { - $foundfile = 1; - last; - } - } - - # It does not need to exist. For example products that do not contain the libraries. - if (! $foundfile ) { $onefile = ""; } - - return $onefile; -} - -#################################################################################### -# Creating the file MsiAssembly.idt dynamically -# Content: -# Component_ Feature_ File_Manifest File_Application Attributes -# s72 s38 S72 S72 I2 -# MsiAssembly Component_ -#################################################################################### - -sub create_msiassembly_table -{ - my ($filesref, $basedir) = @_; - - $installer::globals::msiassemblyfiles = installer::worker::collect_all_items_with_special_flag($filesref, "ASSEMBLY"); - - my @msiassemblytable = (); - - installer::windows::idtglobal::write_idt_header(\@msiassemblytable, "msiassembly"); - - # Registering all libraries listed in $installer::globals::msiassemblyfiles - - for ( my $i = 0; $i <= $#{$installer::globals::msiassemblyfiles}; $i++ ) - { - my $onefile = ${$installer::globals::msiassemblyfiles}[$i]; - - my %msiassembly = (); - - $msiassembly{'Component_'} = get_msiassembly_component($onefile); - $msiassembly{'Feature_'} = get_msiassembly_feature($onefile); - $msiassembly{'File_Manifest'} = get_msiassembly_filemanifest($onefile); - $msiassembly{'File_Application'} = get_msiassembly_fileapplication($onefile); - $msiassembly{'Attributes'} = get_msiassembly_attributes($onefile); - - my $oneline = $msiassembly{'Component_'} . "\t" . $msiassembly{'Feature_'} . "\t" . - $msiassembly{'File_Manifest'} . "\t" . $msiassembly{'File_Application'} . "\t" . - $msiassembly{'Attributes'} . "\n"; - - push(@msiassemblytable, $oneline); - } - - # Saving the file - - my $msiassemblytablename = $basedir . $installer::globals::separator . "MsiAssem.idt"; - installer::files::save_file($msiassemblytablename ,\@msiassemblytable); - my $infoline = "Created idt file: $msiassemblytablename\n"; - push(@installer::globals::logfileinfo, $infoline); -} - -#################################################################################### -# Returning the name for the table MsiAssemblyName -#################################################################################### - -sub get_msiassemblyname_name -{ - ( $number ) = @_; - - my $name = ""; - - if ( $number == 1 ) { $name = "name"; } - elsif ( $number == 2 ) { $name = "publicKeyToken"; } - elsif ( $number == 3 ) { $name = "version"; } - elsif ( $number == 4 ) { $name = "culture"; } - - return $name; -} - -#################################################################################### -# Creating the file MsiAssemblyName.idt dynamically -# Content: -# Component_ Name Value -# s72 s255 s255 -# MsiAssemblyName Component_ Name -#################################################################################### - -sub create_msiassemblyname_table -{ - my ($filesref, $basedir) = @_; - - my @msiassemblynametable = (); - - installer::windows::idtglobal::write_idt_header(\@msiassemblynametable, "msiassemblyname"); - - for ( my $i = 0; $i <= $#{$installer::globals::msiassemblyfiles}; $i++ ) - { - my $onefile = ${$installer::globals::msiassemblyfiles}[$i]; - - my $component = get_msiassembly_component($onefile); - my $oneline = ""; - - # Order: (Assembly)name, publicKeyToken, version, culture. - - if ( $onefile->{'Assemblyname'} ) - { - $oneline = $component . "\t" . "name" . "\t" . $onefile->{'Assemblyname'} . "\n"; - push(@msiassemblynametable, $oneline); - } - - if ( $onefile->{'PublicKeyToken'} ) - { - $oneline = $component . "\t" . "publicKeyToken" . "\t" . $onefile->{'PublicKeyToken'} . "\n"; - push(@msiassemblynametable, $oneline); - } - - if ( $onefile->{'Version'} ) - { - $oneline = $component . "\t" . "version" . "\t" . $onefile->{'Version'} . "\n"; - push(@msiassemblynametable, $oneline); - } - - if ( $onefile->{'Culture'} ) - { - $oneline = $component . "\t" . "culture" . "\t" . $onefile->{'Culture'} . "\n"; - push(@msiassemblynametable, $oneline); - } - - if ( $onefile->{'ProcessorArchitecture'} ) - { - $oneline = $component . "\t" . "processorArchitecture" . "\t" . $onefile->{'ProcessorArchitecture'} . "\n"; - push(@msiassemblynametable, $oneline); - } - } - - # Saving the file - - my $msiassemblynametablename = $basedir . $installer::globals::separator . "MsiAsseN.idt"; - installer::files::save_file($msiassemblynametablename ,\@msiassemblynametable); - my $infoline = "Created idt file: $msiassemblynametablename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -#################################################################################### -# setting an installation condition for the assembly libraries saved in -# @installer::globals::msiassemblynamecontent -#################################################################################### - -sub add_assembly_condition_into_component_table -{ - my ($filesref, $basedir) = @_; - - my $componenttablename = $basedir . $installer::globals::separator . "Componen.idt"; - my $componenttable = installer::files::read_file($componenttablename); - my $changed = 0; - my $infoline = ""; - - for ( my $i = 0; $i <= $#{$installer::globals::msiassemblyfiles}; $i++ ) - { - my $onefile = ${$installer::globals::msiassemblyfiles}[$i]; - - my $filecomponent = get_msiassembly_component($onefile); - - for ( my $j = 0; $j <= $#{$componenttable}; $j++ ) - { - my $oneline = ${$componenttable}[$j]; - - if ( $oneline =~ /(.*)\t(.*)\t(.*)\t(.*)\t(.*)\t(.*)/ ) - { - my $component = $1; - my $componentid = $2; - my $directory = $3; - my $attributes = $4; - my $condition = $5; - my $keypath = $6; - - if ( $component eq $filecomponent ) - { - # setting the condition - - $condition = "DOTNET_SUFFICIENT=1"; - $oneline = $component . "\t" . $componentid . "\t" . $directory . "\t" . $attributes . "\t" . $condition . "\t" . $keypath . "\n"; - ${$componenttable}[$j] = $oneline; - $changed = 1; - $infoline = "Changing $componenttablename :\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = $oneline; - push(@installer::globals::logfileinfo, $infoline); - last; - } - } - } - } - - if ( $changed ) - { - # Saving the file - installer::files::save_file($componenttablename ,$componenttable); - $infoline = "Saved idt file: $componenttablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } -} - -1; diff --git a/solenv/bin/modules/installer/windows/binary.pm b/solenv/bin/modules/installer/windows/binary.pm deleted file mode 100644 index b1bff4130..000000000 --- a/solenv/bin/modules/installer/windows/binary.pm +++ /dev/null @@ -1,77 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::binary; - -use installer::existence; -use installer::files; -use installer::globals; - -########################################################################################################### -# Updating the table Binary dynamically with all files from $binarytablefiles -# Content: -# Name Data -# s72 v0 -# Binary Name -########################################################################################################### - -sub update_binary_table -{ - my ($languageidtdir, $filesref, $binarytablefiles) = @_; - - my $binaryidttablename = $languageidtdir . $installer::globals::separator . "Binary.idt"; - my $binaryidttable = installer::files::read_file($binaryidttablename); - - # Only the iconfiles, that are used in the shortcut table for the - # FolderItems (entries in Windows startmenu) are added into the icon table. - - for ( my $i = 0; $i <= $#{$binarytablefiles}; $i++ ) - { - my $binaryfile = ${$binarytablefiles}[$i]; - my $binaryfilename = $binaryfile->{'Name'}; - my $binaryfiledata = $binaryfilename; - - $binaryfilename =~ s/\.//g; # removing "." in filename: "abc.dll" to "abcdll" in name column - - my %binary = (); - - $binary{'Name'} = $binaryfilename; - $binary{'Data'} = $binaryfiledata; - - my $oneline = $binary{'Name'} . "\t" . $binary{'Data'} . "\n"; - - push(@{$binaryidttable}, $oneline); - } - - # Saving the file - - installer::files::save_file($binaryidttablename ,$binaryidttable); - my $infoline = "Updated idt file: $binaryidttablename\n"; - push(@installer::globals::logfileinfo, $infoline); -} - -1; diff --git a/solenv/bin/modules/installer/windows/component.pm b/solenv/bin/modules/installer/windows/component.pm deleted file mode 100644 index c023aa6c5..000000000 --- a/solenv/bin/modules/installer/windows/component.pm +++ /dev/null @@ -1,532 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::component; - -use installer::converter; -use installer::existence; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::windows::idtglobal; -use installer::windows::language; - -############################################################## -# Returning a globally unique ID (GUID) for a component -# If the component is new, a unique guid has to be created. -# If the component already exists, the guid has to be -# taken from a list component <-> guid -# Sample for a guid: {B68FD953-3CEF-4489-8269-8726848056E8} -############################################################## - -sub get_component_guid -{ - my ( $componentname, $componentidhashref ) = @_; - - # At this time only a template - my $returnvalue = "\{COMPONENTGUID\}"; - - if (( $installer::globals::updatedatabase ) && ( exists($componentidhashref->{$componentname}) )) - { - $returnvalue = $componentidhashref->{$componentname}; - } - - # Returning a ComponentID, that is assigned in scp project - if ( exists($installer::globals::componentid{$componentname}) ) - { - $returnvalue = "\{" . $installer::globals::componentid{$componentname} . "\}"; - } - - return $returnvalue; -} - -############################################################## -# Returning the directory for a file component. -############################################################## - -sub get_file_component_directory -{ - my ($componentname, $filesref, $dirref) = @_; - - my ($onefile, $component, $onedir, $hostname, $uniquedir); - my $found = 0; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - $onefile = ${$filesref}[$i]; - $component = $onefile->{'componentname'}; - - if ( $component eq $componentname ) - { - $found = 1; - last; - } - } - - if (!($found)) - { - # This component can be ignored, if it exists in a version with extension "_pff" (this was renamed in file::get_sequence_for_file() ) - my $ignore_this_component = 0; - my $origcomponentname = $componentname; - my $componentname = $componentname . "_pff"; - - for ( my $j = 0; $j <= $#{$filesref}; $j++ ) - { - $onefile = ${$filesref}[$j]; - $component = $onefile->{'componentname'}; - - if ( $component eq $componentname ) - { - $ignore_this_component = 1; - last; - } - } - - if ( $ignore_this_component ) { return "IGNORE_COMP"; } - else { installer::exiter::exit_program("ERROR: Did not find component \"$origcomponentname\" in file collection", "get_file_component_directory"); } - } - - my $localstyles = ""; - - if ( $onefile->{'Styles'} ) { $localstyles = $onefile->{'Styles'}; } - - if ( $localstyles =~ /\bFONT\b/ ) # special handling for font files - { - return $installer::globals::fontsfolder; - } - - my $destdir = ""; - - if ( $onefile->{'Dir'} ) { $destdir = $onefile->{'Dir'}; } - - if ( $destdir =~ /\bPREDEFINED_OSSHELLNEWDIR\b/ ) # special handling for shellnew files - { - return $installer::globals::templatefolder; - } - - if ( $destdir =~ /\bPREDEFINED_OSWINSHELLNEWDIR\b/ ) - { - return "WindowsShellNewFolder"; - } - - my $destination = $onefile->{'destination'}; - - installer::pathanalyzer::get_path_from_fullqualifiedname(\$destination); - - $destination =~ s/\Q$installer::globals::separator\E\s*$//; - - # This path has to be defined in the directory collection at "HostName" - - if ($destination eq "") # files in the installation root - { - $uniquedir = "INSTALLLOCATION"; - } - else - { - $found = 0; - - for ( my $i = 0; $i <= $#{$dirref}; $i++ ) - { - $onedir = ${$dirref}[$i]; - $hostname = $onedir->{'HostName'}; - - if ( $hostname eq $destination ) - { - $found = 1; - last; - } - } - - if (!($found)) - { - installer::exiter::exit_program("ERROR: Did not find destination $destination in directory collection", "get_file_component_directory"); - } - - $uniquedir = $onedir->{'uniquename'}; - - if ( $uniquedir eq $installer::globals::officeinstalldirectory ) - { - $uniquedir = "INSTALLLOCATION"; - } - } - - $onefile->{'uniquedirname'} = $uniquedir; # saving it in the file collection - - return $uniquedir -} - -############################################################## -# Returning the directory for a registry component. -# This cannot be a useful value -############################################################## - -sub get_registry_component_directory -{ - my $componentdir = "INSTALLLOCATION"; - - return $componentdir; -} - -############################################################## -# Returning the attributes for a file component. -# Always 8 in this first try? -############################################################## - -sub get_file_component_attributes -{ - my ($componentname, $filesref, $allvariables) = @_; - - my $attributes; - - $attributes = 2; - - # special handling for font files - - my $onefile; - my $found = 0; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - $onefile = ${$filesref}[$i]; - my $component = $onefile->{'componentname'}; - - if ( $component eq $componentname ) - { - $found = 1; - last; - } - } - - if (!($found)) - { - installer::exiter::exit_program("ERROR: Did not find component in file collection", "get_file_component_attributes"); - } - - my $localstyles = ""; - - if ( $onefile->{'Styles'} ) { $localstyles = $onefile->{'Styles'}; } - - if ( $localstyles =~ /\bFONT\b/ ) - { - $attributes = 16; # font files will not be deinstalled - } - - if ( $localstyles =~ /\bASSEMBLY\b/ ) - { - $attributes = 0; # Assembly files cannot run from source - } - - if (( $onefile->{'Dir'} =~ /\bPREDEFINED_OSSHELLNEWDIR\b/ ) || ( $onefile->{'needs_user_registry_key'} )) - { - $attributes = 4; # Files in shellnew dir and in non advertised startmenu entries must have user registry key as KeyPath - } - - # Adding 256, if this is a 64 bit installation set. - if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) { $attributes = $attributes + 256; } - - return $attributes -} - -############################################################## -# Returning the attributes for a registry component. -# Always 4, indicating, the keypath is a defined in -# table registry -############################################################## - -sub get_registry_component_attributes -{ - my ($componentname, $allvariables) = @_; - - my $attributes; - - $attributes = 4; - - # Adding 256, if this is a 64 bit installation set. - if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) { $attributes = $attributes + 256; } - - if ( exists($installer::globals::dontdeletecomponents{$componentname}) ) { $attributes = $attributes + 16; } - - return $attributes -} - -############################################################## -# Returning the conditions for a component. -# This is important for language dependent components -# in multilingual installation sets. -############################################################## - -sub get_file_component_condition -{ - my ($componentname, $filesref) = @_; - - my $condition = ""; - - if (exists($installer::globals::componentcondition{$componentname})) - { - $condition = $installer::globals::componentcondition{$componentname}; - } - - # there can be also tree conditions for multilayer products - if (exists($installer::globals::treeconditions{$componentname})) - { - if ( $condition eq "" ) - { - $condition = $installer::globals::treeconditions{$componentname}; - } - else - { - $condition = "($condition) And ($installer::globals::treeconditions{$componentname})"; - } - } - - return $condition -} - -############################################################## -# Returning the conditions for a registry component. -############################################################## - -sub get_component_condition -{ - my ($componentname) = @_; - - my $condition; - - $condition = ""; # Always ? - - if (exists($installer::globals::componentcondition{$componentname})) - { - $condition = $installer::globals::componentcondition{$componentname}; - } - - return $condition -} - -#################################################################### -# Returning the keypath for a component. -# This will be the name of the first file/registry, found in the -# collection $itemsref -# Attention: This has to be the unique (file)name, not the -# real filename! -#################################################################### - -sub get_component_keypath -{ - my ($componentname, $itemsref, $componentidkeypathhashref) = @_; - - my $oneitem; - my $found = 0; - my $infoline = ""; - - for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) - { - $oneitem = ${$itemsref}[$i]; - my $component = $oneitem->{'componentname'}; - - if ( $component eq $componentname ) - { - $found = 1; - last; - } - } - - if (!($found)) - { - installer::exiter::exit_program("ERROR: Did not find component in file/registry collection, function get_component_keypath", "get_component_keypath"); - } - - my $keypath = $oneitem->{'uniquename'}; # "uniquename", not "Name" - - # Special handling for updates from existing databases, because KeyPath must not change - if (( $installer::globals::updatedatabase ) && ( exists($componentidkeypathhashref->{$componentname}) )) - { - $keypath = $componentidkeypathhashref->{$componentname}; - # -> check, if this is a valid key path?! - if ( $keypath ne $oneitem->{'uniquename'} ) - { - # Warning: This keypath was changed because of info from old database - $infoline = "WARNING: The KeyPath for component \"$componentname\" was changed from \"$oneitem->{'uniquename'}\" to \"$keypath\" because of information from update database"; - push(@installer::globals::logfileinfo, $infoline); - } - } - - # Special handling for components in PREDEFINED_OSSHELLNEWDIR. These components - # need as KeyPath a RegistryItem in HKCU - if ( $oneitem->{'userregkeypath'} ) { $keypath = $oneitem->{'userregkeypath'}; } - - # saving it in the file and registry collection - $oneitem->{'keypath'} = $keypath; - - return $keypath -} - -################################################################### -# Creating the file Componen.idt dynamically -# Content: -# Component ComponentId Directory_ Attributes Condition KeyPath -################################################################### - -sub create_component_table -{ - my ($filesref, $registryref, $dirref, $allfilecomponentsref, $allregistrycomponents, $basedir, $componentidhashref, $componentidkeypathhashref, $allvariables) = @_; - - my @componenttable = (); - - my ($oneline, $infoline); - - installer::windows::idtglobal::write_idt_header(\@componenttable, "component"); - - # File components - - for ( my $i = 0; $i <= $#{$allfilecomponentsref}; $i++ ) - { - my %onecomponent = (); - - $onecomponent{'name'} = ${$allfilecomponentsref}[$i]; - $onecomponent{'guid'} = get_component_guid($onecomponent{'name'}, $componentidhashref); - $onecomponent{'directory'} = get_file_component_directory($onecomponent{'name'}, $filesref, $dirref); - if ( $onecomponent{'directory'} eq "IGNORE_COMP" ) { next; } - $onecomponent{'attributes'} = get_file_component_attributes($onecomponent{'name'}, $filesref, $allvariables); - $onecomponent{'condition'} = get_file_component_condition($onecomponent{'name'}, $filesref); - $onecomponent{'keypath'} = get_component_keypath($onecomponent{'name'}, $filesref, $componentidkeypathhashref); - - $oneline = $onecomponent{'name'} . "\t" . $onecomponent{'guid'} . "\t" . $onecomponent{'directory'} . "\t" - . $onecomponent{'attributes'} . "\t" . $onecomponent{'condition'} . "\t" . $onecomponent{'keypath'} . "\n"; - - push(@componenttable, $oneline); - } - - # Registry components - - for ( my $i = 0; $i <= $#{$allregistrycomponents}; $i++ ) - { - my %onecomponent = (); - - $onecomponent{'name'} = ${$allregistrycomponents}[$i]; - $onecomponent{'guid'} = get_component_guid($onecomponent{'name'}, $componentidhashref); - $onecomponent{'directory'} = get_registry_component_directory(); - $onecomponent{'attributes'} = get_registry_component_attributes($onecomponent{'name'}, $allvariables); - $onecomponent{'condition'} = get_component_condition($onecomponent{'name'}); - $onecomponent{'keypath'} = get_component_keypath($onecomponent{'name'}, $registryref, $componentidkeypathhashref); - - $oneline = $onecomponent{'name'} . "\t" . $onecomponent{'guid'} . "\t" . $onecomponent{'directory'} . "\t" - . $onecomponent{'attributes'} . "\t" . $onecomponent{'condition'} . "\t" . $onecomponent{'keypath'} . "\n"; - - push(@componenttable, $oneline); - } - - # Saving the file - - my $componenttablename = $basedir . $installer::globals::separator . "Componen.idt"; - installer::files::save_file($componenttablename ,\@componenttable); - $infoline = "Created idt file: $componenttablename\n"; - push(@installer::globals::logfileinfo, $infoline); -} - -#################################################################################### -# Returning a component for a scp module gid. -# Pairs are saved in the files collector. -#################################################################################### - -sub get_component_name_from_modulegid -{ - my ($modulegid, $filesref) = @_; - - my $componentname = ""; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - - if ( $onefile->{'modules'} ) - { - my $filemodules = $onefile->{'modules'}; - my $filemodulesarrayref = installer::converter::convert_stringlist_into_array_without_newline(\$filemodules, ","); - - if (installer::existence::exists_in_array($modulegid, $filemodulesarrayref)) - { - $componentname = $onefile->{'componentname'}; - last; - } - } - } - - return $componentname; -} - -#################################################################################### -# Updating the file Environm.idt dynamically -# Content: -# Environment Name Value Component_ -#################################################################################### - -sub set_component_in_environment_table -{ - my ($basedir, $filesref) = @_; - - my $infoline = ""; - - my $environmentfilename = $basedir . $installer::globals::separator . "Environm.idt"; - - if ( -f $environmentfilename ) # only do something, if file exists - { - my $environmentfile = installer::files::read_file($environmentfilename); - - for ( my $i = 3; $i <= $#{$environmentfile}; $i++ ) # starting in line 4 of Environm.idt - { - if ( ${$environmentfile}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - my $modulegid = $4; # in Environment table a scp module gid can be used as component replacement - - my $componentname = get_component_name_from_modulegid($modulegid, $filesref); - - if ( $componentname ) # only do something if a component could be found - { - $infoline = "Updated Environment table:\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Old line: ${$environmentfile}[$i]\n"; - push(@installer::globals::logfileinfo, $infoline); - - ${$environmentfile}[$i] =~ s/$modulegid/$componentname/; - - $infoline = "New line: ${$environmentfile}[$i]\n"; - push(@installer::globals::logfileinfo, $infoline); - - } - } - } - - # Saving the file - - installer::files::save_file($environmentfilename ,$environmentfile); - $infoline = "Updated idt file: $environmentfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - - } -} - -1; diff --git a/solenv/bin/modules/installer/windows/createfolder.pm b/solenv/bin/modules/installer/windows/createfolder.pm deleted file mode 100644 index c677b9085..000000000 --- a/solenv/bin/modules/installer/windows/createfolder.pm +++ /dev/null @@ -1,154 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::createfolder; - -use installer::existence; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::windows::idtglobal; - -############################################################## -# Returning directory for createfolder table. -############################################################## - -sub get_createfolder_directory -{ - my ($onedir) = @_; - - my $uniquename = $onedir->{'uniquename'}; - - return $uniquename; -} - -############################################################## -# Searching the correct file for language pack directories. -############################################################## - -sub get_languagepack_file -{ - my ($filesref, $onedir) = @_; - - my $language = $onedir->{'specificlanguage'}; - my $foundfile = 0; - my $onefile = ""; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - $onefile = ${$filesref}[$i]; - - if ( $onefile->{'specificlanguage'} eq $onedir->{'specificlanguage'} ) - { - $foundfile = 1; - last; - } - } - - if ( ! $foundfile ) { installer::exiter::exit_program("ERROR: No file with correct language found (language pack build)!", "get_languagepack_file"); } - - return $onefile; -} - -############################################################## -# Returning component for createfolder table. -############################################################## - -sub get_createfolder_component -{ - my ($onedir, $filesref, $allvariableshashref) = @_; - - # Directories do not belong to a module. - # Therefore they can only belong to the root module and - # will be added to a component at the root module. - # All directories will be added to the component - # containing the file $allvariableshashref->{'GLOBALFILEGID'} - - if ( ! $allvariableshashref->{'GLOBALFILEGID'} ) { installer::exiter::exit_program("ERROR: GLOBALFILEGID must be defined in list file!", "get_createfolder_component"); } - if (( $installer::globals::patch ) && ( ! $allvariableshashref->{'GLOBALFILEGID'} )) { installer::exiter::exit_program("ERROR: GLOBALPATCHFILEGID must be defined in list file!", "get_createfolder_component"); } - - my $globalfilegid = $allvariableshashref->{'GLOBALFILEGID'}; - if ( $installer::globals::patch ) { $globalfilegid = $allvariableshashref->{'GLOBALPATCHFILEGID'}; } - - my $onefile = ""; - if ( $installer::globals::languagepack ) { $onefile = get_languagepack_file($filesref, $onedir); } - elsif ( $installer::globals::helppack ) { $onefile = installer::existence::get_specified_file($filesref, 'gid_File_Help_Common_Zip'); } - else { $onefile = installer::existence::get_specified_file($filesref, $globalfilegid); } - - return $onefile->{'componentname'}; -} - -#################################################################################### -# Creating the file CreateFo.idt dynamically for creation of empty directories -# Content: -# Directory_ Component_ -#################################################################################### - -sub create_createfolder_table -{ - my ($dirref, $filesref, $basedir, $allvariableshashref) = @_; - - my @createfoldertable = (); - - my $infoline; - - installer::windows::idtglobal::write_idt_header(\@createfoldertable, "createfolder"); - - for ( my $i = 0; $i <= $#{$dirref}; $i++ ) - { - my $onedir = ${$dirref}[$i]; - - # language packs and help packs get only language dependent directories - if (( $installer::globals::languagepack ) || ( $installer::globals::languagepack ) && ( $onedir->{'specificlanguage'} eq "" )) { next }; - - my $styles = ""; - - if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; } - - if ( $styles =~ /\bCREATE\b/ ) - { - my %directory = (); - - $directory{'Directory_'} = get_createfolder_directory($onedir); - $directory{'Component_'} = get_createfolder_component($onedir, $filesref, $allvariableshashref); - - my $oneline = $directory{'Directory_'} . "\t" . $directory{'Component_'} . "\n"; - - push(@createfoldertable, $oneline); - } - } - - # Saving the file - - my $createfoldertablename = $basedir . $installer::globals::separator . "CreateFo.idt"; - installer::files::save_file($createfoldertablename ,\@createfoldertable); - $infoline = "Created idt file: $createfoldertablename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -1; diff --git a/solenv/bin/modules/installer/windows/directory.pm b/solenv/bin/modules/installer/windows/directory.pm deleted file mode 100644 index 107ec018c..000000000 --- a/solenv/bin/modules/installer/windows/directory.pm +++ /dev/null @@ -1,566 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::directory; - -use installer::exiter; -use installer::files; -use installer::globals; -use installer::pathanalyzer; -use installer::windows::idtglobal; - -############################################################## -# Collecting all directory trees in global hash -############################################################## - -sub collectdirectorytrees -{ - my ( $directoryref ) = @_; - - for ( my $i = 0; $i <= $#{$directoryref}; $i++ ) - { - my $onedir = ${$directoryref}[$i]; - my $styles = ""; - if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; } - - if ( $styles ne "" ) - { - foreach my $treestyle ( keys %installer::globals::treestyles ) - { - if ( $styles =~ /\b$treestyle\b/ ) - { - my $hostname = $onedir->{'HostName'}; - # -> hostname is the key, the style the value! - $installer::globals::hostnametreestyles{$hostname} = $treestyle; - } - } - } - } -} - -############################################################## -# Overwriting global programfilesfolder, if required -############################################################## - -sub overwrite_programfilesfolder -{ - my ( $allvariables ) = @_; - - if ( $allvariables->{'PROGRAMFILESFOLDERNAME'} ) - { - $installer::globals::programfilesfolder = $allvariables->{'PROGRAMFILESFOLDERNAME'}; - } -} - -############################################################## -# Maximum length of directory name is 72. -# Taking care of underlines, which are the separator. -############################################################## - -sub make_short_dir_version -{ - my ($longstring, $length, $displayname) = @_; - - my $shortstring = ""; - my $infoline = ""; - my $savestring = $longstring; - - # Splitting the string at each "underline" and allowing only $length characters per directory name. - # Checking also uniqueness and length. - - my $stringarray = installer::converter::convert_stringlist_into_array_without_newline(\$longstring, "_"); - - foreach my $onestring ( @{$stringarray} ) - { - my $partstring = ""; - - if ( $onestring =~ /\-/ ) - { - my $localstringarray = installer::converter::convert_stringlist_into_array_without_newline(\$onestring, "-"); - foreach my $onelocalstring ( @{$localstringarray} ) - { - if ( length($onelocalstring) > $length ) { $onelocalstring = substr($onelocalstring, 0, $length); } - $partstring = $partstring . "-" . $onelocalstring; - } - $partstring =~ s/^\s*\-//; - } - else - { - if ( length($onestring) > $length ) { $partstring = substr($onestring, 0, $length); } - else { $partstring = $onestring; } - } - - $shortstring = $shortstring . "_" . $partstring; - } - - $shortstring =~ s/^\s*\_//; - - if ( length($shortstring) > 72 ) - { - my $shortlength = length($shortstring); - $infoline = "WARNING: Failed to create unique directory name with less than 72 characters: \"$displayname\" ($shortstring ($shortlength)).\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - return $shortstring; -} - -############################################################## -# Adding unique directory names to the directory collection -############################################################## - -my $already_checked_the_frigging_directories_for_uniqueness = 0; - -sub create_unique_directorynames -{ - my ($directoryref, $allvariables) = @_; - - $installer::globals::officeinstalldirectoryset = 0; - - my %conversionhash = (); - my $infoline = ""; - my $errorcount = 0; - - for ( my $i = 0; $i <= $#{$directoryref}; $i++ ) - { - my $onedir = ${$directoryref}[$i]; - my $hostname = $onedir->{'HostName'}; - - my $uniquename = $hostname; - my $styles = ""; - if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; } - # get_path_from_fullqualifiedname(\$uniqueparentname); - # making /registry/schema/org/openoffice/VCL.xcs to VCL.xcs - - $uniquename =~ s/^\s*//g; # removing beginning white spaces - $uniquename =~ s/\s*$//g; # removing ending white spaces - $uniquename =~ s/\s//g; # removing white spaces - $uniquename =~ s/\_//g; # removing existing underlines - $uniquename =~ s/\.//g; # removing dots in directoryname - $uniquename =~ s/\Q$installer::globals::separator\E/\_/g; # replacing slash and backslash with underline - $uniquename =~ s/OpenOffice/OO/g; - $uniquename =~ s/LibreOffice/LO/g; - $uniquename =~ s/_registry/_rgy/g; - $uniquename =~ s/_registration/_rgn/g; - $uniquename =~ s/_extension/_ext/g; - $uniquename =~ s/_frame/_frm/g; - $uniquename =~ s/_table/_tbl/g; - $uniquename =~ s/_chart/_crt/g; - - my $startlength = 5; - - if ( ! $allvariables->{'NOSHORTDIRECTORYNAMES'} ) - { - # This process does not work for SDK, because of its long and similar pathes - $uniquename = make_short_dir_version($uniquename, $startlength, $hostname); # taking care of underlines! - } - - if ( !$already_checked_the_frigging_directories_for_uniqueness && - exists($installer::globals::alluniquedirectorynames{$uniquename}) ) - { - # This is an error, that must stop the packaging process - $errorcount++; - - $infoline = "$errorcount: Already existing unique directory: $uniquename\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "$errorcount: First full directory: $conversionhash{$uniquename}\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "$errorcount: Current full directory: $hostname\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - $conversionhash{$uniquename} = $hostname; - - $installer::globals::alluniquedirectorynames{$uniquename} = 1; - - # Important: The unique parent is generated from the string $uniquename. Therefore counters - # like adding "_1" is not allowed to achive uniqueness, because this depends from other directories - # and does not deliver always the same result. - - my $uniqueparentname = $uniquename; - - if ( $uniqueparentname =~ /^\s*(.*)\_(.*?)\s*$/ ) # the underline is now the separator - { - $uniqueparentname = $1; - } - else - { - $uniqueparentname = $installer::globals::programfilesfolder; - } - - if ( $styles =~ /\bPROGRAMFILESFOLDER\b/ ) { $uniqueparentname = $installer::globals::programfilesfolder; } - if ( $styles =~ /\bCOMMONFILESFOLDER\b/ ) { $uniqueparentname = $installer::globals::commonfilesfolder; } - if ( $styles =~ /\bCOMMONAPPDATAFOLDER\b/ ) { $uniqueparentname = $installer::globals::commonappdatafolder; } - if ( $styles =~ /\bLOCALAPPDATAFOLDER\b/ ) { $uniqueparentname = $installer::globals::localappdatafolder; } - - if ( $styles =~ /\bSHAREPOINTPATH\b/ ) - { - $uniqueparentname = "SHAREPOINTPATH"; - $installer::globals::usesharepointpath = 1; - } - - $uniquename =~ s/\-/\_/g; # making "-" to "_" - $uniqueparentname =~ s/\-/\_/g; # making "-" to "_" - - $onedir->{'uniquename'} = $uniquename; - $onedir->{'uniqueparentname'} = $uniqueparentname; - - # setting the installlocation directory - if ( $styles =~ /\bISINSTALLLOCATION\b/ ) - { - if ( $installer::globals::installlocationdirectoryset ) { installer::exiter::exit_program("ERROR: Directory with flag ISINSTALLLOCATION alread set: \"$installer::globals::installlocationdirectory\".", "create_unique_directorynames"); } - $installer::globals::installlocationdirectory = $uniquename; - $installer::globals::installlocationdirectoryset = 1; - if ( $installer::globals::installlocationdirectory =~ /oracle_/i ) { $installer::globals::sundirexists = 1; } - } - - # setting the sundirectory - if ( $styles =~ /\bSUNDIRECTORY\b/ ) - { - if ( $installer::globals::vendordirectoryset ) { installer::exiter::exit_program("ERROR: Directory with flag SUNDIRECTORY alread set: \"$installer::globals::vendordirectory\".", "create_unique_directorynames"); } - $installer::globals::vendordirectory = $uniquename; - $installer::globals::vendordirectoryset = 1; - } - } - - if ( $errorcount > 0 ) - { - installer::exiter::exit_program("ERROR: Failed to create unique directory names.", "create_unique_directorynames"); - } -} - -##################################################### -# Adding ":." to selected default directory names -##################################################### - -sub check_sourcedir_addon -{ - my ( $onedir, $allvariableshashref ) = @_; - - if (($installer::globals::addchildprojects) || - ($installer::globals::patch) || - ($installer::globals::languagepack) || - ($installer::globals::helppack) || - ($allvariableshashref->{'CHANGETARGETDIR'})) - { - my $sourcediraddon = "\:\."; - $onedir->{'defaultdir'} = $onedir->{'defaultdir'} . $sourcediraddon; - } - -} - -##################################################### -# The directory with the style ISINSTALLLOCATION -# will be replaced by INSTALLLOCATION -##################################################### - -sub set_installlocation_directory -{ - my ( $directoryref, $allvariableshashref ) = @_; - - if ( ! $installer::globals::installlocationdirectoryset ) { installer::exiter::exit_program("ERROR: Directory with flag ISINSTALLLOCATION not set!", "set_installlocation_directory"); } - - for ( my $i = 0; $i <= $#{$directoryref}; $i++ ) - { - my $onedir = ${$directoryref}[$i]; - - if ( $onedir->{'uniquename'} eq $installer::globals::installlocationdirectory ) - { - $onedir->{'uniquename'} = "INSTALLLOCATION"; - check_sourcedir_addon($onedir, $allvariableshashref); - } - - if ( $onedir->{'uniquename'} eq $installer::globals::vendordirectory ) - { - check_sourcedir_addon($onedir, $allvariableshashref); - } - - if ( $onedir->{'uniqueparentname'} eq $installer::globals::installlocationdirectory ) - { - $onedir->{'uniqueparentname'} = "INSTALLLOCATION"; - } - } -} - -##################################################### -# Getting the name of the top level directory. This -# can have only one letter -##################################################### - -sub get_last_directory_name -{ - my ($completepathref) = @_; - - if ( $$completepathref =~ /^.*[\/\\](.+?)\s*$/ ) - { - $$completepathref = $1; - } -} - -##################################################### -# Creating the defaultdir for the file Director.idt -##################################################### - -sub create_defaultdir_directorynames -{ - my ($directoryref, $shortdirnamehashref) = @_; - - my @shortnames = (); - if ( $installer::globals::updatedatabase ) { @shortnames = values(%{$shortdirnamehashref}); } - elsif ( $installer::globals::prepare_winpatch ) { @shortnames = values(%installer::globals::saved83dirmapping); } - - for ( my $i = 0; $i <= $#{$directoryref}; $i++ ) - { - my $onedir = ${$directoryref}[$i]; - my $hostname = $onedir->{'HostName'}; - - $hostname =~ s/\Q$installer::globals::separator\E\s*$//; - get_last_directory_name(\$hostname); - my $uniquename = $onedir->{'uniquename'}; - my $shortstring; - if (( $installer::globals::updatedatabase ) && ( exists($shortdirnamehashref->{$uniquename}) )) - { - $shortstring = $shortdirnamehashref->{$uniquename}; - } - elsif (( $installer::globals::prepare_winpatch ) && ( exists($installer::globals::saved83dirmapping{$uniquename}) )) - { - $shortstring = $installer::globals::saved83dirmapping{$uniquename}; - } - else - { - $shortstring = installer::windows::idtglobal::make_eight_three_conform($hostname, "dir", \@shortnames); - } - - my $defaultdir; - - if ( $shortstring eq $hostname ) - { - $defaultdir = $hostname; - } - else - { - $defaultdir = $shortstring . "|" . $hostname; - } - - $onedir->{'defaultdir'} = $defaultdir; - - my $fontdir = ""; - if ( $onedir->{'Dir'} ) { $fontdir = $onedir->{'Dir'}; } - - my $fontdefaultdir = ""; - if ( $onedir->{'defaultdir'} ) { $fontdefaultdir = $onedir->{'defaultdir'}; } - - if (( $fontdir eq "PREDEFINED_OSSYSTEMFONTDIR" ) && ( $fontdefaultdir eq $installer::globals::fontsdirhostname )) - { - $installer::globals::fontsdirname = $onedir->{'defaultdir'}; - $installer::globals::fontsdirparent = $onedir->{'uniqueparentname'}; - } - } -} - -############################################### -# Fill content into the directory table -############################################### - -sub create_directorytable_from_collection -{ - my ($directorytableref, $directoryref) = @_; - - for ( my $i = 0; $i <= $#{$directoryref}; $i++ ) - { - my $onedir = ${$directoryref}[$i]; - my $hostname = $onedir->{'HostName'}; - my $dir = ""; - - if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; } - - if (( $dir eq "PREDEFINED_PROGDIR" ) && ( $hostname eq "" )) { next; } # removing files from root directory - - my $oneline = $onedir->{'uniquename'} . "\t" . $onedir->{'uniqueparentname'} . "\t" . $onedir->{'defaultdir'} . "\n"; - - push(@{$directorytableref}, $oneline); - } -} - -############################################### -# Defining the root installation structure -############################################### - -sub add_root_directories -{ - my ($directorytableref, $allvariableshashref, $onelanguage) = @_; - - my $oneline = ""; - - if (( ! $installer::globals::patch ) && ( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack ) && ( ! $allvariableshashref->{'DONTUSESTARTMENUFOLDER'} )) - { - my $productname; - - $productname = $allvariableshashref->{'PRODUCTNAME'}; - my $productversion = $allvariableshashref->{'PRODUCTVERSION'}; - my $baseproductversion = $productversion; - - if (( $installer::globals::prepare_winpatch ) && ( $allvariableshashref->{'BASEPRODUCTVERSION'} )) - { - $baseproductversion = $allvariableshashref->{'BASEPRODUCTVERSION'}; # for example "2.0" for OOo - } - - my $realproductkey = $productname . " " . $productversion; - my $productkey = $productname . " " . $baseproductversion; - - if (( $allvariableshashref->{'POSTVERSIONEXTENSION'} ) && ( ! $allvariableshashref->{'DONTUSEEXTENSIONINDEFAULTDIR'} )) - { - $productkey = $productkey . " " . $allvariableshashref->{'POSTVERSIONEXTENSION'}; - $realproductkey = $realproductkey . " " . $allvariableshashref->{'POSTVERSIONEXTENSION'}; - } - if ( $allvariableshashref->{'NOVERSIONINDIRNAME'} ) - { - $productkey = $productname; - $realproductkey = $realproductname; - } - if ( $allvariableshashref->{'NOSPACEINDIRECTORYNAME'} ) - { - $productkey =~ s/\ /\_/g; - $realproductkey =~ s/\ /\_/g; - } - - my $shortproductkey = installer::windows::idtglobal::make_eight_three_conform($productkey, "dir"); # third parameter not used - $shortproductkey =~ s/\s/\_/g; # changing empty space to underline - - $oneline = "$installer::globals::officemenufolder\t$installer::globals::programmenufolder\t$shortproductkey|$realproductkey\n"; - push(@{$directorytableref}, $oneline); - } - - $oneline = "TARGETDIR\t\tSourceDir\n"; - push(@{$directorytableref}, $oneline); - - $oneline = "WindowsFolder\tTARGETDIR\tWindows\n"; - push(@{$directorytableref}, $oneline); - - $oneline = "WindowsShellNewFolder\tWindowsFolder\tShellNew\n"; - push(@{$directorytableref}, $oneline); - - $oneline = "$installer::globals::programfilesfolder\tTARGETDIR\t.\n"; - push(@{$directorytableref}, $oneline); - - $oneline = "$installer::globals::programmenufolder\tTARGETDIR\t.\n"; - push(@{$directorytableref}, $oneline); - - $oneline = "$installer::globals::startupfolder\tTARGETDIR\t.\n"; - push(@{$directorytableref}, $oneline); - - $oneline = "$installer::globals::desktopfolder\tTARGETDIR\t.\n"; - push(@{$directorytableref}, $oneline); - - $oneline = "$installer::globals::startmenufolder\tTARGETDIR\t.\n"; - push(@{$directorytableref}, $oneline); - - $oneline = "$installer::globals::commonfilesfolder\tTARGETDIR\t.\n"; - push(@{$directorytableref}, $oneline); - - $oneline = "$installer::globals::commonappdatafolder\tTARGETDIR\t.\n"; - push(@{$directorytableref}, $oneline); - - $oneline = "$installer::globals::localappdatafolder\tTARGETDIR\t.\n"; - push(@{$directorytableref}, $oneline); - - if ( $installer::globals::usesharepointpath ) - { - $oneline = "SHAREPOINTPATH\tTARGETDIR\t.\n"; - push(@{$directorytableref}, $oneline); - } - - $oneline = "$installer::globals::systemfolder\tTARGETDIR\t.\n"; - push(@{$directorytableref}, $oneline); - - my $localtemplatefoldername = $installer::globals::templatefoldername; - my $directorytableentry = $localtemplatefoldername; - my $shorttemplatefoldername = installer::windows::idtglobal::make_eight_three_conform($localtemplatefoldername, "dir"); - if ( $shorttemplatefoldername ne $localtemplatefoldername ) { $directorytableentry = "$shorttemplatefoldername|$localtemplatefoldername"; } - $oneline = "$installer::globals::templatefolder\tTARGETDIR\t$directorytableentry\n"; - push(@{$directorytableref}, $oneline); - - if ( $installer::globals::fontsdirname ) - { - $oneline = "$installer::globals::fontsfolder\t$installer::globals::fontsdirparent\t$installer::globals::fontsfoldername\:$installer::globals::fontsdirname\n"; - } - else - { - $oneline = "$installer::globals::fontsfolder\tTARGETDIR\t$installer::globals::fontsfoldername\n"; - } - - push(@{$directorytableref}, $oneline); - -} - -############################################### -# Creating the file Director.idt dynamically -############################################### - -sub create_directory_table -{ - my ($directoryref, $languagesarrayref, $basedir, $allvariableshashref, $shortdirnamehashref, $loggingdir) = @_; - - # Structure of the directory table: - # Directory Directory_Parent DefaultDir - # Directory is a unique identifier - # Directory_Parent is the unique identifier of the parent - # DefaultDir is .:APPLIC~1|Application Data with - # Before ":" : [sourcedir]:[destdir] (not programmed yet) - # After ":" : 8+3 and not 8+3 the destination directory name - - for ( my $m = 0; $m <= $#{$languagesarrayref}; $m++ ) - { - my $onelanguage = ${$languagesarrayref}[$m]; - $installer::globals::installlocationdirectoryset = 0; - - my @directorytable = (); - my $infoline; - - overwrite_programfilesfolder($allvariableshashref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt_local_1.log", $directoryref); } - create_unique_directorynames($directoryref, $allvariableshashref); - $already_checked_the_frigging_directories_for_uniqueness++; - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt_local_1a.log", $directoryref); } - create_defaultdir_directorynames($directoryref, $shortdirnamehashref); # only destdir! - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt_local_2.log", $directoryref); } - set_installlocation_directory($directoryref, $allvariableshashref); - if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt_local_3.log", $directoryref); } - installer::windows::idtglobal::write_idt_header(\@directorytable, "directory"); - add_root_directories(\@directorytable, $allvariableshashref, $onelanguage); - create_directorytable_from_collection(\@directorytable, $directoryref); - - # Saving the file - - my $directorytablename = $basedir . $installer::globals::separator . "Director.idt" . "." . $onelanguage; - installer::files::save_file($directorytablename ,\@directorytable); - $infoline = "Created idt file: $directorytablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } -} - -1; diff --git a/solenv/bin/modules/installer/windows/feature.pm b/solenv/bin/modules/installer/windows/feature.pm deleted file mode 100644 index c2657beec..000000000 --- a/solenv/bin/modules/installer/windows/feature.pm +++ /dev/null @@ -1,484 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::feature; - -use installer::existence; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::sorter; -use installer::worker; -use installer::windows::idtglobal; -use installer::windows::language; - -############################################################## -# Returning the gid for a feature. -# Attention: Maximum length -############################################################## - -sub get_feature_gid -{ - my ($onefeature) = @_; - - my $gid = ""; - - if ( $onefeature->{'gid'} ) { $gid = $onefeature->{'gid'}; } - - # Attention: Maximum feature length is 38! - installer::windows::idtglobal::shorten_feature_gid(\$gid); - - return $gid -} - -############################################################## -# Returning the gid of the parent. -# Attention: Maximum length -############################################################## - -sub get_feature_parent -{ - my ($onefeature) = @_; - - my $parentgid = ""; - - if ( $onefeature->{'ParentID'} ) { $parentgid = $onefeature->{'ParentID'}; } - - # The modules, hanging directly below the root, have to be root modules. - # Only then it is possible to make the "real" root module invisible by - # setting the display to "0". - - if ( $parentgid eq $installer::globals::rootmodulegid ) { $parentgid = ""; } - - # Attention: Maximum feature length is 38! - installer::windows::idtglobal::shorten_feature_gid(\$parentgid); - - return $parentgid -} - -############################################################## -# Returning the display for a feature. -# 0: Feature is not shown -# odd: subfeatures are shown -# even: subfeatures are not shown -############################################################## - -sub get_feature_display -{ - my ($onefeature) = @_; - - my $display; - my $parentid = ""; - - if ( $onefeature->{'ParentID'} ) { $parentid = $onefeature->{'ParentID'}; } - - if ( $parentid eq "" ) - { - $display = "0"; # root module is not visible - } - elsif ( $onefeature->{'gid'} eq "gid_Module_Prg") # program module shows subfeatures - { - $display = "1"; # root module shows subfeatures - } - else - { - $display = "2"; # all other modules do not show subfeatures - } - - # special case: Feature has flag "HIDDEN_ROOT" -> $display is 0 - my $styles = ""; - if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; } - if ( $styles =~ /\bHIDDEN_ROOT\b/ ) { $display = "0"; } - - # Special handling for language modules. Only visible in multilingual installation set - if (( $styles =~ /\bSHOW_MULTILINGUAL_ONLY\b/ ) && ( ! $installer::globals::ismultilingual )) { $display = "0"; } - - # Special handling for c05office. No program module visible. - if (( $onefeature->{'gid'} eq "gid_Module_Prg" ) && ( $installer::globals::product =~ /c05office/i )) { $display = "0"; } - - # making all feature invisible in Language packs and in Help packs! - if ( $installer::globals::languagepack || $installer::globals::helppack ) { $display = "0"; } - - return $display -} - -############################################################## -# Returning the level for a feature. -############################################################## - -sub get_feature_level -{ - my ($onefeature) = @_; - - my $level = "20"; # the default - - my $localdefault = ""; - - if ( $onefeature->{'Default'} ) { $localdefault = $onefeature->{'Default'}; } - - if ( $localdefault eq "NO" ) # explicitely set Default = "NO" - { - $level = "200"; # deselected in default installation, base is 100 - if ( $installer::globals::patch ) { $level = "20"; } - } - - # special handling for Java and Ada - if ( $onefeature->{'Name'} ) - { - if ( $onefeature->{'Name'} =~ /java/i ) { $level = $level + 40; } - } - - # if FeatureLevel is defined in scp, this will be used - - if ( $onefeature->{'FeatureLevel'} ) { $level = $onefeature->{'FeatureLevel'}; } - - return $level -} - -############################################################## -# Returning the directory for a feature. -############################################################## - -sub get_feature_directory -{ - my ($onefeature) = @_; - - my $directory; - - $directory = "INSTALLLOCATION"; - - return $directory -} - -############################################################## -# Returning the directory for a feature. -############################################################## - -sub get_feature_attributes -{ - my ($onefeature) = @_; - - my $attributes; - - # No advertising of features and no leaving on network. - # Feature without parent must not have the "2" - - my $parentgid = ""; - if ( $onefeature->{'ParentID'} ) { $parentgid = $onefeature->{'ParentID'}; } - - if (( $parentgid eq "" ) || ( $parentgid eq $installer::globals::rootmodulegid )) { $attributes = "8"; } - else { $attributes = "10"; } - - return $attributes -} - -################################################################################# -# Replacing one variable in one files -################################################################################# - -sub replace_one_variable -{ - my ($translationfile, $variable, $searchstring) = @_; - - for ( my $i = 0; $i <= $#{$translationfile}; $i++ ) - { - ${$translationfile}[$i] =~ s/\%$searchstring/$variable/g; - } -} - -################################################################################# -# Replacing the variables in the feature names and descriptions -################################################################################# - -sub replace_variables -{ - my ($translationfile, $variableshashref) = @_; - - # we want to substitute FOO_BR before FOO to avoid floating _BR suffixes - foreach $key (sort { length ($b) <=> length ($a) } keys %{$variableshashref}) - { - my $value = $variableshashref->{$key}; - replace_one_variable($translationfile, $value, $key); - } -} - -################################################################################# -# Collecting the feature recursively. -################################################################################# - -sub collect_modules_recursive -{ - my ($modulesref, $parentid, $feature, $directaccess, $directgid, $directparent, $directsortkey, $sorted) = @_; - - my @allchildren = (); - my $childrenexist = 0; - - # Collecting children from Module $parentid - - my $modulegid; - foreach $modulegid ( keys %{$directparent}) - { - if ( $directparent->{$modulegid} eq $parentid ) - { - my %childhash = ( "gid" => "$modulegid", "Sortkey" => "$directsortkey->{$modulegid}"); - push(@allchildren, \%childhash); - $childrenexist = 1; - } - } - - # Sorting children - - if ( $childrenexist ) - { - # Sort children - installer::sorter::sort_array_of_hashes_numerically(\@allchildren, "Sortkey"); - - # Adding children to new array - my $childhashref; - foreach $childhashref ( @allchildren ) - { - my $gid = $childhashref->{'gid'}; - - # Saving all lines, that have this 'gid' - - my $unique; - foreach $unique ( keys %{$directgid} ) - { - if ( $directgid->{$unique} eq $gid ) - { - push(@{$feature}, ${$modulesref}[$directaccess->{$unique}]); - if ( $sorted->{$unique} == 1 ) { installer::exiter::exit_program("ERROR: Sorting feature failed! \"$unique\" already sorted.", "sort_feature"); } - $sorted->{$unique} = 1; - } - } - - collect_modules_recursive($modulesref, $gid, $feature, $directaccess, $directgid, $directparent, $directsortkey, $sorted); - } - } -} - -################################################################################# -# Sorting the feature in specified order. Evaluated is the key "Sortkey", that -# is set in scp2 projects. -# The display order of modules in Windows Installer is dependent from the order -# in the idt file. Therefore the order of the modules array has to be adapted -# to the Sortkey order, before the idt file is created. -################################################################################# - -sub sort_feature -{ - my ($modulesref) = @_; - - my @feature = (); - - my %directaccess = (); - my %directparent = (); - my %directgid = (); - my %directsortkey = (); - my %sorted = (); - - for ( my $i = 0; $i <= $#{$modulesref}; $i++ ) - { - my $onefeature = ${$modulesref}[$i]; - - my $uniquekey = $onefeature->{'uniquekey'}; - my $modulegid = $onefeature->{'gid'}; - - $directaccess{$uniquekey} = $i; - - $directgid{$uniquekey} = $onefeature->{'gid'}; - - # ParentID and Sortkey are not saved for the 'uniquekey', but only for the 'gid' - - if ( $onefeature->{'ParentID'} ) { $directparent{$modulegid} = $onefeature->{'ParentID'}; } - else { $directparent{$modulegid} = ""; } - - if ( $onefeature->{'Sortkey'} ) { $directsortkey{$modulegid} = $onefeature->{'Sortkey'}; } - else { $directsortkey{$modulegid} = "9999"; } - - # Bookkeeping: - $sorted{$uniquekey} = 0; - } - - # Searching all feature recursively, beginning with ParentID = "" - my $parentid = ""; - collect_modules_recursive($modulesref, $parentid, \@feature, \%directaccess, \%directgid, \%directparent, \%directsortkey, \%sorted); - - # Bookkeeping - my $modulekey; - foreach $modulekey ( keys %sorted ) - { - if ( $sorted{$modulekey} == 0 ) - { - my $infoline = "Warning: Module \"$modulekey\" could not be sorted. Added to the end of the module array.\n"; - push(@installer::globals::logfileinfo, $infoline); - push(@feature, ${$modulesref}[$directaccess{$modulekey}]); - } - } - - return \@feature; -} - -################################################################################# -# Adding a unique key to the modules array. The gid is not unique for -# multilingual modules. Only the combination from gid and specific language -# is unique. Uniqueness is required for sorting mechanism. -################################################################################# - -sub add_uniquekey -{ - my ( $modulesref ) = @_; - - for ( my $i = 0; $i <= $#{$modulesref}; $i++ ) - { - my $uniquekey = ${$modulesref}[$i]->{'gid'}; - if ( ${$modulesref}[$i]->{'specificlanguage'} ) { $uniquekey = $uniquekey . "_" . ${$modulesref}[$i]->{'specificlanguage'}; } - ${$modulesref}[$i]->{'uniquekey'} = $uniquekey; - } -} - -################################################################################# -# Creating the file Feature.idt dynamically -# Content: -# Feature Feature_Parent Title Description Display Level Directory_ Attributes -################################################################################# - -sub create_feature_table -{ - my ($modulesref, $basedir, $languagesarrayref, $allvariableshashref) = @_; - - for ( my $m = 0; $m <= $#{$languagesarrayref}; $m++ ) - { - my $onelanguage = ${$languagesarrayref}[$m]; - - my $infoline; - - my @featuretable = (); - - installer::windows::idtglobal::write_idt_header(\@featuretable, "feature"); - - for ( my $i = 0; $i <= $#{$modulesref}; $i++ ) - { - my $onefeature = ${$modulesref}[$i]; - - # Java and Ada only, if the correct settings are set - my $styles = ""; - if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; } - if (( $styles =~ /\bJAVAMODULE\b/ ) && ( ! ($allvariableshashref->{'JAVAPRODUCT'} ))) { next; } - if (( $styles =~ /\bADAMODULE\b/ ) && ( ! ($allvariableshashref->{'ADAPRODUCT'} ))) { next; } - - # Controlling the language! - # Only language independent feature or feature with the correct language will be included into the table - - if (! (!(( $onefeature->{'ismultilingual'} )) || ( $onefeature->{'specificlanguage'} eq $onelanguage )) ) { next; } - - my %feature = (); - - $feature{'feature'} = get_feature_gid($onefeature); - $feature{'feature_parent'} = get_feature_parent($onefeature); - $feature{'Title'} = $onefeature->{'Name'}; - $feature{'Description'} = $onefeature->{'Description'}; - $feature{'Display'} = get_feature_display($onefeature); - $feature{'Level'} = get_feature_level($onefeature); - $feature{'Directory_'} = get_feature_directory($onefeature); - $feature{'Attributes'} = get_feature_attributes($onefeature); - - my $oneline = $feature{'feature'} . "\t" . $feature{'feature_parent'} . "\t" . $feature{'Title'} . "\t" - . $feature{'Description'} . "\t" . $feature{'Display'} . "\t" . $feature{'Level'} . "\t" - . $feature{'Directory_'} . "\t" . $feature{'Attributes'} . "\n"; - - push(@featuretable, $oneline); - - # collecting all feature in global feature collector (so that properties can be set in property table) - if ( ! installer::existence::exists_in_array($feature{'feature'}, \@installer::globals::featurecollector) ) - { - push(@installer::globals::featurecollector, $feature{'feature'}); - } - - # collecting all language feature in feature collector for check of language selection - if (( $styles =~ /\bSHOW_MULTILINGUAL_ONLY\b/ ) && ( $onefeature->{'ParentID'} ne $installer::globals::rootmodulegid )) - { - $installer::globals::multilingual_only_modules{$feature{'feature'}} = 1; - } - - # collecting all application feature in global feature collector for check of application selection - if ( $styles =~ /\bAPPLICATIONMODULE\b/ ) - { - $installer::globals::application_modules{$feature{'feature'}} = 1; - } - } - - # Sorting names of language packs and dictionaries - my @tempfeaturetable; - my @langlist; - my @langpack; - my @dictlist; - my @sorteddictlist; - my @sortedlanglist; - - foreach (@featuretable) { - if (/^gm_r_Extension_Dictionary_/) { - push (@dictlist, $_); - } - elsif (/^gm_Langpack_r_/) { - push (@langlist, $_); - } - elsif (/\tgm_Langpack_r_/) { - push (@langpack, $_); - } - else { - push (@tempfeaturetable, $_); - } - } - - @sorteddictlist = sort { (split(/\t/, $a))[2] cmp (split(/\t/, $b))[2] } @dictlist; - @sortedlanglist = sort { (split(/\t/, $a))[2] cmp (split(/\t/, $b))[2] } @langlist; - - @featuretable = (@tempfeaturetable, @sorteddictlist); - - foreach (@sortedlanglist) { - my $sortedlanglistline = $_; - push (@featuretable, $sortedlanglistline); - foreach (@langpack) { - my $langpackline = $_; - if ( (split(/\t/, $langpackline))[1] eq (split(/\t/, $sortedlanglistline))[0] ) { - push (@featuretable, $langpackline); - } - } - } - - # Saving the file - - my $featuretablename = $basedir . $installer::globals::separator . "Feature.idt" . "." . $onelanguage; - installer::files::save_file($featuretablename ,\@featuretable); - $infoline = "Created idt file: $featuretablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - -} - -1; diff --git a/solenv/bin/modules/installer/windows/featurecomponent.pm b/solenv/bin/modules/installer/windows/featurecomponent.pm deleted file mode 100644 index f52032ddb..000000000 --- a/solenv/bin/modules/installer/windows/featurecomponent.pm +++ /dev/null @@ -1,175 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::featurecomponent; - -use installer::converter; -use installer::existence; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::windows::idtglobal; - -################################################################################# -# Collecting all pairs of features and components from the files collector -################################################################################# - -sub create_featurecomponent_table_from_files_collector -{ - my ($featurecomponenttableref, $filesref) = @_; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - - my $filecomponent = $onefile->{'componentname'}; - my $filemodules = $onefile->{'modules'}; - - if ( $filecomponent eq "" ) - { - installer::exiter::exit_program("ERROR: No component defined for file $onefile->{'Name'}", "create_featurecomponent_table_from_files_collector"); - } - if ( $filemodules eq "" ) - { - installer::exiter::exit_program("ERROR: No modules found for file $onefile->{'Name'}", "create_featurecomponent_table_from_files_collector"); - } - - my $filemodulesarrayref = installer::converter::convert_stringlist_into_array(\$filemodules, ","); - - for ( my $j = 0; $j <= $#{$filemodulesarrayref}; $j++ ) - { - my %featurecomponent = (); - - my $onemodule = ${$filemodulesarrayref}[$j]; - $onemodule =~ s/\s*$//; - $featurecomponent{'Feature'} = $onemodule; - $featurecomponent{'Component'} = $filecomponent; - - # Attention: Features are renamed, because the maximum length is 38. - # But in the files collector ($filesref), the original names are saved. - - installer::windows::idtglobal::shorten_feature_gid(\$featurecomponent{'Feature'}); - - $oneline = "$featurecomponent{'Feature'}\t$featurecomponent{'Component'}\n"; - - # control of uniqueness - - if (! installer::existence::exists_in_array($oneline, $featurecomponenttableref)) - { - push(@{$featurecomponenttableref}, $oneline); - } - } - } -} - -################################################################################# -# Collecting all pairs of features and components from the registry collector -################################################################################# - -sub create_featurecomponent_table_from_registry_collector -{ - my ($featurecomponenttableref, $registryref) = @_; - - for ( my $i = 0; $i <= $#{$registryref}; $i++ ) - { - my $oneregistry = ${$registryref}[$i]; - - my $registrycomponent = $oneregistry->{'componentname'}; - my $registrymodule = $oneregistry->{'ModuleID'}; - - if ( $registrycomponent eq "" ) - { - installer::exiter::exit_program("ERROR: No component defined for registry $oneregistry->{'gid'}", "create_featurecomponent_table_from_registry_collector"); - } - if ( $registrymodule eq "" ) - { - installer::exiter::exit_program("ERROR: No modules found for registry $oneregistry->{'gid'}", "create_featurecomponent_table_from_registry_collector"); - } - - my %featurecomponent = (); - - $featurecomponent{'Feature'} = $registrymodule; - $featurecomponent{'Component'} = $registrycomponent; - - # Attention: Features are renamed, because the maximum length is 38. - # But in the files collector ($filesref), the original names are saved. - - installer::windows::idtglobal::shorten_feature_gid(\$featurecomponent{'Feature'}); - - $oneline = "$featurecomponent{'Feature'}\t$featurecomponent{'Component'}\n"; - - # control of uniqueness - - if (! installer::existence::exists_in_array($oneline, $featurecomponenttableref)) - { - push(@{$featurecomponenttableref}, $oneline); - } - } -} - -################################################################################# -# Creating the file FeatureC.idt dynamically -# Content: -# Feature Component -################################################################################# - -sub create_featurecomponent_table -{ - my ($filesref, $registryref, $basedir) = @_; - - my @featurecomponenttable = (); - my $infoline; - - installer::windows::idtglobal::write_idt_header(\@featurecomponenttable, "featurecomponent"); - - # This is the first time, that features and componentes are related - # Problem: How about created profiles, configurationfiles, services.rdb - # -> simple solution: putting them all to the root module - # Otherwise profiles and configurationfiles cannot be created the way, they are now created - # -> especially a problem for the configurationfiles! # ToDo - # Very good: All ProfileItems belong to the root - # services.rdb belongs to the root anyway. - - # At the moment only the files are related to components (and the files know their modules). - # The component for each file is written into the files collector $filesinproductlanguageresolvedarrayref - - create_featurecomponent_table_from_files_collector(\@featurecomponenttable, $filesref); - - create_featurecomponent_table_from_registry_collector(\@featurecomponenttable, $registryref); - - # Additional components have to be added here - - # Saving the file - - my $featurecomponenttablename = $basedir . $installer::globals::separator . "FeatureC.idt"; - installer::files::save_file($featurecomponenttablename ,\@featurecomponenttable); - $infoline = "Created idt file: $featurecomponenttablename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -1; diff --git a/solenv/bin/modules/installer/windows/file.pm b/solenv/bin/modules/installer/windows/file.pm deleted file mode 100644 index 0a12d59f4..000000000 --- a/solenv/bin/modules/installer/windows/file.pm +++ /dev/null @@ -1,1072 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::file; - -use Digest::MD5; -use installer::existence; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::worker; -use installer::windows::font; -use installer::windows::idtglobal; -use installer::windows::language; - -########################################################################## -# Assigning one cabinet file to each file. This is requrired, -# if cabinet files shall be equivalent to packages. -########################################################################## - -sub assign_cab_to_files -{ - my ( $filesref ) = @_; - - my $infoline = ""; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - if ( ! exists(${$filesref}[$i]->{'modules'}) ) { installer::exiter::exit_program("ERROR: No module assignment found for ${$filesref}[$i]->{'gid'} !", "assign_cab_to_files"); } - my $module = ${$filesref}[$i]->{'modules'}; - # If modules contains a list of modules, only taking the first one. - if ( $module =~ /^\s*(.*?)\,/ ) { $module = $1; } - - if ( ! exists($installer::globals::allcabinetassigns{$module}) ) { installer::exiter::exit_program("ERROR: No cabinet file assigned to module \"$module\" (${$filesref}[$i]->{'gid'}) !", "assign_cab_to_files"); } - ${$filesref}[$i]->{'assignedcabinetfile'} = $installer::globals::allcabinetassigns{$module}; - - # Counting the files in each cabinet file - if ( ! exists($installer::globals::cabfilecounter{${$filesref}[$i]->{'assignedcabinetfile'}}) ) - { - $installer::globals::cabfilecounter{${$filesref}[$i]->{'assignedcabinetfile'}} = 1; - } - else - { - $installer::globals::cabfilecounter{${$filesref}[$i]->{'assignedcabinetfile'}}++; - } - } - - # logging the number of files in each cabinet file - - $infoline = "\nCabinet file content:\n"; - push(@installer::globals::logfileinfo, $infoline); - my $cabfile; - foreach $cabfile ( sort keys %installer::globals::cabfilecounter ) - { - $infoline = "$cabfile : $installer::globals::cabfilecounter{$cabfile} files\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - # assigning startsequencenumbers for each cab file - - my $offset = 1; - foreach $cabfile ( sort keys %installer::globals::cabfilecounter ) - { - my $filecount = $installer::globals::cabfilecounter{$cabfile}; - $installer::globals::cabfilecounter{$cabfile} = $offset; - $offset = $offset + $filecount; - - $installer::globals::lastsequence{$cabfile} = $offset - 1; - } - - # logging the start sequence numbers - - $infoline = "\nCabinet file start sequences:\n"; - push(@installer::globals::logfileinfo, $infoline); - foreach $cabfile ( sort keys %installer::globals::cabfilecounter ) - { - $infoline = "$cabfile : $installer::globals::cabfilecounter{$cabfile}\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - # logging the last sequence numbers - - $infoline = "\nCabinet file last sequences:\n"; - push(@installer::globals::logfileinfo, $infoline); - foreach $cabfile ( sort keys %installer::globals::lastsequence ) - { - $infoline = "$cabfile : $installer::globals::lastsequence{$cabfile}\n"; - push(@installer::globals::logfileinfo, $infoline); - } -} - -########################################################################## -# Assigning sequencenumbers to files. This is requrired, -# if cabinet files shall be equivalent to packages. -########################################################################## - -sub assign_sequencenumbers_to_files -{ - my ( $filesref ) = @_; - - my %directaccess = (); - my %allassigns = (); - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - - # Keeping order in cabinet files - # -> collecting all files in one cabinet file - # -> sorting files and assigning numbers - - # Saving counter $i for direct access into files array - # "destination" of the file is a unique identifier ('Name' is not unique!) - if ( exists($directaccess{$onefile->{'destination'}}) ) { installer::exiter::exit_program("ERROR: 'destination' at file not unique: $onefile->{'destination'}", "assign_sequencenumbers_to_files"); } - $directaccess{$onefile->{'destination'}} = $i; - - my $cabfilename = $onefile->{'assignedcabinetfile'}; - # collecting files in cabinet files - if ( ! exists($allassigns{$cabfilename}) ) - { - my %onecabfile = (); - $onecabfile{$onefile->{'destination'}} = 1; - $allassigns{$cabfilename} = \%onecabfile; - } - else - { - $allassigns{$cabfilename}->{$onefile->{'destination'}} = 1; - } - } - - # Sorting each hash and assigning numbers - # The destination of the file determines the sort order, not the filename! - my $cabfile; - foreach $cabfile ( sort keys %allassigns ) - { - my $counter = $installer::globals::cabfilecounter{$cabfile}; - my $dest; - foreach $dest ( sort keys %{$allassigns{$cabfile}} ) # <- sorting the destination! - { - my $directaccessnumber = $directaccess{$dest}; - ${$filesref}[$directaccessnumber]->{'assignedsequencenumber'} = $counter; - $counter++; - } - } -} - -######################################################### -# Create a shorter version of a long component name, -# because maximum length in msi database is 72. -# Attention: In multi msi installation sets, the short -# names have to be unique over all packages, because -# this string is used to create the globally unique id -# -> no resetting of -# %installer::globals::allshortcomponents -# after a package was created. -######################################################### - -sub generate_new_short_componentname -{ - my ($componentname) = @_; - - my $shortcomponentname = ""; - my $counter = 1; - - my $startversion = substr($componentname, 0, 60); # taking only the first 60 characters - $startversion = $startversion . "_"; - - $shortcomponentname = $startversion . $counter; - - while ( exists($installer::globals::allshortcomponents{$shortcomponentname}) ) - { - $counter++; - $shortcomponentname = $startversion . $counter; - } - - $installer::globals::allshortcomponents{$shortcomponentname} = 1; - - return $shortcomponentname; -} - -############################################### -# Generating the component name from a file -############################################### - -sub get_file_component_name -{ - my ($fileref, $filesref) = @_; - - my $componentname = ""; - - # Special handling for files with ASSIGNCOMPOMENT - - my $styles = ""; - if ( $fileref->{'Styles'} ) { $styles = $fileref->{'Styles'}; } - if ( $styles =~ /\bASSIGNCOMPOMENT\b/ ) - { - $componentname = get_component_from_assigned_file($fileref->{'AssignComponent'}, $filesref); - } - else - { - # In this function exists the rule to create components from files - # Rule: - # Two files get the same componentid, if: - # both have the same destination directory. - # both have the same "gid" -> both were packed in the same zip file - # All other files are included into different components! - - # my $componentname = $fileref->{'gid'} . "_" . $fileref->{'Dir'}; - - # $fileref->{'Dir'} is not sufficient! All files in a zip file have the same $fileref->{'Dir'}, - # but can be in different subdirectories. - # Solution: destination=share\Scripts\beanshell\Capitalise\capitalise.bsh - # in which the filename (capitalise.bsh) has to be removed and all backslashes (slashes) are - # converted into underline. - - my $destination = $fileref->{'destination'}; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$destination); - $destination =~ s/\s//g; - $destination =~ s/\\/\_/g; - $destination =~ s/\//\_/g; - $destination =~ s/\_\s*$//g; # removing ending underline - - $componentname = $fileref->{'gid'} . "__" . $destination; - - # Files with different languages, need to be packed into different components. - # Then the installation of the language specific component is determined by a language condition. - - if ( $fileref->{'ismultilingual'} ) - { - my $officelanguage = $fileref->{'specificlanguage'}; - $componentname = $componentname . "_" . $officelanguage; - } - - $componentname = lc($componentname); # componentnames always lowercase - - $componentname =~ s/\-/\_/g; # converting "-" to "_" - $componentname =~ s/\./\_/g; # converting "-" to "_" - - # Attention: Maximum length for the componentname is 72 - # %installer::globals::allcomponents_in_this_database : resetted for each database - # %installer::globals::allcomponents : not resetted for each database - # Component strings must be unique for the complete product, because they are used for - # the creation of the globally unique identifier. - - my $fullname = $componentname; # This can be longer than 72 - - if (( exists($installer::globals::allcomponents{$fullname}) ) && ( ! exists($installer::globals::allcomponents_in_this_database{$fullname}) )) - { - # This is not allowed: One component cannot be installed with different packages. - installer::exiter::exit_program("ERROR: Component \"$fullname\" is already included into another package. This is not allowed.", "get_file_component_name"); - } - - if ( exists($installer::globals::allcomponents{$fullname}) ) - { - $componentname = $installer::globals::allcomponents{$fullname}; - } - else - { - if ( length($componentname) > 60 ) - { - # Using md5sum needs much time - # chomp(my $shorter = `echo $componentname | md5sum | sed -e "s/ .*//g"`); - # $componentname = "comp_$shorter"; - $componentname = generate_new_short_componentname($componentname); # This has to be unique for the complete product, not only one package - } - - $installer::globals::allcomponents{$fullname} = $componentname; - $installer::globals::allcomponents_in_this_database{$fullname} = 1; - } - - # $componentname =~ s/gid_file_/g_f_/g; - # $componentname =~ s/_extra_/_e_/g; - # $componentname =~ s/_config_/_c_/g; - # $componentname =~ s/_org_openoffice_/_o_o_/g; - # $componentname =~ s/_program_/_p_/g; - # $componentname =~ s/_typedetection_/_td_/g; - # $componentname =~ s/_linguistic_/_l_/g; - # $componentname =~ s/_module_/_m_/g; - # $componentname =~ s/_optional_/_opt_/g; - # $componentname =~ s/_packages/_pack/g; - # $componentname =~ s/_menubar/_mb/g; - # $componentname =~ s/_common_/_cm_/g; - # $componentname =~ s/_export_/_exp_/g; - # $componentname =~ s/_table_/_tb_/g; - # $componentname =~ s/_sofficecfg_/_sc_/g; - # $componentname =~ s/_soffice_cfg_/_sc_/g; - # $componentname =~ s/_startmodulecommands_/_smc_/g; - # $componentname =~ s/_drawimpresscommands_/_dic_/g; - # $componentname =~ s/_basiccommands_/_bac_/g; - # $componentname =~ s/_basicidecommands_/_baic_/g; - # $componentname =~ s/_genericcommands_/_genc_/g; - # $componentname =~ s/_bibliographycommands_/_bibc_/g; - # $componentname =~ s/_gentiumbookbasicbolditalic_/_gbbbi_/g; - # $componentname =~ s/_share_/_s_/g; - # $componentname =~ s/_extension_/_ext_/g; - # $componentname =~ s/_extensions_/_exs_/g; - # $componentname =~ s/_modules_/_ms_/g; - # $componentname =~ s/_uiconfig_zip_/_ucz_/g; - # $componentname =~ s/_productivity_/_pr_/g; - # $componentname =~ s/_wizard_/_wz_/g; - # $componentname =~ s/_import_/_im_/g; - # $componentname =~ s/_javascript_/_js_/g; - # $componentname =~ s/_template_/_tpl_/g; - # $componentname =~ s/_tplwizletter_/_twl_/g; - # $componentname =~ s/_beanshell_/_bs_/g; - # $componentname =~ s/_presentation_/_bs_/g; - # $componentname =~ s/_columns_/_cls_/g; - # $componentname =~ s/_python_/_py_/g; - - # $componentname =~ s/_tools/_ts/g; - # $componentname =~ s/_transitions/_trs/g; - # $componentname =~ s/_scriptbinding/_scrb/g; - # $componentname =~ s/_spreadsheet/_ssh/g; - # $componentname =~ s/_publisher/_pub/g; - # $componentname =~ s/_presenter/_pre/g; - # $componentname =~ s/_registry/_reg/g; - - # $componentname =~ s/screen/sc/g; - # $componentname =~ s/wordml/wm/g; - # $componentname =~ s/openoffice/oo/g; - } - - return $componentname; -} - -#################################################################### -# Returning the component name for a defined file gid. -# This is necessary for files with flag ASSIGNCOMPOMENT -#################################################################### - -sub get_component_from_assigned_file -{ - my ($gid, $filesref) = @_; - - my $onefile = installer::existence::get_specified_file($filesref, $gid); - my $componentname = ""; - if ( $onefile->{'componentname'} ) { $componentname = $onefile->{'componentname'}; } - else { installer::exiter::exit_program("ERROR: No component defined for file: $gid", "get_component_from_assigned_file"); } - - return $componentname; -} - -#################################################################### -# Generating the special filename for the database file File.idt -# Sample: CONTEXTS, CONTEXTS1 -# This name has to be unique. -# In most cases this is simply the filename. -#################################################################### - -sub generate_unique_filename_for_filetable -{ - my ($fileref, $component, $uniquefilenamehashref) = @_; - - # This new filename has to be saved into $fileref, because this is needed to find the source. - # The filename sbasic.idx/OFFSETS is changed to OFFSETS, but OFFSETS is not unique. - # In this procedure names like OFFSETS5 are produced. And exactly this string has to be added to - # the array of all files. - - my $uniquefilename = ""; - my $counter = 0; - - if ( $fileref->{'Name'} ) { $uniquefilename = $fileref->{'Name'}; } - - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$uniquefilename); # making /registry/schema/org/openoffice/VCL.xcs to VCL.xcs - - # Reading unique filename with help of "Component_" in File table from old database - if (( $installer::globals::updatedatabase ) && ( exists($uniquefilenamehashref->{"$component/$uniquefilename"}) )) - { - $uniquefilename = $uniquefilenamehashref->{"$component/$uniquefilename"}; # syntax of $value: ($uniquename;$shortname) - if ( $uniquefilename =~ /^\s*(.*?)\;\s*(.*?)\s*$/ ) { $uniquefilename = $1; } - $lcuniquefilename = lc($uniquefilename); - $installer::globals::alluniquefilenames{$uniquefilename} = 1; - $installer::globals::alllcuniquefilenames{$lcuniquefilename} = 1; - return $uniquefilename; - } - elsif (( $installer::globals::prepare_winpatch ) && ( exists($installer::globals::savedmapping{"$component/$uniquefilename"}) )) - { - # If we have a FTK mapping for this component/file, use it. - $installer::globals::savedmapping{"$component/$uniquefilename"} =~ m/^(.*);/; - $uniquefilename = $1; - $lcuniquefilename = lc($uniquefilename); - $installer::globals::alluniquefilenames{$uniquefilename} = 1; - $installer::globals::alllcuniquefilenames{$lcuniquefilename} = 1; - return $uniquefilename; - } - - $uniquefilename =~ s/\-/\_/g; # no "-" allowed - $uniquefilename =~ s/\@/\_/g; # no "@" allowed - $uniquefilename =~ s/\$/\_/g; # no "$" allowed - $uniquefilename =~ s/^\s*\./\_/g; # no "." at the beginning allowed allowed - $uniquefilename =~ s/^\s*\d/\_d/g; # no number at the beginning allowed allowed (even file "0.gif", replacing to "_d.gif") - $uniquefilename =~ s/org_openoffice_/ooo_/g; # shorten the unique file name - - my $lcuniquefilename = lc($uniquefilename); # only lowercase names - - my $newname = 0; - - if ( ! exists($installer::globals::alllcuniquefilenames{$lcuniquefilename}) && - ! exists($installer::globals::savedrevmapping{$lcuniquefilename}) ) - { - $installer::globals::alluniquefilenames{$uniquefilename} = 1; - $installer::globals::alllcuniquefilenames{$lcuniquefilename} = 1; - $newname = 1; - } - - if ( ! $newname ) - { - # adding a number until the name is really unique: OFFSETS, OFFSETS1, OFFSETS2, ... - # But attention: Making "abc.xcu" to "abc1.xcu" - - my $uniquefilenamebase = $uniquefilename; - - do - { - $counter++; - - if ( $uniquefilenamebase =~ /\./ ) - { - $uniquefilename = $uniquefilenamebase; - $uniquefilename =~ s/\./$counter\./; - } - else - { - $uniquefilename = $uniquefilenamebase . $counter; - } - - $newname = 0; - $lcuniquefilename = lc($uniquefilename); # only lowercase names - - if ( ! exists($installer::globals::alllcuniquefilenames{$lcuniquefilename}) && - ! exists($installer::globals::savedrevmapping{$lcuniquefilename}) ) - { - $installer::globals::alluniquefilenames{$uniquefilename} = 1; - $installer::globals::alllcuniquefilenames{$lcuniquefilename} = 1; - $newname = 1; - } - } - until ( $newname ) - } - - return $uniquefilename; -} - -#################################################################### -# Generating the special file column for the database file File.idt -# Sample: NAMETR~1.TAB|.nametranslation.table -# The first part has to be 8.3 conform. -#################################################################### - -sub generate_filename_for_filetable -{ - my ($fileref, $shortnamesref, $uniquefilenamehashref) = @_; - - my $returnstring = ""; - - my $filename = $fileref->{'Name'}; - - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$filename); # making /registry/schema/org/openoffice/VCL.xcs to VCL.xcs - - my $shortstring; - - # Reading short string with help of "FileName" in File table from old database - if (( $installer::globals::updatedatabase ) && ( exists($uniquefilenamehashref->{"$fileref->{'componentname'}/$filename"}) )) - { - my $value = $uniquefilenamehashref->{"$fileref->{'componentname'}/$filename"}; # syntax of $value: ($uniquename;$shortname) - if ( $value =~ /^\s*(.*?)\;\s*(.*?)\s*$/ ) { $shortstring = $2; } # already collected in function "collect_shortnames_from_old_database" - else { $shortstring = $filename; } - } - elsif (( $installer::globals::prepare_winpatch ) && ( exists($installer::globals::savedmapping{"$fileref->{'componentname'}/$filename"}) )) - { - $installer::globals::savedmapping{"$fileref->{'componentname'}/$filename"} =~ m/.*;(.*)/; - if ($1 ne '') - { - $shortstring = $1; - } - else - { - $shortstring = installer::windows::idtglobal::make_eight_three_conform_with_hash($filename, "file", $shortnamesref); - } - } - else - { - $shortstring = installer::windows::idtglobal::make_eight_three_conform_with_hash($filename, "file", $shortnamesref); - } - - if ( $shortstring eq $filename ) { $returnstring = $filename; } # nothing changed - else {$returnstring = $shortstring . "\|" . $filename; } - - return $returnstring; -} - -######################################### -# Returning the filesize of a file -######################################### - -sub get_filesize -{ - my ($fileref) = @_; - - my $file = $fileref->{'sourcepath'}; - - my $filesize; - - if ( -f $file ) # test of existence. For instance services.rdb does not always exist - { - $filesize = ( -s $file ); # file size can be "0" - } - else - { - $filesize = -1; - } - - return $filesize; -} - -############################################# -# Returning the file version, if required -# Sample: "8.0.1.8976"; -############################################# - -sub get_fileversion -{ - my ($onefile, $allvariables, $styles) = @_; - - my $fileversion = ""; - - if ( $allvariables->{'USE_FILEVERSION'} ) - { - if ( ! $allvariables->{'LIBRARYVERSION'} ) { installer::exiter::exit_program("ERROR: USE_FILEVERSION is set, but not LIBRARYVERSION", "get_fileversion"); } - my $libraryversion = $allvariables->{'LIBRARYVERSION'}; - if ( $libraryversion =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ ) - { - my $major = $1; - my $minor = $2; - my $micro = $3; - my $concat = 100 * $minor + $micro; - $libraryversion = $major . "\." . $concat; - } - my $vendornumber = 0; - if ( $allvariables->{'VENDORPATCHVERSION'} ) { $vendornumber = $allvariables->{'VENDORPATCHVERSION'}; } - $fileversion = $libraryversion . "\." . $installer::globals::buildid . "\." . $vendornumber; - if ( $onefile->{'FileVersion'} ) { $fileversion = $onefile->{'FileVersion'}; } # overriding FileVersion in scp - - # if ( $styles =~ /\bFONT\b/ ) - # { - # my $newfileversion = installer::windows::font::get_font_version($onefile->{'sourcepath'}); - # if ( $newfileversion != 0 ) { $fileversion = $newfileversion; } - # } - } - - if ( $installer::globals::prepare_winpatch ) { $fileversion = ""; } # Windows patches do not allow this version # -> who says so? - - return $fileversion; -} - -############################################# -# Returning the sequence for a file -############################################# - -sub get_sequence_for_file -{ - my ($number, $onefile, $fileentry, $allupdatesequenceshashref, $allupdatecomponentshashref, $allupdatefileorderhashref, $allfilecomponents) = @_; - - my $sequence = ""; - my $infoline = ""; - my $pffcomponentname = $onefile->{'componentname'} . "_pff"; - - if ( $installer::globals::updatedatabase ) - { - if (( exists($allupdatesequenceshashref->{$onefile->{'uniquename'}}) ) && - (( $onefile->{'componentname'} eq $allupdatecomponentshashref->{$onefile->{'uniquename'}} ) || - ( $pffcomponentname eq $allupdatecomponentshashref->{$onefile->{'uniquename'}} ))) - { - # The second condition is necessary to find shifted files, that have same "uniquename", but are now - # located in another directory. This can be seen at the component name. - $sequence = $allupdatesequenceshashref->{$onefile->{'uniquename'}}; - $onefile->{'assignedsequencenumber'} = $sequence; - # Collecting all used sequences, to guarantee, that no number is unused - $installer::globals::allusedupdatesequences{$sequence} = 1; - # Special help for files, that already have a "pff" component name (for example after ServicePack 1) - if ( $pffcomponentname eq $allupdatecomponentshashref->{$onefile->{'uniquename'}} ) - { - $infoline = "Warning: Special handling for component \"$pffcomponentname\". This file was added after the final, but before this ServicePack.\n"; - push(@installer::globals::logfileinfo, $infoline); - $onefile->{'componentname'} = $pffcomponentname; # pff for "post final file" - $fileentry->{'Component_'} = $onefile->{'componentname'}; - if ( ! exists($allfilecomponents->{$fileentry->{'Component_'}}) ) { $allfilecomponents->{$fileentry->{'Component_'}} = 1; } - } - } - else - { - $installer::globals::updatesequencecounter++; - $sequence = $installer::globals::updatesequencecounter; - $onefile->{'assignedsequencenumber'} = $sequence; - # $onefile->{'assignedcabinetfile'} = $installer::globals::pffcabfilename; # assigning to cabinet file for "post final files" - # Collecting all new files - $installer::globals::newupdatefiles{$sequence} = $onefile; - # Saving in sequence hash - $allupdatefileorderhashref->{$sequence} = $onefile->{'uniquename'}; - - # If the new file is part of an existing component, this must be changed now. All files - # of one component have to be included in one cabinet file. But because the order must - # not change, all new files have to be added to new components. - # $onefile->{'componentname'} = $file{'Component_'}; - - $onefile->{'componentname'} = $onefile->{'componentname'} . "_pff"; # pff for "post final file" - $fileentry->{'Component_'} = $onefile->{'componentname'}; - if ( ! exists($allfilecomponents->{$fileentry->{'Component_'}}) ) { $allfilecomponents->{$fileentry->{'Component_'}} = 1; } - $onefile->{'PostFinalFile'} = 1; - # $installer::globals::pfffileexists = 1; - # The sequence for this file has changed. It has to be inserted at the end of the files collector. - $installer::globals::insert_file_at_end = 1; - $installer::globals::newfilescollector{$sequence} = $onefile; # Adding new files to the end of the filescollector - $installer::globals::newfilesexist = 1; - } - } - elsif (( $onefile->{'assignedsequencenumber'} ) && ( $installer::globals::use_packages_for_cabs )) - { - $sequence = $onefile->{'assignedsequencenumber'}; - } - else - { - $sequence = $number; - # my $sequence = $number + 1; - - # Idea: Each component is packed into a cab file. - # This requires that all files in one cab file have sequences directly follwing each other, - # for instance from 1456 to 1466. Then in the media table the LastSequence for this cab file - # is 1466. - # Because all files belonging to one component are directly behind each other in the file - # collector, it is possible to use simply an increasing number as sequence value. - # If files belonging to one component are not directly behind each other in the files collector - # this mechanism will no longer work. - } - - return $sequence; -} - -############################################# -# Returning the Windows language of a file -############################################# - -sub get_language_for_file -{ - my ($fileref) = @_; - - my $language = ""; - - if ( $fileref->{'specificlanguage'} ) { $language = $fileref->{'specificlanguage'}; } - - if ( $language eq "" ) - { - $language = 0; # language independent - # If this is not a font, the return value should be "0" (Check ICE 60) - my $styles = ""; - if ( $fileref->{'Styles'} ) { $styles = $fileref->{'Styles'}; } - if ( $styles =~ /\bFONT\b/ ) { $language = ""; } - } - else - { - $language = installer::windows::language::get_windows_language($language); - } - - return $language; -} - -#################################################################### -# Creating a new KeyPath for components in TemplatesFolder. -#################################################################### - -sub generate_registry_keypath -{ - my ($onefile) = @_; - - my $keypath = $onefile->{'Name'}; - $keypath =~ s/\.//g; - $keypath = lc($keypath); - $keypath = "userreg_" . $keypath; - - return $keypath; -} - -#################################################################### -# Check, if in an update process files are missing. No removal -# of files allowed for Windows Patch creation. -# Also logging all new files, that have to be included in extra -# components and cab files. -#################################################################### - -sub check_file_sequences -{ - my ($allupdatefileorderhashref, $allupdatecomponentorderhashref) = @_; - - # All used sequences stored in %installer::globals::allusedupdatesequences - # Maximum sequence number of old database stored in $installer::globals::updatelastsequence - # All new files stored in %installer::globals::newupdatefiles - - my $infoline = ""; - - my @missing_sequences = (); - my @really_missing_sequences = (); - - for ( my $i = 1; $i <= $installer::globals::updatelastsequence; $i++ ) - { - if ( ! exists($installer::globals::allusedupdatesequences{$i}) ) { push(@missing_sequences, $i); } - } - - if ( $#missing_sequences > -1 ) - { - # Missing sequences can also be caused by files included in merge modules. This files are added later into the file table. - # Therefore now it is time to check the content of the merge modules. - - for ( my $j = 0; $j <= $#missing_sequences; $j++ ) - { - my $filename = $allupdatefileorderhashref->{$missing_sequences[$j]}; - - # Is this a file from a merge module? Then this is no error. - if ( ! exists($installer::globals::mergemodulefiles{$filename}) ) - { - push(@really_missing_sequences, $missing_sequences[$j]); - } - } - } - - if ( $#really_missing_sequences > -1 ) - { - my $errorstring = ""; - for ( my $j = 0; $j <= $#really_missing_sequences; $j++ ) - { - my $filename = $allupdatefileorderhashref->{$really_missing_sequences[$j]}; - my $comp = $allupdatecomponentorderhashref->{$really_missing_sequences[$j]}; - $errorstring = "$errorstring$filename (Sequence: $really_missing_sequences[$j], Component: \"$comp\")\n"; - } - - $infoline = "ERROR: Files are removed compared with update database.\nThe following files are missing:\n$errorstring"; - push(@installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program($infoline, "check_file_sequences"); - } - - # Searching for new files - - my $counter = 0; - - foreach my $key ( keys %installer::globals::newupdatefiles ) - { - my $onefile = $installer::globals::newupdatefiles{$key}; - $counter++; - if ( $counter == 1 ) - { - $infoline = "\nNew files compared to the update database:\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - $infoline = "$onefile->{'Name'} ($onefile->{'gid'}) Sequence: $onefile->{'assignedsequencenumber'}\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - if ( $counter == 0 ) - { - $infoline = "Info: No new file compared with update database!\n"; - push(@installer::globals::logfileinfo, $infoline); - } - -} - -################################################################### -# Collecting further conditions for the component table. -# This is used by multilayer products, to enable installation -# of separate layers. -################################################################### - -sub get_tree_condition_for_component -{ - my ($onefile, $componentname) = @_; - - if ( $onefile->{'destination'} ) - { - my $dest = $onefile->{'destination'}; - - # Comparing the destination path with - # $installer::globals::hostnametreestyles{$hostname} = $treestyle; - # (-> hostname is the key, the style the value!) - - foreach my $hostname ( keys %installer::globals::hostnametreestyles ) - { - if (( $dest eq $hostname ) || ( $dest =~ /^\s*\Q$hostname\E\\/ )) - { - # the value is the style - my $style = $installer::globals::hostnametreestyles{$hostname}; - # the condition is saved in %installer::globals::treestyles - my $condition = $installer::globals::treestyles{$style}; - # Saving condition to be added in table Property - $installer::globals::usedtreeconditions{$condition} = 1; - $condition = $condition . "=1"; - # saving this condition - $installer::globals::treeconditions{$componentname} = $condition; - - # saving also at the file, for usage in fileinfo - $onefile->{'layer'} = $installer::globals::treelayername{$style}; - } - } - } -} - -############################################ -# Collecting all short names, that are -# already used by the old database -############################################ - -sub collect_shortnames_from_old_database -{ - my ($uniquefilenamehashref, $shortnameshashref) = @_; - - foreach my $key ( keys %{$uniquefilenamehashref} ) - { - my $value = $uniquefilenamehashref->{$key}; # syntax of $value: ($uniquename;$shortname) - - if ( $value =~ /^\s*(.*?)\;\s*(.*?)\s*$/ ) - { - my $shortstring = $2; - $shortnameshashref->{$shortstring} = 1; # adding the shortname to the array of all shortnames - } - } -} - -############################################ -# Creating the file File.idt dynamically -############################################ - -sub create_files_table -{ - my ($filesref, $allfilecomponentsref, $basedir, $allvariables, $uniquefilenamehashref, $allupdatesequenceshashref, $allupdatecomponentshashref, $allupdatefileorderhashref) = @_; - - installer::logger::include_timestamp_into_logfile("Performance Info: File Table start"); - - # Structure of the files table: - # File Component_ FileName FileSize Version Language Attributes Sequence - # In this function, all components are created. - # - # $allfilecomponentsref is empty at the beginning - - my $infoline; - - my @allfiles = (); - my @filetable = (); - my @filehashtable = (); - my %allfilecomponents = (); - my $counter = 0; - - if ( $^O =~ /cygwin/i ) { installer::worker::generate_cygwin_pathes($filesref); } - - # The filenames must be collected because of uniqueness - # 01-44-~1.DAT, 01-44-~2.DAT, ... - my %shortnames = (); - - if ( $installer::globals::updatedatabase ) { collect_shortnames_from_old_database($uniquefilenamehashref, \%shortnames); } - - installer::windows::idtglobal::write_idt_header(\@filetable, "file"); - installer::windows::idtglobal::write_idt_header(\@filehashtable, "filehash"); - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my %file = (); - - my $onefile = ${$filesref}[$i]; - - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - if (( $styles =~ /\bJAVAFILE\b/ ) && ( ! ($allvariables->{'JAVAPRODUCT'} ))) { next; } - - $file{'Component_'} = get_file_component_name($onefile, $filesref); - $file{'File'} = generate_unique_filename_for_filetable($onefile, $file{'Component_'}, $uniquefilenamehashref); - - $onefile->{'uniquename'} = $file{'File'}; - $onefile->{'componentname'} = $file{'Component_'}; - - # Collecting all components - - if ( ! exists($allfilecomponents{$file{'Component_'}}) ) { $allfilecomponents{$file{'Component_'}} = 1; } - - $file{'FileName'} = generate_filename_for_filetable($onefile, \%shortnames, $uniquefilenamehashref); - - $file{'FileSize'} = get_filesize($onefile); - - $file{'Version'} = get_fileversion($onefile, $allvariables, $styles); - - $file{'Language'} = get_language_for_file($onefile); - - if ( $styles =~ /\bDONT_PACK\b/ ) { $file{'Attributes'} = "8192"; } - else { $file{'Attributes'} = "16384"; } - - # $file{'Attributes'} = "16384"; # Sourcefile is packed - # $file{'Attributes'} = "8192"; # Sourcefile is unpacked - - $installer::globals::insert_file_at_end = 0; - $counter++; - $file{'Sequence'} = get_sequence_for_file($counter, $onefile, \%file, $allupdatesequenceshashref, $allupdatecomponentshashref, $allupdatefileorderhashref, \%allfilecomponents); - - $onefile->{'sequencenumber'} = $file{'Sequence'}; - - my $oneline = $file{'File'} . "\t" . $file{'Component_'} . "\t" . $file{'FileName'} . "\t" - . $file{'FileSize'} . "\t" . $file{'Version'} . "\t" . $file{'Language'} . "\t" - . $file{'Attributes'} . "\t" . $file{'Sequence'} . "\n"; - - push(@filetable, $oneline); - - if ( ! $installer::globals::insert_file_at_end ) { push(@allfiles, $onefile); } - - # Collecting all component conditions - if ( $onefile->{'ComponentCondition'} ) - { - if ( ! exists($installer::globals::componentcondition{$file{'Component_'}})) - { - $installer::globals::componentcondition{$file{'Component_'}} = $onefile->{'ComponentCondition'}; - } - } - - # Collecting also all tree conditions for multilayer products - get_tree_condition_for_component($onefile, $file{'Component_'}); - - # Collecting all component names, that have flag VERSION_INDEPENDENT_COMP_ID - # This should be all components with constant API, for example URE - if ( $styles =~ /\bVERSION_INDEPENDENT_COMP_ID\b/ ) - { - $installer::globals::base_independent_components{$onefile->{'componentname'}} = 1; - } - - # Collecting all component ids, that are defined at files in scp project (should not be used anymore) - if ( $onefile->{'CompID'} ) - { - if ( ! exists($installer::globals::componentid{$onefile->{'componentname'}})) - { - $installer::globals::componentid{$onefile->{'componentname'}} = $onefile->{'CompID'}; - } - else - { - if ( $installer::globals::componentid{$onefile->{'componentname'}} ne $onefile->{'CompID'} ) - { - installer::exiter::exit_program("ERROR: There is already a ComponentID for component \"$onefile->{'componentname'}\" : \"$installer::globals::componentid{$onefile->{'componentname'}}\" . File \"$onefile->{'gid'}\" uses \"$onefile->{'CompID'}\" !", "create_files_table"); - } - } - - # Also checking vice versa. Is this ComponentID already used? If yes, is the componentname the same? - - if ( ! exists($installer::globals::comparecomponentname{$onefile->{'CompID'}})) - { - $installer::globals::comparecomponentname{$onefile->{'CompID'}} = $onefile->{'componentname'}; - } - else - { - if ( $installer::globals::comparecomponentname{$onefile->{'CompID'}} ne $onefile->{'componentname'} ) - { - installer::exiter::exit_program("ERROR: There is already a component for ComponentID \"$onefile->{'CompID'}\" : \"$installer::globals::comparecomponentname{$onefile->{'CompID'}}\" . File \"$onefile->{'gid'}\" has same component id but is included in component \"$onefile->{'componentname'}\" !", "create_files_table"); - } - } - } - - # Collecting all language specific conditions - if ( $onefile->{'ismultilingual'} ) - { - if ( $onefile->{'ComponentCondition'} ) { installer::exiter::exit_program("ERROR: Cannot set language condition. There is already another component condition for file $onefile->{'gid'}: \"$onefile->{'ComponentCondition'}\" !", "create_files_table"); } - - if ( $onefile->{'specificlanguage'} eq "" ) { installer::exiter::exit_program("ERROR: There is no specific language for file at language module: $onefile->{'gid'} !", "create_files_table"); } - my $locallanguage = $onefile->{'specificlanguage'}; - my $property = "IS" . $file{'Language'}; - my $value = 1; - my $condition = $property . "=" . $value; - - $onefile->{'ComponentCondition'} = $condition; - - if ( exists($installer::globals::componentcondition{$file{'Component_'}})) - { - if ( $installer::globals::componentcondition{$file{'Component_'}} ne $condition ) { installer::exiter::exit_program("ERROR: There is already another component condition for file $onefile->{'gid'}: \"$installer::globals::componentcondition{$file{'Component_'}}\" and \"$condition\" !", "create_files_table"); } - } - else - { - $installer::globals::componentcondition{$file{'Component_'}} = $condition; - } - - # collecting all properties for table Property - if ( ! exists($installer::globals::languageproperties{$property}) ) { $installer::globals::languageproperties{$property} = $value; } - } - - if ( $installer::globals::prepare_winpatch ) - { - my $path = $onefile->{'sourcepath'}; - if ( $^O =~ /cygwin/i ) { $path = $onefile->{'cyg_sourcepath'}; } - - open(FILE, $path) or die "ERROR: Can't open $path for creating file hash"; - binmode(FILE); - my $hashinfo = pack("l", 20); - $hashinfo .= Digest::MD5->new->addfile(*FILE)->digest; - - my @i = unpack ('x[l]l4', $hashinfo); - $oneline = $file{'File'} . "\t" . - "0" . "\t" . - $i[0] . "\t" . - $i[1] . "\t" . - $i[2] . "\t" . - $i[3] . "\n"; - push (@filehashtable, $oneline); - } - - # Saving the sequence number in a hash with uniquefilename as key. - # This is used for better performance in "save_packorder" - $installer::globals::uniquefilenamesequence{$onefile->{'uniquename'}} = $onefile->{'sequencenumber'}; - - # Special handling for files in PREDEFINED_OSSHELLNEWDIR. These components - # need as KeyPath a RegistryItem in HKCU - my $destdir = ""; - if ( $onefile->{'Dir'} ) { $destdir = $onefile->{'Dir'}; } - - if (( $destdir =~ /\bPREDEFINED_OSSHELLNEWDIR\b/ ) || ( $onefile->{'needs_user_registry_key'} )) - { - my $keypath = generate_registry_keypath($onefile); - $onefile->{'userregkeypath'} = $keypath; - push(@installer::globals::userregistrycollector, $onefile); - $installer::globals::addeduserregitrykeys = 1; - } - } - - # putting content from %allfilecomponents to $allfilecomponentsref for later usage - foreach $localkey (keys %allfilecomponents ) { push( @{$allfilecomponentsref}, $localkey); } - - my $filetablename = $basedir . $installer::globals::separator . "File.idt"; - installer::files::save_file($filetablename ,\@filetable); - $infoline = "\nCreated idt file: $filetablename\n"; - push(@installer::globals::logfileinfo, $infoline); - - installer::logger::include_timestamp_into_logfile("Performance Info: File Table end"); - - my $filehashtablename = $basedir . $installer::globals::separator . "MsiFileHash.idt"; - installer::files::save_file($filehashtablename ,\@filehashtable); - $infoline = "\nCreated idt file: $filehashtablename\n"; - push(@installer::globals::logfileinfo, $infoline); - - # Now the new files can be added to the files collector (only in update packaging processes) - if ( $installer::globals::newfilesexist ) - { - foreach my $seq (sort keys %installer::globals::newfilescollector) { push(@allfiles, $installer::globals::newfilescollector{$seq}) } - } - - return \@allfiles; -} - -1; diff --git a/solenv/bin/modules/installer/windows/font.pm b/solenv/bin/modules/installer/windows/font.pm deleted file mode 100644 index 64dbc39f6..000000000 --- a/solenv/bin/modules/installer/windows/font.pm +++ /dev/null @@ -1,109 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::font; - -use installer::files; -use installer::globals; -use installer::windows::idtglobal; - - -################################################################################# -# Creating the file Font.idt dynamically -# Content: -# File_ FontTitle -################################################################################# - -sub create_font_table -{ - my ($filesref, $basedir) = @_; - - my @fonttable = (); - - installer::windows::idtglobal::write_idt_header(\@fonttable, "font"); - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - my $styles = ""; - - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - - if ( $styles =~ /\bFONT\b/ ) - { - my %font = (); - - $font{'File_'} = $onefile->{'uniquename'}; - $font{'FontTitle'} = ""; - - my $oneline = $font{'File_'} . "\t" . $font{'FontTitle'} . "\n"; - - push(@fonttable, $oneline); - } - } - - # Saving the file - - my $fonttablename = $basedir . $installer::globals::separator . "Font.idt"; - installer::files::save_file($fonttablename ,\@fonttable); - my $infoline = "Created idt file: $fonttablename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -################################################################################# -# Reading the Font version from the ttf file, to avoid installation -# of older files over newer files. -################################################################################# - -sub get_font_version -{ - my ( $fontfile ) = @_; - - if ( ! -f $fontfile ) { installer::exiter::exit_program("ERROR: Font file does not exist: \"$fontfile\"", "get_font_version"); } - - my $fontversion = 0; - my $infoline = ""; - - my $onefile = installer::files::read_binary_file($fontfile); - - if ( $onefile =~ /Version\s+(\d+\.\d+\.*\d*)/ ) - { - $fontversion = $1; - $infoline = "FONT: Font \"$fontfile\" version: $fontversion\n"; - push(@installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "FONT: Could not determine font version: \"$fontfile\"\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - return $fontversion; -} - -1; diff --git a/solenv/bin/modules/installer/windows/icon.pm b/solenv/bin/modules/installer/windows/icon.pm deleted file mode 100644 index 74f6f5662..000000000 --- a/solenv/bin/modules/installer/windows/icon.pm +++ /dev/null @@ -1,77 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::icon; - -use installer::files; -use installer::globals; -use installer::pathanalyzer; -use installer::windows::idtglobal; - -########################################################################################################### -# Creating the file Icon.idt dynamically -# Content: -# Name Data -########################################################################################################### - -sub create_icon_table -{ - my ($iconfilecollector, $basedir) = @_; - - my @icontable = (); - - installer::windows::idtglobal::write_idt_header(\@icontable, "icon"); - - # Only the iconfiles, that are used in the shortcut table for the - # FolderItems (entries in Windows startmenu) are added into the icon table. - - for ( my $i = 0; $i <= $#{$iconfilecollector}; $i++ ) - { - my $iconfile = ${$iconfilecollector}[$i]; - - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$iconfile); - - my %icon = (); - - $icon{'Name'} = $iconfile; # simply soffice.exe - $icon{'Data'} = $iconfile; # simply soffice.exe - - my $oneline = $icon{'Name'} . "\t" . $icon{'Data'} . "\n"; - - push(@icontable, $oneline); - } - - # Saving the file - - my $icontablename = $basedir . $installer::globals::separator . "Icon.idt"; - installer::files::save_file($icontablename ,\@icontable); - my $infoline = "Created idt file: $icontablename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -1; diff --git a/solenv/bin/modules/installer/windows/idtglobal.pm b/solenv/bin/modules/installer/windows/idtglobal.pm deleted file mode 100644 index 8ef7f14ea..000000000 --- a/solenv/bin/modules/installer/windows/idtglobal.pm +++ /dev/null @@ -1,2411 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::idtglobal; - -use Cwd; -use installer::converter; -use installer::existence; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::pathanalyzer; -use installer::remover; -use installer::scriptitems; -use installer::systemactions; -use installer::windows::language; - -############################################################## -# Shorten the gid for a feature. -# Attention: Maximum length is 38 -############################################################## - -sub shorten_feature_gid -{ - my ($stringref) = @_; - - $$stringref =~ s/gid_Module_/gm_/; - $$stringref =~ s/_Extension_/_ex_/; - $$stringref =~ s/_Root_/_r_/; - $$stringref =~ s/_Prg_/_p_/; - $$stringref =~ s/_Optional_/_o_/; - $$stringref =~ s/_Tools_/_tl_/; - $$stringref =~ s/_Wrt_Flt_/_w_f_/; - $$stringref =~ s/_Javafilter_/_jf_/; - $$stringref =~ s/_Productivity_/_pr_/; -} - -############################################ -# Getting the next free number, that -# can be added. -# Sample: 01-44-~1.DAT, 01-44-~2.DAT, ... -############################################ - -sub get_next_free_number -{ - my ($name, $shortnamesref) = @_; - - my $counter = 0; - my $dontsave = 0; - my $alreadyexists; - my ($newname, $shortname); - - do - { - $alreadyexists = 0; - $counter++; - $newname = $name . $counter; - - for ( my $i = 0; $i <= $#{$shortnamesref}; $i++ ) - { - $shortname = ${$shortnamesref}[$i]; - - if ( uc($shortname) eq uc($newname) ) # case insensitive - { - $alreadyexists = 1; - last; - } - } - } - until (!($alreadyexists)); - - if (( $counter > 9 ) && ( length($name) > 6 )) { $dontsave = 1; } - if (( $counter > 99 ) && ( length($name) > 5 )) { $dontsave = 1; } - - if (!($dontsave)) - { - push(@{$shortnamesref}, $newname); # adding the new shortname to the array of shortnames - } - - return $counter -} - -############################################ -# Getting the next free number, that -# can be added. -# Sample: 01-44-~1.DAT, 01-44-~2.DAT, ... -############################################ - -sub get_next_free_number_with_hash -{ - my ($name, $shortnamesref, $ext) = @_; - - my $counter = 0; - my $dontsave = 0; - my $saved = 0; - my $alreadyexists; - my ($newname, $shortname); - - do - { - $alreadyexists = 0; - $counter++; - $newname = $name . $counter; - $newname = uc($newname); # case insensitive, always upper case - if ( exists($shortnamesref->{$newname}) || - exists($installer::globals::savedrev83mapping{$newname.$ext}) ) - { - $alreadyexists = 1; - } - } - until (!($alreadyexists)); - - if (( $counter > 9 ) && ( length($name) > 6 )) { $dontsave = 1; } - if (( $counter > 99 ) && ( length($name) > 5 )) { $dontsave = 1; } - - if (!($dontsave)) - { - $shortnamesref->{$newname} = 1; # adding the new shortname to the array of shortnames, always uppercase - $saved = 1; - } - - return ( $counter, $saved ) -} - -######################################### -# 8.3 for filenames and directories -######################################### - -sub make_eight_three_conform -{ - my ($inputstring, $pattern, $shortnamesref) = @_; - - # all shortnames are collected in $shortnamesref, because of uniqueness - - my ($name, $namelength, $number); - my $conformstring = ""; - my $changed = 0; - - if (( $inputstring =~ /^\s*(.*?)\.(.*?)\s*$/ ) && ( $pattern eq "file" )) # files with a dot - { - $name = $1; - my $extension = $2; - - $namelength = length($name); - my $extensionlength = length($extension); - - if ( $extensionlength > 3 ) - { - # simply taking the first three letters - $extension = substr($extension, 0, 3); # name, offset, length - } - - # Attention: readme.html -> README~1.HTM - - if (( $namelength > 8 ) || ( $extensionlength > 3 )) - { - # taking the first six letters - $name = substr($name, 0, 6); # name, offset, length - $name =~ s/\s*$//; # removing ending whitespaces - $name = $name . "\~"; - $number = get_next_free_number($name, $shortnamesref); - - # if $number>9 the new name would be "abcdef~10.xyz", which is 9+3, and therefore not allowed - - if ( $number > 9 ) - { - $name = substr($name, 0, 5); # name, offset, length - $name =~ s/\s*$//; # removing ending whitespaces - $name = $name . "\~"; - $number = get_next_free_number($name, $shortnamesref); - - if ( $number > 99 ) - { - $name = substr($name, 0, 4); # name, offset, length - $name =~ s/\s*$//; # removing ending whitespaces - $name = $name . "\~"; - $number = get_next_free_number($name, $shortnamesref); - } - } - - $name = $name . "$number"; - - $changed = 1; - } - - $conformstring = $name . "\." . $extension; - - if ( $changed ) { $conformstring= uc($conformstring); } - } - else # no dot in filename or directory (also used for shortcuts) - { - $name = $inputstring; - $namelength = length($name); - - if ( $namelength > 8 ) - { - # taking the first six letters - $name = substr($name, 0, 6); # name, offset, length - $name =~ s/\s*$//; # removing ending whitespaces - $name = $name . "\~"; - $number = get_next_free_number($name, $shortnamesref); - - # if $number>9 the new name would be "abcdef~10.xyz", which is 9+3, and therefore not allowed - - if ( $number > 9 ) - { - $name = substr($name, 0, 5); # name, offset, length - $name =~ s/\s*$//; # removing ending whitespaces - $name = $name . "\~"; - $number = get_next_free_number($name, $shortnamesref); - - if ( $number > 99 ) - { - $name = substr($name, 0, 4); # name, offset, length - $name =~ s/\s*$//; # removing ending whitespaces - $name = $name . "\~"; - $number = get_next_free_number($name, $shortnamesref); - } - } - - $name = $name . "$number"; - $changed = 1; - if ( $pattern eq "dir" ) { $name =~ s/\./\_/g; } # in directories replacing "." with "_" - } - - $conformstring = $name; - - if ( $changed ) { $conformstring = uc($name); } - } - - return $conformstring; -} - -######################################### -# 8.3 for filenames and directories -# $shortnamesref is a hash in this case -# -> performance reasons -######################################### - -sub make_eight_three_conform_with_hash -{ - my ($inputstring, $pattern, $shortnamesref) = @_; - - # all shortnames are collected in $shortnamesref, because of uniqueness (a hash!) - - my ($name, $namelength, $number); - my $conformstring = ""; - my $changed = 0; - my $saved; - - if (( $inputstring =~ /^\s*(.*)\.(.*?)\s*$/ ) && ( $pattern eq "file" )) # files with a dot - { - # extension has to be non-greedy, but name is. This is important to find the last dot in the filename - $name = $1; - my $extension = $2; - - if ( $name =~ /^\s*(.*?)\s*$/ ) { $name = $1; } # now the name is also non-greedy - $name =~ s/\.//g; # no dots in 8+3 conform filename - - $namelength = length($name); - my $extensionlength = length($extension); - - if ( $extensionlength > 3 ) - { - # simply taking the first three letters - $extension = substr($extension, 0, 3); # name, offset, length - $changed = 1; - } - - # Attention: readme.html -> README~1.HTM - - if (( $namelength > 8 ) || ( $extensionlength > 3 )) - { - # taking the first six letters, if filename is longer than 6 characters - if ( $namelength > 6 ) - { - $name = substr($name, 0, 6); # name, offset, length - $name =~ s/\s*$//; # removing ending whitespaces - $name = $name . "\~"; - ($number, $saved) = get_next_free_number_with_hash($name, $shortnamesref, '.'.uc($extension)); - - # if $number>9 the new name would be "abcdef~10.xyz", which is 9+3, and therefore not allowed - - if ( ! $saved ) - { - $name = substr($name, 0, 5); # name, offset, length - $name =~ s/\s*$//; # removing ending whitespaces - $name = $name . "\~"; - ($number, $saved) = get_next_free_number_with_hash($name, $shortnamesref, '.'.uc($extension)); - - # if $number>99 the new name would be "abcde~100.xyz", which is 9+3, and therefore not allowed - - if ( ! $saved ) - { - $name = substr($name, 0, 4); # name, offset, length - $name =~ s/\s*$//; # removing ending whitespaces - $name = $name . "\~"; - ($number, $saved) = get_next_free_number_with_hash($name, $shortnamesref, '.'.uc($extension)); - - if ( ! $saved ) - { - installer::exiter::exit_program("ERROR: Could not set 8+3 conform name for $inputstring !", "make_eight_three_conform_with_hash"); - } - } - } - - $name = $name . "$number"; - $changed = 1; - } - } - - $conformstring = $name . "\." . $extension; - - if ( $changed ) { $conformstring= uc($conformstring); } - } - else # no dot in filename or directory (also used for shortcuts) - { - $name = $inputstring; - $namelength = length($name); - - if ( $namelength > 8 ) - { - # taking the first six letters - $name = substr($name, 0, 6); # name, offset, length - $name =~ s/\s*$//; # removing ending whitespaces - $name = $name . "\~"; - ( $number, $saved ) = get_next_free_number_with_hash($name, $shortnamesref, ''); - - # if $number>9 the new name would be "abcdef~10", which is 9+0, and therefore not allowed - - if ( ! $saved ) - { - $name = substr($name, 0, 5); # name, offset, length - $name =~ s/\s*$//; # removing ending whitespaces - $name = $name . "\~"; - ( $number, $saved ) = get_next_free_number_with_hash($name, $shortnamesref, ''); - - # if $number>99 the new name would be "abcde~100", which is 9+0, and therefore not allowed - - if ( ! $saved ) - { - $name = substr($name, 0, 4); # name, offset, length - $name =~ s/\s*$//; # removing ending whitespaces - $name = $name . "\~"; - ( $number, $saved ) = get_next_free_number_with_hash($name, $shortnamesref, ''); - - if ( ! $saved ) { installer::exiter::exit_program("ERROR: Could not set 8+3 conform name for $inputstring !", "make_eight_three_conform_with_hash"); } - } - } - - $name = $name . "$number"; - $changed = 1; - if ( $pattern eq "dir" ) { $name =~ s/\./\_/g; } # in directories replacing "." with "_" - } - - $conformstring = $name; - - if ( $changed ) { $conformstring = uc($name); } - } - - return $conformstring; -} - -######################################### -# Writing the header for idt files -######################################### - -sub write_idt_header -{ - my ($idtref, $definestring) = @_; - - my $oneline; - - if ( $definestring eq "file" ) - { - $oneline = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti4\n"; - push(@{$idtref}, $oneline); - $oneline = "File\tFile\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "filehash" ) - { - $oneline = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\ti2\ti4\ti4\ti4\ti4\n"; - push(@{$idtref}, $oneline); - $oneline = "MsiFileHash\tFile_\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "directory" ) - { - $oneline = "Directory\tDirectory_Parent\tDefaultDir\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\tS72\tl255\n"; - push(@{$idtref}, $oneline); - $oneline = "Directory\tDirectory\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "component" ) - { - $oneline = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\tS38\ts72\ti2\tS255\tS72\n"; - push(@{$idtref}, $oneline); - $oneline = "Component\tComponent\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "feature" ) - { - $oneline = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"; - push(@{$idtref}, $oneline); - $oneline = "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"; - push(@{$idtref}, $oneline); - $oneline = "WINDOWSENCODINGTEMPLATE\tFeature\tFeature\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "featurecomponent" ) - { - $oneline = "Feature_\tComponent_\n"; - push(@{$idtref}, $oneline); - $oneline = "s38\ts72\n"; - push(@{$idtref}, $oneline); - $oneline = "FeatureComponents\tFeature_\tComponent_\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "media" ) - { - $oneline = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"; - push(@{$idtref}, $oneline); - $oneline = "i2\ti4\tL64\tS255\tS32\tS72\n"; - push(@{$idtref}, $oneline); - $oneline = "Media\tDiskId\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "font" ) - { - $oneline = "File_\tFontTitle\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\tS128\n"; - push(@{$idtref}, $oneline); - $oneline = "Font\tFile_\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "shortcut" ) - { - $oneline = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\ts72\tl128\ts72\ts72\tS255\tL255\tI2\tS72\tI2\tI2\tS72\n"; - push(@{$idtref}, $oneline); - $oneline = "WINDOWSENCODINGTEMPLATE\tShortcut\tShortcut\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "registry" ) - { - $oneline = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\ti2\tl255\tL255\tL0\ts72\n"; - push(@{$idtref}, $oneline); - $oneline = "Registry\tRegistry\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "reg64" ) - { - $oneline = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\ti2\tl255\tL255\tL0\ts72\n"; - push(@{$idtref}, $oneline); - $oneline = "Reg64\tRegistry\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "createfolder" ) - { - $oneline = "Directory_\tComponent_\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\ts72\n"; - push(@{$idtref}, $oneline); - $oneline = "CreateFolder\tDirectory_\tComponent_\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "removefile" ) - { - $oneline = "FileKey\tComponent_\tFileName\tDirProperty\tInstallMode\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\ts72\tL255\ts72\ti2\n"; - push(@{$idtref}, $oneline); - $oneline = "RemoveFile\tFileKey\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "upgrade" ) - { - $oneline = "UpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\tRemove\tActionProperty\n"; - push(@{$idtref}, $oneline); - $oneline = "s38\tS20\tS20\tS255\ti4\tS255\ts72\n"; - push(@{$idtref}, $oneline); - $oneline = "Upgrade\tUpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "icon" ) - { - $oneline = "Name\tData\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\tv0\n"; - push(@{$idtref}, $oneline); - $oneline = "Icon\tName\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "inifile" ) - { - $oneline = "IniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\tl255\tS72\tl96\tl128\tl255\ti2\ts72\n"; - push(@{$idtref}, $oneline); - $oneline = "IniFile\tIniFile\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "selfreg" ) - { - $oneline = "File_\tCost\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\tI2\n"; - push(@{$idtref}, $oneline); - $oneline = "SelfReg\tFile_\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "msiassembly" ) - { - $oneline = "Component_\tFeature_\tFile_Manifest\tFile_Application\tAttributes\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\ts38\tS72\tS72\tI2\n"; - push(@{$idtref}, $oneline); - $oneline = "MsiAssembly\tComponent_\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "msiassemblyname" ) - { - $oneline = "Component_\tName\tValue\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\ts255\ts255\n"; - push(@{$idtref}, $oneline); - $oneline = "MsiAssemblyName\tComponent_\tName\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "appsearch" ) - { - $oneline = "Property\tSignature_\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\ts72\n"; - push(@{$idtref}, $oneline); - $oneline = "AppSearch\tProperty\tSignature_\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "reglocat" ) - { - $oneline = "Signature_\tRoot\tKey\tName\tType\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\ti2\ts255\tS255\tI2\n"; - push(@{$idtref}, $oneline); - $oneline = "RegLocator\tSignature_\n"; - push(@{$idtref}, $oneline); - } - - if ( $definestring eq "signatur" ) - { - $oneline = "Signature\tFileName\tMinVersion\tMaxVersion\tMinSize\tMaxSize\tMinDate\tMaxDate\tLanguages\n"; - push(@{$idtref}, $oneline); - $oneline = "s72\ts255\tS20\tS20\tI4\tI4\tI4\tI4\tS255\n"; - push(@{$idtref}, $oneline); - $oneline = "Signature\tSignature\n"; - push(@{$idtref}, $oneline); - } - -} - -############################################################## -# Returning the name of the rranslation file for a -# given language. -# Sample: "01" oder "en-US" -> "1033.txt" -############################################################## - -sub get_languagefilename -{ - my ($idtfilename, $basedir) = @_; - - $idtfilename =~ s/\.idt/\.mlf/; - - my $languagefilename = $basedir . $installer::globals::separator . $idtfilename; - - return $languagefilename; -} - -############################################################## -# Returning the complete block in all languages -# for a specified string -############################################################## - -sub get_language_block_from_language_file -{ - my ($searchstring, $languagefile) = @_; - - my @language_block = (); - - for ( my $i = 0; $i <= $#{$languagefile}; $i++ ) - { - if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ ) - { - my $counter = $i; - - push(@language_block, ${$languagefile}[$counter]); - $counter++; - - while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ ))) - { - push(@language_block, ${$languagefile}[$counter]); - $counter++; - } - - last; - } - } - - return \@language_block; -} - -############################################################## -# Returning a specific language string from the block -# of all translations -############################################################## - -sub get_language_string_from_language_block -{ - my ($language_block, $language, $oldstring) = @_; - - my $newstring = ""; - - for ( my $i = 0; $i <= $#{$language_block}; $i++ ) - { - if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) - { - $newstring = $1; - last; - } - } - - if ( $newstring eq "" ) - { - $language = "en-US"; # defaulting to english - - for ( my $i = 0; $i <= $#{$language_block}; $i++ ) - { - if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) - { - $newstring = $1; - last; - } - } - } - - return $newstring; -} - -############################################################## -# Returning a specific code from the block -# of all codes. No defaulting to english! -############################################################## - -sub get_code_from_code_block -{ - my ($codeblock, $language) = @_; - - my $newstring = ""; - - for ( my $i = 0; $i <= $#{$codeblock}; $i++ ) - { - if ( ${$codeblock}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) - { - $newstring = $1; - last; - } - } - - return $newstring; -} - -############################################################## -# Translating an idt file -############################################################## - -sub translate_idtfile -{ - my ($idtfile, $languagefile, $onelanguage) = @_; - - for ( my $i = 0; $i <= $#{$idtfile}; $i++ ) - { - my @allstrings = (); - - my $oneline = ${$idtfile}[$i]; - - while ( $oneline =~ /\b(OOO_\w+)\b/ ) - { - my $replacestring = $1; - push(@allstrings, $replacestring); - $oneline =~ s/$replacestring//; - } - - my $oldstring; - - foreach $oldstring (@allstrings) - { - my $language_block = get_language_block_from_language_file($oldstring, $languagefile); - my $newstring = get_language_string_from_language_block($language_block, $onelanguage, $oldstring); - - ${$idtfile}[$i] =~ s/$oldstring/$newstring/; # always substitute, even if $newstring eq "" (there are empty strings for control.idt) - } - } -} - -############################################################## -# Copying all needed files to create a msi database -# into one language specific directory -############################################################## - -sub prepare_language_idt_directory -{ - my ($destinationdir, $newidtdir, $onelanguage, $filesref, $iconfilecollector, $binarytablefiles, $allvariables) = @_; - - # Copying all idt-files from the source $installer::globals::idttemplatepath to the destination $destinationdir - # Copying all files in the subdirectory "Binary" - # Copying all files in the subdirectory "Icon" - - my $infoline = ""; - - installer::systemactions::copy_directory($installer::globals::idttemplatepath, $destinationdir); - - if ( -d $installer::globals::idttemplatepath . $installer::globals::separator . "Binary") - { - installer::systemactions::create_directory($destinationdir . $installer::globals::separator . "Binary"); - installer::systemactions::copy_directory($installer::globals::idttemplatepath . $installer::globals::separator . "Binary", $destinationdir . $installer::globals::separator . "Binary"); - - if ((( $installer::globals::patch ) && ( $allvariables->{'WINDOWSPATCHBITMAPDIRECTORY'} )) || ( $allvariables->{'WINDOWSBITMAPDIRECTORY'} )) - { - my $bitmapdir = ""; - if ( $allvariables->{'WINDOWSPATCHBITMAPDIRECTORY'} ) { $bitmapdir = $allvariables->{'WINDOWSPATCHBITMAPDIRECTORY'}; } - if ( $allvariables->{'WINDOWSBITMAPDIRECTORY'} ) { $bitmapdir = $allvariables->{'WINDOWSBITMAPDIRECTORY'}; } - - my $newsourcedir = $installer::globals::unpackpath . $installer::globals::separator . $bitmapdir; # path setting in list file dependent from unpackpath !? - $infoline = "\nOverwriting files in directory \"" . $destinationdir . $installer::globals::separator . "Binary" . "\" with files from directory \"" . $newsourcedir . "\".\n"; - push( @installer::globals::logfileinfo, $infoline); - if ( ! -d $newsourcedir ) - { - my $currentdir = cwd(); - installer::exiter::exit_program("ERROR: Directory $newsourcedir does not exist! Current directory is: $currentdir", "prepare_language_idt_directory"); - } - installer::systemactions::copy_directory($newsourcedir, $destinationdir . $installer::globals::separator . "Binary"); - } - } - - installer::systemactions::create_directory($destinationdir . $installer::globals::separator . "Icon"); - - if ( -d $installer::globals::idttemplatepath . $installer::globals::separator . "Icon") - { - installer::systemactions::copy_directory($installer::globals::idttemplatepath . $installer::globals::separator . "Icon", $destinationdir . $installer::globals::separator . "Icon"); - } - - # Copying all files in $iconfilecollector, that describe icons of folderitems - - for ( my $i = 0; $i <= $#{$iconfilecollector}; $i++ ) - { - my $iconfilename = ${$iconfilecollector}[$i]; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$iconfilename); - installer::systemactions::copy_one_file(${$iconfilecollector}[$i], $destinationdir . $installer::globals::separator . "Icon" . $installer::globals::separator . $iconfilename); - } - - # Copying all files in $binarytablefiles in the binary directory - - for ( my $i = 0; $i <= $#{$binarytablefiles}; $i++ ) - { - my $binaryfile = ${$binarytablefiles}[$i]; - my $binaryfilepath = $binaryfile->{'sourcepath'}; - my $binaryfilename = $binaryfilepath; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$binaryfilename); - installer::systemactions::copy_one_file($binaryfilepath, $destinationdir . $installer::globals::separator . "Binary" . $installer::globals::separator . $binaryfilename); - } - - # Copying all new created and language independent idt-files to the destination $destinationdir. - # Example: "File.idt" - - installer::systemactions::copy_directory_with_fileextension($newidtdir, $destinationdir, "idt"); - - # Copying all new created and language dependent idt-files to the destination $destinationdir. - # Example: "Feature.idt.01" - - installer::systemactions::copy_directory_with_fileextension($newidtdir, $destinationdir, $onelanguage); - installer::systemactions::rename_files_with_fileextension($destinationdir, $onelanguage); - -} - -############################################################## -# Returning the source path of the rtf licensefile for -# a specified language -############################################################## - -sub get_rtflicensefilesource -{ - my ($language, $includepatharrayref) = @_; - - my $licensefilename = "license_" . $language . ".rtf"; - - my $sourcefileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $includepatharrayref, 1); - - if ($$sourcefileref eq "") { installer::exiter::exit_program("ERROR: Could not find $licensefilename!", "get_rtflicensefilesource"); } - - my $infoline = "Using licensefile: $$sourcefileref\n"; - push( @installer::globals::logfileinfo, $infoline); - - return $$sourcefileref; -} - -############################################################## -# Returning the source path of the licensefile for -# a specified language -############################################################## - -sub get_licensefilesource -{ - my ($language, $filesref) = @_; - - my $licensefilename = "license_" . $language . ".txt"; - my $sourcepath = ""; - my $foundlicensefile = 0; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - my $filename = $onefile->{'Name'}; - - if ($filename eq $licensefilename) - { - $sourcepath = $onefile->{'sourcepath'}; - $foundlicensefile = 1; - last; - } - } - - if ( ! $foundlicensefile ) { installer::exiter::exit_program("ERROR: Did not find file $licensefilename in file collector!", "get_licensefilesource"); } - - return $sourcepath; -} - -############################################################## -# A simple converter to create the license text -# in rtf format -############################################################## - -sub get_rtf_licensetext -{ - my ($licensefile) = @_; - - # A very simple rtf converter - - # The static header - - my $rtf_licensetext = '{\rtf1\ansi\deff0'; - $rtf_licensetext = $rtf_licensetext . '{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}}'; - $rtf_licensetext = $rtf_licensetext . '{\colortbl\red0\green0\blue0;\red255\green255\blue255;\red128\green128\blue128;}'; - $rtf_licensetext = $rtf_licensetext . '{\stylesheet{\s1\snext1 Standard;}}'; - $rtf_licensetext = $rtf_licensetext . '{\info{\comment StarWriter}{\vern5690}}\deftab709'; - $rtf_licensetext = $rtf_licensetext . '{\*\pgdsctbl'; - $rtf_licensetext = $rtf_licensetext . '{\pgdsc0\pgdscuse195\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}}'; - $rtf_licensetext = $rtf_licensetext . '\paperh16837\paperw11905\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc'; - $rtf_licensetext = $rtf_licensetext . '\pard\plain \s1'; - - for ( my $i = 0; $i <= $#{$licensefile}; $i++ ) - { - my $oneline = ${$licensefile}[$i]; - - if ( $i == 0 ) { $oneline =~ s/^\W*//; } - - $oneline =~ s/\t/ /g; # no tabs allowed, converting to four spaces - $oneline =~ s/\n$//g; # no newline at line end - - # german replacements - - $oneline =~ s/\Ã\„/\\\'c4/g; # converting "Ä" - $oneline =~ s/\Ã\–/\\\'d6/g; # converting "Ö" - $oneline =~ s/\Ã\œ/\\\'dc/g; # converting "Ü" - $oneline =~ s/\Ã\¤/\\\'e4/g; # converting "ä" - $oneline =~ s/\Ã\¶/\\\'f6/g; # converting "ö" - $oneline =~ s/\Ã\¼/\\\'fc/g; # converting "ü" - $oneline =~ s/\Ã\Ÿ/\\\'df/g; # converting "ß" - - # french replacements - - $oneline =~ s/\Ã\‰/\\\'c9/g; - $oneline =~ s/\Ã\€/\\\'c0/g; - $oneline =~ s/\Â\«/\\\'ab/g; - $oneline =~ s/\Â\»/\\\'bb/g; - $oneline =~ s/\Ã\©/\\\'e9/g; - $oneline =~ s/\Ã\¨/\\\'e8/g; - $oneline =~ s/\Ã\ /\\\'e0/g; - $oneline =~ s/\Ã\´/\\\'f4/g; - $oneline =~ s/\Ã\§/\\\'e7/g; - $oneline =~ s/\Ã\ª/\\\'ea/g; - $oneline =~ s/\Ã\Š/\\\'ca/g; - $oneline =~ s/\Ã\»/\\\'fb/g; - $oneline =~ s/\Ã\¹/\\\'f9/g; - $oneline =~ s/\Ã\®/\\\'ee/g; - - # quotation marks - - $oneline =~ s/\â\€\ž/\\\'84/g; - $oneline =~ s/\â\€\œ/\\ldblquote/g; - $oneline =~ s/\â\€\™/\\rquote/g; - - - $oneline =~ s/\Â\ /\\\~/g; - - $oneline = '\par ' . $oneline; - - $rtf_licensetext = $rtf_licensetext . $oneline; - } - - # and the end - - $rtf_licensetext = $rtf_licensetext . '\par \par }'; - - return $rtf_licensetext; -} - -############################################################## -# A simple converter to create a license txt string from -# the rtf format -############################################################## - -sub make_string_licensetext -{ - my ($licensefile) = @_; - - my $rtf_licensetext = ""; - - for ( my $i = 0; $i <= $#{$licensefile}; $i++ ) - { - my $oneline = ${$licensefile}[$i]; - $oneline =~ s/\s*$//g; # no whitespace at line end - - $rtf_licensetext = $rtf_licensetext . $oneline . " "; - } - - return $rtf_licensetext; -} - -############################################################## -# Setting the path, where the soffice.exe is installed, into -# the CustomAction table -############################################################## - -sub add_officedir_to_database -{ - my ($basedir, $allvariables) = @_; - - my $customactionfilename = $basedir . $installer::globals::separator . "CustomAc.idt"; - - my $customacfile = installer::files::read_file($customactionfilename); - - my $found = 0; - - # Updating the values - - if ( $installer::globals::officeinstalldirectoryset ) - { - $found = 0; - - for ( my $i = 0; $i <= $#{$customacfile}; $i++ ) - { - if ( ${$customacfile}[$i] =~ /\bOFFICEDIRECTORYGID\b/ ) - { - ${$customacfile}[$i] =~ s/\bOFFICEDIRECTORYGID\b/$installer::globals::officeinstalldirectory/; - $found = 1; - } - } - - if (( ! $found ) && ( ! $allvariables->{'IGNOREDIRECTORYLAYER'} )) - { - installer::exiter::exit_program("ERROR: \"OFFICEDIRECTORYGID\" not found in \"$customactionfilename\" !", "add_officedir_to_database"); - } - } - - # Saving the file - - installer::files::save_file($customactionfilename ,$customacfile); - my $infoline = "Updated idt file: $customactionfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -############################################################## -# Including the license text into the table control.idt -############################################################## - -sub add_licensefile_to_database -{ - my ($licensefile, $controltable) = @_; - - # Nine tabs before the license text and two tabs after it - # The license text has to be included into the dialog - # LicenseAgreement into the control Memo. - - my $foundlicenseline = 0; - my ($number, $line); - - for ( my $i = 0; $i <= $#{$controltable}; $i++ ) - { - $line = ${$controltable}[$i]; - - if ( $line =~ /^\s*\bLicenseAgreement\b\t\bMemo\t/ ) - { - $foundlicenseline = 1; - $number = $i; - last; - } - } - - if (!($foundlicenseline)) - { - installer::exiter::exit_program("ERROR: Line for license file in Control.idt not found!", "add_licensefile_to_database"); - } - else - { - my %control = (); - - if ( $line =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - $control{'Dialog_'} = $1; - $control{'Control'} = $2; - $control{'Type'} = $3; - $control{'X'} = $4; - $control{'Y'} = $5; - $control{'Width'} = $6; - $control{'Height'} = $7; - $control{'Attributes'} = $8; - $control{'Property'} = $9; - $control{'Text'} = $10; - $control{'Control_Next'} = $11; - $control{'Help'} = $12; - } - else - { - installer::exiter::exit_program("ERROR: Could not split line correctly!", "add_licensefile_to_database"); - } - - # my $licensetext = get_rtf_licensetext($licensefile); - my $licensetext = make_string_licensetext($licensefile); - - $control{'Text'} = $licensetext; - - my $newline = $control{'Dialog_'} . "\t" . $control{'Control'} . "\t" . $control{'Type'} . "\t" . - $control{'X'} . "\t" . $control{'Y'} . "\t" . $control{'Width'} . "\t" . - $control{'Height'} . "\t" . $control{'Attributes'} . "\t" . $control{'Property'} . "\t" . - $control{'Text'} . "\t" . $control{'Control_Next'} . "\t" . $control{'Help'} . "\n"; - - ${$controltable}[$number] = $newline - } -} - -################################################################################################ -# Including the checkboxes for the language selection dialog -# into the table control.idt . This is only relevant for -# multilingual installation sets. -# -# old: -# LanguageSelection CheckBox1 CheckBox 22 60 15 24 3 IS1033 CheckBox2 -# LanguageSelection Text1 Text 40 60 70 15 65539 OOO_CONTROL_LANG_1033 -# LanguageSelection CheckBox2 CheckBox 22 90 15 24 3 IS1031 Next -# LanguageSelection Text2 Text 40 90 70 15 65539 OOO_CONTROL_LANG_1031 -# new: -# LanguageSelection CheckBox1 CheckBox 22 60 15 24 3 IS1033 Text CheckBox2 -# LanguageSelection CheckBox2 CheckBox 22 90 15 24 3 IS1031 Text Next -################################################################################################ - -sub add_language_checkboxes_to_database -{ - my ($controltable, $languagesarrayref) = @_; - - # for each language, two lines have to be inserted - - for ( my $i = 0; $i <= $#{$languagesarrayref}; $i++ ) - { - my $last = 0; - if ( $i == $#{$languagesarrayref} ) { $last = 1; } # special handling for the last - - my $onelanguage = ${$languagesarrayref}[$i]; - my $windowslanguage = installer::windows::language::get_windows_language($onelanguage); - - my $checkboxattribute = "3"; - - my $count = $i + 1; - my $nextcount = $i + 2; - my $checkboxcount = "CheckBox" . $count; - - my $multiplier = 20; - my $offset = 60; - if ( $#{$languagesarrayref} > 7 ) - { - $multiplier = 15; # smaller differences for more than 7 languages - $offset = 50; # smaller offset for more than 7 languages - } - - my $yvalue = $offset + $i * $multiplier; - - my $property = "IS" . $windowslanguage; - - my $controlnext = ""; - if ( $last ) { $controlnext = "Next"; } - else { $controlnext = "CheckBox" . $nextcount; } - - my $stringname = "OOO_CONTROL_LANG_" . $windowslanguage; - - my $line1 = "LanguageSelection" . "\t" . $checkboxcount . "\t" . "CheckBox" . "\t" . - "22" . "\t" . $yvalue . "\t" . "200" . "\t" . "15" . "\t" . $checkboxattribute . "\t" . - $property . "\t" . $stringname . "\t" . $controlnext . "\t" . "\n"; - - push(@{$controltable}, $line1); - - # my $textcount = "Text" . $count; - # my $stringname = "OOO_CONTROL_LANG_" . $windowslanguage; - # - # $yvalue = $yvalue + 2; # text 2 pixel lower than checkbox - # - # my $line2 = "LanguageSelection" . "\t" . $textcount . "\t" . "Text" . "\t" . - # "40" . "\t" . $yvalue . "\t" . "70" . "\t" . "15" . "\t" . "65539" . "\t" . - # "\t" . $stringname . "\t" . "\t" . "\n"; - # - # push(@{$controltable}, $line2); - } -} - -################################################################### -# Determining the last position in a sequencetable -# into the tables CustomAc.idt and InstallE.idt. -################################################################### - -sub get_last_position_in_sequencetable -{ - my ($sequencetable) = @_; - - my $position = 0; - - for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) - { - my $line = ${$sequencetable}[$i]; - - if ( $line =~ /^\s*\w+\t.*\t\s*(\d+)\s$/ ) - { - my $newposition = $1; - if ( $newposition > $position ) { $position = $newposition; } - } - } - - return $position; -} - -######################################################################### -# Determining the position of a specified Action in the sequencetable -######################################################################### - -sub get_position_in_sequencetable -{ - my ($action, $sequencetable) = @_; - - my $position = 0; - - $action =~ s/^\s*behind_//; - - for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) - { - my $line = ${$sequencetable}[$i]; - - if ( $line =~ /^\s*(\w+)\t.*\t\s*(\d+)\s$/ ) - { - my $compareaction = $1; - $position = $2; - if ( $compareaction eq $action ) { last; } - } - } - - return $position; -} - -################################################################################################ -# Including the CustomAction for the configuration -# into the tables CustomAc.idt and InstallE.idt. -# -# CustomAc.idt: ExecutePkgchk 82 pkgchk.exe -s -# InstallE.idt: ExecutePkgchk Not REMOVE="ALL" 3175 -# -# CustomAc.idt: ExecuteQuickstart 82 install_quickstart.exe -# InstallE.idt: ExecuteQuickstart &gm_o_Quickstart=3 3200 -# -# CustomAc.idt: ExecuteInstallRegsvrex 82 regsvrex.exe shlxthdl.dll -# InstallE.idt: ExecuteInstallRegsvrex Not REMOVE="ALL" 3225 -# -# CustomAc.idt: ExecuteUninstallRegsvrex 82 regsvrex.exe /u shlxthdl.dll -# InstallE.idt: ExecuteUninstallRegsvrex REMOVE="ALL" 690 -# -# CustomAc.idt: Regmsdocmsidll1 1 reg4msdocmsidll Reg4MsDocEntry -# InstallU.idt: Regmsdocmsidll1 Not REMOVE="ALL" 610 -# -# CustomAc.idt: Regmsdocmsidll2 1 reg4msdocmsidll Reg4MsDocEntry -# InstallE.idt: Regmsdocmsidll2 Not REMOVE="ALL" 3160 -################################################################################################ - -sub set_custom_action -{ - my ($customactionidttable, $actionname, $actionflags, $exefilename, $actionparameter, $inbinarytable, $filesref, $customactionidttablename, $styles) = @_; - - my $included_customaction = 0; - my $infoline = ""; - my $customaction_exefilename = $exefilename; - my $uniquename = ""; - - # when the style NO_FILE is set, no searching for the file is needed, no filtering is done, we can add that custom action - if ( $styles =~ /\bNO_FILE\b/ ) - { - my $line = $actionname . "\t" . $actionflags . "\t" . $customaction_exefilename . "\t" . $actionparameter . "\n"; - push(@{$customactionidttable}, $line); - - $infoline = "Added $actionname CustomAction into table $customactionidttablename (NO_FILE has been set)\n"; - push(@installer::globals::logfileinfo, $infoline); - - $included_customaction = 1; - return $included_customaction; - } - - # is the $exefilename a library that is included into the binary table - - if ( $inbinarytable ) { $customaction_exefilename =~ s/\.//; } # this is the entry in the binary table ("abc.dll" -> "abcdll") - - # is the $exefilename included into the product? - - my $contains_file = 0; - - # All files are located in $filesref and in @installer::globals::binarytableonlyfiles. - # Both must be added together - my $localfilesref = [@installer::globals::binarytableonlyfiles, @{$filesref}]; - - for ( my $i = 0; $i <= $#{$localfilesref}; $i++ ) - { - my $onefile = ${$localfilesref}[$i]; - my $filename = ""; - if ( exists($onefile->{'Name'}) ) - { - $filename = $onefile->{'Name'}; - - if ( $filename eq $exefilename ) - { - $contains_file = 1; - $uniquename = ${$localfilesref}[$i]->{'uniquename'}; - last; - } - } - else - { - installer::exiter::exit_program("ERROR: Did not find \"Name\" for file \"$onefile->{'uniquename'}\" ($onefile->{'gid'})!", "set_custom_action"); - } - } - - if ( $contains_file ) - { - # Now the CustomAction can be included into the CustomAc.idt - - if ( ! $inbinarytable ) { $customaction_exefilename = $uniquename; } # the unique file name has to be added to the custom action table - - my $line = $actionname . "\t" . $actionflags . "\t" . $customaction_exefilename . "\t" . $actionparameter . "\n"; - push(@{$customactionidttable}, $line); - - $included_customaction = 1; - } - - if ( $included_customaction ) { $infoline = "Added $actionname CustomAction into table $customactionidttablename\n"; } - else { $infoline = "Did not add $actionname CustomAction into table $customactionidttablename\n"; } - push(@installer::globals::logfileinfo, $infoline); - - return $included_customaction; -} - -#################################################################### -# Adding a Custom Action to InstallExecuteTable or InstallUITable -#################################################################### - -sub add_custom_action_to_install_table -{ - my ($installtable, $exefilename, $actionname, $actioncondition, $position, $filesref, $installtablename, $styles) = @_; - - my $included_customaction = 0; - my $feature = ""; - my $infoline = ""; - - # when the style NO_FILE is set, no searching for the file is needed, no filtering is done, we can add that custom action - if ( $styles =~ /\bNO_FILE\b/ ) - { - # then the InstallE.idt.idt or InstallU.idt.idt - $actioncondition =~ s/FEATURETEMPLATE/$feature/g; # only execute Custom Action, if feature of the file is installed - - my $actionposition = 0; - - if ( $position eq "end" ) { $actionposition = get_last_position_in_sequencetable($installtable) + 25; } - elsif ( $position =~ /^\s*behind_/ ) { $actionposition = get_position_in_sequencetable($position, $installtable) + 2; } - else { $actionposition = get_position_in_sequencetable($position, $installtable) - 2; } - - my $line = $actionname . "\t" . $actioncondition . "\t" . $actionposition . "\n"; - push(@{$installtable}, $line); - - $infoline = "Added $actionname CustomAction into table $installtablename (NO_FILE has been set)\n"; - push(@installer::globals::logfileinfo, $infoline); - return; - } - - my $contains_file = 0; - - # All files are located in $filesref and in @installer::globals::binarytableonlyfiles. - # Both must be added together - my $localfilesref = [@installer::globals::binarytableonlyfiles, @{$filesref}]; - - for ( my $i = 0; $i <= $#{$localfilesref}; $i++ ) - { - my $filename = ${$localfilesref}[$i]->{'Name'}; - - if ( $filename eq $exefilename ) - { - $contains_file = 1; - - # Determining the feature of the file - - if ( ${$localfilesref}[$i] ) { $feature = ${$localfilesref}[$i]->{'modules'}; } - - # If modules contains a list of modules, only taking the first one. - if ( $feature =~ /^\s*(.*?)\,/ ) { $feature = $1; } - # Attention: Maximum feature length is 38! - shorten_feature_gid(\$feature); - - last; - } - } - - if ( $contains_file ) - { - # then the InstallE.idt.idt or InstallU.idt.idt - - $actioncondition =~ s/FEATURETEMPLATE/$feature/g; # only execute Custom Action, if feature of the file is installed - -# my $actionposition = 0; -# if ( $position eq "end" ) { $actionposition = get_last_position_in_sequencetable($installtable) + 25; } -# elsif ( $position =~ /^\s*behind_/ ) { $actionposition = get_position_in_sequencetable($position, $installtable) + 2; } -# else { $actionposition = get_position_in_sequencetable($position, $installtable) - 2; } -# my $line = $actionname . "\t" . $actioncondition . "\t" . $actionposition . "\n"; - - my $positiontemplate = ""; - if ( $position =~ /^\s*\d+\s*$/ ) { $positiontemplate = $position; } # setting the position directly, number defined in scp2 - else { $positiontemplate = "POSITIONTEMPLATE_" . $position; } - - my $line = $actionname . "\t" . $actioncondition . "\t" . $positiontemplate . "\n"; - push(@{$installtable}, $line); - - $included_customaction = 1; - } - - if ( $included_customaction ) { $infoline = "Added $actionname CustomAction into table $installtablename\n"; } - else { $infoline = "Did not add $actionname CustomAction into table $installtablename\n"; } - push(@installer::globals::logfileinfo, $infoline); - -} - -################################################################## -# A line in the table ControlEvent connects a Control -# with a Custom Action -################################################################# - -sub connect_custom_action_to_control -{ - my ( $table, $tablename, $dialog, $control, $event, $argument, $condition, $ordering) = @_; - - my $line = $dialog . "\t" . $control. "\t" . $event. "\t" . $argument. "\t" . $condition. "\t" . $ordering . "\n"; - - push(@{$table}, $line); - - $line =~ s/\s*$//g; - - $infoline = "Added line \"$line\" into table $tablename\n"; - push(@installer::globals::logfileinfo, $infoline); -} - -################################################################## -# A line in the table ControlCondition connects a Control state -# with a condition -################################################################## - -sub connect_condition_to_control -{ - my ( $table, $tablename, $dialog, $control, $event, $condition) = @_; - - my $line = $dialog . "\t" . $control. "\t" . $event. "\t" . $condition. "\n"; - - push(@{$table}, $line); - - $line =~ s/\s*$//g; - - $infoline = "Added line \"$line\" into table $tablename\n"; - push(@installer::globals::logfileinfo, $infoline); -} - -################################################################## -# Searching for a sequencenumber in InstallUISequence table -# "ExecuteAction" must be the last action -################################################################## - -sub get_free_number_in_uisequence_table -{ - my ( $installuitable ) = @_; - - # determining the sequence of "ExecuteAction" - - my $executeactionnumber = 0; - - for ( my $i = 0; $i <= $#{$installuitable}; $i++ ) - { - if ( ${$installuitable}[$i] =~ /^\s*(\w+)\t\w*\t(\d+)\s*$/ ) - { - my $actionname = $1; - my $actionnumber = $2; - - if ( $actionname eq "ExecuteAction" ) - { - $executeactionnumber = $actionnumber; - last; - } - } - } - - if ( $executeactionnumber == 0 ) { installer::exiter::exit_program("ERROR: Did not find \"ExecuteAction\" in InstallUISequence table!", "get_free_number_in_uisequence_table"); } - - # determining the sequence of the action before "ExecuteAction" - - my $lastactionnumber = 0; - - for ( my $i = 0; $i <= $#{$installuitable}; $i++ ) - { - if ( ${$installuitable}[$i] =~ /^\s*\w+\t\w*\t(\d+)\s*$/ ) - { - my $actionnumber = $1; - - if (( $actionnumber > $lastactionnumber ) && ( $actionnumber != $executeactionnumber )) - { - $lastactionnumber = $actionnumber; - } - } - } - - # the new number can now be calculated - - my $newnumber = 0; - - if ((( $lastactionnumber + $executeactionnumber ) % 2 ) == 0 ) { $newnumber = ( $lastactionnumber + $executeactionnumber ) / 2; } - else { $newnumber = ( $lastactionnumber + $executeactionnumber -1 ) / 2; } - - return $newnumber; -} - -################################################################## -# Searching for a specified string in the feature table -################################################################## - -sub get_feature_name -{ - my ( $string, $featuretable ) = @_; - - my $featurename = ""; - - for ( my $i = 0; $i <= $#{$featuretable}; $i++ ) - { - if ( ${$featuretable}[$i] =~ /^\s*(\w+$string)\t/ ) - { - $featurename = $1; - last; - } - } - - return $featurename; -} - -###################################################################### -# Returning the toplevel directory name of one specific file -###################################################################### - -sub get_directory_name_from_file -{ - my ($onefile) = @_; - - my $destination = $onefile->{'destination'}; - my $name = $onefile->{'Name'}; - - $destination =~ s/\Q$name\E\s*$//; - $destination =~ s/\Q$installer::globals::separator\E\s*$//; - - my $path = ""; - - if ( $destination =~ /\Q$installer::globals::separator\E/ ) - { - if ( $destination =~ /^\s*(\S.*\S\Q$installer::globals::separator\E)(\S.+\S?)/ ) - { - $path = $2; - } - } - else - { - $path = $destination; - } - - return $path; -} - -############################################################# -# Including the new subdir into the directory table -############################################################# - -sub include_subdirname_into_directory_table -{ - my ($dirname, $directorytable, $directorytablename, $onefile) = @_; - - my $subdir = ""; - if ( $onefile->{'Subdir'} ) { $subdir = $onefile->{'Subdir'}; } - if ( $subdir eq "" ) { installer::exiter::exit_program("ERROR: No \"Subdir\" defined for $onefile->{'Name'}", "include_subdirname_into_directory_table"); } - - # program INSTALLLOCATION program -> subjava INSTALLLOCATION program:java - - my $uniquename = ""; - my $parent = ""; - my $name = ""; - - my $includedline = 0; - - my $newdir = ""; - - for ( my $i = 0; $i <= $#{$directorytable}; $i++ ) - { - - if ( ${$directorytable}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - $uniquename = $1; - $parent = $2; - $name = $3; - - if ( $dirname eq $name ) - { - my $newuniquename = "sub" . $subdir; - $newdir = $newuniquename; - my $newparent = "INSTALLLOCATION"; - my $newname = $name . "\:" . $subdir; - my $newline = - $line = "$newuniquename\t$newparent\t$newname\n"; - push(@{$directorytable}, $line); - installer::remover::remove_leading_and_ending_whitespaces(\$line); - $infoline = "Added $line into directory table $directorytablename\n"; - push(@installer::globals::logfileinfo, $infoline); - - $includedline = 1; - last; - } - } - } - - if ( ! $includedline ) { installer::exiter::exit_program("ERROR: Could not include new subdirectory into directory table for file $onefile->{'Name'}!", "include_subdirname_into_directory_table"); } - - return $newdir; -} - -################################################################## -# Including the new sub directory into the component table -################################################################## - -sub include_subdir_into_componenttable -{ - my ($subdir, $onefile, $componenttable) = @_; - - my $componentname = $onefile->{'componentname'}; - - my $changeddirectory = 0; - - for ( my $i = 0; $i <= $#{$componenttable}; $i++ ) - { - if ( ${$componenttable}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - my $localcomponentname = $1; - my $directory = $3; - - if ( $componentname eq $localcomponentname ) - { - my $oldvalue = ${$componenttable}[$i]; - ${$componenttable}[$i] =~ s/\b\Q$directory\E\b/$subdir/; - my $newvalue = ${$componenttable}[$i]; - - installer::remover::remove_leading_and_ending_whitespaces(\$oldvalue); - installer::remover::remove_leading_and_ending_whitespaces(\$newvalue); - $infoline = "Change in Component table: From \"$oldvalue\" to \"$newvalue\"\n"; - push(@installer::globals::logfileinfo, $infoline); - - $changeddirectory = 1; - last; - } - } - } - - if ( ! $changeddirectory ) { installer::exiter::exit_program("ERROR: Could not change directory for component: $onefile->{'Name'}!", "include_subdir_into_componenttable"); } - -} - -################################################################################################ -# Including the content for the child installations -# into the tables: -# CustomAc.idt, InstallU.idt, Feature.idt -################################################################################################ - -sub add_childprojects -{ - my ($languageidtdir, $filesref, $allvariables) = @_; - - my $customactiontablename = $languageidtdir . $installer::globals::separator . "CustomAc.idt"; - my $customactiontable = installer::files::read_file($customactiontablename); - my $installuitablename = $languageidtdir . $installer::globals::separator . "InstallU.idt"; - my $installuitable = installer::files::read_file($installuitablename); - my $featuretablename = $languageidtdir . $installer::globals::separator . "Feature.idt"; - my $featuretable = installer::files::read_file($featuretablename); - my $directorytablename = $languageidtdir . $installer::globals::separator . "Director.idt"; - my $directorytable = installer::files::read_file($directorytablename); - my $componenttablename = $languageidtdir . $installer::globals::separator . "Componen.idt"; - my $componenttable = installer::files::read_file($componenttablename); - - my $infoline = ""; - my $line = ""; - - $installer::globals::javafile = installer::worker::return_first_item_with_special_flag($filesref ,"JAVAFILE"); - $installer::globals::urefile = installer::worker::return_first_item_with_special_flag($filesref ,"UREFILE"); - - if (( $installer::globals::javafile eq "" ) && ( $allvariables->{'JAVAPRODUCT'} )) { installer::exiter::exit_program("ERROR: No JAVAFILE found in files collector!", "add_childprojects"); } - if (( $installer::globals::urefile eq "" ) && ( $allvariables->{'UREPRODUCT'} )) { installer::exiter::exit_program("ERROR: No UREFILE found in files collector!", "add_childprojects"); } - - # Content for Directory table - # SystemFolder TARGETDIR . - - my $contains_systemfolder = 0; - - for ( my $i = 0; $i <= $#{$directorytable}; $i++ ) - { - if ( ${$directorytable}[$i] =~ /^\s*SystemFolder\t/ ) - { - $contains_systemfolder = 1; - last; - } - } - - if ( ! $contains_systemfolder ) - { - $line = "SystemFolder\tTARGETDIR\t\.\n"; - push(@{$directorytable}, $line); - installer::remover::remove_leading_and_ending_whitespaces(\$line); - $infoline = "Added $line into table $directorytablename\n"; - } - else - { - $infoline = "SystemFolder already exists in table $directorytablename\n"; - } - - push(@installer::globals::logfileinfo, $infoline); - - # Additional content for the directory table - # subjava INSTALLLOCATION program:java - # subure INSTALLLOCATION program:ure - - my $dirname = ""; - my $subjavadir = ""; - my $suburedir = ""; - - if ( $allvariables->{'JAVAPRODUCT'} ) - { - $dirname = get_directory_name_from_file($installer::globals::javafile); - $subjavadir = include_subdirname_into_directory_table($dirname, $directorytable, $directorytablename, $installer::globals::javafile); - } - - if ( $allvariables->{'UREPRODUCT'} ) - { - $dirname = get_directory_name_from_file($installer::globals::urefile); - $suburedir = include_subdirname_into_directory_table($dirname, $directorytable, $directorytablename, $installer::globals::urefile); - } - - # Content for the Component table - # The Java and Ada components have new directories - - if ( $allvariables->{'JAVAPRODUCT'} ) { include_subdir_into_componenttable($subjavadir, $installer::globals::javafile, $componenttable); } - if ( $allvariables->{'UREPRODUCT'} ) { include_subdir_into_componenttable($suburedir, $installer::globals::urefile, $componenttable); } - - # Content for CustomAction table - - if ( $allvariables->{'JAVAPRODUCT'} ) - { - $line = "InstallJava\t98\tSystemFolder\t[SourceDir]$installer::globals::javafile->{'Subdir'}\\$installer::globals::javafile->{'Name'} \/qb REBOOT=Suppress SPONSORS=0 DISABLEAD=1\n"; - push(@{$customactiontable} ,$line); - installer::remover::remove_leading_and_ending_whitespaces(\$line); - $infoline = "Added $line into table $customactiontablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - if ( $allvariables->{'UREPRODUCT'} ) - { - $line = "InstallUre\t98\tSystemFolder\t$installer::globals::urefile->{'Subdir'}\\$installer::globals::urefile->{'Name'} /S\n"; - push(@{$customactiontable} ,$line); - installer::remover::remove_leading_and_ending_whitespaces(\$line); - $infoline = "Added $line into table $customactiontablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - if ( $allvariables->{'JAVAPRODUCT'} ) - { - $line = "MaintenanceJava\t82\t$installer::globals::javafile->{'uniquename'}\t\/qb REBOOT=Suppress SPONSORS=0 DISABLEAD=1\n"; - push(@{$customactiontable} ,$line); - installer::remover::remove_leading_and_ending_whitespaces(\$line); - $infoline = "Added $line into table $customactiontablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - if ( $allvariables->{'UREPRODUCT'} ) - { - $line = "MaintenanceUre\t82\t$installer::globals::urefile->{'uniquename'}\t\/S\n"; - push(@{$customactiontable} ,$line); - installer::remover::remove_leading_and_ending_whitespaces(\$line); - $infoline = "Added $line into table $customactiontablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - # Content for InstallUISequence table - # InstallAdabas &gm_o_Adabas=3 825 - # InstallJava &gm_o_Java=3 827 - - my $number = ""; - my $featurename = ""; - - if ( $allvariables->{'ADAPRODUCT'} ) - { - $number = get_free_number_in_uisequence_table($installuitable); - $featurename = get_feature_name("_Adabas", $featuretable); - $line = "InstallAdabas\t\&$featurename\=3 And Not Installed And Not PATCH\t$number\n"; - push(@{$installuitable} ,$line); - installer::remover::remove_leading_and_ending_whitespaces(\$line); - $infoline = "Added $line into table $installuitablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - if ( $allvariables->{'JAVAPRODUCT'} ) - { - $number = get_free_number_in_uisequence_table($installuitable) + 2; - $featurename = get_feature_name("_Java", $featuretable); - if ( $featurename ) { $line = "InstallJava\t\&$featurename\=3 And Not Installed And JAVAPATH\=\"\" And Not PATCH\t$number\n"; } - else { $line = "InstallJava\tNot Installed And JAVAPATH\=\"\" And Not PATCH\t$number\n"; } # feature belongs to root - push(@{$installuitable} ,$line); - installer::remover::remove_leading_and_ending_whitespaces(\$line); - $infoline = "Added $line into table $installuitablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - if ( $allvariables->{'ADAPRODUCT'} ) - { - $number = get_free_number_in_uisequence_table($installuitable) + 4; - $featurename = get_feature_name("_Adabas", $featuretable); - $line = "MaintenanceAdabas\t\&$featurename\=3 And Installed And Not PATCH\t$number\n"; - push(@{$installuitable} ,$line); - installer::remover::remove_leading_and_ending_whitespaces(\$line); - $infoline = "Added $line into table $installuitablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - if ( $allvariables->{'JAVAPRODUCT'} ) - { - $number = get_free_number_in_uisequence_table($installuitable) + 6; - $featurename = get_feature_name("_Java", $featuretable); - if ( $featurename ) { $line = "MaintenanceJava\t\&$featurename\=3 And Installed And JAVAPATH\=\"\" And Not PATCH\t$number\n"; } - else { $line = "MaintenanceJava\tInstalled And JAVAPATH\=\"\" And Not PATCH\t$number\n"; } # feature belongs to root - push(@{$installuitable} ,$line); - installer::remover::remove_leading_and_ending_whitespaces(\$line); - $infoline = "Added $line into table $installuitablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - if ( $allvariables->{'UREPRODUCT'} ) - { - $number = get_free_number_in_uisequence_table($installuitable) + 8; - $featurename = get_feature_name("_Ure", $featuretable); - if ( $featurename ) { $line = "InstallUre\t\&$featurename\=3 And Not Installed\t$number\n"; } - else { $line = "InstallUre\tNot Installed\t$number\n"; } # feature belongs to root - push(@{$installuitable} ,$line); - installer::remover::remove_leading_and_ending_whitespaces(\$line); - $infoline = "Added $line into table $installuitablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - if ( $allvariables->{'UREPRODUCT'} ) - { - $number = get_free_number_in_uisequence_table($installuitable) + 10; - $featurename = get_feature_name("_Ure", $featuretable); - if ( $featurename ) { $line = "MaintenanceUre\t\&$featurename\=3 And Installed\t$number\n"; } - else { $line = "MaintenanceUre\tInstalled\t$number\n"; } # feature belongs to root - push(@{$installuitable} ,$line); - installer::remover::remove_leading_and_ending_whitespaces(\$line); - $infoline = "Added $line into table $installuitablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - # Content for Feature table, better from scp (translation) - # gm_o_java gm_optional Java 1.4.2 Description 2 200 - - installer::files::save_file($customactiontablename, $customactiontable); - installer::files::save_file($installuitablename, $installuitable); - installer::files::save_file($featuretablename, $featuretable); - installer::files::save_file($directorytablename, $directorytable); - installer::files::save_file($componenttablename, $componenttable); -} - -################################################################## -# Setting the encoding in all idt files. Replacing the -# variable WINDOWSENCODINGTEMPLATE -################################################################## - -sub setencoding -{ - my ( $languageidtdir, $onelanguage ) = @_; - - my $encoding = installer::windows::language::get_windows_encoding($onelanguage); - - # collecting all idt files in the directory $languageidtdir and substituting the string - - my $idtfiles = installer::systemactions::find_file_with_file_extension("idt", $languageidtdir); - - for ( my $i = 0; $i <= $#{$idtfiles}; $i++ ) - { - my $onefilename = $languageidtdir . $installer::globals::separator . ${$idtfiles}[$i]; - my $onefile = installer::files::read_file($onefilename); - - for ( my $j = 0; $j <= $#{$onefile}; $j++ ) - { - ${$onefile}[$j] =~ s/WINDOWSENCODINGTEMPLATE/$encoding/g; - } - - installer::files::save_file($onefilename, $onefile); - } -} - -################################################################## -# Setting the condition, that at least one module is selected. -# All modules with flag SHOW_MULTILINGUAL_ONLY were already -# collected. In table ControlE.idt, the string -# LANGUAGECONDITIONINSTALL needs to be replaced. -# Also for APPLICATIONCONDITIONINSTALL for the applications -# with flag APPLICATIONMODULE. -################################################################## - -sub set_multilanguageonly_condition -{ - my ( $languageidtdir ) = @_; - - my $onefilename = $languageidtdir . $installer::globals::separator . "ControlE.idt"; - my $onefile = installer::files::read_file($onefilename); - - # Language modules - - my $condition = ""; - - foreach my $module ( sort keys %installer::globals::multilingual_only_modules ) - { - $condition = $condition . " &$module=3 Or"; - } - - $condition =~ s/^\s*//; - $condition =~ s/\s*Or\s*$//; # removing the ending "Or" - - if ( $condition eq "" ) { $condition = "1"; } - - for ( my $j = 0; $j <= $#{$onefile}; $j++ ) - { - ${$onefile}[$j] =~ s/LANGUAGECONDITIONINSTALL/$condition/; - } - - # Application modules - - $condition = ""; - - foreach my $module ( sort keys %installer::globals::application_modules ) - { - $condition = $condition . " &$module=3 Or"; - } - - $condition =~ s/^\s*//; - $condition =~ s/\s*Or\s*$//; # removing the ending "Or" - - if ( $condition eq "" ) { $condition = "1"; } - - for ( my $j = 0; $j <= $#{$onefile}; $j++ ) - { - ${$onefile}[$j] =~ s/APPLICATIONCONDITIONINSTALL/$condition/; - } - - installer::files::save_file($onefilename, $onefile); -} - -############################################# -# Putting array values into hash -############################################# - -sub fill_assignment_hash -{ - my ($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray) = @_; - - my $max = $parameter - 1; - - if ( $max != $#{$assignmentarray} ) - { - my $definedparameter = $#{$assignmentarray} + 1; - installer::exiter::exit_program("ERROR: gid: $gid, key: $key ! Wrong parameter in scp. For table $tablename $parameter parameter are required ! You defined: $definedparameter", "fill_assignment_hash"); - } - - for ( my $i = 0; $i <= $#{$assignmentarray}; $i++ ) - { - my $counter = $i + 1; - my $key = "parameter". $counter; - - my $localvalue = ${$assignmentarray}[$i]; - installer::remover::remove_leading_and_ending_quotationmarks(\$localvalue); - $localvalue =~ s/\\\"/\"/g; - $localvalue =~ s/\\\!/\!/g; - $localvalue =~ s/\\\&/\&/g; - $localvalue =~ s/\\\</\</g; - $localvalue =~ s/\\\>/\>/g; - $assignmenthashref->{$key} = $localvalue; - } -} - -########################################################################## -# Checking the assignment of a Windows CustomAction and putting it -# into a hash -########################################################################## - -sub create_customaction_assignment_hash -{ - my ($gid, $name, $key, $assignmentarray) = @_; - - my %assignment = (); - my $assignmenthashref = \%assignment; - - my $tablename = ${$assignmentarray}[0]; - installer::remover::remove_leading_and_ending_quotationmarks(\$tablename); - - my $tablename_defined = 0; - my $parameter = 0; - - if ( $tablename eq "InstallUISequence" ) - { - $tablename_defined = 1; - $parameter = 3; - fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); - } - - if ( $tablename eq "InstallExecuteSequence" ) - { - $tablename_defined = 1; - $parameter = 3; - fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); - } - - if ( $tablename eq "AdminExecuteSequence" ) - { - $tablename_defined = 1; - $parameter = 3; - fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); - } - - if ( $tablename eq "ControlEvent" ) - { - $tablename_defined = 1; - $parameter = 7; - fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); - } - - if ( $tablename eq "ControlCondition" ) - { - $tablename_defined = 1; - $parameter = 5; - fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); - } - - if ( ! $tablename_defined ) - { - installer::exiter::exit_program("ERROR: gid: $gid, key: $key ! Unknown Windows CustomAction table: $tablename ! Currently supported: InstallUISequence, InstallExecuteSequence, ControlEvent, ControlCondition", "create_customaction_assignment_hash"); - } - - return $assignmenthashref; -} - -########################################################################## -# Finding the position of a specified CustomAction. -# If the CustomAction is not found, the return value is "-1". -# If the CustomAction position is not defined yet, -# the return value is also "-1". -########################################################################## - -sub get_customaction_position -{ - my ($action, $sequencetable) = @_; - - my $position = -1; - - for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) - { - my $line = ${$sequencetable}[$i]; - - if ( $line =~ /^\s*([\w\.]+)\t.*\t\s*(\d+)\s$/ ) # matching only, if position is a number! - { - my $compareaction = $1; - my $localposition = $2; - - if ( $compareaction eq $action ) - { - $position = $localposition; - last; - } - } - } - - return $position; -} - -########################################################################## -# Setting the position of CustomActions in sequence tables. -# Replacing all occurrences of "POSITIONTEMPLATE_" -########################################################################## - -sub set_positions_in_table -{ - my ( $sequencetable, $tablename ) = @_; - - my $infoline = "\nSetting positions in table \"$tablename\".\n"; - push(@installer::globals::logfileinfo, $infoline); - - # Step 1: Resolving all occurrences of "POSITIONTEMPLATE_end" - - my $lastposition = get_last_position_in_sequencetable($sequencetable); - - for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) - { - if ( ${$sequencetable}[$i] =~ /^\s*([\w\.]+)\t.*\t\s*POSITIONTEMPLATE_end\s*$/ ) - { - my $customaction = $1; - $lastposition = $lastposition + 25; - ${$sequencetable}[$i] =~ s/POSITIONTEMPLATE_end/$lastposition/; - $infoline = "Setting position \"$lastposition\" for custom action \"$customaction\".\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } - - # Step 2: Resolving all occurrences of "POSITIONTEMPLATE_abc" or "POSITIONTEMPLATE_behind_abc" - # where abc is the name of the reference Custom Action. - # This has to be done, until there is no more occurrence of POSITIONTEMPLATE (success) - # or there is no replacement in one circle (failure). - - my $template_exists = 0; - my $template_replaced = 0; - my $counter = 0; - - do - { - $template_exists = 0; - $template_replaced = 0; - $counter++; - - for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) - { - if ( ${$sequencetable}[$i] =~ /^\s*([\w\.]+)\t.*\t\s*(POSITIONTEMPLATE_.*?)\s*$/ ) - { - my $onename = $1; - my $templatename = $2; - my $positionname = $templatename; - my $customaction = $templatename; - $customaction =~ s/POSITIONTEMPLATE_//; - $template_exists = 1; - - # Trying to find the correct number. - # This can fail, if the custom action has no number - - my $setbehind = 0; - if ( $customaction =~ /^\s*behind_(.*?)\s*$/ ) - { - $customaction = $1; - $setbehind = 1; - } - - my $position = get_customaction_position($customaction, $sequencetable); - - if ( $position >= 0 ) # Found CustomAction and is has a position. Otherwise return value is "-1". - { - my $newposition = 0; - if ( $setbehind ) { $newposition = $position + 2; } - else { $newposition = $position - 2; } - ${$sequencetable}[$i] =~ s/$templatename/$newposition/; - $template_replaced = 1; - $infoline = "Setting position \"$newposition\" for custom action \"$onename\" (scp: \"$positionname\" at position $position).\n"; - push(@installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Could not assign position for custom action \"$onename\" yet (scp: \"$positionname\").\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } - } - } while (( $template_exists ) && ( $template_replaced )); - - # An error occurred, because templates still exist, but could not be replaced. - # Reason: - # 1. Wrong name of CustomAction in scp2 (typo?) - # 2. Circular dependencies of CustomActions (A after B and B after A) - - # Problem: It is allowed, that a CustomAction is defined in scp2 in a library that is - # part of product ABC, but this CustomAction is not used in this product - # and the reference CustomAction is not part of this product. - # Therefore this cannot be an error, but only produce a warning. The assigned number - # must be the last sequence number. - - if (( $template_exists ) && ( ! $template_replaced )) - { - for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) - { - if ( ${$sequencetable}[$i] =~ /^\s*([\w\.]+)\t.*\t\s*(POSITIONTEMPLATE_.*?)\s*$/ ) - { - my $customactionname = $1; - my $fulltemplate = $2; - my $template = $fulltemplate; - $template =~ s/POSITIONTEMPLATE_//; - $lastposition = $lastposition + 25; - ${$sequencetable}[$i] =~ s/$fulltemplate/$lastposition/; - $infoline = "WARNING: Setting position \"$lastposition\" for custom action \"$customactionname\". Could not find CustomAction \"$template\".\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } - } -} - -########################################################################## -# Setting the Windows custom actions into different tables -# CustomAc.idt, InstallE.idt, InstallU.idt, ControlE.idt, ControlC.idt -########################################################################## - -sub addcustomactions -{ - my ($languageidtdir, $customactions, $filesarray) = @_; - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: addcustomactions start\n"); - - my $customactionidttablename = $languageidtdir . $installer::globals::separator . "CustomAc.idt"; - my $customactionidttable = installer::files::read_file($customactionidttablename); - my $installexecutetablename = $languageidtdir . $installer::globals::separator . "InstallE.idt"; - my $installexecutetable = installer::files::read_file($installexecutetablename); - my $adminexecutetablename = $languageidtdir . $installer::globals::separator . "AdminExe.idt"; - my $adminexecutetable = installer::files::read_file($adminexecutetablename); - my $installuitablename = $languageidtdir . $installer::globals::separator . "InstallU.idt"; - my $installuitable = installer::files::read_file($installuitablename); - my $controleventtablename = $languageidtdir . $installer::globals::separator . "ControlE.idt"; - my $controleventtable = installer::files::read_file($controleventtablename); - my $controlconditiontablename = $languageidtdir . $installer::globals::separator . "ControlC.idt"; - my $controlconditiontable = installer::files::read_file($controlconditiontablename); - - # Iterating over all Windows custom actions - - for ( my $i = 0; $i <= $#{$customactions}; $i++ ) - { - my $customaction = ${$customactions}[$i]; - my $name = $customaction->{'Name'}; - my $typ = $customaction->{'Typ'}; - my $source = $customaction->{'Source'}; - my $target = $customaction->{'Target'}; - my $inbinarytable = $customaction->{'Inbinarytable'}; - my $gid = $customaction->{'gid'}; - - my $styles = ""; - if ( $customaction->{'Styles'} ) { $styles = $customaction->{'Styles'}; } - - my $added_customaction = set_custom_action($customactionidttable, $name, $typ, $source, $target, $inbinarytable, $filesarray, $customactionidttablename, $styles); - - if ( $added_customaction ) - { - # If the CustomAction was added into the CustomAc.idt, it can be connected to the installation. - # There are currently two different ways for doing this: - # 1. Using "add_custom_action_to_install_table", which adds the CustomAction to the install sequences, - # which are saved in InstallE.idt and InstallU.idt - # 2. Using "connect_custom_action_to_control" and "connect_custom_action_to_control". The first method - # connects a CustomAction to a control in ControlE.idt. The second method sets a condition for a control, - # which might be influenced by the CustomAction. This happens in ControlC.idt. - - # Any Windows CustomAction can have a lot of different assignments. - - for ( my $j = 1; $j <= 50; $j++ ) - { - my $key = "Assignment" . $j; - my $value = ""; - if ( $customaction->{$key} ) - { - $value = $customaction->{$key}; - - # in a patch the Assignment can be overwritten by a PatchAssignment - if ( $installer::globals::patch ) - { - $patchkey = "PatchAssignment" . $j; - if ( $customaction->{$patchkey} ) - { - $value = $customaction->{$patchkey}; - $key = $patchkey; - } - } - - } - else { last; } - - # $value is now a comma separated list - if ( $value =~ /^\s*\(\s*(.*)\s*\);?\s*$/ ) { $value = $1; } - my $assignmentarray = installer::converter::convert_stringlist_into_array(\$value, ","); - my $assignment = create_customaction_assignment_hash($gid, $name, $key, $assignmentarray); - - if ( $assignment->{'parameter1'} eq "InstallExecuteSequence" ) - { - add_custom_action_to_install_table($installexecutetable, $source, $name, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $filesarray, $installexecutetablename, $styles); - } - elsif ( $assignment->{'parameter1'} eq "AdminExecuteSequence" ) - { - add_custom_action_to_install_table($adminexecutetable, $source, $name, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $filesarray, $adminexecutetablename, $styles); - } - elsif ( $assignment->{'parameter1'} eq "InstallUISequence" ) - { - add_custom_action_to_install_table($installuitable, $source, $name, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $filesarray, $installuitablename, $styles); - } - elsif ( $assignment->{'parameter1'} eq "ControlEvent" ) - { - connect_custom_action_to_control($controleventtable, $controleventtablename, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $assignment->{'parameter4'}, $assignment->{'parameter5'}, $assignment->{'parameter6'}, $assignment->{'parameter7'}); - } - elsif ( $assignment->{'parameter1'} eq "ControlCondition" ) - { - connect_condition_to_control($controlconditiontable, $controlconditiontablename, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $assignment->{'parameter4'}, $assignment->{'parameter5'}); - } - else - { - installer::exiter::exit_program("ERROR: gid: $gid, key: $key ! Unknown Windows CustomAction table: $assignmenthashref->{'parameter1'} ! Currently supported: InstallUISequence, InstallESequence, ControlEvent, ControlCondition", "addcustomactions"); - } - } - } - } - - # Setting the positions in the tables - - set_positions_in_table($installexecutetable, $installexecutetablename); - set_positions_in_table($installuitable, $installuitablename); - set_positions_in_table($adminexecutetable, $adminexecutetablename); - - # Saving the files - - installer::files::save_file($customactionidttablename, $customactionidttable); - installer::files::save_file($installexecutetablename, $installexecutetable); - installer::files::save_file($adminexecutetablename, $adminexecutetable); - installer::files::save_file($installuitablename, $installuitable); - installer::files::save_file($controleventtablename, $controleventtable); - installer::files::save_file($controlconditiontablename, $controlconditiontable); - - my $infoline = "Updated idt file: $customactionidttablename\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Updated idt file: $installexecutetablename\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Updated idt file: $adminexecutetablename\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Updated idt file: $installuitablename\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Updated idt file: $controleventtablename\n"; - push(@installer::globals::logfileinfo, $infoline); - $infoline = "Updated idt file: $controlconditiontablename\n"; - push(@installer::globals::logfileinfo, $infoline); - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: addcustomactions end\n"); -} - -########################################################################## -# Setting bidi attributes in idt tables -########################################################################## - -sub setbidiattributes -{ - my ($languageidtdir, $onelanguage) = @_; - - # Editing the files Dialog.idt and Control.idt - - my $dialogfilename = $languageidtdir . $installer::globals::separator . "Dialog.idt"; - my $controlfilename = $languageidtdir . $installer::globals::separator . "Control.idt"; - - my $dialogfile = installer::files::read_file($dialogfilename); - my $controlfile = installer::files::read_file($controlfilename); - - # Searching attributes in Dialog.idt and adding "896". - # Attributes are in column 6 (from 10). - - my $bidiattribute = 896; - for ( my $i = 0; $i <= $#{$dialogfile}; $i++ ) - { - if ( $i < 3 ) { next; } - if ( ${$dialogfile}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - my $one = $1; - my $two = $2; - my $three = $3; - my $four = $4; - my $five = $5; - my $attribute = $6; - my $seven = $7; - my $eight = $8; - $attribute = $attribute + $bidiattribute; - ${$dialogfile}[$i] = "$one\t$two\t$three\t$four\t$five\t$attribute\t$seven\t$eight\n"; - } - } - - # Searching attributes in Control.idt and adding "224". - # Attributes are in column 8 (from 12). - - $bidiattribute = 224; - for ( my $i = 0; $i <= $#{$controlfile}; $i++ ) - { - if ( $i < 3 ) { next; } - if ( ${$controlfile}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - my $one = $1; - my $two = $2; - my $three = $3; - my $four = $4; - my $five = $5; - my $six = $6; - my $seven = $7; - my $attribute = $8; - my $nine = $9; - my $ten = $10; - my $eleven = $11; - my $twelve = $12; - $attribute = $attribute + $bidiattribute; - ${$controlfile}[$i] = "$one\t$two\t$three\t$four\t$five\t$six\t$seven\t$attribute\t$nine\t$ten\t$eleven\t$twelve\n"; - } - } - - # Saving the file - - installer::files::save_file($dialogfilename, $dialogfile); - $infoline = "Set bidi support in idt file \"$dialogfilename\" for language $onelanguage\n"; - push(@installer::globals::logfileinfo, $infoline); - - installer::files::save_file($controlfilename, $controlfile); - $infoline = "Set bidi support in idt file \"$controlfilename\" for language $onelanguage\n"; - push(@installer::globals::logfileinfo, $infoline); -} - -1; diff --git a/solenv/bin/modules/installer/windows/inifile.pm b/solenv/bin/modules/installer/windows/inifile.pm deleted file mode 100644 index 29d0e6f2f..000000000 --- a/solenv/bin/modules/installer/windows/inifile.pm +++ /dev/null @@ -1,146 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::inifile; - -use installer::existence; -use installer::files; -use installer::globals; -use installer::windows::idtglobal; - -#################################################### -# Setting the profile for a special profileitem -#################################################### - -sub get_profile_for_profileitem -{ - my ($profileid, $filesref) = @_; - - my $profile = installer::existence::get_specified_file($filesref, $profileid); - - return $profile; -} - -#################################################### -# Checking whether profile is included in patch -#################################################### - -sub profile_has_patch_flag -{ - my ($profile) = @_; - - my $in_patch = 0; - - my $styles = ""; - if ( $profile->{'Styles'} ) { $styles = $profile->{'Styles'}; } - if ( $styles =~ /\bPATCH\b/ ) { $in_patch = 1; } - - return $in_patch; -} - -#################################################### -# Checking whether profile is part of product -#################################################### - -sub file_is_part_of_product -{ - my ($profilegid, $filesref) = @_; - - my $part_of_product = 0; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - $onefile = ${$filesref}[$i]; - my $filegid = $onefile->{'gid'}; - - if ( $filegid eq $profilegid ) - { - $part_of_product = 1; - last; - } - } - - return $part_of_product; -} - -########################################################################################################### -# Creating the file IniFile.idt dynamically -# Content: -# IniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_ -########################################################################################################### - -sub create_inifile_table -{ - my ($inifiletableentries, $filesref, $basedir) = @_; - - my @inifiletable = (); - - installer::windows::idtglobal::write_idt_header(\@inifiletable, "inifile"); - - for ( my $i = 0; $i <= $#{$inifiletableentries}; $i++ ) - { - my $profileitem = ${$inifiletableentries}[$i]; - - my $profileid = $profileitem->{'ProfileID'}; - - # Is this profile part of the product? This is not sure, for example in patch process. - # If the profile is not part of the product, this ProfileItem must be ignored. - - if ( ! file_is_part_of_product($profileid, $filesref) ) { next; } - - my $profile = get_profile_for_profileitem($profileid, $filesref); - - if (( $installer::globals::patch ) && ( ! profile_has_patch_flag($profile) )) { next; } - - my %inifile = (); - - $inifile{'IniFile'} = $profileitem->{'Inifiletablekey'}; - $inifile{'FileName'} = $profile->{'Name'}; - $inifile{'DirProperty'} = $profile->{'uniquedirname'}; - $inifile{'Section'} = $profileitem->{'Section'}; - $inifile{'Key'} = $profileitem->{'Key'}; - $inifile{'Value'} = $profileitem->{'Value'}; - $inifile{'Action'} = $profileitem->{'Inifiletableaction'}; - $inifile{'Component_'} = $profile->{'componentname'}; - - my $oneline = $inifile{'IniFile'} . "\t" . $inifile{'FileName'} . "\t" . $inifile{'DirProperty'} . "\t" - . $inifile{'Section'} . "\t" . $inifile{'Key'} . "\t" . $inifile{'Value'} . "\t" - . $inifile{'Action'} . "\t" . $inifile{'Component_'} . "\n"; - - push(@inifiletable, $oneline); - } - - # Saving the file - - my $inifiletablename = $basedir . $installer::globals::separator . "IniFile.idt"; - installer::files::save_file($inifiletablename ,\@inifiletable); - my $infoline = "Created idt file: $inifiletablename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -1; diff --git a/solenv/bin/modules/installer/windows/java.pm b/solenv/bin/modules/installer/windows/java.pm deleted file mode 100644 index e61947d2b..000000000 --- a/solenv/bin/modules/installer/windows/java.pm +++ /dev/null @@ -1,120 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::java; - -use installer::exiter; -use installer::files; -use installer::globals; -use installer::windows::idtglobal; - -#################################################################################### -# Writing content into RegLocat.idt and AppSearc.idt to find Java on system -#################################################################################### - -sub update_java_tables -{ - my ($basedir, $allvariables) = @_; - - my $reglocatfile = ""; - my $appsearchfile = ""; - - my $reglocatfilename = $basedir . $installer::globals::separator . "RegLocat.idt"; - my $appsearchfilename = $basedir . $installer::globals::separator . "AppSearc.idt"; - my $signaturefilename = $basedir . $installer::globals::separator . "Signatur.idt"; - - if ( -f $reglocatfilename ) - { - $reglocatfile = installer::files::read_file($reglocatfilename); - } - else - { - my @reglocattable = (); - $reglocatfile = \@reglocattable; - installer::windows::idtglobal::write_idt_header($reglocatfile, "reglocat"); - } - - if ( -f $appsearchfilename ) - { - $appsearchfile = installer::files::read_file($appsearchfilename); - } - else - { - my @appsearchtable = (); - $appsearchfile = \@appsearchtable; - installer::windows::idtglobal::write_idt_header($appsearchfile, "appsearch"); - } - - if ( -f $signaturefilename ) - { - $signaturefile = installer::files::read_file($signaturefilename); - } - else - { - my @signaturetable = (); - $signaturefile = \@signaturetable; - installer::windows::idtglobal::write_idt_header($signaturefile, "signatur"); - } - - # Writing content into this tables - # Java version is saved in scp project - # $installer::globals::javafile was defined in installer::windows::idtglobal::add_childprojects - - if ( ! $installer::globals::javafile->{'Javaversion'} ) { installer::exiter::exit_program("ERROR: \"Javaversion\" has to be defined in $installer::globals::javafile->{'gid'} in scp project!", "update_java_tables"); } - - my $javastring = $installer::globals::javafile->{'Javaversion'}; - - my $signature = "JavaReg"; - my $rootvalue = "2"; - my $key = "Software\\JavaSoft\\Java Runtime Environment\\" . $javastring; - my $name = "JavaHome"; - my $type = 2; - my $property = "JAVAPATH"; - - my $oneline = $signature . "\t" . $rootvalue . "\t" . $key . "\t" . $name . "\t" . $type . "\n"; - push(@{$reglocatfile}, $oneline); - - $oneline = $property . "\t" . $signature . "\n"; - push(@{$appsearchfile}, $oneline); - - # Saving the files - - installer::files::save_file($reglocatfilename ,$reglocatfile); - my $infoline = "Updated idt file for Java: $reglocatfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - - installer::files::save_file($appsearchfilename ,$appsearchfile); - $infoline = "Updated idt file for Java: $appsearchfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - - installer::files::save_file($signaturefilename ,$signaturefile); - $infoline = "Updated idt file: $signaturefilename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -1; diff --git a/solenv/bin/modules/installer/windows/language.pm b/solenv/bin/modules/installer/windows/language.pm deleted file mode 100644 index f20235a50..000000000 --- a/solenv/bin/modules/installer/windows/language.pm +++ /dev/null @@ -1,73 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::language; - -use installer::exiter; - -#################################################### -# Determining the Windows language (LCID) -# English: 1033 -#################################################### - -sub get_windows_language -{ - my ($language) = @_; - - my $windowslanguage = ""; - - if ( $installer::globals::msilanguage->{$language} ) { $windowslanguage = $installer::globals::msilanguage->{$language}; } - - if ( $windowslanguage eq "" ) { installer::exiter::exit_program("ERROR: Unknown language $language in function get_windows_language", "get_windows_language"); } - - return $windowslanguage; -} - -#################################################### -# Determining the Windows language ANSI-Codepage -# English: 1252 -#################################################### - -sub get_windows_encoding -{ - my ($language) = @_; - - my $windowsencoding = ""; - - if ( $installer::globals::msiencoding->{$language} ) { $windowsencoding = $installer::globals::msiencoding->{$language}; } - - if ( $windowsencoding eq "" ) { $windowsencoding = "0"; } # setting value, if the language is not listed in the encodinglist - - if ( $windowsencoding eq "0" ) { $windowsencoding = "65001"; } # languages with "0" have to be available in UTF-8 (65001) - - # Asian multilingual installation sets need a code neutral Windows Installer database -> $windowsencoding = 0 - if (( $language eq "en-US" ) && (( $installer::globals::product =~ /suitemulti/i ) || ( $installer::globals::product =~ /officemulti/i ) || ( $installer::globals::product =~ /c05office/i ) || ( $installer::globals::added_english ))) { $windowsencoding = "0"; } - - return $windowsencoding; -} - -1; diff --git a/solenv/bin/modules/installer/windows/media.pm b/solenv/bin/modules/installer/windows/media.pm deleted file mode 100644 index efa515769..000000000 --- a/solenv/bin/modules/installer/windows/media.pm +++ /dev/null @@ -1,455 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::media; - -use installer::exiter; -use installer::files; -use installer::globals; -use installer::windows::idtglobal; - -############################################################## -# Returning the diskid for the media table. -############################################################## - -sub get_media_diskid -{ - my ($id) = @_; - - return $id; -} - -############################################################## -# Returning the lastsequence for the media table. -############################################################## - -sub get_media_lastsequence -{ - my ($fileref) = @_; - - return $fileref->{'sequencenumber'}; -} - -############################################################## -# Returning the diskprompt for the media table. -############################################################## - -sub get_media_diskprompt -{ - return 1; -} - -############################################################## -# Returning the cabinet file name for the media table. -############################################################## - -sub get_media_cabinet -{ - my ($id) = @_; - - my $number = 1000 + $id; - my $filename = "f_" . $number . ".cab"; - - if ( $installer::globals::include_cab_in_msi ) { $filename = "\#" . $filename; } - - return $filename; -} - -############################################################## -# Returning the volumelabel for the media table. -############################################################## - -sub get_media_volumelabel -{ - return "DISK1"; -} - -############################################################## -# Returning the source for the media table. -############################################################## - -sub get_media_source -{ - return ""; -} - -############################################################## -# Saving the cabinet file name in the files collector. -# This is useful for making a list to connect the -# source of each file with the destination cabinet file. -############################################################## - -sub set_cabinetfilename_for_component_in_file_collector -{ - my ($cabinetfilename, $filesref, $componentname, $max) = @_; - - for ( my $i = 0; $i <= $max; $i++ ) - { - my $onefile = ${$filesref}[$i]; - my $component = $onefile->{'componentname'}; - - if ( $component eq $componentname ) - { - my $cabinet = ""; - - if ( $onefile->{'cabinet'} ) { $cabinet = $onefile->{'cabinet'}; } - - if ( $cabinet eq "" ) - { - $onefile->{'cabinet'} = $cabinetfilename; - } - } - } -} - -################################################# -# Creating the cab file name dynamically -################################################# - -sub generate_cab_filename_for_some_cabs -{ - my ( $allvariables, $id ) = @_; - - my $name = $allvariables->{'PRODUCTNAME'}; - - $name = lc($name); - $name =~ s/\.//g; - $name =~ s/\s//g; - - # possibility to overwrite the name with variable CABFILENAME - if ( $allvariables->{'CABFILENAME'} ) { $name = $allvariables->{'CABFILENAME'}; } - - $name = $name . $id . ".cab"; - - if ( $installer::globals::include_cab_in_msi ) { $name = "\#" . $name; } - - return $name; -} - -################################################# -# Creating the cab file name for cab files -# defined in packages. -################################################# - -sub get_cabfilename -{ - my ($name) = @_; - - if ( $installer::globals::include_cab_in_msi ) { $name = "\#" . $name; } - - return $name; -} - -################################################# -# Creating the cab file name dynamically -################################################# - -sub generate_cab_filename -{ - my ( $allvariables ) = @_; - - my $name = $allvariables->{'PRODUCTNAME'}; - - $name = lc($name); - $name =~ s/\.//g; - $name =~ s/\s//g; - - # possibility to overwrite the name with variable CABFILENAME - if ( $allvariables->{'CABFILENAME'} ) { $name = $allvariables->{'CABFILENAME'}; } - - $name = $name . ".cab"; - - if ( $installer::globals::include_cab_in_msi ) { $name = "\#" . $name; } - - return $name; -} - -sub get_maximum_filenumber -{ - my ($allfiles, $maxcabfilenumber) = @_; - - my $maxfile = 0; - - while ( ! ( $allfiles%$maxcabfilenumber == 0 )) - { - $allfiles++; - } - - $maxfile = $allfiles / $maxcabfilenumber; - - $maxfile++; # for securitry - - return $maxfile; -} - -################################################################################# -# Setting the last sequence for the cabinet files -################################################################################# - -sub get_last_sequence -{ - my ( $cabfilename, $alludpatelastsequences ) = @_; - - my $sequence = 0; - - if (( $installer::globals::updatedatabase ) && ( exists($alludpatelastsequences->{$cabfilename}) )) - { - $sequence = $alludpatelastsequences->{$cabfilename}; - } - else - { - $sequence = $installer::globals::lastsequence{$cabfilename}; - } - - return $sequence; -} - -################################################################################# -# Creating the file Media.idt dynamically -# Content: -# DiskId LastSequence DiskPrompt Cabinet VolumeLabel Source -# Idea: Every component is packed into each own cab file -################################################################################# - -sub create_media_table -{ - my ($filesref, $basedir, $allvariables, $alludpatelastsequences, $allupdatediskids) = @_; - - my @mediatable = (); - - my $diskid = 0; - - installer::windows::idtglobal::write_idt_header(\@mediatable, "media"); - - if ( $allvariables->{'INCLUDE_CAB_IN_MSI'} ) { $installer::globals::include_cab_in_msi = 1; } - - if ( $installer::globals::use_packages_for_cabs ) - { - my $cabfile; - foreach $cabfile ( sort keys %installer::globals::lastsequence ) - { - my %media = (); - $diskid++; - - $media{'DiskId'} = get_media_diskid($diskid); - $media{'LastSequence'} = get_last_sequence($cabfile, $alludpatelastsequences); - $media{'DiskPrompt'} = get_media_diskprompt(); - $media{'Cabinet'} = get_cabfilename($cabfile); - $media{'VolumeLabel'} = get_media_volumelabel(); - $media{'Source'} = get_media_source(); - - my $oneline = $media{'DiskId'} . "\t" . $media{'LastSequence'} . "\t" . $media{'DiskPrompt'} . "\t" - . $media{'Cabinet'} . "\t" . $media{'VolumeLabel'} . "\t" . $media{'Source'} . "\n"; - - push(@mediatable, $oneline); - - # Comparing the disk id with the disk id from update database. Both have to be identical. New files have to be added - # to the new pff cabinet file. And existing cab files must not be removed. - if ( $installer::globals::updatedatabase ) - { - # Comparing lines in new media table with line from media table in udpate database. - if ( exists($allupdatediskids->{$media{'Cabinet'}}) ) - { - if ( $media{'DiskId'} != $allupdatediskids->{$media{'Cabinet'}} ) - { - installer::exiter::exit_program("ERROR: Different DiskIDs for cab file \"$media{'Cabinet'}\".\nCurrent installation set: \"$media{'DiskId'}\", but update database used \"$allupdatediskids->{$media{'Cabinet'}}\".\nWere cabinet files removed or added?", "create_media_table"); - } - } - else - { - my $localinfoline = "Warning: Could not find cabinet file \"$media{'Cabinet'}}\" in update database. This seems to be an new cabinet file!?\n"; - push(@installer::globals::logfileinfo, $localinfoline); - } - } - } - - # one new cabinet file for all files added after the final release - if (( $installer::globals::updatedatabase ) && ( $installer::globals::pfffileexists )) - { - my %media = (); - $diskid++; - - $media{'DiskId'} = get_media_diskid($diskid) + $installer::globals::mergemodulenumber; # Adding mergemodulenumber, because this files are included later - $media{'LastSequence'} = $installer::globals::updatesequencecounter; - $media{'DiskPrompt'} = get_media_diskprompt(); - $media{'Cabinet'} = get_cabfilename($installer::globals::pffcabfilename); - $media{'VolumeLabel'} = get_media_volumelabel(); - $media{'Source'} = get_media_source(); - - my $oneline = $media{'DiskId'} . "\t" . $media{'LastSequence'} . "\t" . $media{'DiskPrompt'} . "\t" - . $media{'Cabinet'} . "\t" . $media{'VolumeLabel'} . "\t" . $media{'Source'} . "\n"; - - push(@mediatable, $oneline); - } - - } - elsif ( $installer::globals::cab_file_per_component ) - { - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - my $nextfile = ${$filesref}[$i+1]; - - my $filecomponent = ""; - my $nextcomponent = ""; - - if ( $onefile->{'componentname'} ) { $filecomponent = $onefile->{'componentname'}; } - if ( $nextfile->{'componentname'} ) { $nextcomponent = $nextfile->{'componentname'}; } - - if ( $filecomponent eq $nextcomponent ) - { - next; # nothing to do, this is not the last file of a component - } - - my %media = (); - $diskid++; - - $media{'DiskId'} = get_media_diskid($diskid); - $media{'LastSequence'} = get_media_lastsequence($onefile); - $media{'DiskPrompt'} = get_media_diskprompt(); - $media{'Cabinet'} = get_media_cabinet($diskid); - $media{'VolumeLabel'} = get_media_volumelabel(); - $media{'Source'} = get_media_source(); - - my $oneline = $media{'DiskId'} . "\t" . $media{'LastSequence'} . "\t" . $media{'DiskPrompt'} . "\t" - . $media{'Cabinet'} . "\t" . $media{'VolumeLabel'} . "\t" . $media{'Source'} . "\n"; - - push(@mediatable, $oneline); - - $media{'Cabinet'} =~ s/^\s*\#//; # removing leading hash - set_cabinetfilename_for_component_in_file_collector($media{'Cabinet'}, $filesref, $filecomponent, $i); - } - } - elsif ( $installer::globals::fix_number_of_cab_files ) - { - # number of cabfiles - my $maxcabfilenumber = $installer::globals::number_of_cabfiles; - if ( $allvariables->{'CABFILENUMBER'} ) { $maxcabfilenumber = $allvariables->{'CABFILENUMBER'}; } - my $allfiles = $#{$filesref} + 1; - my $maxfilenumber = get_maximum_filenumber($allfiles, $maxcabfilenumber); - my $cabfilenumber = 0; - my $cabfull = 0; - my $counter = 0; - - # Sorting of files collector files required ! - # Attention: The order in the cab file is not guaranteed (especially in udpate process) - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - if (( $counter >= $maxfilenumber ) || ( $i == $#{$filesref} )) { $cabfull = 1; } - - $counter++; # counting the files in the cab file - - my $onefile = ${$filesref}[$i]; - my $nextfile = ${$filesref}[$i+1]; - - my $filecomponent = ""; - my $nextcomponent = ""; - - if ( $onefile->{'componentname'} ) { $filecomponent = $onefile->{'componentname'}; } - if ( $nextfile->{'componentname'} ) { $nextcomponent = $nextfile->{'componentname'}; } - - if ( $filecomponent eq $nextcomponent ) # all files of one component have to be in one cab file - { - next; # nothing to do, this is not the last file of a component - } - - if ( $cabfull ) - { - my %media = (); - $cabfilenumber++; - - $media{'DiskId'} = get_media_diskid($cabfilenumber); - $media{'LastSequence'} = $i + 1; # This should be correct, also for unsorted files collectors - $media{'DiskPrompt'} = get_media_diskprompt(); - $media{'Cabinet'} = generate_cab_filename_for_some_cabs($allvariables, $cabfilenumber); - $media{'VolumeLabel'} = get_media_volumelabel(); - $media{'Source'} = get_media_source(); - - my $oneline = $media{'DiskId'} . "\t" . $media{'LastSequence'} . "\t" . $media{'DiskPrompt'} . "\t" - . $media{'Cabinet'} . "\t" . $media{'VolumeLabel'} . "\t" . $media{'Source'} . "\n"; - - push(@mediatable, $oneline); - - # Saving the cabinet file name in the file collector - - $media{'Cabinet'} =~ s/^\s*\#//; # removing leading hash - - for ( my $j = 0; $j <= $i; $j++ ) - { - my $onefile = ${$filesref}[$j]; - if ( ! $onefile->{'cabinet'} ) { $onefile->{'cabinet'} = $media{'Cabinet'}; } - } - - $cabfull = 0; - $counter = 0; - } - } - } - elsif ( $installer::globals::one_cab_file ) - { - my %media = (); - $diskid++; - - my $maximumfile = $#{$filesref}; - - $media{'DiskId'} = get_media_diskid($diskid); - $media{'LastSequence'} = $maximumfile + 1; # This works also for unsorted file collector - $media{'DiskPrompt'} = get_media_diskprompt(); - $media{'Cabinet'} = generate_cab_filename($allvariables); - $media{'VolumeLabel'} = get_media_volumelabel(); - $media{'Source'} = get_media_source(); - - my $oneline = $media{'DiskId'} . "\t" . $media{'LastSequence'} . "\t" . $media{'DiskPrompt'} . "\t" - . $media{'Cabinet'} . "\t" . $media{'VolumeLabel'} . "\t" . $media{'Source'} . "\n"; - - push(@mediatable, $oneline); - - # Saving the cabinet file name in the file collector - - $media{'Cabinet'} =~ s/^\s*\#//; # removing leading hash - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - $onefile->{'cabinet'} = $media{'Cabinet'}; - } - } - else - { - installer::exiter::exit_program("ERROR: No cab file specification in globals.pm !", "create_media_table"); - } - - # Saving the file - - my $mediatablename = $basedir . $installer::globals::separator . "Media.idt"; - installer::files::save_file($mediatablename ,\@mediatable); - my $infoline = "Created idt file: $mediatablename\n"; - push(@installer::globals::logfileinfo, $infoline); -} - -1; diff --git a/solenv/bin/modules/installer/windows/mergemodule.pm b/solenv/bin/modules/installer/windows/mergemodule.pm deleted file mode 100755 index 833b476f1..000000000 --- a/solenv/bin/modules/installer/windows/mergemodule.pm +++ /dev/null @@ -1,1636 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::mergemodule; - -use Cwd; -use Digest::MD5; -use installer::converter; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::remover; -use installer::scriptitems; -use installer::systemactions; -use installer::worker; -use installer::windows::idtglobal; -use installer::windows::language; - -################################################################# -# Merging the Windows MergeModules into the msi database. -################################################################# - -sub merge_mergemodules_into_msi_database -{ - my ($mergemodules, $filesref, $msifilename, $languagestringref, $language, $languagefile, $allvariables, $includepatharrayref, $allupdatesequences, $allupdatelastsequences, $allupdatediskids) = @_; - - my $domerge = 0; - if (( $#{$mergemodules} > -1 ) && ( ! $installer::globals::patch ) && ( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack )) { $domerge = 1; } - - if ( $domerge ) - { - installer::logger::include_header_into_logfile("Merging merge modules into msi database"); - installer::logger::print_message( "... merging msm files into msi database ... \n" ); - installer::logger::include_timestamp_into_logfile("\nPerformance Info: MergeModule into msi database, start"); - - my $msidb = "msidb.exe"; # Has to be in the path - my $cabinetfile = "MergeModule.CABinet"; # the name of each cabinet file in a merge file - my $infoline = ""; - my $systemcall = ""; - my $returnvalue = ""; - - # 1. Analyzing the MergeModule (has only to be done once) - # a. -> Extracting cabinet file: msidb.exe -d <msmfile> -x MergeModule.CABinet - # b. -> Number of files in cabinet file: msidb.exe -d <msmfile> -f <directory> -e File - # c. -> List of components: msidb.exe -d <msmfile> -f <directory> -e Component - - if ( ! $installer::globals::mergemodules_analyzed ) - { - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Analyzing MergeModules, start"); - $infoline = "Analyzing all Merge Modules\n\n"; - push( @installer::globals::logfileinfo, $infoline); - - %installer::globals::mergemodules = (); - - my $mergemoduledir = installer::systemactions::create_directories("mergefiles", $languagestringref); - - my $mergemodule; - foreach $mergemodule ( @{$mergemodules} ) - { - my $filename = $mergemodule->{'Name'}; - my $mergefile = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$filename, $includepatharrayref, 1); - - if ( ! -f $$mergefile ) { installer::exiter::exit_program("ERROR: msm file not found: $filename !", "merge_mergemodules_into_msi_database"); } - my $completesource = $$mergefile; - - my $mergegid = $mergemodule->{'gid'}; - my $workdir = $mergemoduledir . $installer::globals::separator . $mergegid; - if ( ! -d $workdir ) { installer::systemactions::create_directory($workdir); } - - $infoline = "Analyzing Merge Module: $filename\n"; - push( @installer::globals::logfileinfo, $infoline); - - # copy msm file into working directory - my $completedest = $workdir . $installer::globals::separator . $filename; - installer::systemactions::copy_one_file($completesource, $completedest); - if ( ! -f $completedest ) { installer::exiter::exit_program("ERROR: msm file not found: $completedest !", "merge_mergemodules_into_msi_database"); } - - # changing directory - my $from = cwd(); - my $to = $workdir; - chdir($to); - - # remove an existing cabinet file - if ( -f $cabinetfile ) { unlink($cabinetfile); } - - # exclude cabinet file - $systemcall = $msidb . " -d " . $filename . " -x " . $cabinetfile; - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Could not extract cabinet file from merge file: $completedest !", "merge_mergemodules_into_msi_database"); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - # exclude tables from mergefile - # Attention: All listed tables have to exist in the database. If they not exist, an error window pops up - # and the return value of msidb.exe is not zero. The error window makes it impossible to check the existence - # of a table with the help of the return value. - # Solution: Export of all tables by using "*" . Some tables must exist (File Component Directory), other - # tables do not need to exist (MsiAssembly). - - if ( $^O =~ /cygwin/i ) { - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - my $localworkdir = $workdir; - $localworkdir =~ s/\//\\\\/g; - $systemcall = $msidb . " -d " . $filename . " -f " . $localworkdir . " -e \\\*"; - } - else - { - $systemcall = $msidb . " -d " . $filename . " -f " . $workdir . " -e \*"; - } - - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Could not exclude tables from merge file: $completedest !", "merge_mergemodules_into_msi_database"); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - # Determining files - my $idtfilename = "File.idt"; # must exist - if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: File \"$idtfilename\" not found in directory \"$workdir\" !", "merge_mergemodules_into_msi_database"); } - my $filecontent = installer::files::read_file($idtfilename); - my @file_idt_content = (); - my $filecounter = 0; - my %mergefilesequence = (); - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i <= 2 ) { next; } # ignoring first three lines - if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines - $filecounter++; - push(@file_idt_content, ${$filecontent}[$i]); - if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.+?)\t(.+?)\t(.+?)\t(.*?)\t(.*?)\t(.*?)\t(\d+?)\s*$/ ) - { - my $filename = $1; - my $filesequence = $8; - $mergefilesequence{$filename} = $filesequence; - } - else - { - my $linecount = $i + 1; - installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "merge_mergemodules_into_msi_database"); - } - } - - # Determining components - $idtfilename = "Component.idt"; # must exist - if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: File \"$idtfilename\" not found in directory \"$workdir\" !", "merge_mergemodules_into_msi_database"); } - $filecontent = installer::files::read_file($idtfilename); - my %componentnames = (); - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i <= 2 ) { next; } # ignoring first three lines - if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines - if ( ${$filecontent}[$i] =~ /^\s*(\S+)\s+/ ) { $componentnames{$1} = 1; } - } - - # Determining directories - $idtfilename = "Directory.idt"; # must exist - if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: File \"$idtfilename\" not found in directory \"$workdir\" !", "merge_mergemodules_into_msi_database"); } - $filecontent = installer::files::read_file($idtfilename); - my %mergedirectories = (); - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i <= 2 ) { next; } # ignoring first three lines - if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines - if ( ${$filecontent}[$i] =~ /^\s*(\S+)\s+/ ) { $mergedirectories{$1} = 1; } - } - - # Determining assemblies - $idtfilename = "MsiAssembly.idt"; # does not need to exist - my $hasmsiassemblies = 0; - my %mergeassemblies = (); - if ( -f $idtfilename ) - { - $filecontent = installer::files::read_file($idtfilename); - $hasmsiassemblies = 1; - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i <= 2 ) { next; } # ignoring first three lines - if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines - if ( ${$filecontent}[$i] =~ /^\s*(\S+)\s+/ ) { $mergeassemblies{$1} = 1; } - } - } - - # It is possible, that other tables have to be checked here. This happens, if tables in the - # merge module have to know the "Feature" or the "Directory", under which the content of the - # msm file is integrated into the msi database. - - # Determining name of cabinet file in installation set - my $cabfilename = $mergemodule->{'Cabfilename'}; - installer::packagelist::resolve_packagevariables(\$cabfilename, $allvariables, 0); - - # Analyzing styles - # Flag REMOVE_FILE_TABLE is required for msvc9 Merge-Module, because otherwise msidb.exe - # fails during integration of msm file into msi database. - - my $styles = ""; - my $removefiletable = 0; - if ( $mergemodule->{'Styles'} ) { $styles = $mergemodule->{'Styles'}; } - if ( $styles =~ /\bREMOVE_FILE_TABLE\b/ ) { $removefiletable = 1; } - - if ( $removefiletable ) - { - my $removeworkdir = $workdir . $installer::globals::separator . "remove_file_idt"; - if ( ! -d $removeworkdir ) { installer::systemactions::create_directory($removeworkdir); } - my $completeremovedest = $removeworkdir . $installer::globals::separator . $filename; - installer::systemactions::copy_one_file($completedest, $completeremovedest); - if ( ! -f $completeremovedest ) { installer::exiter::exit_program("ERROR: msm file not found: $completeremovedest !", "merge_mergemodules_into_msi_database"); } - - # Unpacking msm file - if ( $^O =~ /cygwin/i ) { - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - my $localcompleteremovedest = $completeremovedest; - my $localremoveworkdir = $removeworkdir; - $localcompleteremovedest =~ s/\//\\\\/g; - $localremoveworkdir =~ s/\//\\\\/g; - $systemcall = $msidb . " -d " . $localcompleteremovedest . " -f " . $localremoveworkdir . " -e \\\*"; - } - else - { - $systemcall = $msidb . " -d " . $completeremovedest . " -f " . $removeworkdir . " -e \*"; - } - - $returnvalue = system($systemcall); - - my $idtfilename = $removeworkdir . $installer::globals::separator . "File.idt"; - if ( -f $idtfilename ) { unlink $idtfilename; } - unlink $completeremovedest; - - # Packing msm file without "File.idt" - if ( $^O =~ /cygwin/i ) { - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - my $localcompleteremovedest = $completeremovedest; - my $localremoveworkdir = $removeworkdir; - $localcompleteremovedest =~ s/\//\\\\/g; - $localremoveworkdir =~ s/\//\\\\/g; - $systemcall = $msidb . " -c -d " . $localcompleteremovedest . " -f " . $localremoveworkdir . " -i \\\*"; - } - else - { - $systemcall = $msidb . " -c -d " . $completeremovedest . " -f " . $removeworkdir . " -i \*"; - } - $returnvalue = system($systemcall); - - # Using this msm file for merging - if ( -f $completeremovedest ) { $completedest = $completeremovedest; } - else { installer::exiter::exit_program("ERROR: Could not find msm file without File.idt: $completeremovedest !", "merge_mergemodules_into_msi_database"); } - } - - # Saving MergeModule info - - my %onemergemodulehash = (); - $onemergemodulehash{'mergefilepath'} = $completedest; - $onemergemodulehash{'workdir'} = $workdir; - $onemergemodulehash{'cabinetfile'} = $workdir . $installer::globals::separator . $cabinetfile; - $onemergemodulehash{'filenumber'} = $filecounter; - $onemergemodulehash{'componentnames'} = \%componentnames; - $onemergemodulehash{'cabfilename'} = $cabfilename; - $onemergemodulehash{'feature'} = $mergemodule->{'Feature'}; - $onemergemodulehash{'rootdir'} = $mergemodule->{'RootDir'}; - $onemergemodulehash{'name'} = $mergemodule->{'Name'}; - $onemergemodulehash{'mergefilesequence'} = \%mergefilesequence; - $onemergemodulehash{'mergeassemblies'} = \%mergeassemblies; - $onemergemodulehash{'mergedirectories'} = \%mergedirectories; - $onemergemodulehash{'hasmsiassemblies'} = $hasmsiassemblies; - $onemergemodulehash{'removefiletable'} = $removefiletable; - $onemergemodulehash{'fileidtcontent'} = \@file_idt_content; - - $installer::globals::mergemodules{$mergegid} = \%onemergemodulehash; - - # Collecting all cab files, to copy them into installation set - $installer::globals::copy_msm_files{$cabfilename} = $onemergemodulehash{'cabinetfile'}; - - chdir($from); - } - - $infoline = "All Merge Modules successfully analyzed\n"; - push( @installer::globals::logfileinfo, $infoline); - - $installer::globals::mergemodules_analyzed = 1; - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Analyzing MergeModules, stop"); - - $infoline = "\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - # 2. Change msi database (has to be done for every msi database -> for every language) - # a. Merge msm file into msi database: msidb.exe -d <msifile> -m <mergefile> - # b. Extracting tables from msi database: msidb.exe -d <msifile> -f <directory> -e File Media, ... - # c. Changing content of msi database in tables: File, Media, Directory, FeatureComponent - # d. Including tables into msi database: msidb.exe -d <msifile> -f <directory> -i File Media, ... - # e. Copying cabinet file into installation set (later) - - my $counter = 0; - my $mergemodulegid; - foreach $mergemodulegid (keys %installer::globals::mergemodules) - { - my $mergemodulehash = $installer::globals::mergemodules{$mergemodulegid}; - $counter++; - - installer::logger::include_header_into_logfile("Merging Module: $mergemodulehash->{'name'}"); - installer::logger::print_message( "\t... $mergemodulehash->{'name'} ... \n" ); - - $msifilename = installer::converter::make_path_conform($msifilename); - my $workdir = $msifilename; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$workdir); - - # changing directory - my $from = cwd(); - my $to = $workdir; - chdir($to); - - # Saving original msi database - installer::systemactions::copy_one_file($msifilename, "$msifilename\.$counter"); - - # Merging msm file, this is the "real" merge command - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Before merging database"); - - if ( $^O =~ /cygwin/i ) { - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - my $localmergemodulepath = $mergemodulehash->{'mergefilepath'}; - my $localmsifilename = $msifilename; - $localmergemodulepath =~ s/\//\\\\/g; - $localmsifilename =~ s/\//\\\\/g; - $systemcall = $msidb . " -d " . $localmsifilename . " -m " . $localmergemodulepath; - } - else - { - $systemcall = $msidb . " -d " . $msifilename . " -m " . $mergemodulehash->{'mergefilepath'}; - } - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall . Returnvalue: $returnvalue!\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Could not merge msm file into database: $mergemodulehash->{'mergefilepath'} !", "merge_mergemodules_into_msi_database"); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: After merging database"); - - # Saving original idt files - if ( -f "File.idt" ) { installer::systemactions::rename_one_file("File.idt", "old.File.idt.$counter"); } - if ( -f "Media.idt" ) { installer::systemactions::rename_one_file("Media.idt", "old.Media.idt.$counter"); } - if ( -f "Directory.idt" ) { installer::systemactions::rename_one_file("Directory.idt", "old.Directory.idt.$counter"); } - if ( -f "Director.idt" ) { installer::systemactions::rename_one_file("Director.idt", "old.Director.idt.$counter"); } - if ( -f "FeatureComponents.idt" ) { installer::systemactions::rename_one_file("FeatureComponents.idt", "old.FeatureComponents.idt.$counter"); } - if ( -f "FeatureC.idt" ) { installer::systemactions::rename_one_file("FeatureC.idt", "old.FeatureC.idt.$counter"); } - if ( -f "MsiAssembly.idt" ) { installer::systemactions::rename_one_file("MsiAssembly.idt", "old.MsiAssembly.idt.$counter"); } - if ( -f "MsiAssem.idt" ) { installer::systemactions::rename_one_file("MsiAssem.idt", "old.MsiAssem.idt.$counter"); } - - # Extracting tables - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Before extracting tables"); - - my $workingtables = "File Media Directory FeatureComponents"; # required tables - # Optional tables can be added now - if ( $mergemodulehash->{'hasmsiassemblies'} ) { $workingtables = $workingtables . " MsiAssembly"; } - - # Table "Feature" has to be exported, but it is not necessary to import it. - if ( $^O =~ /cygwin/i ) { - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - my $localmsifilename = $msifilename; - my $localworkdir = $workdir; - $localmsifilename =~ s/\//\\\\/g; - $localworkdir =~ s/\//\\\\/g; - $systemcall = $msidb . " -d " . $localmsifilename . " -f " . $localworkdir . " -e " . "Feature " . $workingtables; - } - else - { - $systemcall = $msidb . " -d " . $msifilename . " -f " . $workdir . " -e " . "Feature " . $workingtables; - } - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Could not exclude tables from msi database: $msifilename !", "merge_mergemodules_into_msi_database"); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: After extracting tables"); - - # Using 8+3 table names, that are used, when tables are integrated into database. The export of tables - # creates idt-files, that have long names. - - if ( -f "Directory.idt" ) { installer::systemactions::rename_one_file("Directory.idt", "Director.idt"); } - if ( -f "FeatureComponents.idt" ) { installer::systemactions::rename_one_file("FeatureComponents.idt", "FeatureC.idt"); } - if ( -f "MsiAssembly.idt" ) { installer::systemactions::rename_one_file("MsiAssembly.idt", "MsiAssem.idt"); } - - # Changing content of tables: File, Media, Directory, FeatureComponent, MsiAssembly - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing Media table"); - change_media_table($mergemodulehash, $workdir, $mergemodulegid, $allupdatelastsequences, $allupdatediskids); - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing File table"); - $filesref = change_file_table($mergemodulehash, $workdir, $allupdatesequences, $includepatharrayref, $filesref, $mergemodulegid); - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing FeatureComponent table"); - change_featurecomponent_table($mergemodulehash, $workdir); - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing Directory table"); - change_directory_table($mergemodulehash, $workdir); - if ( $mergemodulehash->{'hasmsiassemblies'} ) - { - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing MsiAssembly table"); - change_msiassembly_table($mergemodulehash, $workdir); - } - - # msidb.exe does not merge InstallExecuteSequence, AdminExecuteSequence and AdvtExecuteSequence. Instead it creates - # new tables ModuleInstallExecuteSequence, ModuleAdminExecuteSequence and ModuleAdvtExecuteSequence that need to be - # merged into the three ExecuteSequences with the following process (also into InstallUISequence.idt). - - # Saving original idt files - if ( -f "InstallE.idt" ) { installer::systemactions::rename_one_file("InstallE.idt", "old.InstallE.idt.$counter"); } - if ( -f "InstallU.idt" ) { installer::systemactions::rename_one_file("InstallU.idt", "old.InstallU.idt.$counter"); } - if ( -f "AdminExe.idt" ) { installer::systemactions::rename_one_file("AdminExe.idt", "old.AdminExe.idt.$counter"); } - if ( -f "AdvtExec.idt" ) { installer::systemactions::rename_one_file("AdvtExec.idt", "old.AdvtExec.idt.$counter"); } - if ( -f "ModuleInstallExecuteSequence.idt" ) { installer::systemactions::rename_one_file("ModuleInstallExecuteSequence.idt", "old.ModuleInstallExecuteSequence.idt.$counter"); } - if ( -f "ModuleAdminExecuteSequence.idt" ) { installer::systemactions::rename_one_file("ModuleAdminExecuteSequence.idt", "old.ModuleAdminExecuteSequence.idt.$counter"); } - if ( -f "ModuleAdvtExecuteSequence.idt" ) { installer::systemactions::rename_one_file("ModuleAdvtExecuteSequence.idt", "old.ModuleAdvtExecuteSequence.idt.$counter"); } - - # Extracting tables - my $moduleexecutetables = "ModuleInstallExecuteSequence ModuleAdminExecuteSequence ModuleAdvtExecuteSequence"; # new tables - my $executetables = "InstallExecuteSequence InstallUISequence AdminExecuteSequence AdvtExecuteSequence"; # tables to be merged - - - if ( $^O =~ /cygwin/i ) { - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - my $localmsifilename = $msifilename; - my $localworkdir = $workdir; - $localmsifilename =~ s/\//\\\\/g; - $localworkdir =~ s/\//\\\\/g; - $systemcall = $msidb . " -d " . $localmsifilename . " -f " . $localworkdir . " -e " . "Feature " . $moduleexecutetables; - } - else - { - $systemcall = $msidb . " -d " . $msifilename . " -f " . $workdir . " -e " . "Feature " . $moduleexecutetables; - } - $returnvalue = system($systemcall); - - if ( $^O =~ /cygwin/i ) { - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - my $localmsifilename = $msifilename; - my $localworkdir = $workdir; - $localmsifilename =~ s/\//\\\\/g; - $localworkdir =~ s/\//\\\\/g; - $systemcall = $msidb . " -d " . $localmsifilename . " -f " . $localworkdir . " -e " . "Feature " . $executetables; - } - else - { - $systemcall = $msidb . " -d " . $msifilename . " -f " . $workdir . " -e " . "Feature " . $executetables; - } - $returnvalue = system($systemcall); - - # Using 8+3 table names, that are used, when tables are integrated into database. The export of tables - # creates idt-files, that have long names. - - if ( -f "InstallExecuteSequence.idt" ) { installer::systemactions::rename_one_file("InstallExecuteSequence.idt", "InstallE.idt"); } - if ( -f "InstallUISequence.idt" ) { installer::systemactions::rename_one_file("InstallUISequence.idt", "InstallU.idt"); } - if ( -f "AdminExecuteSequence.idt" ) { installer::systemactions::rename_one_file("AdminExecuteSequence.idt", "AdminExe.idt"); } - if ( -f "AdvtExecuteSequence.idt" ) { installer::systemactions::rename_one_file("AdvtExecuteSequence.idt", "AdvtExec.idt"); } - - # Merging content of tables ModuleInstallExecuteSequence, ModuleAdminExecuteSequence and ModuleAdvtExecuteSequence - # into tables InstallExecuteSequence, AdminExecuteSequence and AdvtExecuteSequence - if ( -f "ModuleInstallExecuteSequence.idt" ) - { - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing InstallExecuteSequence table"); - change_executesequence_table($mergemodulehash, $workdir, "InstallE.idt", "ModuleInstallExecuteSequence.idt"); - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing InstallUISequence table"); - change_executesequence_table($mergemodulehash, $workdir, "InstallU.idt", "ModuleInstallExecuteSequence.idt"); - } - - if ( -f "ModuleAdminExecuteSequence.idt" ) - { - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing AdminExecuteSequence table"); - change_executesequence_table($mergemodulehash, $workdir, "AdminExe.idt", "ModuleAdminExecuteSequence.idt"); - } - - if ( -f "ModuleAdvtExecuteSequence.idt" ) - { - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing AdvtExecuteSequence table"); - change_executesequence_table($mergemodulehash, $workdir, "AdvtExec.idt", "ModuleAdvtExecuteSequence.idt"); - } - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: All tables edited"); - - # Including tables into msi database - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Before including tables"); - - if ( $^O =~ /cygwin/i ) { - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - my $localmsifilename = $msifilename; - my $localworkdir = $workdir; - $localmsifilename =~ s/\//\\\\/g; - $localworkdir =~ s/\//\\\\/g; - foreach $table (split / /, $workingtables . ' ' . $executetables) { - $systemcall = $msidb . " -d " . $localmsifilename . " -f " . $localworkdir . " -i " . $table; - my $retval = system($systemcall); - $infoline = "Systemcall returned $retval: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - $returnvalue |= $retval; - } - } - else - { - $systemcall = $msidb . " -d " . $msifilename . " -f " . $workdir . " -i " . $workingtables. " " . $executetables; - $returnvalue = system($systemcall); - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - } - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Could not include tables into msi database: $msifilename !", "merge_mergemodules_into_msi_database"); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: After including tables"); - - chdir($from); - } - - if ( ! $installer::globals::mergefiles_added_into_collector ) { $installer::globals::mergefiles_added_into_collector = 1; } # Now all mergemodules are merged for one language. - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: MergeModule into msi database, stop"); - } - - return $filesref; -} - -######################################################################### -# Analyzing the content of the media table. -######################################################################### - -sub analyze_media_file -{ - my ($filecontent, $workdir) = @_; - - my %filehash = (); - my $linecount = 0; - my $counter = 0; - my $filename = "Media.idt"; - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i <= 2 ) { next; } # ignoring first three lines - if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines - if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.+?)\t(.+?)\t(.+?)\t(.+?)\t(.*?)\s*$/ ) - { - my %line = (); - # Format: DiskId LastSequence DiskPrompt Cabinet VolumeLabel Source - $line{'DiskId'} = $1; - $line{'LastSequence'} = $2; - $line{'DiskPrompt'} = $3; - $line{'Cabinet'} = $4; - $line{'VolumeLabel'} = $5; - $line{'Source'} = $6; - - $counter++; - $filehash{$counter} = \%line; - } - else - { - $linecount = $i + 1; - installer::exiter::exit_program("ERROR: Unknown line format in table \"$filename\" in \"$workdir\" (line $linecount) !", "analyze_media_file"); - } - } - - return \%filehash; -} - -######################################################################### -# Setting the DiskID for the new cabinet file -######################################################################### - -sub get_diskid -{ - my ($mediafile, $allupdatediskids, $cabfilename) = @_; - - my $diskid = 0; - my $line; - - if (( $installer::globals::updatedatabase ) && ( exists($allupdatediskids->{$cabfilename}) )) - { - $diskid = $allupdatediskids->{$cabfilename}; - } - else - { - foreach $line ( keys %{$mediafile} ) - { - if ( $mediafile->{$line}->{'DiskId'} > $diskid ) { $diskid = $mediafile->{$line}->{'DiskId'}; } - } - - $diskid++; - } - - return $diskid; -} - -######################################################################### -# Setting the global LastSequence variable -######################################################################### - -sub set_current_last_sequence -{ - my ($mediafile) = @_; - - my $lastsequence = 0; - my $line; - foreach $line ( keys %{$mediafile} ) - { - if ( $mediafile->{$line}->{'LastSequence'} > $lastsequence ) { $lastsequence = $mediafile->{$line}->{'LastSequence'}; } - } - - $installer::globals::lastsequence_before_merge = $lastsequence; -} - -######################################################################### -# Setting the LastSequence for the new cabinet file -######################################################################### - -sub get_lastsequence -{ - my ($mergemodulehash, $allupdatelastsequences) = @_; - - my $lastsequence = 0; - - if (( $installer::globals::updatedatabase ) && ( exists($allupdatelastsequences->{$mergemodulehash->{'cabfilename'}}) )) - { - $lastsequence = $allupdatelastsequences->{$mergemodulehash->{'cabfilename'}}; - } - else - { - $lastsequence = $installer::globals::lastsequence_before_merge + $mergemodulehash->{'filenumber'}; - } - - return $lastsequence; -} - -######################################################################### -# Setting the DiskPrompt for the new cabinet file -######################################################################### - -sub get_diskprompt -{ - my ($mediafile) = @_; - - my $diskprompt = ""; - my $line; - foreach $line ( keys %{$mediafile} ) - { - if ( exists($mediafile->{$line}->{'DiskPrompt'}) ) - { - $diskprompt = $mediafile->{$line}->{'DiskPrompt'}; - last; - } - } - - return $diskprompt; -} - -######################################################################### -# Setting the VolumeLabel for the new cabinet file -######################################################################### - -sub get_volumelabel -{ - my ($mediafile) = @_; - - my $volumelabel = ""; - my $line; - foreach $line ( keys %{$mediafile} ) - { - if ( exists($mediafile->{$line}->{'VolumeLabel'}) ) - { - $volumelabel = $mediafile->{$line}->{'VolumeLabel'}; - last; - } - } - - return $volumelabel; -} - -######################################################################### -# Setting the Source for the new cabinet file -######################################################################### - -sub get_source -{ - my ($mediafile) = @_; - - my $source = ""; - my $line; - foreach $line ( keys %{$mediafile} ) - { - if ( exists($mediafile->{$line}->{'Source'}) ) - { - $diskprompt = $mediafile->{$line}->{'Source'}; - last; - } - } - - return $source; -} - -######################################################################### -# For each Merge Module one new line has to be included into the -# media table. -######################################################################### - -sub create_new_media_line -{ - my ($mergemodulehash, $mediafile, $allupdatelastsequences, $allupdatediskids) = @_; - - my $diskid = get_diskid($mediafile, $allupdatediskids, $mergemodulehash->{'cabfilename'}); - my $lastsequence = get_lastsequence($mergemodulehash, $allupdatelastsequences); - my $diskprompt = get_diskprompt($mediafile); - my $cabinet = $mergemodulehash->{'cabfilename'}; - my $volumelabel = get_volumelabel($mediafile); - my $source = get_source($mediafile); - - if ( $installer::globals::include_cab_in_msi ) { $cabinet = "\#" . $cabinet; } - - my $newline = "$diskid\t$lastsequence\t$diskprompt\t$cabinet\t$volumelabel\t$source\n"; - - return $newline; -} - -######################################################################### -# Setting the last diskid in media table. -######################################################################### - -sub get_last_diskid -{ - my ($mediafile) = @_; - - my $lastdiskid = 0; - my $line; - foreach $line ( keys %{$mediafile} ) - { - if ( $mediafile->{$line}->{'DiskId'} > $lastdiskid ) { $lastdiskid = $mediafile->{$line}->{'DiskId'}; } - } - - return $lastdiskid; -} - -######################################################################### -# Setting global variable for last cab file name. -######################################################################### - -sub set_last_cabfile_name -{ - my ($mediafile, $lastdiskid) = @_; - - my $line; - foreach $line ( keys %{$mediafile} ) - { - if ( $mediafile->{$line}->{'DiskId'} == $lastdiskid ) { $installer::globals::lastcabfilename = $mediafile->{$line}->{'Cabinet'}; } - } - my $infoline = "Setting last cabinet file: $installer::globals::lastcabfilename\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -######################################################################### -# In the media table the new cabinet file has to be added or the -# number of the last cabinet file has to be increased. -######################################################################### - -sub change_media_table -{ - my ( $mergemodulehash, $workdir, $mergemodulegid, $allupdatelastsequences, $allupdatediskids ) = @_; - - my $infoline = "Changing content of table \"Media\"\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $filename = "Media.idt"; - if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" in \"$workdir\" !", "change_media_table"); } - - my $filecontent = installer::files::read_file($filename); - my $mediafile = analyze_media_file($filecontent, $workdir); - set_current_last_sequence($mediafile); - - if ( $installer::globals::fix_number_of_cab_files ) - { - # Determining the line with the highest sequencenumber. That file needs to be updated. - my $lastdiskid = get_last_diskid($mediafile); - if ( $installer::globals::lastcabfilename eq "" ) { set_last_cabfile_name($mediafile, $lastdiskid); } - my $newmaxsequencenumber = $installer::globals::lastsequence_before_merge + $mergemodulehash->{'filenumber'}; - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i <= 2 ) { next; } # ignoring first three lines - if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines - if ( ${$filecontent}[$i] =~ /^\s*(\Q$lastdiskid\E\t)\Q$installer::globals::lastsequence_before_merge\E(\t.*)$/ ) - { - my $start = $1; - my $final = $2; - $infoline = "Merge: Old line in media table: ${$filecontent}[$i]\n"; - push( @installer::globals::logfileinfo, $infoline); - my $newline = $start . $newmaxsequencenumber . $final . "\n"; - ${$filecontent}[$i] = $newline; - $infoline = "Merge: Changed line in media table: ${$filecontent}[$i]\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - } - else - { - # the new line is identical for all localized databases, but has to be created for each MergeModule ($mergemodulegid) - if ( ! exists($installer::globals::merge_media_line{$mergemodulegid}) ) - { - $installer::globals::merge_media_line{$mergemodulegid} = create_new_media_line($mergemodulehash, $mediafile, $allupdatelastsequences, $allupdatediskids); - } - - $infoline = "Adding line: $installer::globals::merge_media_line{$mergemodulegid}\n"; - push( @installer::globals::logfileinfo, $infoline); - - # adding new line - push(@{$filecontent}, $installer::globals::merge_media_line{$mergemodulegid}); - } - - # saving file - installer::files::save_file($filename, $filecontent); -} - -######################################################################### -# Putting the directory table content into a hash. -######################################################################### - -sub analyze_directorytable_file -{ - my ($filecontent, $idtfilename) = @_; - - my %dirhash = (); - # Iterating over the file content - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i <= 2 ) { next; } # ignoring first three lines - if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines - if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.*?)\t(.*?)\s*$/ ) - { - my %line = (); - # Format: Directory Directory_Parent DefaultDir - $line{'Directory'} = $1; - $line{'Directory_Parent'} = $2; - $line{'DefaultDir'} = $3; - $line{'linenumber'} = $i; # saving also the line number for direct access - - my $uniquekey = $line{'Directory'}; - $dirhash{$uniquekey} = \%line; - } - else - { - my $linecount = $i + 1; - installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "analyze_directorytable_file"); - } - } - - return \%dirhash; -} - -######################################################################### -# Putting the msi assembly table content into a hash. -######################################################################### - -sub analyze_msiassemblytable_file -{ - my ($filecontent, $idtfilename) = @_; - - my %assemblyhash = (); - # Iterating over the file content - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i <= 2 ) { next; } # ignoring first three lines - if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines - if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.+?)\t(.+?)\t(.*?)\t(.*?)\s*$/ ) - { - my %line = (); - # Format: Component_ Feature_ File_Manifest File_Application Attributes - $line{'Component'} = $1; - $line{'Feature'} = $2; - $line{'File_Manifest'} = $3; - $line{'File_Application'} = $4; - $line{'Attributes'} = $5; - $line{'linenumber'} = $i; # saving also the line number for direct access - - my $uniquekey = $line{'Component'}; - $assemblyhash{$uniquekey} = \%line; - } - else - { - my $linecount = $i + 1; - installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "analyze_msiassemblytable_file"); - } - } - - return \%assemblyhash; -} - -######################################################################### -# Putting the file table content into a hash. -######################################################################### - -sub analyze_filetable_file -{ - my ( $filecontent, $idtfilename ) = @_; - - my %filehash = (); - # Iterating over the file content - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i <= 2 ) { next; } # ignoring first three lines - if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines - if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.+?)\t(.+?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.+?)\s*$/ ) - { - my %line = (); - # Format: File Component_ FileName FileSize Version Language Attributes Sequence - $line{'File'} = $1; - $line{'Component'} = $2; - $line{'FileName'} = $3; - $line{'FileSize'} = $4; - $line{'Version'} = $5; - $line{'Language'} = $6; - $line{'Attributes'} = $7; - $line{'Sequence'} = $8; - $line{'linenumber'} = $i; # saving also the line number for direct access - - my $uniquekey = $line{'File'}; - $filehash{$uniquekey} = \%line; - } - else - { - my $linecount = $i + 1; - installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "analyze_filetable_file"); - } - } - - return \%filehash; -} - -######################################################################### -# Creating a new line for the directory table. -######################################################################### - -sub get_new_line_for_directory_table -{ - my ($dir) = @_; - - my $newline = "$dir->{'Directory'}\t$dir->{'Directory_Parent'}\t$dir->{'DefaultDir'}\n"; - - return $newline; -} - -######################################################################### -# Creating a new line for the file table. -######################################################################### - -sub get_new_line_for_file_table -{ - my ($file) = @_; - - my $newline = "$file->{'File'}\t$file->{'Component'}\t$file->{'FileName'}\t$file->{'FileSize'}\t$file->{'Version'}\t$file->{'Language'}\t$file->{'Attributes'}\t$file->{'Sequence'}\n"; - - return $newline; -} - -######################################################################### -# Creating a new line for the msiassembly table. -######################################################################### - -sub get_new_line_for_msiassembly_table -{ - my ($assembly) = @_; - - my $newline = "$assembly->{'Component'}\t$assembly->{'Feature'}\t$assembly->{'File_Manifest'}\t$assembly->{'File_Application'}\t$assembly->{'Attributes'}\n"; - - return $newline; -} - -######################################################################### -# Sorting the files collector, if there are files, following -# the merge module files. -######################################################################### - -sub sort_files_collector_for_sequence -{ - my ($filesref) = @_; - - my @sortarray = (); - my %helphash = (); - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - if ( ! exists($onefile->{'sequencenumber'}) ) { installer::exiter::exit_program("ERROR: Could not find sequencenumber for file: $onefile->{'uniquename'} !", "sort_files_collector_for_sequence"); } - my $sequence = $onefile->{'sequencenumber'}; - $helphash{$sequence} = $onefile; - } - - foreach my $seq ( sort { $a <=> $b } keys %helphash ) { push(@sortarray, $helphash{$seq}); } - - return \@sortarray; -} - -######################################################################### -# In the file table "Sequence" and "Attributes" have to be changed. -######################################################################### - -sub change_file_table -{ - my ($mergemodulehash, $workdir, $allupdatesequenceshashref, $includepatharrayref, $filesref, $mergemodulegid) = @_; - - my $infoline = "Changing content of table \"File\"\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $idtfilename = "File.idt"; - if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$idtfilename\" in \"$workdir\" !", "change_file_table"); } - - my $filecontent = installer::files::read_file($idtfilename); - - # If File.idt needed to be removed before the msm database was merged into the msi database, - # now it is time to add the content into File.idt - if ( $mergemodulehash->{'removefiletable'} ) - { - for ( my $i = 0; $i <= $#{$mergemodulehash->{'fileidtcontent'}}; $i++ ) - { - push(@{$filecontent}, ${$mergemodulehash->{'fileidtcontent'}}[$i]); - } - } - - # Unpacking the MergeModule.CABinet (only once) - # Unpacking into temp directory. Warning: expand.exe has problems with very long unpack directories. - - my $unpackdir = installer::systemactions::create_directories("cab", ""); - push(@installer::globals::removedirs, $unpackdir); - $unpackdir = $unpackdir . $installer::globals::separator . $mergemodulegid; - - my %newfileshash = (); - if (( $installer::globals::fix_number_of_cab_files ) && ( ! $installer::globals::mergefiles_added_into_collector )) - { - if ( ! -d $unpackdir ) { installer::systemactions::create_directory($unpackdir); } - - # changing directory - my $from = cwd(); - my $to = $mergemodulehash->{'workdir'}; - if ( $^O =~ /cygwin/i ) { - $to = qx(cygpath -u "$to"); - chomp $to; - } - - chdir($to) || die "Could not chdir to \"$to\"\n"; - - # Unpack the cab file, so that in can be included into the last office cabinet file. - # Not using cabarc.exe from cabsdk for unpacking cabinet files, but "expand.exe" that - # should be available on every Windows system. - - $infoline = "Unpacking cabinet file: $mergemodulehash->{'cabinetfile'}\n"; - push( @installer::globals::logfileinfo, $infoline); - - # Avoid the Cygwin expand command - my $expandfile = "expand.exe"; # Has to be in the path - if ( $^O =~ /cygwin/i ) { - $expandfile = qx(cygpath -u "$ENV{WINDIR}"/System32/expand.exe); - chomp $expandfile; - } - - my $cabfilename = "MergeModule.CABinet"; - - my $systemcall = ""; - if ( $^O =~ /cygwin/i ) { - my $localunpackdir = qx(cygpath -m "$unpackdir"); - chomp $localunpackdir; - $systemcall = $expandfile . " " . $cabfilename . " -F:\\\* " . $localunpackdir; - } - else - { - $systemcall = $expandfile . " " . $cabfilename . " -F:\* " . $unpackdir . " 2\>\&1"; - } - - my $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Could not extract cabinet file: $mergemodulehash->{'cabinetfile'} !", "change_file_table"); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - chdir($from); - } - - # For performance reasons creating a hash with file names and rows - # The content of File.idt is changed after every merge -> content cannot be saved in global hash - $merge_filetablehashref = analyze_filetable_file($filecontent, $idtfilename); - - my $attributes = "16384"; # Always - - my $filename; - foreach $filename (keys %{$mergemodulehash->{'mergefilesequence'}} ) - { - my $mergefilesequence = $mergemodulehash->{'mergefilesequence'}->{$filename}; - - if ( ! exists($merge_filetablehashref->{$filename}) ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" in \"$idtfilename\" !", "change_file_table"); } - my $filehash = $merge_filetablehashref->{$filename}; - my $linenumber = $filehash->{'linenumber'}; - - # <- this line has to be changed concerning "Sequence" and "Attributes" - $filehash->{'Attributes'} = $attributes; - - # If this is an update process, the sequence numbers have to be reused. - if ( $installer::globals::updatedatabase ) - { - if ( ! exists($allupdatesequenceshashref->{$filehash->{'File'}}) ) { installer::exiter::exit_program("ERROR: Sequence not defined for file \"$filehash->{'File'}\" !", "change_file_table"); } - $filehash->{'Sequence'} = $allupdatesequenceshashref->{$filehash->{'File'}}; - # Saving all mergemodule sequence numbers. This is important for creating ddf files - $installer::globals::allmergemodulefilesequences{$filehash->{'Sequence'}} = 1; - } - else - { - # Important saved data: $installer::globals::lastsequence_before_merge. - # This mechanism keeps the correct order inside the new cabinet file. - $filehash->{'Sequence'} = $filehash->{'Sequence'} + $installer::globals::lastsequence_before_merge; - } - - my $oldline = ${$filecontent}[$linenumber]; - my $newline = get_new_line_for_file_table($filehash); - ${$filecontent}[$linenumber] = $newline; - - $infoline = "Merge, replacing line:\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "Old: $oldline\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "New: $newline\n"; - push( @installer::globals::logfileinfo, $infoline); - - # Adding files to the files collector (but only once) - if (( $installer::globals::fix_number_of_cab_files ) && ( ! $installer::globals::mergefiles_added_into_collector )) - { - # If the number of cabinet files is kept constant, - # all files from the mergemodule cabinet files will - # be integrated into the last office cabinet file - # (installer::globals::lastcabfilename). - # Therefore the files must now be added to the filescollector, - # so that they will be integrated into the ddf files. - - # Problem with very long filenames -> copying to shorter filenames - my $newfilename = "f" . $filehash->{'Sequence'}; - my $completesource = $unpackdir . $installer::globals::separator . $filehash->{'File'}; - my $completedest = $unpackdir . $installer::globals::separator . $newfilename; - installer::systemactions::copy_one_file($completesource, $completedest); - - my $locallastcabfilename = $installer::globals::lastcabfilename; - if ( $locallastcabfilename =~ /^\s*\#/ ) { $locallastcabfilename =~ s/^\s*\#//; } # removing beginning hashes - - # Create new file hash for file collector - my %newfile = (); - $newfile{'sequencenumber'} = $filehash->{'Sequence'}; - $newfile{'assignedsequencenumber'} = $filehash->{'Sequence'}; - $newfile{'cabinet'} = $locallastcabfilename; - $newfile{'sourcepath'} = $completedest; - $newfile{'componentname'} = $filehash->{'Component'}; - $newfile{'uniquename'} = $filehash->{'File'}; - $newfile{'Name'} = $filehash->{'File'}; - - # Saving in globals sequence hash - $installer::globals::uniquefilenamesequence{$filehash->{'File'}} = $filehash->{'Sequence'}; - - if ( ! -f $newfile{'sourcepath'} ) { installer::exiter::exit_program("ERROR: File \"$newfile{'sourcepath'}\" must exist!", "change_file_table"); } - - # Collecting all new files. Attention: This files must be included into files collector in correct order! - $newfileshash{$filehash->{'Sequence'}} = \%newfile; - # push(@{$filesref}, \%newfile); -> this is not the correct order - } - } - - # Now the files can be added to the files collector - # In the case of an update process, there can be new files, that have to be added after the merge module files. - # Warning: In multilingual installation sets, the files only have to be added once to the files collector! - - if ( ! $installer::globals::mergefiles_added_into_collector ) - { - foreach my $localsequence ( sort { $a <=> $b } keys %newfileshash ) { push(@{$filesref}, $newfileshash{$localsequence}); } - if ( $installer::globals::newfilesexist ) { $filesref = sort_files_collector_for_sequence($filesref); } - # $installer::globals::mergefiles_added_into_collector = 1; -> Not yet. Only if all mergemodules are merged for one language. - } - - # Saving the idt file (for every language) - installer::files::save_file($idtfilename, $filecontent); - - return $filesref; -} - -######################################################################### -# Reading the file "Director.idt". The Directory, that is defined in scp -# has to be defined in this table. -######################################################################### - -sub collect_directories -{ - my $idtfilename = "Director.idt"; - my $filecontent = installer::files::read_file($idtfilename); - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i <= 2 ) { next; } # ignoring first three lines - if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines - # Format: Directory Directory_Parent DefaultDir - if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.*?)\t(.*?)\s*$/ ) - { - $installer::globals::merge_alldirectory_hash{$1} = 1; - } - else - { - my $linecount = $i + 1; - installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "collect_directories"); - } - } -} - -######################################################################### -# Reading the file "Feature.idt". The Feature, that is defined in scp -# has to be defined in this table. -######################################################################### - -sub collect_feature -{ - my $idtfilename = "Feature.idt"; - if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$idtfilename\" in \"$workdir\" !", "collect_feature"); } - my $filecontent = installer::files::read_file($idtfilename); - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i <= 2 ) { next; } # ignoring first three lines - if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines - # Format: Feature Feature_Parent Title Description Display Level Directory_ Attributes - if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - $installer::globals::merge_allfeature_hash{$1} = 1; - } - else - { - my $linecount = $i + 1; - installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "collect_feature"); - } - } -} - -######################################################################### -# In the featurecomponent table, the new connections have to be added. -######################################################################### - -sub change_featurecomponent_table -{ - my ($mergemodulehash, $workdir) = @_; - - my $infoline = "Changing content of table \"FeatureComponents\"\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $idtfilename = "FeatureC.idt"; - if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$idtfilename\" in \"$workdir\" !", "change_featurecomponent_table"); } - - my $filecontent = installer::files::read_file($idtfilename); - - # Simply adding for each new component one line. The Feature has to be defined in scp project. - my $feature = $mergemodulehash->{'feature'}; - - if ( ! $installer::globals::mergefeaturecollected ) - { - collect_feature(); # putting content into hash %installer::globals::merge_allfeature_hash - $installer::globals::mergefeaturecollected = 1; - } - - if ( ! exists($installer::globals::merge_allfeature_hash{$feature}) ) - { - installer::exiter::exit_program("ERROR: Unknown feature defined in scp: \"$feature\" . Not defined in table \"Feature\" !", "change_featurecomponent_table"); - } - - my $component; - foreach $component ( keys %{$mergemodulehash->{'componentnames'}} ) - { - my $line = "$feature\t$component\n"; - push(@{$filecontent}, $line); - $infoline = "Adding line: $line\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - # saving file - installer::files::save_file($idtfilename, $filecontent); -} - -######################################################################### -# In the directory table, the directory parent has to be changed, -# if it is not TARGETDIR. -######################################################################### - -sub change_directory_table -{ - my ($mergemodulehash, $workdir) = @_; - - # directory for MergeModule has to be defined in scp project - my $scpdirectory = $mergemodulehash->{'rootdir'}; - - if ( $scpdirectory ne "TARGETDIR" ) # TARGETDIR works fine, when using msidb.exe - { - my $infoline = "Changing content of table \"Directory\"\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $idtfilename = "Director.idt"; - if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$idtfilename\" in \"$workdir\" !", "change_directory_table"); } - - my $filecontent = installer::files::read_file($idtfilename); - - if ( ! $installer::globals::mergedirectoriescollected ) - { - collect_directories(); # putting content into %installer::globals::merge_alldirectory_hash, only first column! - $installer::globals::mergedirectoriescollected = 1; - } - - if ( ! exists($installer::globals::merge_alldirectory_hash{$scpdirectory}) ) - { - installer::exiter::exit_program("ERROR: Unknown directory defined in scp: \"$scpdirectory\" . Not defined in table \"Directory\" !", "change_directory_table"); - } - - # If the definition in scp is okay, now the complete content of "Director.idt" can be analyzed - my $merge_directorytablehashref = analyze_directorytable_file($filecontent, $idtfilename); - - my $directory; - foreach $directory (keys %{$mergemodulehash->{'mergedirectories'}} ) - { - if ( ! exists($merge_directorytablehashref->{$directory}) ) { installer::exiter::exit_program("ERROR: Could not find directory \"$directory\" in \"$idtfilename\" !", "change_directory_table"); } - my $dirhash = $merge_directorytablehashref->{$directory}; - my $linenumber = $dirhash->{'linenumber'}; - - # <- this line has to be changed concerning "Directory_Parent", - # if the current value is "TARGETDIR", which is the default value from msidb.exe - - if ( $dirhash->{'Directory_Parent'} eq "TARGETDIR" ) - { - $dirhash->{'Directory_Parent'} = $scpdirectory; - - my $oldline = ${$filecontent}[$linenumber]; - my $newline = get_new_line_for_directory_table($dirhash); - ${$filecontent}[$linenumber] = $newline; - - $infoline = "Merge, replacing line:\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "Old: $oldline\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "New: $newline\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - # saving file - installer::files::save_file($idtfilename, $filecontent); - } -} - -######################################################################### -# In the msiassembly table, the feature has to be changed. -######################################################################### - -sub change_msiassembly_table -{ - my ($mergemodulehash, $workdir) = @_; - - my $infoline = "Changing content of table \"MsiAssembly\"\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $idtfilename = "MsiAssem.idt"; - if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$idtfilename\" in \"$workdir\" !", "change_msiassembly_table"); } - - my $filecontent = installer::files::read_file($idtfilename); - - # feature has to be defined in scp project - my $feature = $mergemodulehash->{'feature'}; - - if ( ! $installer::globals::mergefeaturecollected ) - { - collect_feature(); # putting content into hash %installer::globals::merge_allfeature_hash - $installer::globals::mergefeaturecollected = 1; - } - - if ( ! exists($installer::globals::merge_allfeature_hash{$feature}) ) - { - installer::exiter::exit_program("ERROR: Unknown feature defined in scp: \"$feature\" . Not defined in table \"Feature\" !", "change_msiassembly_table"); - } - - my $merge_msiassemblytablehashref = analyze_msiassemblytable_file($filecontent, $idtfilename); - - my $component; - foreach $component (keys %{$mergemodulehash->{'mergeassemblies'}} ) - { - if ( ! exists($merge_msiassemblytablehashref->{$component}) ) { installer::exiter::exit_program("ERROR: Could not find component \"$component\" in \"$idtfilename\" !", "change_msiassembly_table"); } - my $assemblyhash = $merge_msiassemblytablehashref->{$component}; - my $linenumber = $assemblyhash->{'linenumber'}; - - # <- this line has to be changed concerning "Feature" - $assemblyhash->{'Feature'} = $feature; - - my $oldline = ${$filecontent}[$linenumber]; - my $newline = get_new_line_for_msiassembly_table($assemblyhash); - ${$filecontent}[$linenumber] = $newline; - - $infoline = "Merge, replacing line:\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "Old: $oldline\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "New: $newline\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - # saving file - installer::files::save_file($idtfilename, $filecontent); -} - -######################################################################### -# Creating file content hash -######################################################################### - -sub make_executeidtcontent_hash -{ - my ($filecontent, $idtfilename) = @_; - - my %newhash = (); - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i <= 2 ) { next; } # ignoring first three lines - if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines - # Format for all sequence tables: Action Condition Sequence - if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.*?)\t(.*?)\s*$/ ) - { - my %onehash = (); - $onehash{'Action'} = $1; - $onehash{'Condition'} = $2; - $onehash{'Sequence'} = $3; - $newhash{$onehash{'Action'}} = \%onehash; - } - else - { - my $linecount = $i + 1; - installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "make_executeidtcontent_hash"); - } - } - - return \%newhash; -} - -######################################################################### -# Creating file content hash -######################################################################### - -sub make_moduleexecuteidtcontent_hash -{ - my ($filecontent, $idtfilename) = @_; - - my %newhash = (); - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i <= 2 ) { next; } # ignoring first three lines - if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines - # Format for all module sequence tables: Action Sequence BaseAction After Condition - if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - my %onehash = (); - $onehash{'Action'} = $1; - $onehash{'Sequence'} = $2; - $onehash{'BaseAction'} = $3; - $onehash{'After'} = $4; - $onehash{'Condition'} = $5; - $newhash{$onehash{'Action'}} = \%onehash; - } - else - { - my $linecount = $i + 1; - installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "make_executeidtcontent_hash"); - } - } - - return \%newhash; -} - -######################################################################### -# ExecuteSequence tables need to be merged with -# ModuleExecuteSequence tables created by msidb.exe. -######################################################################### - -sub change_executesequence_table -{ - my ($mergemodulehash, $workdir, $idtfilename, $moduleidtfilename) = @_; - - my $infoline = "Changing content of table \"$idtfilename\"\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$idtfilename\" in \"$workdir\" !", "change_executesequence_table"); } - if ( ! -f $moduleidtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$moduleidtfilename\" in \"$workdir\" !", "change_executesequence_table"); } - - # Reading file content - my $idtfilecontent = installer::files::read_file($idtfilename); - my $moduleidtfilecontent = installer::files::read_file($moduleidtfilename); - - # Converting to hash - my $idtcontenthash = make_executeidtcontent_hash($idtfilecontent, $idtfilename); - my $moduleidtcontenthash = make_moduleexecuteidtcontent_hash($moduleidtfilecontent, $moduleidtfilename); - - # Merging - foreach my $action ( keys %{$moduleidtcontenthash} ) - { - if ( exists($idtcontenthash->{$action}) ) { next; } # Action already exists, can be ignored - - if (( $idtfilename eq "InstallU.idt" ) && ( ! ( $action =~ /^\s*WindowsFolder\./ ))) { next; } # Only "WindowsFolder.*" CustomActions for UI Sequence table - - my $actionhashref = $moduleidtcontenthash->{$action}; - if ( $actionhashref->{'Sequence'} ne "" ) - { - # Format for all sequence tables: Action Condition Sequence - my $newline = $actionhashref->{'Action'} . "\t" . $actionhashref->{'Condition'} . "\t" . $actionhashref->{'Sequence'} . "\n"; - # Adding to table - push(@{$idtfilecontent}, $newline); - # Also adding to hash - my %idttablehash = (); - $idttablehash{'Action'} = $actionhashref->{'Action'}; - $idttablehash{'Condition'} = $actionhashref->{'Condition'}; - $idttablehash{'Sequence'} = $actionhashref->{'Sequence'}; - $idtcontenthash->{$action} = \%idttablehash; - - } - else # no sequence defined, using syntax "BaseAction" and "After" - { - my $baseactionname = $actionhashref->{'BaseAction'}; - # If this baseactionname is not defined in execute idt file, it is not possible to merge - if ( ! exists($idtcontenthash->{$baseactionname}) ) { installer::exiter::exit_program("ERROR: Merge problem: Could not find action \"$baseactionname\" in file \"$idtfilename\" !", "change_executesequence_table"); } - - my $baseaction = $idtcontenthash->{$baseactionname}; - my $sequencenumber = $baseaction->{'Sequence'}; - if ( $actionhashref->{'After'} == 1 ) { $sequencenumber = $sequencenumber + 1; } - else { $sequencenumber = $sequencenumber - 1; } - - # Format for all sequence tables: Action Condition Sequence - my $newline = $actionhashref->{'Action'} . "\t" . $actionhashref->{'Condition'} . "\t" . $sequencenumber . "\n"; - # Adding to table - push(@{$idtfilecontent}, $newline); - # Also adding to hash - my %idttablehash = (); - $idttablehash{'Action'} = $actionhashref->{'Action'}; - $idttablehash{'Condition'} = $actionhashref->{'Condition'}; - $idttablehash{'Sequence'} = $sequencenumber; - $idtcontenthash->{$action} = \%idttablehash; - } - } - - # saving file - installer::files::save_file($idtfilename, $idtfilecontent); -} - - -1; diff --git a/solenv/bin/modules/installer/windows/msiglobal.pm b/solenv/bin/modules/installer/windows/msiglobal.pm deleted file mode 100644 index 18b6b9f3b..000000000 --- a/solenv/bin/modules/installer/windows/msiglobal.pm +++ /dev/null @@ -1,2321 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::msiglobal; - -use Cwd; -use Digest::MD5; -use installer::converter; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::remover; -use installer::scriptitems; -use installer::systemactions; -use installer::worker; -use installer::windows::idtglobal; -use installer::windows::language; - -########################################################################### -# Generating the header of the ddf file. -# The usage of ddf files is needed, because makecab.exe can only include -# one sourcefile into a cab file -########################################################################### - -sub write_ddf_file_header -{ - my ($ddffileref, $cabinetfile, $installdir) = @_; - - my $oneline; - - $oneline = ".Set CabinetName1=" . $cabinetfile . "\n"; - push(@{$ddffileref} ,$oneline); - $oneline = ".Set ReservePerCabinetSize=128\n"; # This reserves space for a digital signature. - push(@{$ddffileref} ,$oneline); - $oneline = ".Set MaxDiskSize=2147483648\n"; # This allows the .cab file to get a size of 2 GB. - push(@{$ddffileref} ,$oneline); - $oneline = ".Set CompressionType=LZX\n"; - push(@{$ddffileref} ,$oneline); - $oneline = ".Set Compress=ON\n"; - push(@{$ddffileref} ,$oneline); -# The window size for LZX compression -# CompressionMemory=15 | 16 | ... | 21 -# Reference: http://msdn.microsoft.com/en-us/library/bb417343.aspx - $oneline = ".Set CompressionMemory=$installer::globals::cabfilecompressionlevel\n"; - push(@{$ddffileref} ,$oneline); - $oneline = ".Set Cabinet=ON\n"; - push(@{$ddffileref} ,$oneline); - $oneline = ".Set DiskDirectoryTemplate=" . $installdir . "\n"; - push(@{$ddffileref} ,$oneline); -} - -########################################################################## -# Lines in ddf files must not contain more than 256 characters -########################################################################## - -sub check_ddf_file -{ - my ( $ddffile, $ddffilename ) = @_; - - my $maxlength = 0; - my $maxline = 0; - my $linelength = 0; - my $linenumber = 0; - - for ( my $i = 0; $i <= $#{$ddffile}; $i++ ) - { - my $oneline = ${$ddffile}[$i]; - - $linelength = length($oneline); - $linenumber = $i + 1; - - if ( $linelength > 256 ) - { - installer::exiter::exit_program("ERROR \"$ddffilename\" line $linenumber: Lines in ddf files must not contain more than 256 characters!", "check_ddf_file"); - } - - if ( $linelength > $maxlength ) - { - $maxlength = $linelength; - $maxline = $linenumber; - } - } - - my $infoline = "Check of ddf file \"$ddffilename\": Maximum length \"$maxlength\" in line \"$maxline\" (allowed line length: 256 characters)\n"; - push(@installer::globals::logfileinfo, $infoline); -} - -########################################################################## -# Lines in ddf files must not be longer than 256 characters. -# Therefore it can be useful to use relative pathes. Then it is -# necessary to change into temp directory before calling -# makecab.exe. -########################################################################## - -sub make_relative_ddf_path -{ - my ( $sourcepath ) = @_; - - my $windowstemppath = $installer::globals::temppath; - - if ( $^O =~ /cygwin/i ) - { - $windowstemppath = $installer::globals::cyg_temppath; - } - - $sourcepath =~ s/\Q$windowstemppath\E//; - $sourcepath =~ s/^\\//; - - return $sourcepath; -} - -########################################################################## -# Returning the order of the sequences in the files array. -########################################################################## - -sub get_sequenceorder -{ - my ($filesref) = @_; - - my %order = (); - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - if ( ! $onefile->{'assignedsequencenumber'} ) { installer::exiter::exit_program("ERROR: No sequence number assigned to $onefile->{'gid'} ($onefile->{'uniquename'})!", "get_sequenceorder"); } - $order{$onefile->{'assignedsequencenumber'}} = $i; - } - - return \%order; -} - -########################################################################## -# Generation the list, in which the source of the files is connected -# with the cabinet destination file. Because more than one file needs -# to be included into a cab file, this has to be done via ddf files. -########################################################################## - -sub generate_cab_file_list -{ - my ($filesref, $installdir, $ddfdir, $allvariables) = @_; - - my @cabfilelist = (); - - installer::logger::include_header_into_logfile("Generating ddf files"); - - installer::logger::include_timestamp_into_logfile("Performance Info: ddf file generation start"); - - if ( $^O =~ /cygwin/i ) { installer::worker::generate_cygwin_pathes($filesref); } - - if ( $installer::globals::use_packages_for_cabs ) - { - my $sequenceorder = get_sequenceorder($filesref); - - my $counter = 1; - my $currentcabfile = ""; - - while ( ( exists($sequenceorder->{$counter}) ) || ( exists($installer::globals::allmergemodulefilesequences{$counter}) ) ) # Taking care of files from merge modules - { - if ( exists($installer::globals::allmergemodulefilesequences{$counter}) ) - { - # Skipping this sequence, it is not included in $filesref, because it is assigned to a file from a merge module.\n"; - $counter++; - next; - } - - # Files with increasing sequencerorder are included in one cab file - my $onefile = ${$filesref}[$sequenceorder->{$counter}]; - my $cabinetfile = $onefile->{'assignedcabinetfile'}; - my $sourcepath = $onefile->{'sourcepath'}; - if ( $^O =~ /cygwin/i ) { $sourcepath = $onefile->{'cyg_sourcepath'}; } - my $uniquename = $onefile->{'uniquename'}; - - my $styles = ""; - my $doinclude = 1; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }; - if ( $styles =~ /\bDONT_PACK\b/ ) { $doinclude = 0; } - - # to avoid lines with more than 256 characters, it can be useful to use relative pathes - if ( $allvariables->{'RELATIVE_PATHES_IN_DDF'} ) { $sourcepath = make_relative_ddf_path($sourcepath); } - - # all files with the same cabinetfile have increasing sequencenumbers - - my @ddffile = (); - - write_ddf_file_header(\@ddffile, $cabinetfile, $installdir); - - my $ddfline = "\"" . $sourcepath . "\"" . " " . $uniquename . "\n"; - if ( $doinclude ) { push(@ddffile, $ddfline); } - - $counter++; # increasing the counter - my $nextfile = ""; - my $nextcabinetfile = ""; - if ( exists($sequenceorder->{$counter}) ) { $nextfile = ${$filesref}[$sequenceorder->{$counter}]; } - if ( $nextfile->{'assignedcabinetfile'} ) { $nextcabinetfile = $nextfile->{'assignedcabinetfile'}; } - - while ( $nextcabinetfile eq $cabinetfile ) - { - $sourcepath = $nextfile->{'sourcepath'}; - if ( $^O =~ /cygwin/i ) { $sourcepath = $nextfile->{'cyg_sourcepath'}; } - # to avoid lines with more than 256 characters, it can be useful to use relative pathes - if ( $allvariables->{'RELATIVE_PATHES_IN_DDF'} ) { $sourcepath = make_relative_ddf_path($sourcepath); } - $uniquename = $nextfile->{'uniquename'}; - my $localdoinclude = 1; - my $nextfilestyles = ""; - if ( $nextfile->{'Styles'} ) { $nextfilestyles = $nextfile->{'Styles'}; } - if ( $nextfilestyles =~ /\bDONT_PACK\b/ ) { $localdoinclude = 0; } - $ddfline = "\"" . $sourcepath . "\"" . " " . $uniquename . "\n"; - if ( $localdoinclude ) { push(@ddffile, $ddfline); } - - $counter++; # increasing the counter! - $nextcabinetfile = "_lastfile_"; - if ( exists($sequenceorder->{$counter}) ) - { - $nextfile = ${$filesref}[$sequenceorder->{$counter}]; - $nextcabinetfile = $nextfile->{'assignedcabinetfile'}; - } - } - - # creating the DDF file - - my $ddffilename = $cabinetfile; - $ddffilename =~ s/.cab/.ddf/; - $ddfdir =~ s/\Q$installer::globals::separator\E\s*$//; - $ddffilename = $ddfdir . $installer::globals::separator . $ddffilename; - - installer::files::save_file($ddffilename ,\@ddffile); - my $infoline = "Created ddf file: $ddffilename\n"; - push(@installer::globals::logfileinfo, $infoline); - - # lines in ddf files must not be longer than 256 characters - check_ddf_file(\@ddffile, $ddffilename); - - # Writing the makecab system call - - my $oneline = "makecab.exe /V3 /F " . $ddffilename . " 2\>\&1 |" . "\n"; - - push(@cabfilelist, $oneline); - - # collecting all ddf files - push(@installer::globals::allddffiles, $ddffilename); - } - } - elsif ((( $installer::globals::cab_file_per_component ) || ( $installer::globals::fix_number_of_cab_files )) && ( $installer::globals::updatedatabase )) - { - my $sequenceorder = get_sequenceorder($filesref); - - my $counter = 1; - my $currentcabfile = ""; - - while ( ( exists($sequenceorder->{$counter}) ) || ( exists($installer::globals::allmergemodulefilesequences{$counter}) ) ) # Taking care of files from merge modules - { -# if ( exists($installer::globals::allmergemodulefilesequences{$counter}) ) -# { -# # Skipping this sequence, it is not included in $filesref, because it is assigned to a file from a merge module.\n"; -# $counter++; -# next; -# } - - my $onefile = ${$filesref}[$sequenceorder->{$counter}]; - $counter++; - - my $cabinetfile = $onefile->{'cabinet'}; - my $sourcepath = $onefile->{'sourcepath'}; - if ( $^O =~ /cygwin/i ) { $sourcepath = $onefile->{'cyg_sourcepath'}; } - my $uniquename = $onefile->{'uniquename'}; - - my $styles = ""; - my $doinclude = 1; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }; - if ( $styles =~ /\bDONT_PACK\b/ ) { $doinclude = 0; } - - # to avoid lines with more than 256 characters, it can be useful to use relative pathes - if ( $allvariables->{'RELATIVE_PATHES_IN_DDF'} ) { $sourcepath = make_relative_ddf_path($sourcepath); } - - my @ddffile = (); - - write_ddf_file_header(\@ddffile, $cabinetfile, $installdir); - - my $ddfline = "\"" . $sourcepath . "\"" . " " . $uniquename . "\n"; - if ( $doinclude ) { push(@ddffile, $ddfline); } - - my $nextfile = ""; - if ( ${$filesref}[$sequenceorder->{$counter}] ) { $nextfile = ${$filesref}[$sequenceorder->{$counter}]; } - - my $nextcabinetfile = ""; - - if ( $nextfile->{'cabinet'} ) { $nextcabinetfile = $nextfile->{'cabinet'}; } - - while ( $nextcabinetfile eq $cabinetfile ) - { - $sourcepath = $nextfile->{'sourcepath'}; - if ( $^O =~ /cygwin/i ) { $sourcepath = $nextfile->{'cyg_sourcepath'}; } - # to avoid lines with more than 256 characters, it can be useful to use relative pathes - if ( $allvariables->{'RELATIVE_PATHES_IN_DDF'} ) { $sourcepath = make_relative_ddf_path($sourcepath); } - $uniquename = $nextfile->{'uniquename'}; - my $localdoinclude = 1; - my $nextfilestyles = ""; - if ( $nextfile->{'Styles'} ) { $nextfilestyles = $nextfile->{'Styles'}; } - if ( $nextfilestyles =~ /\bDONT_PACK\b/ ) { $localdoinclude = 0; } - $ddfline = "\"" . $sourcepath . "\"" . " " . $uniquename . "\n"; - if ( $localdoinclude ) { push(@ddffile, $ddfline); } - $counter++; # increasing the counter! - $nextfile = ""; - $nextcabinetfile = "_lastfile_"; - if (( exists($sequenceorder->{$counter}) ) && ( ${$filesref}[$sequenceorder->{$counter}] )) - { - $nextfile = ${$filesref}[$sequenceorder->{$counter}]; - $nextcabinetfile = $nextfile->{'cabinet'}; - } - } - - # creating the DDF file - - my $ddffilename = $cabinetfile; - $ddffilename =~ s/.cab/.ddf/; - $ddfdir =~ s/\Q$installer::globals::separator\E\s*$//; - $ddffilename = $ddfdir . $installer::globals::separator . $ddffilename; - - installer::files::save_file($ddffilename ,\@ddffile); - my $infoline = "Created ddf file: $ddffilename\n"; - push(@installer::globals::logfileinfo, $infoline); - - # lines in ddf files must not be longer than 256 characters - check_ddf_file(\@ddffile, $ddffilename); - - # Writing the makecab system call - - my $oneline = "makecab.exe /V3 /F " . $ddffilename . " 2\>\&1 |" . "\n"; - - push(@cabfilelist, $oneline); - - # collecting all ddf files - push(@installer::globals::allddffiles, $ddffilename); - } - } - elsif (( $installer::globals::cab_file_per_component ) || ( $installer::globals::fix_number_of_cab_files )) - { - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - my $cabinetfile = $onefile->{'cabinet'}; - my $sourcepath = $onefile->{'sourcepath'}; - if ( $^O =~ /cygwin/i ) { $sourcepath = $onefile->{'cyg_sourcepath'}; } - my $uniquename = $onefile->{'uniquename'}; - - my $styles = ""; - my $doinclude = 1; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }; - if ( $styles =~ /\bDONT_PACK\b/ ) { $doinclude = 0; } - - - # to avoid lines with more than 256 characters, it can be useful to use relative pathes - if ( $allvariables->{'RELATIVE_PATHES_IN_DDF'} ) { $sourcepath = make_relative_ddf_path($sourcepath); } - - # all files with the same cabinetfile are directly behind each other in the files collector - - my @ddffile = (); - - write_ddf_file_header(\@ddffile, $cabinetfile, $installdir); - - my $ddfline = "\"" . $sourcepath . "\"" . " " . $uniquename . "\n"; - if ( $doinclude ) { push(@ddffile, $ddfline); } - - my $nextfile = ${$filesref}[$i+1]; - my $nextcabinetfile = ""; - - if ( $nextfile->{'cabinet'} ) { $nextcabinetfile = $nextfile->{'cabinet'}; } - - while ( $nextcabinetfile eq $cabinetfile ) - { - $sourcepath = $nextfile->{'sourcepath'}; - if ( $^O =~ /cygwin/i ) { $sourcepath = $nextfile->{'cyg_sourcepath'}; } - # to avoid lines with more than 256 characters, it can be useful to use relative pathes - if ( $allvariables->{'RELATIVE_PATHES_IN_DDF'} ) { $sourcepath = make_relative_ddf_path($sourcepath); } - $uniquename = $nextfile->{'uniquename'}; - my $localdoinclude = 1; - my $nextfilestyles = ""; - if ( $nextfile->{'Styles'} ) { $nextfilestyles = $nextfile->{'Styles'}; } - if ( $nextfilestyles =~ /\bDONT_PACK\b/ ) { $localdoinclude = 0; } - $ddfline = "\"" . $sourcepath . "\"" . " " . $uniquename . "\n"; - if ( $localdoinclude ) { push(@ddffile, $ddfline); } - $i++; # increasing the counter! - $nextfile = ${$filesref}[$i+1]; - if ( $nextfile ) { $nextcabinetfile = $nextfile->{'cabinet'}; } - else { $nextcabinetfile = "_lastfile_"; } - } - - # creating the DDF file - - my $ddffilename = $cabinetfile; - $ddffilename =~ s/.cab/.ddf/; - $ddfdir =~ s/\Q$installer::globals::separator\E\s*$//; - $ddffilename = $ddfdir . $installer::globals::separator . $ddffilename; - - installer::files::save_file($ddffilename ,\@ddffile); - my $infoline = "Created ddf file: $ddffilename\n"; - push(@installer::globals::logfileinfo, $infoline); - - # lines in ddf files must not be longer than 256 characters - check_ddf_file(\@ddffile, $ddffilename); - - # Writing the makecab system call - - my $oneline = "makecab.exe /V3 /F " . $ddffilename . " 2\>\&1 |" . "\n"; - - push(@cabfilelist, $oneline); - - # collecting all ddf files - push(@installer::globals::allddffiles, $ddffilename); - } - } - elsif (( $installer::globals::one_cab_file ) && ( $installer::globals::updatedatabase )) - { - my $sequenceorder = get_sequenceorder($filesref); - - my $counter = 1; - my $currentcabfile = ""; - - while ( ( exists($sequenceorder->{$counter}) ) || ( exists($installer::globals::allmergemodulefilesequences{$counter}) ) ) # Taking care of files from merge modules - { - if ( exists($installer::globals::allmergemodulefilesequences{$counter}) ) - { - # Skipping this sequence, it is not included in $filesref, because it is assigned to a file from a merge module.\n"; - $counter++; - next; - } - - my $onefile = ${$filesref}[$sequenceorder->{$counter}]; - - $cabinetfile = $onefile->{'cabinet'}; - my $sourcepath = $onefile->{'sourcepath'}; - if ( $^O =~ /cygwin/i ) { $sourcepath = $onefile->{'cyg_sourcepath'}; } - my $uniquename = $onefile->{'uniquename'}; - - # to avoid lines with more than 256 characters, it can be useful to use relative pathes - if ( $allvariables->{'RELATIVE_PATHES_IN_DDF'} ) { $sourcepath = make_relative_ddf_path($sourcepath); } - - if ( $counter == 1 ) { write_ddf_file_header(\@ddffile, $cabinetfile, $installdir); } - - my $styles = ""; - my $doinclude = 1; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }; - if ( $styles =~ /\bDONT_PACK\b/ ) { $doinclude = 0; } - - my $ddfline = "\"" . $sourcepath . "\"" . " " . $uniquename . "\n"; - if ( $doinclude ) { push(@ddffile, $ddfline); } - - $counter++; # increasing the counter - } - - # creating the DDF file - - my $ddffilename = $cabinetfile; - $ddffilename =~ s/.cab/.ddf/; - $ddfdir =~ s/[\/\\]\s*$//; - $ddffilename = $ddfdir . $installer::globals::separator . $ddffilename; - - installer::files::save_file($ddffilename ,\@ddffile); - my $infoline = "Created ddf file: $ddffilename\n"; - push(@installer::globals::logfileinfo, $infoline); - - # lines in ddf files must not be longer than 256 characters - check_ddf_file(\@ddffile, $ddffilename); - - # Writing the makecab system call - - # my $oneline = "makecab.exe /F " . $ddffilename . "\n"; - my $oneline = "makecab.exe /V3 /F " . $ddffilename . " 2\>\&1 |" . "\n"; - - push(@cabfilelist, $oneline); - - # collecting all ddf files - push(@installer::globals::allddffiles, $ddffilename); - } - elsif ( $installer::globals::one_cab_file ) - { - my @ddffile = (); - - my $cabinetfile = ""; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - $cabinetfile = $onefile->{'cabinet'}; - my $sourcepath = $onefile->{'sourcepath'}; - if ( $^O =~ /cygwin/i ) { $sourcepath = $onefile->{'cyg_sourcepath'}; } - my $uniquename = $onefile->{'uniquename'}; - - # to avoid lines with more than 256 characters, it can be useful to use relative pathes - if ( $allvariables->{'RELATIVE_PATHES_IN_DDF'} ) { $sourcepath = make_relative_ddf_path($sourcepath); } - - if ( $i == 0 ) { write_ddf_file_header(\@ddffile, $cabinetfile, $installdir); } - - my $styles = ""; - my $doinclude = 1; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }; - if ( $styles =~ /\bDONT_PACK\b/ ) { $doinclude = 0; } - - my $ddfline = "\"" . $sourcepath . "\"" . " " . $uniquename . "\n"; - if ( $doinclude ) { push(@ddffile, $ddfline); } - } - - # creating the DDF file - - my $ddffilename = $cabinetfile; - $ddffilename =~ s/.cab/.ddf/; - $ddfdir =~ s/[\/\\]\s*$//; - $ddffilename = $ddfdir . $installer::globals::separator . $ddffilename; - - installer::files::save_file($ddffilename ,\@ddffile); - my $infoline = "Created ddf file: $ddffilename\n"; - push(@installer::globals::logfileinfo, $infoline); - - # lines in ddf files must not be longer than 256 characters - check_ddf_file(\@ddffile, $ddffilename); - - # Writing the makecab system call - - my $oneline = "makecab.exe /F " . $ddffilename . "\n"; - - push(@cabfilelist, $oneline); - - # collecting all ddf files - push(@installer::globals::allddffiles, $ddffilename); - } - else - { - installer::exiter::exit_program("ERROR: No cab file specification in globals.pm !", "create_media_table"); - } - - installer::logger::include_timestamp_into_logfile("Performance Info: ddf file generation end"); - - return \@cabfilelist; # contains all system calls for packaging process -} - -######################################################################## -# Returning the file sequence of a specified file. -######################################################################## - -sub get_file_sequence -{ - my ($filesref, $uniquefilename) = @_; - - my $sequence = ""; - my $found_sequence = 0; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - my $uniquename = $onefile->{'uniquename'}; - - if ( $uniquename eq $uniquefilename ) - { - $sequence = $onefile->{'sequencenumber'}; - $found_sequence = 1; - last; - } - } - - if ( ! $found_sequence ) { installer::exiter::exit_program("ERROR: No sequence found for $uniquefilename !", "get_file_sequence"); } - - return $sequence; -} - -######################################################################## -# For update and patch reasons the pack order needs to be saved. -# The pack order is saved in the ddf files; the names and locations -# of the ddf files are saved in @installer::globals::allddffiles. -# The outputfile "packorder.txt" can be saved in -# $installer::globals::infodirectory . -######################################################################## - -sub save_packorder -{ - installer::logger::include_header_into_logfile("Saving pack order"); - - installer::logger::include_timestamp_into_logfile("Performance Info: saving pack order start"); - - my $packorderfilename = "packorder.txt"; - $packorderfilename = $installer::globals::infodirectory . $installer::globals::separator . $packorderfilename; - - my @packorder = (); - - my $headerline = "\# Syntax\: Filetable_Sequence Cabinetfilename Physical_FileName Unique_FileName\n\n"; - push(@packorder, $headerline); - - for ( my $i = 0; $i <= $#installer::globals::allddffiles; $i++ ) - { - my $ddffilename = $installer::globals::allddffiles[$i]; - my $ddffile = installer::files::read_file($ddffilename); - my $cabinetfile = ""; - - for ( my $j = 0; $j <= $#{$ddffile}; $j++ ) - { - my $oneline = ${$ddffile}[$j]; - - # Getting the Cabinet file name - - if ( $oneline =~ /^\s*\.Set\s+CabinetName.*\=(.*?)\s*$/ ) { $cabinetfile = $1; } - if ( $oneline =~ /^\s*\.Set\s+/ ) { next; } - - if ( $oneline =~ /^\s*\"(.*?)\"\s+(.*?)\s*$/ ) - { - my $sourcefile = $1; - my $uniquefilename = $2; - - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$sourcefile); - - # Using the hash created in create_files_table for performance reasons to get the sequence number - my $filesequence = ""; - if ( exists($installer::globals::uniquefilenamesequence{$uniquefilename}) ) { $filesequence = $installer::globals::uniquefilenamesequence{$uniquefilename}; } - else { installer::exiter::exit_program("ERROR: No sequence number value for $uniquefilename !", "save_packorder"); } - - my $line = $filesequence . "\t" . $cabinetfile . "\t" . $sourcefile . "\t" . $uniquefilename . "\n"; - push(@packorder, $line); - } - } - } - - installer::files::save_file($packorderfilename ,\@packorder); - - installer::logger::include_timestamp_into_logfile("Performance Info: saving pack order end"); -} - -################################################################# -# Returning the name of the msi database -################################################################# - -sub get_msidatabasename -{ - my ($allvariableshashref, $language) = @_; - - my $databasename = $allvariableshashref->{'PRODUCTNAME'} . $allvariableshashref->{'PRODUCTVERSION'}; - $databasename = lc($databasename); - $databasename =~ s/\.//g; - $databasename =~ s/\-//g; - $databasename =~ s/\s//g; - - # possibility to overwrite the name with variable DATABASENAME - if ( $allvariableshashref->{'DATABASENAME'} ) - { - $databasename = $allvariableshashref->{'DATABASENAME'}; - } - - if ( $language ) - { - if (!($language eq "")) - { - $databasename .= "_$language"; - } - } - - $databasename .= ".msi"; - - return $databasename; -} - -################################################################# -# Creating the msi database -# This works only on Windows -################################################################# - -sub create_msi_database -{ - my ($idtdirbase ,$msifilename) = @_; - - # -f : path containing the idt files - # -d : msi database, including path - # -c : create database - # -i : include the following tables ("*" includes all available tables) - - my $msidb = "msidb.exe"; # Has to be in the path - my $extraslash = ""; # Has to be set for non-ActiveState perl - - installer::logger::include_header_into_logfile("Creating msi database"); - - $idtdirbase = installer::converter::make_path_conform($idtdirbase); - - $msifilename = installer::converter::make_path_conform($msifilename); - - if ( $^O =~ /cygwin/i ) { - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - $idtdirbase =~ s/\//\\\\/g; - $msifilename =~ s/\//\\\\/g; - $extraslash = "\\"; - } - my $systemcall = $msidb . " -f " . $idtdirbase . " -d " . $msifilename . " -c " . "-i " . $extraslash . "*"; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $msidb!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed $msidb successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -##################################################################### -# Returning the value from sis.mlf for Summary Information Stream -##################################################################### - -sub get_value_from_sis_lng -{ - my ($language, $languagefile, $searchstring) = @_; - - my $language_block = installer::windows::idtglobal::get_language_block_from_language_file($searchstring, $languagefile); - my $newstring = installer::windows::idtglobal::get_language_string_from_language_block($language_block, $language, $searchstring); - $newstring = "\"" . $newstring . "\""; - - return $newstring; -} - -################################################################# -# Returning the msi version for the Summary Information Stream -################################################################# - -sub get_msiversion_for_sis -{ - my $msiversion = "200"; - return $msiversion; -} - -################################################################# -# Returning the word count for the Summary Information Stream -################################################################# - -sub get_wordcount_for_sis -{ - my $wordcount = "0"; - return $wordcount; -} - -################################################################# -# Returning the codepage for the Summary Information Stream -################################################################# - -sub get_codepage_for_sis -{ - my ( $language ) = @_; - - my $codepage = installer::windows::language::get_windows_encoding($language); - - # Codepage 65001 does not work in Summary Information Stream - if ( $codepage == 65001 ) { $codepage = 0; } - - # my $codepage = "1252"; # determine dynamically in a function - # my $codepage = "65001"; # UTF-8 - return $codepage; -} - -################################################################# -# Returning the template for the Summary Information Stream -################################################################# - -sub get_template_for_sis -{ - my ( $language, $allvariables ) = @_; - - my $windowslanguage = installer::windows::language::get_windows_language($language); - - my $architecture = "Intel"; - - # Adding 256, if this is a 64 bit installation set. - if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) { $architecture = "x64"; } - - my $value = "\"" . $architecture . ";" . $windowslanguage; # adding the Windows language - - $value = $value . "\""; # adding ending '"' - - return $value ; -} - -################################################################# -# Returning the PackageCode for the Summary Information Stream -################################################################# - -sub get_packagecode_for_sis -{ - # always generating a new package code for each package - - my $guidref = get_guid_list(1, 1); # only one GUID shall be generated - - ${$guidref}[0] =~ s/\s*$//; # removing ending spaces - - my $guid = "\{" . ${$guidref}[0] . "\}"; - - my $infoline = "PackageCode: $guid\n"; - push( @installer::globals::logfileinfo, $infoline); - - return $guid; -} - -################################################################# -# Returning the title for the Summary Information Stream -################################################################# - -sub get_title_for_sis -{ - my ( $language, $languagefile, $searchstring ) = @_; - - my $title = get_value_from_sis_lng($language, $languagefile, $searchstring ); - - return $title; -} - -################################################################# -# Returning the author for the Summary Information Stream -################################################################# - -sub get_author_for_sis -{ - my $author = $installer::globals::longmanufacturer; - - $author = "\"" . $author . "\""; - - return $author; -} - -################################################################# -# Returning the subject for the Summary Information Stream -################################################################# - -sub get_subject_for_sis -{ - my ( $allvariableshashref ) = @_; - - my $subject = $allvariableshashref->{'PRODUCTNAME'} . " " . $allvariableshashref->{'PRODUCTVERSION'}; - - $subject = "\"" . $subject . "\""; - - return $subject; -} - -################################################################# -# Returning the comment for the Summary Information Stream -################################################################# - -sub get_comment_for_sis -{ - my ( $language, $languagefile, $searchstring ) = @_; - - my $comment = get_value_from_sis_lng($language, $languagefile, $searchstring ); - - return $comment; -} - -################################################################# -# Returning the keywords for the Summary Information Stream -################################################################# - -sub get_keywords_for_sis -{ - my ( $language, $languagefile, $searchstring ) = @_; - - my $keywords = get_value_from_sis_lng($language, $languagefile, $searchstring ); - - return $keywords; -} - -###################################################################### -# Returning the application name for the Summary Information Stream -###################################################################### - -sub get_appname_for_sis -{ - my ( $language, $languagefile, $searchstring ) = @_; - - my $appname = get_value_from_sis_lng($language, $languagefile, $searchstring ); - - return $appname; -} - -###################################################################### -# Returning the security for the Summary Information Stream -###################################################################### - -sub get_security_for_sis -{ - my $security = "0"; - return $security; -} - -################################################################# -# Writing the Summary information stream into the msi database -# This works only on Windows -################################################################# - -sub write_summary_into_msi_database -{ - my ($msifilename, $language, $languagefile, $allvariableshashref) = @_; - - # -g : requrired msi version - # -c : codepage - # -p : template - - installer::logger::include_header_into_logfile("Writing summary information stream"); - - my $msiinfo = "msiinfo.exe"; # Has to be in the path - - my $sislanguage = "en-US"; # title, comment, keyword and appname alway in english - - my $msiversion = get_msiversion_for_sis(); - my $codepage = get_codepage_for_sis($language); - my $template = get_template_for_sis($language, $allvariableshashref); - my $guid = get_packagecode_for_sis(); - my $title = get_title_for_sis($sislanguage,$languagefile, "OOO_SIS_TITLE"); - my $author = get_author_for_sis(); - my $subject = get_subject_for_sis($allvariableshashref); - my $comment = get_comment_for_sis($sislanguage,$languagefile, "OOO_SIS_COMMENT"); - my $keywords = get_keywords_for_sis($sislanguage,$languagefile, "OOO_SIS_KEYWORDS"); - my $appname = get_appname_for_sis($sislanguage,$languagefile, "OOO_SIS_APPNAME"); - my $security = get_security_for_sis(); - my $wordcount = get_wordcount_for_sis(); - - $msifilename = installer::converter::make_path_conform($msifilename); - - my $systemcall = $msiinfo . " " . $msifilename . " -g " . $msiversion . " -c " . $codepage - . " -p " . $template . " -v " . $guid . " -t " . $title . " -a " . $author - . " -j " . $subject . " -o " . $comment . " -k " . $keywords . " -n " . $appname - . " -u " . $security . " -w " . $wordcount; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $msiinfo!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed $msiinfo successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -######################################################################### -# For more than one language in the installation set: -# Use one database and create Transformations for all other languages -######################################################################### - -sub create_transforms -{ - my ($languagesarray, $defaultlanguage, $installdir, $allvariableshashref) = @_; - - installer::logger::include_header_into_logfile("Creating Transforms"); - - my $msitran = "msitran.exe"; # Has to be in the path - - $installdir = installer::converter::make_path_conform($installdir); - - # Syntax for creating a transformation - # msitran.exe -g <baseDB> <referenceDB> <transformfile> [<errorhandling>} - - my $basedbname = get_msidatabasename($allvariableshashref, $defaultlanguage); - $basedbname = $installdir . $installer::globals::separator . $basedbname; - - my $errorhandling = "f"; # Suppress "change codepage" error - - # Iterating over all files - - foreach ( @{$languagesarray} ) - { - my $onelanguage = $_; - - if ( $onelanguage eq $defaultlanguage ) { next; } - - my $referencedbname = get_msidatabasename($allvariableshashref, $onelanguage); - $referencedbname = $installdir . $installer::globals::separator . $referencedbname; - - my $transformfile = $installdir . $installer::globals::separator . "trans_" . $onelanguage . ".mst"; - - my $systemcall = $msitran . " " . " -g " . $basedbname . " " . $referencedbname . " " . $transformfile . " " . $errorhandling; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - # Problem: msitran.exe in version 4.0 always returns "1", even if no failure occurred. - # Therefore it has to be checked, if this is version 4.0. If yes, if the mst file - # exists and if it is larger than 0 bytes. If this is true, then no error occurred. - # File Version of msitran.exe: 4.0.6000.16384 has checksum: "b66190a70145a57773ec769e16777b29". - # Same for msitran.exe from wntmsci12: "aa25d3445b94ffde8ef0c1efb77a56b8" - - if ($returnvalue) - { - $infoline = "WARNING: Returnvalue of $msitran is not 0. Checking version of $msitran!\n"; - push( @installer::globals::logfileinfo, $infoline); - - open(FILE, "<$installer::globals::msitranpath") or die "ERROR: Can't open $installer::globals::msitranpath for creating file hash"; - binmode(FILE); - my $digest = Digest::MD5->new->addfile(*FILE)->hexdigest; - close(FILE); - - my @problemchecksums = ("b66190a70145a57773ec769e16777b29", "aa25d3445b94ffde8ef0c1efb77a56b8", "748206e54fc93efe6a1aaa9d491f3ad1"); - my $isproblemchecksum = 0; - - foreach my $problemchecksum ( @problemchecksums ) - { - $infoline = "Checksum of problematic MsiTran.exe: $problemchecksum\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "Checksum of used MsiTran.exe: $digest\n"; - push( @installer::globals::logfileinfo, $infoline); - if ( $digest eq $problemchecksum ) { $isproblemchecksum = 1; } - } - - if ( $isproblemchecksum ) - { - # Check existence of mst - if ( -f $transformfile ) - { - $infoline = "File $transformfile exists.\n"; - push( @installer::globals::logfileinfo, $infoline); - my $filesize = ( -s $transformfile ); - $infoline = "Size of $transformfile: $filesize\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( $filesize > 0 ) - { - $infoline = "Info: Returnvalue $returnvalue of $msitran is no problem :-) .\n"; - push( @installer::globals::logfileinfo, $infoline); - $returnvalue = 0; # reset the error - } - else - { - $infoline = "Filesize indicates that an error occurred.\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - else - { - $infoline = "File $transformfile does not exist -> An error occurred.\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - else - { - $infoline = "This is not a problematic version of msitran.exe. Therefore the error is not caused by problematic msitran.exe.\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $msitran!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed $msitran successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - # The reference database can be deleted - - my $result = unlink($referencedbname); - # $result contains the number of deleted files - - if ( $result == 0 ) - { - $infoline = "ERROR: Could not remove file $$referencedbname !\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program($infoline, "create_transforms"); - } - } -} - -######################################################################### -# The default language msi database does not need to contain -# the language in the database name. Therefore the file -# is renamed. Example: "openofficeorg20_01.msi" to "openofficeorg20.msi" -######################################################################### - -sub rename_msi_database_in_installset -{ - my ($defaultlanguage, $installdir, $allvariableshashref) = @_; - - installer::logger::include_header_into_logfile("Renaming msi database"); - - my $olddatabasename = get_msidatabasename($allvariableshashref, $defaultlanguage); - $olddatabasename = $installdir . $installer::globals::separator . $olddatabasename; - - my $newdatabasename = get_msidatabasename($allvariableshashref); - - $installer::globals::shortmsidatabasename = $newdatabasename; - - $newdatabasename = $installdir . $installer::globals::separator . $newdatabasename; - - installer::systemactions::rename_one_file($olddatabasename, $newdatabasename); - - $installer::globals::msidatabasename = $newdatabasename; -} - -######################################################################### -# Adding the language to the name of the msi databasename, -# if this is required (ADDLANGUAGEINDATABASENAME) -######################################################################### - -sub add_language_to_msi_database -{ - my ($defaultlanguage, $installdir, $allvariables) = @_; - - my $languagestring = $defaultlanguage; - if ( $allvariables->{'USELANGUAGECODE'} ) { $languagestring = installer::windows::language::get_windows_language($defaultlanguage); } - my $newdatabasename = $installer::globals::shortmsidatabasename; - $newdatabasename =~ s/\.msi\s*$/_$languagestring\.msi/; - $installer::globals::shortmsidatabasename = $newdatabasename; - $newdatabasename = $installdir . $installer::globals::separator . $newdatabasename; - - my $olddatabasename = $installer::globals::msidatabasename; - - installer::systemactions::rename_one_file($olddatabasename, $newdatabasename); - - $installer::globals::msidatabasename = $newdatabasename; -} - -########################################################################## -# Writing the databasename into the setup.ini. -########################################################################## - -sub put_databasename_into_setupini -{ - my ($setupinifile, $allvariableshashref) = @_; - - my $databasename = get_msidatabasename($allvariableshashref); - my $line = "database=" . $databasename . "\n"; - - push(@{$setupinifile}, $line); -} - -########################################################################## -# Writing the required msi version into setup.ini -########################################################################## - -sub put_msiversion_into_setupini -{ - my ($setupinifile) = @_; - - my $msiversion = "2.0"; - my $line = "msiversion=" . $msiversion . "\n"; - - push(@{$setupinifile}, $line); -} - -########################################################################## -# Writing the productname into setup.ini -########################################################################## - -sub put_productname_into_setupini -{ - my ($setupinifile, $allvariableshashref) = @_; - - my $productname = $allvariableshashref->{'PRODUCTNAME'}; - my $line = "productname=" . $productname . "\n"; - - push(@{$setupinifile}, $line); -} - -########################################################################## -# Writing the productcode into setup.ini -########################################################################## - -sub put_productcode_into_setupini -{ - my ($setupinifile) = @_; - - my $productcode = $installer::globals::productcode; - my $line = "productcode=" . $productcode . "\n"; - - push(@{$setupinifile}, $line); -} - -########################################################################## -# Writing the ProductVersion from Property table into setup.ini -########################################################################## - -sub put_productversion_into_setupini -{ - my ($setupinifile) = @_; - - my $line = "productversion=" . $installer::globals::msiproductversion . "\n"; - push(@{$setupinifile}, $line); -} - -########################################################################## -# Writing the key for Minor Upgrades into setup.ini -########################################################################## - -sub put_upgradekey_into_setupini -{ - my ($setupinifile) = @_; - - if ( $installer::globals::minorupgradekey ne "" ) - { - my $line = "upgradekey=" . $installer::globals::minorupgradekey . "\n"; - push(@{$setupinifile}, $line); - } -} - -########################################################################## -# Writing the number of languages into setup.ini -########################################################################## - -sub put_languagecount_into_setupini -{ - my ($setupinifile, $languagesarray) = @_; - - my $languagecount = $#{$languagesarray} + 1; - my $line = "count=" . $languagecount . "\n"; - - push(@{$setupinifile}, $line); -} - -########################################################################## -# Writing the defaultlanguage into setup.ini -########################################################################## - -sub put_defaultlanguage_into_setupini -{ - my ($setupinifile, $defaultlanguage) = @_; - - my $windowslanguage = installer::windows::language::get_windows_language($defaultlanguage); - my $line = "default=" . $windowslanguage . "\n"; - push(@{$setupinifile}, $line); -} - -########################################################################## -# Writing the information about transformations into setup.ini -########################################################################## - -sub put_transforms_into_setupini -{ - my ($setupinifile, $onelanguage, $counter) = @_; - - my $windowslanguage = installer::windows::language::get_windows_language($onelanguage); - my $transformfilename = "trans_" . $onelanguage . ".mst"; - - my $line = "lang" . $counter . "=" . $windowslanguage . "," . $transformfilename . "\n"; - - push(@{$setupinifile}, $line); -} - -################################################### -# Including Windows line ends in ini files -# Profiles on Windows shall have \r\n line ends -################################################### - -sub include_windows_lineends -{ - my ($onefile) = @_; - - for ( my $i = 0; $i <= $#{$onefile}; $i++ ) - { - ${$onefile}[$i] =~ s/\r?\n$/\r\n/; - } -} - -########################################################################## -# Generation the file setup.ini, that is used by the loader setup.exe. -########################################################################## - -sub create_setup_ini -{ - my ($languagesarray, $defaultlanguage, $installdir, $allvariableshashref) = @_; - - installer::logger::include_header_into_logfile("Creating setup.ini"); - - my $setupinifilename = $installdir . $installer::globals::separator . "setup.ini"; - - my @setupinifile = (); - my $setupinifile = \@setupinifile; - - my $line = "\[setup\]\n"; - push(@setupinifile, $line); - - put_databasename_into_setupini($setupinifile, $allvariableshashref); - put_msiversion_into_setupini($setupinifile); - put_productname_into_setupini($setupinifile, $allvariableshashref); - put_productcode_into_setupini($setupinifile); - put_productversion_into_setupini($setupinifile); - put_upgradekey_into_setupini($setupinifile); - - $line = "\[languages\]\n"; - push(@setupinifile, $line); - - put_languagecount_into_setupini($setupinifile, $languagesarray); - put_defaultlanguage_into_setupini($setupinifile, $defaultlanguage); - - if ( $#{$languagesarray} > 0 ) # writing the transforms information - { - my $counter = 1; - - for ( my $i = 0; $i <= $#{$languagesarray}; $i++ ) - { - if ( ${$languagesarray}[$i] eq $defaultlanguage ) { next; } - - put_transforms_into_setupini($setupinifile, ${$languagesarray}[$i], $counter); - $counter++; - } - } - - if ( $installer::globals::iswin && $installer::globals::plat =~ /cygwin/i) # Windows line ends only for Cygwin - { - include_windows_lineends($setupinifile); - } - - installer::files::save_file($setupinifilename, $setupinifile); - - $infoline = "Generated file $setupinifilename !\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -################################################################# -# Copying the files defined as ScpActions into the -# installation set. -################################################################# - -sub copy_scpactions_into_installset -{ - my ($defaultlanguage, $installdir, $allscpactions) = @_; - - installer::logger::include_header_into_logfile("Copying ScpAction files into installation set"); - - for ( my $i = 0; $i <= $#{$allscpactions}; $i++ ) - { - my $onescpaction = ${$allscpactions}[$i]; - - if ( $onescpaction->{'Name'} eq "loader.exe" ) { next; } # do not copy this ScpAction loader - - # only copying language independent files or files with the correct language (the defaultlanguage) - - my $filelanguage = $onescpaction->{'specificlanguage'}; - - if ( ($filelanguage eq $defaultlanguage) || ($filelanguage eq "") ) - { - my $sourcefile = $onescpaction->{'sourcepath'}; - my $destfile = $installdir . $installer::globals::separator . $onescpaction->{'DestinationName'}; - - installer::systemactions::copy_one_file($sourcefile, $destfile); - } - } -} - -################################################################# -# Copying the files for the Windows installer into the -# installation set (setup.exe). -################################################################# - -sub copy_windows_installer_files_into_installset -{ - my ($installdir, $includepatharrayref, $allvariables) = @_; - - installer::logger::include_header_into_logfile("Copying Windows installer files into installation set"); - - @copyfile = (); - push(@copyfile, "loader2.exe"); - - if ( $allvariables->{'NOLOADERREQUIRED'} ) { @copyfile = (); } - - for ( my $i = 0; $i <= $#copyfile; $i++ ) - { - my $filename = $copyfile[$i]; - my $sourcefileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$filename, $includepatharrayref, 1); - - if ( ! -f $$sourcefileref ) { installer::exiter::exit_program("ERROR: msi file not found: $$sourcefileref !", "copy_windows_installer_files_into_installset"); } - - my $destfile; - if ( $copyfile[$i] eq "loader2.exe" ) { $destfile = "setup.exe"; } # renaming the loader - else { $destfile = $copyfile[$i]; } - - $destfile = $installdir . $installer::globals::separator . $destfile; - - installer::systemactions::copy_one_file($$sourcefileref, $destfile); - } -} - -################################################################# -# Copying MergeModules for the Windows installer into the -# installation set. The list of MergeModules is located -# in %installer::globals::copy_msm_files -################################################################# - -sub copy_merge_modules_into_installset -{ - my ($installdir) = @_; - - installer::logger::include_header_into_logfile("Copying Merge files into installation set"); - - my $cabfile; - foreach $cabfile ( keys %installer::globals::copy_msm_files ) - { - my $sourcefile = $installer::globals::copy_msm_files{$cabfile}; - my $destfile = $installdir . $installer::globals::separator . $cabfile; - - installer::systemactions::copy_one_file($sourcefile, $destfile); - } -} - -################################################################# -# Copying the child projects into the -# installation set -################################################################# - -sub copy_child_projects_into_installset -{ - my ($installdir, $allvariables) = @_; - - my $sourcefile = ""; - my $destdir = ""; - - # adding Java - - if ( $allvariables->{'JAVAPRODUCT'} ) - { - $sourcefile = $installer::globals::javafile->{'sourcepath'}; - $destdir = $installdir . $installer::globals::separator . $installer::globals::javafile->{'Subdir'}; - if ( ! -d $destdir) { installer::systemactions::create_directory($destdir); } - installer::systemactions::copy_one_file($sourcefile, $destdir); - } - - if ( $allvariables->{'UREPRODUCT'} ) - { - $sourcefile = $installer::globals::urefile->{'sourcepath'}; - $destdir = $installdir . $installer::globals::separator . $installer::globals::urefile->{'Subdir'}; - if ( ! -d $destdir) { installer::systemactions::create_directory($destdir); } - installer::systemactions::copy_one_file($sourcefile, $destdir); - } -} - -################################################################# -# Getting a list of GUID using uuidgen.exe. -# This works only on Windows -################################################################# - -sub get_guid_list -{ - my ($number, $log) = @_; - - if ( $log ) { installer::logger::include_header_into_logfile("Generating $number GUID"); } - - my $uuidgen = "uuidgen.exe"; # Has to be in the path - - # "-c" for uppercase output - - my $systemcall = "$uuidgen -n$number |"; - open (UUIDGEN, "$systemcall" ) or die("uuidgen is missing."); - my @uuidlist = <UUIDGEN>; - close (UUIDGEN); - - my $infoline = "Systemcall: $systemcall\n"; - if ( $log ) { push( @installer::globals::logfileinfo, $infoline); } - - my $comparenumber = $#uuidlist + 1; - - if ( $comparenumber == $number ) - { - $infoline = "Success: Executed $uuidgen successfully!\n"; - if ( $log ) { push( @installer::globals::logfileinfo, $infoline); } - } - else - { - $infoline = "ERROR: Could not execute $uuidgen successfully!\n"; - if ( $log ) { push( @installer::globals::logfileinfo, $infoline); } - } - - # uppercase, no longer "-c", because this is only supported in uuidgen.exe v.1.01 - for ( my $i = 0; $i <= $#uuidlist; $i++ ) { $uuidlist[$i] = uc($uuidlist[$i]); } - - return \@uuidlist; -} - -################################################################# -# Calculating a GUID with a string using md5. -################################################################# - -sub calculate_guid -{ - my ( $string ) = @_; - - my $guid = ""; - - my $md5 = Digest::MD5->new; - $md5->add($string); - my $digest = $md5->hexdigest; - $digest = uc($digest); - - my ($first, $second, $third, $fourth, $fifth) = unpack ('A8 A4 A4 A4 A12', $digest); - $guid = "$first-$second-$third-$fourth-$fifth"; - - return $guid; -} - -################################################################# -# Filling the component hash with the values of the -# component file. -################################################################# - -sub fill_component_hash -{ - my ($componentfile) = @_; - - my %components = (); - - for ( my $i = 0; $i <= $#{$componentfile}; $i++ ) - { - my $line = ${$componentfile}[$i]; - - if ( $line =~ /^\s*(.*?)\t(.*?)\s*$/ ) - { - my $key = $1; - my $value = $2; - - $components{$key} = $value; - } - } - - return \%components; -} - -################################################################# -# Creating a new component file, if new guids were generated. -################################################################# - -sub create_new_component_file -{ - my ($componenthash) = @_; - - my @componentfile = (); - - my $key; - - foreach $key (keys %{$componenthash}) - { - my $value = $componenthash->{$key}; - my $input = "$key\t$value\n"; - push(@componentfile ,$input); - } - - return \@componentfile; -} - -################################################################# -# Filling real component GUID into the component table. -# This works only on Windows -################################################################# - -sub set_uuid_into_component_table -{ - my ($idtdirbase, $allvariables) = @_; - - my $componenttablename = $idtdirbase . $installer::globals::separator . "Componen.idt"; - - my $componenttable = installer::files::read_file($componenttablename); - - # For update and patch reasons (small update) the GUID of an existing component must not change! - # The collection of component GUIDs is saved in the directory $installer::globals::idttemplatepath in the file "components.txt" - - my $infoline = ""; - my $counter = 0; - - for ( my $i = 3; $i <= $#{$componenttable}; $i++ ) # ignoring the first three lines - { - my $oneline = ${$componenttable}[$i]; - my $componentname = ""; - if ( $oneline =~ /^\s*(\S+?)\t/ ) { $componentname = $1; } - - my $uuid = ""; - - if ( exists($installer::globals::calculated_component_guids{$componentname})) - { - $uuid = $installer::globals::calculated_component_guids{$componentname}; - } - else - { - # Calculating new GUID with the help of the component name. - my $useooobaseversion = 1; - if ( exists($installer::globals::base_independent_components{$componentname})) { $useooobaseversion = 0; } - my $sourcestring = $componentname; - - if ( $useooobaseversion ) - { - if ( ! exists($allvariables->{'OOOBASEVERSION'}) ) { installer::exiter::exit_program("ERROR: Could not find variable \"OOOBASEVERSION\" (required value for GUID creation)!", "set_uuid_into_component_table"); } - $sourcestring = $sourcestring . "_" . $allvariables->{'OOOBASEVERSION'}; - } - $uuid = calculate_guid($sourcestring); - $counter++; - - # checking, if there is a conflict with an already created guid - if ( exists($installer::globals::allcalculated_guids{$uuid}) ) { installer::exiter::exit_program("ERROR: \"$uuid\" was already created before!", "set_uuid_into_component_table"); } - $installer::globals::allcalculated_guids{$uuid} = 1; - $installer::globals::calculated_component_guids{$componentname} = $uuid; - } - - ${$componenttable}[$i] =~ s/COMPONENTGUID/$uuid/; - } - - installer::files::save_file($componenttablename, $componenttable); -} - -######################################################################### -# Adding final 64 properties into msi database, if required. -# RegLocator : +16 in type column to search in 64 bit registry. -# All conditions: "VersionNT" -> "VersionNT64" (several tables). -# Already done: "+256" in Attributes column of table "Component". -# Still following: Setting "x64" instead of "Intel" in Summary -# Information Stream of msi database in "get_template_for_sis". -######################################################################### - -sub prepare_64bit_database -{ - my ($basedir, $allvariables) = @_; - - my $infoline = ""; - - if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) - { - # 1. Beginning with table "RegLocat.idt". Adding "16" to the type. - - my $reglocatfile = ""; - my $reglocatfilename = $basedir . $installer::globals::separator . "RegLocat.idt"; - - if ( -f $reglocatfilename ) - { - my $saving_required = 0; - $reglocatfile = installer::files::read_file($reglocatfilename); - - for ( my $i = 3; $i <= $#{$reglocatfile}; $i++ ) # ignoring the first three lines - { - my $oneline = ${$reglocatfile}[$i]; - - if ( $oneline =~ /^\s*\#/ ) { next; } # this is a comment line - if ( $oneline =~ /^\s*$/ ) { next; } - - if ( $oneline =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(\d+)\s*$/ ) - { - # Syntax: Signature_ Root Key Name Type - my $sig = $1; - my $root = $2; - my $key = $3; - my $name = $4; - my $type = $5; - - $type = $type + 16; - - my $newline = $sig . "\t" . $root . "\t" . $key . "\t" . $name . "\t" . $type . "\n"; - ${$reglocatfile}[$i] = $newline; - - $saving_required = 1; - } - } - - if ( $saving_required ) - { - # Saving the files - installer::files::save_file($reglocatfilename ,$reglocatfile); - $infoline = "Making idt file 64 bit conform: $reglocatfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } - - # 2. Replacing all occurences of "VersionNT" by "VersionNT64" - - my @versionnt_files = ("Componen.idt", "InstallE.idt", "InstallU.idt", "LaunchCo.idt"); - - foreach my $onefile ( @versionnt_files ) - { - my $fullfilename = $basedir . $installer::globals::separator . $onefile; - - if ( -f $fullfilename ) - { - my $saving_required = 0; - $filecontent = installer::files::read_file($fullfilename); - - for ( my $i = 3; $i <= $#{$filecontent}; $i++ ) # ignoring the first three lines - { - my $oneline = ${$filecontent}[$i]; - - if ( $oneline =~ /\bVersionNT\b/ ) - { - ${$filecontent}[$i] =~ s/\bVersionNT\b/VersionNT64/g; - $saving_required = 1; - } - } - - if ( $saving_required ) - { - # Saving the files - installer::files::save_file($fullfilename ,$filecontent); - $infoline = "Making idt file 64 bit conform: $fullfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } - } - } - -} - -################################################################# -# Include all cab files into the msi database. -# This works only on Windows -################################################################# - -sub include_cabs_into_msi -{ - my ($installdir) = @_; - - installer::logger::include_header_into_logfile("Including cabs into msi database"); - - my $from = cwd(); - my $to = $installdir; - - chdir($to); - - my $infoline = "Changing into directory: $to"; - push( @installer::globals::logfileinfo, $infoline); - - my $msidb = "msidb.exe"; # Has to be in the path - my $extraslash = ""; # Has to be set for non-ActiveState perl - - my $msifilename = $installer::globals::msidatabasename; - - $msifilename = installer::converter::make_path_conform($msifilename); - - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - $msifilename =~ s/\//\\\\/g; - $extraslash = "\\"; - - my $allcabfiles = installer::systemactions::find_file_with_file_extension("cab", $installdir); - - for ( my $i = 0; $i <= $#{$allcabfiles}; $i++ ) - { - my $systemcall = $msidb . " -d " . $msifilename . " -a " . ${$allcabfiles}[$i]; - - my $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - # deleting the cab file - - unlink(${$allcabfiles}[$i]); - - $infoline = "Deleted cab file: ${$allcabfiles}[$i]\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - $infoline = "Changing back into directory: $from"; - push( @installer::globals::logfileinfo, $infoline); - - chdir($from); -} - -################################################################# -# Executing the created batch file to pack all files. -# This works only on Windows -################################################################# - -sub execute_packaging -{ - my ($localpackjobref, $loggingdir, $allvariables) = @_; - - installer::logger::include_header_into_logfile("Packaging process"); - - installer::logger::include_timestamp_into_logfile("Performance Info: Execute packaging start"); - - my $infoline = ""; - my $from = cwd(); - my $to = $loggingdir; - - chdir($to); - $infoline = "chdir: $to \n"; - push( @installer::globals::logfileinfo, $infoline); - - # if the ddf file contains relative pathes, it is necessary to change into the temp directory - if ( $allvariables->{'RELATIVE_PATHES_IN_DDF'} ) - { - $to = $installer::globals::temppath; - chdir($to); - $infoline = "chdir: $to \n"; - push( @installer::globals::logfileinfo, $infoline); - } - - # changing the tmp directory, because makecab.exe generates temporary cab files - my $origtemppath = ""; - if ( $ENV{'TMP'} ) { $origtemppath = $ENV{'TMP'}; } - $ENV{'TMP'} = $installer::globals::temppath; # setting TMP to the new unique directory! - - my $maxmakecabcalls = 3; - my $allmakecabcalls = $#{$localpackjobref} + 1; - - for ( my $i = 0; $i <= $#{$localpackjobref}; $i++ ) - { - my $systemcall = ${$localpackjobref}[$i]; - - my $callscounter = $i + 1; - - installer::logger::print_message( "... makecab.exe ($callscounter/$allmakecabcalls) ... \n" ); - - for ( my $n = 1; $n <= $maxmakecabcalls; $n++ ) - { - my @ddfoutput = (); - - $infoline = "Systemcall: $systemcall"; - push( @installer::globals::logfileinfo, $infoline); - - open (DDF, "$systemcall"); - while (<DDF>) {push(@ddfoutput, $_); } - close (DDF); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - if ($returnvalue) - { - if ( $n < $maxmakecabcalls ) - { - installer::logger::print_message( "makecab_error (Try $n): Trying again \n" ); - $infoline = "makecab_error (Try $n): $systemcall !"; - } - else - { - installer::logger::print_message( "ERROR (Try $n): Abort packing \n" ); - $infoline = "ERROR (Try $n): $systemcall !"; - } - - push( @installer::globals::logfileinfo, $infoline); - - for ( my $m = 0; $m <= $#ddfoutput; $m++ ) - { - if ( $ddfoutput[$m] =~ /(ERROR\:.*?)\s*$/ ) - { - $infoline = $1 . "\n"; - if ( $n < $maxmakecabcalls ) { $infoline =~ s/ERROR\:/makecab_error\:/i; } - installer::logger::print_message( $infoline ); - push( @installer::globals::logfileinfo, $infoline); - } - } - - if ( $n == $maxmakecabcalls ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "execute_packaging"); } - } - else - { - $infoline = "Success (Try $n): $systemcall"; - push( @installer::globals::logfileinfo, $infoline); - last; - } - } - } - - installer::logger::include_timestamp_into_logfile("Performance Info: Execute packaging end"); - - # setting back to the original tmp directory - $ENV{'TMP'} = $origtemppath; - - chdir($from); - $infoline = "chdir: $from \n"; - push( @installer::globals::logfileinfo, $infoline); -} - -############################################################### -# Setting the global variables ProductCode and the UpgradeCode -############################################################### - -sub set_global_code_variables -{ - my ( $languagesref, $languagestringref, $allvariableshashref, $alloldproperties ) = @_; - - # In the msi template directory a files "codes.txt" has to exist, in which the ProductCode - # and the UpgradeCode for the product are defined. - # The name "codes.txt" can be overwritten in Product definition with CODEFILENAME . - # Default $installer::globals::codefilename is defined in parameter.pm. - - if ( $allvariableshashref->{'CODEFILENAME'} ) - { - $installer::globals::codefilename = $installer::globals::idttemplatepath . $installer::globals::separator . $allvariableshashref->{'CODEFILENAME'}; - installer::files::check_file($installer::globals::codefilename); - } - - my $infoline = "Using Codes file: $installer::globals::codefilename \n"; - push( @installer::globals::logfileinfo, $infoline); - - my $codefile = installer::files::read_file($installer::globals::codefilename); - - my $isopensource = 0; - if ( $allvariableshashref->{'OPENSOURCE'} ) { $isopensource = $allvariableshashref->{'OPENSOURCE'}; } - - my $onelanguage = ""; - - if ( $#{$languagesref} > 0 ) # more than one language - { - if (( $installer::globals::added_english ) && ( $#{$languagesref} == 1 )) # only multilingual because of added English - { - $onelanguage = ${$languagesref}[1]; # setting the first language, that is not english - } - else - { - if (( ${$languagesref}[1] =~ /jp/ ) || - ( ${$languagesref}[1] =~ /ko/ ) || - ( ${$languagesref}[1] =~ /zh/ )) - { - $onelanguage = "multiasia"; - } - else - { - $onelanguage = "multiwestern"; - } - } - } - else # only one language - { - $onelanguage = ${$languagesref}[0]; - } - - # ProductCode must not change, if Windows patches shall be applied - if ( $installer::globals::updatedatabase ) - { - $installer::globals::productcode = $alloldproperties->{'ProductCode'}; - } - elsif ( $installer::globals::prepare_winpatch ) - { - # ProductCode has to be specified in each language - my $searchstring = "PRODUCTCODE"; - my $codeblock = installer::windows::idtglobal::get_language_block_from_language_file($searchstring, $codefile); - $installer::globals::productcode = installer::windows::idtglobal::get_code_from_code_block($codeblock, $onelanguage); - } else { - my $guidref = get_guid_list(1, 1); # only one GUID shall be generated - ${$guidref}[0] =~ s/\s*$//; # removing ending spaces - $installer::globals::productcode = "\{" . ${$guidref}[0] . "\}"; - } - - if ( $installer::globals::patch ) # patch upgrade codes are defined in soffice.lst - { - if ( $allvariableshashref->{'PATCHUPGRADECODE'} ) { $installer::globals::upgradecode = $allvariableshashref->{'PATCHUPGRADECODE'}; } - else { installer::exiter::exit_program("ERROR: PATCHUPGRADECODE not defined in list file!", "set_global_code_variables"); } - } - else - { - # UpgradeCode can take english as default, if not defined in specified language - - $searchstring = "UPGRADECODE"; # searching in the codes.txt file - $codeblock = installer::windows::idtglobal::get_language_block_from_language_file($searchstring, $codefile); - $installer::globals::upgradecode = installer::windows::idtglobal::get_language_string_from_language_block($codeblock, $onelanguage, ""); - } - - if ( $installer::globals::upgradecode eq "" ) { installer::exiter::exit_program("ERROR: UpgradeCode not defined in $installer::globals::codefilename !", "set_global_code_variables"); } - - $infoline = "Setting ProductCode to: $installer::globals::productcode \n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "Setting UpgradeCode to: $installer::globals::upgradecode \n"; - push( @installer::globals::logfileinfo, $infoline); - - # Adding both variables into the variables array - - $allvariableshashref->{'PRODUCTCODE'} = $installer::globals::productcode; - $allvariableshashref->{'UPGRADECODE'} = $installer::globals::upgradecode; - - $infoline = "Defined variable PRODUCTCODE: $installer::globals::productcode \n"; - push( @installer::globals::logfileinfo, $infoline); - - $infoline = "Defined variable UPGRADECODE: $installer::globals::upgradecode \n"; - push( @installer::globals::logfileinfo, $infoline); - -} - -############################################################### -# Setting the product version used in property table and -# upgrade table. Saving in global variable $msiproductversion -############################################################### - -sub set_msiproductversion -{ - my ( $allvariables ) = @_; - - my $productversion = $allvariables->{'PRODUCTVERSION'}; - - if (( $productversion =~ /^\s*\d+\s*$/ ) && ( $productversion > 255 )) { $productversion = $productversion%256; } - - if ( $productversion =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ ) - { - $productversion = $1 . "\." . $2 . $3 . "\." . $installer::globals::buildid; - } - elsif ( $productversion =~ /^\s*(\d+)\.(\d+)\s*$/ ) - { - $productversion = $1 . "\." . $2 . "\." . $installer::globals::buildid; - } - else - { - my $productminor = "00"; - if (( $allvariables->{'PACKAGEVERSION'} ) && ( $allvariables->{'PACKAGEVERSION'} ne "" )) - { - if ( $allvariables->{'PACKAGEVERSION'} =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ ) { $productminor = $2; } - } - - $productversion = $productversion . "\." . $productminor . "\." . $installer::globals::buildid; - } - - $installer::globals::msiproductversion = $productversion; - - # Setting $installer::globals::msimajorproductversion, to differ between old version in upgrade table - - if ( $installer::globals::msiproductversion =~ /^\s*(\d+)\./ ) - { - my $major = $1; - $installer::globals::msimajorproductversion = $major . "\.0\.0"; - } -} - -################################################################################# -# Including the msi product version into the bootstrap.ini, Windows only -################################################################################# - -sub put_msiproductversion_into_bootstrapfile -{ - my ($filesref) = @_; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - - if ( $onefile->{'gid'} eq "gid_Profile_Version_Ini" ) - { - my $file = installer::files::read_file($onefile->{'sourcepath'}); - - for ( my $j = 0; $j <= $#{$file}; $j++ ) - { - ${$file}[$j] =~ s/\<msiproductversion\>/$installer::globals::msiproductversion/; - } - - installer::files::save_file($onefile->{'sourcepath'}, $file); - - last; - } - } -} - -#################################################################################### -# Updating the file Property.idt dynamically -# Content: -# Property Value -#################################################################################### - -sub update_reglocat_table -{ - my ($basedir, $allvariables) = @_; - - my $reglocatfilename = $basedir . $installer::globals::separator . "RegLocat.idt"; - - # Only do something, if this file exists - - if ( -f $reglocatfilename ) - { - my $reglocatfile = installer::files::read_file($reglocatfilename); - - my $layername = ""; - if ( $allvariables->{'REGISTRYLAYERNAME'} ) - { - $layername = $allvariables->{'REGISTRYLAYERNAME'}; - } - else - { - for ( my $i = 0; $i <= $#{$reglocatfile}; $i++ ) - { - if ( ${$reglocatfile}[$i] =~ /\bLAYERNAMETEMPLATE\b/ ) - { - installer::exiter::exit_program("ERROR: Variable \"REGISTRYLAYERNAME\" has to be defined", "update_reglocat_table"); - } - } - } - - if ( $layername ne "" ) - { - # Updating the layername in - - for ( my $i = 0; $i <= $#{$reglocatfile}; $i++ ) - { - ${$reglocatfile}[$i] =~ s/\bLAYERNAMETEMPLATE\b/$layername/; - } - - # Saving the file - installer::files::save_file($reglocatfilename ,$reglocatfile); - my $infoline = "Updated idt file: $reglocatfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } -} - - - -#################################################################################### -# Updating the file RemoveRe.idt dynamically (RemoveRegistry.idt) -# The name of the component has to be replaced. -#################################################################################### - -sub update_removere_table -{ - my ($basedir) = @_; - - my $removeregistryfilename = $basedir . $installer::globals::separator . "RemoveRe.idt"; - - # Only do something, if this file exists - - if ( -f $removeregistryfilename ) - { - my $removeregistryfile = installer::files::read_file($removeregistryfilename); - - for ( my $i = 0; $i <= $#{$removeregistryfile}; $i++ ) - { - for ( my $i = 0; $i <= $#{$removeregistryfile}; $i++ ) - { - ${$removeregistryfile}[$i] =~ s/\bREGISTRYROOTCOMPONENT\b/$installer::globals::registryrootcomponent/; - } - } - - # Saving the file - installer::files::save_file($removeregistryfilename ,$removeregistryfile); - my $infoline = "Updated idt file: $removeregistryfilename \n"; - push(@installer::globals::logfileinfo, $infoline); - } -} - -########################################################################## -# Reading saved mappings in Files.idt and Director.idt. -# This is required, if installation sets shall be created, -# that can be used for creation of msp files. -########################################################################## - -sub read_saved_mappings -{ - installer::logger::include_header_into_logfile("Reading saved mappings from older installation sets:"); - - installer::logger::include_timestamp_into_logfile("Performance Info: Reading saved mappings start"); - - if ( $installer::globals::previous_idt_dir ) - { - my @errorlines = (); - my $errorstring = ""; - my $error_occurred = 0; - my $file_error_occurred = 0; - my $dir_error = 0; - - my $idtdir = $installer::globals::previous_idt_dir; - $idtdir =~ s/\Q$installer::globals::separator\E\s*$//; - - # Reading File.idt - - my $idtfile = $idtdir . $installer::globals::separator . "File.idt"; - push( @installer::globals::globallogfileinfo, "\nAnalyzing file: $idtfile\n" ); - if ( ! -f $idtfile ) { push( @installer::globals::globallogfileinfo, "Warning: File $idtfile does not exist!\n" ); } - - my $n = 0; - open (F, "<$idtfile") || installer::exiter::exit_program("ERROR: Cannot open file $idtfile for reading", "read_saved_mappings"); - <F>; <F>; <F>; - while (<F>) - { - m/^([^\t]+)\t([^\t]+)\t((.*)\|)?([^\t]*)/; - print "OUT1: \$1: $1, \$2: $2, \$3: $3, \$4: $4, \$5: $5\n"; - next if ("$1" eq "$5") && (!defined($3)); - my $lc1 = lc($1); - - if ( exists($installer::globals::savedmapping{"$2/$5"})) - { - if ( ! $file_error_occurred ) - { - $errorstring = "\nErrors in $idtfile: \n"; - push(@errorlines, $errorstring); - } - $errorstring = "Duplicate savedmapping{" . "$2/$5}\n"; - push(@errorlines, $errorstring); - $error_occurred = 1; - $file_error_occurred = 1; - } - - if ( exists($installer::globals::savedrevmapping{$lc1})) - { - if ( ! $file_error_occurred ) - { - $errorstring = "\nErrors in $idtfile: \n"; - push(@errorlines, $errorstring); - } - $errorstring = "Duplicate savedrevmapping{" . "$lc1}\n"; - push(@errorlines, $errorstring); - $error_occurred = 1; - $file_error_occurred = 1; - } - - my $shortname = $4 || ''; - - # Don't reuse illegal 8.3 mappings that we used to generate in 2.0.4 - if (index($shortname, '.') > 8 || - (index($shortname, '.') == -1 && length($shortname) > 8)) - { - $shortname = ''; - } - - if (( $shortname ne '' ) && ( index($shortname, '~') > 0 ) && ( exists($installer::globals::savedrev83mapping{$shortname}) )) - { - if ( ! $file_error_occurred ) - { - $errorstring = "\nErrors in $idtfile: \n"; - push(@errorlines, $errorstring); - } - $errorstring = "Duplicate savedrev83mapping{" . "$shortname}\n"; - push(@errorlines, $errorstring); - $error_occurred = 1; - $file_error_occurred = 1; - } - - $installer::globals::savedmapping{"$2/$5"} = "$1;$shortname"; - $installer::globals::savedrevmapping{lc($1)} = "$2/$5"; - $installer::globals::savedrev83mapping{$shortname} = "$2/$5" if $shortname ne ''; - $n++; - } - - close (F); - - push( @installer::globals::globallogfileinfo, "Read $n old file table key or 8.3 name mappings from $idtfile\n" ); - - # Reading Director.idt - - $idtfile = $idtdir . $installer::globals::separator . "Director.idt"; - push( @installer::globals::globallogfileinfo, "\nAnalyzing file $idtfile\n" ); - if ( ! -f $idtfile ) { push( @installer::globals::globallogfileinfo, "Warning: File $idtfile does not exist!\n" ); } - - $n = 0; - open (F, "<$idtfile") || installer::exiter::exit_program("ERROR: Cannot open file $idtfile for reading", "read_saved_mappings"); - <F>; <F>; <F>; - while (<F>) - { - m/^([^\t]+)\t([^\t]+)\t(([^~]+~\d.*)\|)?([^\t]*)/; - next if (!defined($3)); - my $lc1 = lc($1); - - print "OUT2: \$1: $1, \$2: $2, \$3: $3\n"; - - if ( exists($installer::globals::saved83dirmapping{$1}) ) - { - if ( ! $dir_error_occurred ) - { - $errorstring = "\nErrors in $idtfile: \n"; - push(@errorlines, $errorstring); - } - $errorstring = "Duplicate saved83dirmapping{" . "$1}\n"; - push(@errorlines, $errorstring); - $error_occurred = 1; - $dir_error_occurred = 1; - } - - $installer::globals::saved83dirmapping{$1} = $4; - $n++; - } - close (F); - - push( @installer::globals::globallogfileinfo, "Read $n old directory 8.3 name mappings from $idtfile\n" ); - - # Analyzing errors - - if ( $error_occurred ) - { - for ( my $i = 0; $i <= $#errorlines; $i++ ) - { - print "$errorlines[$i]"; - push( @installer::globals::globallogfileinfo, "$errorlines[$i]"); - } - installer::exiter::exit_program("ERROR: Duplicate entries in saved mappings!", "read_saved_mappings"); - } - } else { - installer::exiter::exit_program("ERROR: Windows patch shall be prepared, but environment variable PREVIOUS_IDT_DIR is not set!", "read_saved_mappings"); - } - - installer::logger::include_timestamp_into_logfile("Performance Info: Reading saved mappings end"); -} - -1; - diff --git a/solenv/bin/modules/installer/windows/msp.pm b/solenv/bin/modules/installer/windows/msp.pm deleted file mode 100644 index e394596b5..000000000 --- a/solenv/bin/modules/installer/windows/msp.pm +++ /dev/null @@ -1,1483 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::msp; - -use File::Copy; -use installer::control; -use installer::converter; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::systemactions; -use installer::windows::admin; -use installer::windows::idtglobal; -use installer::windows::update; - -################################################################################# -# Making all required administrative installations -################################################################################# - -sub install_installation_sets -{ - my ($installationdir) = @_; - - # Finding the msi database in the new installation set, that is located in $installationdir - - my $msifiles = installer::systemactions::find_file_with_file_extension("msi", $installationdir); - - if ( $#{$msifiles} < 0 ) { installer::exiter::exit_program("ERROR: Did not find msi database in directory $installationdir", "create_msp_patch"); } - if ( $#{$msifiles} > 0 ) { installer::exiter::exit_program("ERROR: Did find more than one msi database in directory $installationdir", "create_msp_patch"); } - - my $newinstallsetdatabasepath = $installationdir . $installer::globals::separator . ${$msifiles}[0]; - my $oldinstallsetdatabasepath = $installer::globals::updatedatabasepath; - - # Creating temp directory again - installer::systemactions::create_directory_structure($installer::globals::temppath); - - # Creating old installation directory - my $dirname = "admin"; - my $installpath = $installer::globals::temppath . $installer::globals::separator . $dirname; - if ( ! -d $installpath) { installer::systemactions::create_directory($installpath); } - - my $oldinstallpath = $installpath . $installer::globals::separator . "old"; - my $newinstallpath = $installpath . $installer::globals::separator . "new"; - - if ( ! -d $oldinstallpath) { installer::systemactions::create_directory($oldinstallpath); } - if ( ! -d $newinstallpath) { installer::systemactions::create_directory($newinstallpath); } - - my $olddatabase = installer::windows::admin::make_admin_install($oldinstallsetdatabasepath, $oldinstallpath); - my $newdatabase = installer::windows::admin::make_admin_install($newinstallsetdatabasepath, $newinstallpath); - - if ( $^O =~ /cygwin/i ) { - $olddatabase = qx{cygpath -w "$olddatabase"}; - $olddatabase =~ s/\s*$//g; - $newdatabase = qx{cygpath -w "$newdatabase"}; - $newdatabase =~ s/\s*$//g; - } - - return ($olddatabase, $newdatabase); -} - -################################################################################# -# Collecting the destinations of all files with flag PATCH in a hash. -################################################################################# - -sub collect_patch_file_destinations -{ - my ( $filesarray ) = @_; - - my %patchfiledestinations = (); - my %nopatchfiledestinations = (); - my $patchcounter = 0; - my $nopatchcounter = 0; - - for ( my $i = 0; $i <= $#{$filesarray}; $i++ ) - { - my $onefile = ${$filesarray}[$i]; - my $styles = ""; - - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'} }; - - if ( $styles =~ /\bPATCH\b/ ) - { - $patchfiledestinations{$onefile->{'destination'}} = 1; - $patchcounter++; - } - else - { - $nopatchfiledestinations{$onefile->{'destination'}} = 1; - $nopatchcounter++; - } - } - - return (\%patchfiledestinations, \%nopatchfiledestinations, $patchcounter, $nopatchcounter); -} - -################################################################################# -# Returning the first path segment of a path -################################################################################# - -sub get_first_path_segment -{ - my ( $path ) = @_; - - my $firstsegment = ""; - my $remainder = $path; - - if ( $path =~ /^\s*(.*?)[\/\\](.*)\s*$/ ) - { - $firstsegment = $1; - $remainder = $2; - } - - return ($firstsegment, $remainder); -} - -################################################################################# -# Finding the flexible path in the destinations, that are saved in -# the hash $nopatchfiledestinations. -################################################################################# - -sub prepare_path_in_nopatchfilehash -{ - my ($nopatchfiledestinations, $newpath) = @_; - - my $infoline = ""; - my $flexiblepath = ""; - my $found = 0; - my %checked_destinations = (); - - foreach my $onedestination ( keys %{$nopatchfiledestinations} ) - { - $flexiblepath = ""; - $found = 0; - - my $found_first_segement = 1; - my $firstsegement = ""; - my $fixedpath = $onedestination; - my $testfile = $newpath . $installer::globals::separator . $fixedpath; - - while (( ! -f $testfile ) && ( $found_first_segement )) - { - $firstsegement = ""; - ( $firstsegement, $fixedpath ) = get_first_path_segment($fixedpath); - - if ( $firstsegement ne "" ) - { - $found_first_segement = 1; - $flexiblepath = $flexiblepath . $firstsegement . $installer::globals::separator; - } - else - { - $found_first_segement = 0; - } - - $testfile = $newpath . $installer::globals::separator . $fixedpath; - } - - if ( -f $testfile ) { $found = 1; } - - if ( $found ) { last; } - } - - if ( ! $found ) { installer::exiter::exit_program("ERROR: Could not determine flexible destination path for msp patch creation!", "prepare_path_in_nopatchfilehash"); } - - $infoline = "Setting flexible path for msp creation: $flexiblepath\n"; - push( @installer::globals::logfileinfo, $infoline); - - foreach my $onedestination ( keys %{$nopatchfiledestinations} ) - { - $onedestination =~ s/^\s*\Q$flexiblepath\E//; - $checked_destinations{$onedestination} = 1; - } - - return \%checked_destinations; -} - -################################################################################# -# Synchronizing the two installed products in that way, that only -# files with flag PATCH are different. -################################################################################# - -sub synchronize_installation_sets -{ - my ($olddatabase, $newdatabase, $filesarray) = @_; - - my $infoline = "\nSynchronizing installed products because of PATCH flag\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "Old product: $olddatabase\n"; - push( @installer::globals::logfileinfo, $infoline); - $infoline = "New product: $newdatabase\n"; - push( @installer::globals::logfileinfo, $infoline); - - my ( $patchfiledestinations, $nopatchfiledestinations, $patchfilecounter, $nopatchfilecounter ) = collect_patch_file_destinations($filesarray); - - $infoline = "Number of files with PATCH flag: $patchfilecounter\n"; - push( @installer::globals::logfileinfo, $infoline); - - $infoline = "Number of files without PATCH flag: $nopatchfilecounter\n"; - push( @installer::globals::logfileinfo, $infoline); - - foreach my $localfile ( sort keys %{$patchfiledestinations} ) - { - $infoline = "\tPATCH file: $localfile\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - my $oldpath = $olddatabase; - if ( $^O =~ /cygwin/i ) { $oldpath =~ s/\\/\//g; } - installer::pathanalyzer::get_path_from_fullqualifiedname(\$oldpath); - $oldpath =~ s/\\\s*$//; - $oldpath =~ s/\/\s*$//; - - my $newpath = $newdatabase; - if ( $^O =~ /cygwin/i ) { $newpath =~ s/\\/\//g; } - installer::pathanalyzer::get_path_from_fullqualifiedname(\$newpath); - $newpath =~ s/\\\s*$//; - $newpath =~ s/\/\s*$//; - - # The destination path is not correct. destinations in the hash contain - # the flexible installation path, that is not part in the administrative installation - $nopatchfiledestinations = prepare_path_in_nopatchfilehash($nopatchfiledestinations, $newpath); - - foreach my $onedestination ( keys %{$nopatchfiledestinations} ) - { - my $source = $oldpath . $installer::globals::separator . $onedestination; - my $dest = $newpath . $installer::globals::separator . $onedestination; - - if ( -f $source ) - { - if ( -f $dest ) - { - my $copyreturn = copy($source, $dest); - # installer::systemactions::copy_one_file($source, $dest); - # $infoline = "Synchronizing file: $source to $dest\n"; - # push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Not synchronizing. Destination file \"$dest\" does not exist.\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - else - { - $infoline = "Not synchronizing. Source file \"$source\" does not exist.\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } -} - -################################################################################# -# Extracting all tables from a pcp file -################################################################################# - -sub extract_all_tables_from_pcpfile -{ - my ($fullpcpfilepath, $workdir) = @_; - - my $msidb = "msidb.exe"; # Has to be in the path - my $infoline = ""; - my $systemcall = ""; - my $returnvalue = ""; - my $extraslash = ""; # Has to be set for non-ActiveState perl - - my $localfullpcpfile = $fullpcpfilepath; - my $localworkdir = $workdir; - - if ( $^O =~ /cygwin/i ) { - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - $localfullpcpfile =~ s/\//\\\\/g; - $localworkdir =~ s/\//\\\\/g; - $extraslash = "\\"; - } - - # Export of all tables by using "*" - - $systemcall = $msidb . " -d " . $localfullpcpfile . " -f " . $localworkdir . " -e " . $extraslash . "*"; - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Could not exclude tables from pcp file: $fullpcpfilepath !", "extract_all_tables_from_msidatabase"); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -################################################################################# -# Include tables into a pcp file -################################################################################# - -sub include_tables_into_pcpfile -{ - my ($fullpcpfilepath, $workdir, $tables) = @_; - - my $msidb = "msidb.exe"; # Has to be in the path - my $infoline = ""; - my $systemcall = ""; - my $returnvalue = ""; - - # Make all table 8+3 conform - my $alltables = installer::converter::convert_stringlist_into_array(\$tables, " "); - - for ( my $i = 0; $i <= $#{$alltables}; $i++ ) - { - my $tablename = ${$alltables}[$i]; - $tablename =~ s/\s*$//; - my $namelength = length($tablename); - if ( $namelength > 8 ) - { - my $newtablename = substr($tablename, 0, 8); # name, offset, length - my $oldfile = $workdir . $installer::globals::separator . $tablename . ".idt"; - my $newfile = $workdir . $installer::globals::separator . $newtablename . ".idt"; - if ( -f $newfile ) { unlink $newfile; } - installer::systemactions::copy_one_file($oldfile, $newfile); - } - } - - # Import of tables - - my $localworkdir = $workdir; - my $localfullpcpfilepath = $fullpcpfilepath; - - if ( $^O =~ /cygwin/i ) { - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - $localfullpcpfilepath =~ s/\//\\\\/g; - $localworkdir =~ s/\//\\\\/g; - } - - $systemcall = $msidb . " -d " . $localfullpcpfilepath . " -f " . $localworkdir . " -i " . $tables; - - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Could not include tables into pcp file: $fullpcpfilepath !", "include_tables_into_pcpfile"); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -################################################################################# -# Calling msimsp.exe -################################################################################# - -sub execute_msimsp -{ - my ($fullpcpfilename, $mspfilename, $localmspdir) = @_; - - my $msimsp = "msimsp.exe"; # Has to be in the path - my $infoline = ""; - my $systemcall = ""; - my $returnvalue = ""; - my $logfilename = $localmspdir . $installer::globals::separator . "msimsp.log"; - - # Using a specific temp for each msimsp.exe process - # Creating temp directory again (should already have happened) - installer::systemactions::create_directory_structure($installer::globals::temppath); - - # Creating old installation directory - my $dirname = "msimsptemp"; - my $msimsptemppath = $installer::globals::temppath . $installer::globals::separator . $dirname; - if ( ! -d $msimsptemppath) { installer::systemactions::create_directory($msimsptemppath); } - - # r:\msvc9p\PlatformSDK\v6.1\bin\msimsp.exe -s c:\patch\hotfix_qfe1.pcp -p c:\patch\patch_ooo3_m2_m3.msp -l c:\patch\patch_ooo3_m2_m3.log - - if ( -f $logfilename ) { unlink $logfilename; } - - my $localfullpcpfilename = $fullpcpfilename; - my $localmspfilename = $mspfilename; - my $locallogfilename = $logfilename; - my $localmsimsptemppath = $msimsptemppath; - - if ( $^O =~ /cygwin/i ) { - # msimsp.exe really wants backslashes. (And double escaping because system() expands the string.) - $localfullpcpfilename =~ s/\//\\\\/g; - $locallogfilename =~ s/\//\\\\/g; - - $localmspfilename =~ s/\\/\\\\/g; # path already contains backslash - - $localmsimsptemppath = qx{cygpath -w "$localmsimsptemppath"}; - $localmsimsptemppath =~ s/\\/\\\\/g; - $localmsimsptemppath =~ s/\s*$//g; - } - - $systemcall = $msimsp . " -s " . $localfullpcpfilename . " -p " . $localmspfilename . " -l " . $locallogfilename . " -f " . $localmsimsptemppath; - installer::logger::print_message( "... $systemcall ...\n" ); - - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Could not execute $systemcall !", "execute_msimsp"); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return $logfilename; -} - -#################################################################### -# Checking existence and saving all tables, that need to be edited -#################################################################### - -sub check_and_save_tables -{ - my ($tablelist, $workdir) = @_; - - my $tables = installer::converter::convert_stringlist_into_array(\$tablelist, " "); - - for ( my $i = 0; $i <= $#{$tables}; $i++ ) - { - my $filename = ${$tables}[$i]; - $filename =~ s/\s*$//; - my $fullfilename = $workdir . $installer::globals::separator . $filename . ".idt"; - - if ( ! -f $fullfilename ) { installer::exiter::exit_program("ERROR: Required idt file could not be found: \"$fullfilename\"!", "check_and_save_tables"); } - - my $savfilename = $fullfilename . ".sav"; - installer::systemactions::copy_one_file($fullfilename, $savfilename); - } -} - -#################################################################### -# Setting the languages for the service packs -#################################################################### - -sub create_langstring -{ - my ( $languagesarrayref ) = @_; - - my $langstring = ""; - for ( my $i = 0; $i <= $#{$languagesarrayref}; $i++ ) { $langstring = $langstring . "_" . ${$languagesarrayref}[$i]; } - - return $langstring; -} - -#################################################################### -# Setting the name of the msp database -#################################################################### - -sub set_mspfilename -{ - my ($allvariables, $mspdir, $languagesarrayref) = @_; - - my $databasename = $allvariables->{'PRODUCTNAME'}; - $databasename = lc($databasename); - $databasename =~ s/\.//g; - $databasename =~ s/\-//g; - $databasename =~ s/\s//g; - - if ( $allvariables->{'MSPPRODUCTVERSION'} ) { $databasename = $databasename . $allvariables->{'MSPPRODUCTVERSION'}; } - - # possibility to overwrite the name with variable DATABASENAME - # if ( $allvariables->{'DATABASENAME'} ) { $databasename = $allvariables->{'DATABASENAME'}; } - - # Adding patch info to database name - # if ( $installer::globals::buildid ) { $databasename = $databasename . "_" . $installer::globals::buildid; } - - # if ( $allvariables->{'VENDORPATCHVERSION'} ) { $databasename = $databasename . "_" . $allvariables->{'VENDORPATCHVERSION'}; } - - - if (( $allvariables->{'SERVICEPACK'} ) && ( $allvariables->{'SERVICEPACK'} == 1 )) - { - my $windowspatchlevel = 0; - if ( $allvariables->{'MSPPATCHLEVEL'} ) { $windowspatchlevel = $allvariables->{'MSPPATCHLEVEL'}; } - $databasename = $databasename . "_servicepack_" . $windowspatchlevel; - my $languagestring = create_langstring($languagesarrayref); - $databasename = $databasename . $languagestring; - } - else - { - my $hotfixaddon = "hotfix_"; - $hotfixaddon = $hotfixaddon . $installer::globals::buildid; - my $cwsname = ""; - if ( $allvariables->{'OVERWRITE_CWSNAME'} ) { $hotfixaddon = $allvariables->{'OVERWRITE_CWSNAME'}; } - $databasename = $databasename . "_" . $hotfixaddon; - } - - $databasename = $databasename . ".msp"; - - my $fullmspname = $mspdir . $installer::globals::separator . $databasename; - - if ( $^O =~ /cygwin/i ) { $fullmspname =~ s/\//\\/g; } - - return $fullmspname; -} - -#################################################################### -# Editing table Properties -#################################################################### - -sub change_properties_table -{ - my ($localmspdir, $mspfilename) = @_; - - my $infoline = "Changing content of table \"Properties\"\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $filename = $localmspdir . $installer::globals::separator . "Properties.idt"; - if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" !", "change_properties_table"); } - - my $filecontent = installer::files::read_file($filename); - - - my $guidref = installer::windows::msiglobal::get_guid_list(1, 1); - ${$guidref}[0] =~ s/\s*$//; # removing ending spaces - my $patchcode = "\{" . ${$guidref}[0] . "\}"; - - # Setting "PatchOutputPath" - my $found_patchoutputpath = 0; - my $found_patchguid = 0; - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( ${$filecontent}[$i] =~ /^\s*PatchOutputPath\t(.*?)\s*$/ ) - { - my $oldvalue = $1; - ${$filecontent}[$i] =~ s/\Q$oldvalue\E/$mspfilename/; - $found_patchoutputpath = 1; - } - - if ( ${$filecontent}[$i] =~ /^\s*PatchGUID\t(.*?)\s*$/ ) - { - my $oldvalue = $1; - ${$filecontent}[$i] =~ s/\Q$oldvalue\E/$patchcode/; - $found_patchguid = 1; - } - } - - if ( ! $found_patchoutputpath ) - { - my $newline = "PatchOutputPath\t$mspfilename\n"; - push(@{$filecontent}, $newline); - } - - if ( ! $found_patchguid ) - { - my $newline = "PatchGUID\t$patchcode\n"; - push(@{$filecontent}, $newline); - } - - # saving file - installer::files::save_file($filename, $filecontent); -} - -#################################################################### -# Editing table TargetImages -#################################################################### - -sub change_targetimages_table -{ - my ($localmspdir, $olddatabase) = @_; - - my $infoline = "Changing content of table \"TargetImages\"\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $filename = $localmspdir . $installer::globals::separator . "TargetImages.idt"; - if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" !", "change_targetimages_table"); } - - my $filecontent = installer::files::read_file($filename); - my @newcontent = (); - - # Copying the header - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) { if ( $i < 3 ) { push(@newcontent, ${$filecontent}[$i]); } } - - #Adding all targets - my $newline = "T1\t$olddatabase\t\tU1\t1\t0x00000922\t1\n"; - push(@newcontent, $newline); - - # saving file - installer::files::save_file($filename, \@newcontent); -} - -#################################################################### -# Editing table UpgradedImages -#################################################################### - -sub change_upgradedimages_table -{ - my ($localmspdir, $newdatabase) = @_; - - my $infoline = "Changing content of table \"UpgradedImages\"\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $filename = $localmspdir . $installer::globals::separator . "UpgradedImages.idt"; - if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" !", "change_upgradedimages_table"); } - - my $filecontent = installer::files::read_file($filename); - my @newcontent = (); - - # Copying the header - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) { if ( $i < 3 ) { push(@newcontent, ${$filecontent}[$i]); } } - - # Syntax: Upgraded MsiPath PatchMsiPath SymbolPaths Family - - # default values - my $upgraded = "U1"; - my $msipath = $newdatabase; - my $patchmsipath = ""; - my $symbolpaths = ""; - my $family = "22334455"; - - if ( $#{$filecontent} >= 3 ) - { - my $line = ${$filecontent}[3]; - if ( $line =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - $upgraded = $1; - $patchmsipath = $3; - $symbolpaths = $4; - $family = $5; - } - } - - #Adding sequence line, saving PatchFamily - my $newline = "$upgraded\t$msipath\t$patchmsipath\t$symbolpaths\t$family\n"; - push(@newcontent, $newline); - - # saving file - installer::files::save_file($filename, \@newcontent); -} - -#################################################################### -# Editing table ImageFamilies -#################################################################### - -sub change_imagefamilies_table -{ - my ($localmspdir) = @_; - - my $infoline = "Changing content of table \"ImageFamilies\"\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $filename = $localmspdir . $installer::globals::separator . "ImageFamilies.idt"; - if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" !", "change_imagefamilies_table"); } - - my $filecontent = installer::files::read_file($filename); - my @newcontent = (); - - # Copying the header - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) { if ( $i < 3 ) { push(@newcontent, ${$filecontent}[$i]); } } - - # Syntax: Family MediaSrcPropName MediaDiskId FileSequenceStart DiskPrompt VolumeLabel - # "FileSequenceStart has to be set - - # Default values: - - my $family = "22334455"; - my $mediasrcpropname = "MediaSrcPropName"; - my $mediadiskid = "2"; - my $filesequencestart = get_filesequencestart(); - my $diskprompt = ""; - my $volumelabel = ""; - - if ( $#{$filecontent} >= 3 ) - { - my $line = ${$filecontent}[3]; - if ( $line =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - $family = $1; - $mediasrcpropname = $2; - $mediadiskid = $3; - $diskprompt = $5; - $volumelabel = $6; - } - } - - #Adding sequence line - my $newline = "$family\t$mediasrcpropname\t$mediadiskid\t$filesequencestart\t$diskprompt\t$volumelabel\n"; - push(@newcontent, $newline); - - # saving file - installer::files::save_file($filename, \@newcontent); -} - -#################################################################### -# Setting start sequence for patch -#################################################################### - -sub get_filesequencestart -{ - my $sequence = 1000; # default - - if ( $installer::globals::updatelastsequence ) { $sequence = $installer::globals::updatelastsequence + 500; } - - return $sequence; -} - -#################################################################### -# Setting time value into pcp file -# Format mm/dd/yyyy hh:mm -#################################################################### - -sub get_patchtime_value -{ - # Syntax: 8/8/2008 11:55 - my $minute = (localtime())[1]; - my $hour = (localtime())[2]; - my $day = (localtime())[3]; - my $month = (localtime())[4]; - my $year = 1900 + (localtime())[5]; - - $month++; # zero based month - if ( $minute < 10 ) { $minute = "0" . $minute; } - if ( $hour < 10 ) { $hour = "0" . $hour; } - - my $timestring = $month . "/" . $day . "/" . $year . " " . $hour . ":" . $minute; - - return $timestring; -} - -################################################################################# -# Checking, if this is the correct database. -################################################################################# - -sub correct_langs -{ - my ($langs, $languagestringref) = @_; - - my $correct_langs = 0; - - # Comparing $langs with $languagestringref - - my $langlisthash = installer::converter::convert_stringlist_into_hash(\$langs, ","); - my $langstringhash = installer::converter::convert_stringlist_into_hash($languagestringref, "_"); - - my $not_included = 0; - foreach my $onelang ( keys %{$langlisthash} ) - { - if ( ! exists($langstringhash->{$onelang}) ) - { - $not_included = 1; - last; - } - } - - if ( ! $not_included ) - { - foreach my $onelanguage ( keys %{$langstringhash} ) - { - if ( ! exists($langlisthash->{$onelanguage}) ) - { - $not_included = 1; - last; - } - } - - if ( ! $not_included ) { $correct_langs = 1; } - } - - return $correct_langs; -} - -################################################################################# -# Searching for the path to the reference database for this special product. -################################################################################# - -sub get_patchid_from_list -{ - my ($filecontent, $languagestringref, $filename) = @_; - - my $patchid = ""; - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - my $line = ${$filecontent}[$i]; - if ( $line =~ /^\s*$/ ) { next; } # empty line - if ( $line =~ /^\s*\#/ ) { next; } # comment line - - if ( $line =~ /^\s*(.+?)\s*=\s*(.+?)\s*$/ ) - { - my $langs = $1; - my $localpatchid = $2; - - if ( correct_langs($langs, $languagestringref) ) - { - $patchid = $localpatchid; - last; - } - } - else - { - installer::exiter::exit_program("ERROR: Wrong syntax in file: $filename! Line: \"$line\"", "get_patchid_from_list"); - } - } - - return $patchid; -} - -#################################################################### -# Editing table PatchMetadata -#################################################################### - -sub change_patchmetadata_table -{ - my ($localmspdir, $allvariables, $languagestringref) = @_; - - my $infoline = "Changing content of table \"PatchMetadata\"\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $filename = $localmspdir . $installer::globals::separator . "PatchMetadata.idt"; - if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" !", "change_patchmetadata_table"); } - - my $filecontent = installer::files::read_file($filename); - my @newcontent = (); - - # Syntax: Company Property Value - # Interesting properties: "Classification" and "CreationTimeUTC" - - my $classification_set = 0; - my $creationtime_set = 0; - my $targetproductname_set = 0; - my $manufacturer_set = 0; - my $displayname_set = 0; - my $description_set = 0; - my $allowremoval_set = 0; - - my $defaultcompany = ""; - - my $classificationstring = "Classification"; - my $classificationvalue = "Hotfix"; - if (( $allvariables->{'SERVICEPACK'} ) && ( $allvariables->{'SERVICEPACK'} == 1 )) { $classificationvalue = "ServicePack"; } - - my $allowremovalstring = "AllowRemoval"; - my $allowremovalvalue = "1"; - if (( exists($allvariables->{'MSPALLOWREMOVAL'}) ) && ( $allvariables->{'MSPALLOWREMOVAL'} == 0 )) { $allowremovalvalue = 0; } - - my $timestring = "CreationTimeUTC"; - # Syntax: 8/8/2008 11:55 - my $timevalue = get_patchtime_value(); - - my $targetproductnamestring = "TargetProductName"; - my $targetproductnamevalue = $allvariables->{'PRODUCTNAME'}; - if ( $allvariables->{'PROPERTYTABLEPRODUCTNAME'} ) { $targetproductnamevalue = $allvariables->{'PROPERTYTABLEPRODUCTNAME'}; } - - my $manufacturerstring = "ManufacturerName"; - my $manufacturervalue = "LibreOffice"; - if ( $installer::globals::longmanufacturer ) { $manufacturervalue = $installer::globals::longmanufacturer; } - - my $displaynamestring = "DisplayName"; - my $descriptionstring = "Description"; - my $displaynamevalue = ""; - my $descriptionvalue = ""; - - my $base = $allvariables->{'PRODUCTNAME'} . " " . $allvariables->{'PRODUCTVERSION'}; - if ( $installer::globals::languagepack || $installer::globals::helppack ) { $base = $targetproductnamevalue; } - - my $windowspatchlevel = 0; - if ( $allvariables->{'WINDOWSPATCHLEVEL'} ) { $windowspatchlevel = $allvariables->{'WINDOWSPATCHLEVEL'}; } - - my $displayaddon = ""; - if ( $allvariables->{'PATCHDISPLAYADDON'} ) { $displayaddon = $allvariables->{'PATCHDISPLAYADDON'}; } - - my $patchsequence = get_patchsequence($allvariables); - - if (( $allvariables->{'SERVICEPACK'} ) && ( $allvariables->{'SERVICEPACK'} == 1 )) - { - $displaynamevalue = $base . " ServicePack " . $windowspatchlevel . " " . $patchsequence . " Build: " . $installer::globals::buildid; - $descriptionvalue = $base . " ServicePack " . $windowspatchlevel . " " . $patchsequence . " Build: " . $installer::globals::buildid; - } - else - { - $displaynamevalue = $base . " Hotfix " . $displayaddon . " " . $patchsequence . " Build: " . $installer::globals::buildid; - $descriptionvalue = $base . " Hotfix " . $displayaddon . " " . $patchsequence . " Build: " . $installer::globals::buildid; - $displaynamevalue =~ s/ / /g; - $descriptionvalue =~ s/ / /g; - $displaynamevalue =~ s/ / /g; - $descriptionvalue =~ s/ / /g; - $displaynamevalue =~ s/ / /g; - $descriptionvalue =~ s/ / /g; - } - - if ( $allvariables->{'MSPPATCHNAMELIST'} ) - { - my $patchnamelistfile = $allvariables->{'MSPPATCHNAMELIST'}; - $patchnamelistfile = $installer::globals::idttemplatepath . $installer::globals::separator . $patchnamelistfile; - if ( ! -f $patchnamelistfile ) { installer::exiter::exit_program("ERROR: Could not find file \"$patchnamelistfile\".", "change_patchmetadata_table"); } - my $filecontent = installer::files::read_file($patchnamelistfile); - - # Get name and path of reference database - my $patchid = get_patchid_from_list($filecontent, $languagestringref, $patchnamelistfile); - - if ( $patchid eq "" ) { installer::exiter::exit_program("ERROR: Could not find file patchid in file \"$patchnamelistfile\" for language(s) \"$$languagestringref\".", "change_patchmetadata_table"); } - - # Setting language specific patch id - } - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - my $company = $1; - my $property = $2; - my $value = $3; - - if ( $property eq $classificationstring ) - { - ${$filecontent}[$i] = "$company\t$property\t$classificationvalue\n"; - $classification_set = 1; - } - - if ( $property eq $allowremovalstring ) - { - ${$filecontent}[$i] = "$company\t$property\t$allowremovalvalue\n"; - $allowremoval_set = 1; - } - - if ( $property eq $timestring ) - { - ${$filecontent}[$i] = "$company\t$property\t$timevalue\n"; - $creationtime_set = 1; - } - - if ( $property eq $targetproductnamestring ) - { - ${$filecontent}[$i] = "$company\t$property\t$targetproductnamevalue\n"; - $targetproductname_set = 1; - } - - if ( $property eq $manufacturerstring ) - { - ${$filecontent}[$i] = "$company\t$property\t$manufacturervalue\n"; - $manufacturer_set = 1; - } - - if ( $property eq $displaynamestring ) - { - ${$filecontent}[$i] = "$company\t$property\t$displaynamevalue\n"; - $displayname_set = 1; - } - - if ( $property eq $descriptionstring ) - { - ${$filecontent}[$i] = "$company\t$property\t$descriptionvalue\n"; - $description_set = 1; - } - } - - push(@newcontent, ${$filecontent}[$i]); - } - - if ( ! $classification_set ) - { - my $line = "$defaultcompany\t$classificationstring\t$classificationvalue\n"; - push(@newcontent, $line); - } - - if ( ! $allowremoval_set ) - { - my $line = "$defaultcompany\t$classificationstring\t$allowremovalvalue\n"; - push(@newcontent, $line); - } - - if ( ! $allowremoval_set ) - { - my $line = "$defaultcompany\t$classificationstring\t$allowremovalvalue\n"; - push(@newcontent, $line); - } - - if ( ! $creationtime_set ) - { - my $line = "$defaultcompany\t$timestring\t$timevalue\n"; - push(@newcontent, $line); - } - - if ( ! $targetproductname_set ) - { - my $line = "$defaultcompany\t$targetproductnamestring\t$targetproductnamevalue\n"; - push(@newcontent, $line); - } - - if ( ! $manufacturer_set ) - { - my $line = "$defaultcompany\t$manufacturerstring\t$manufacturervalue\n"; - push(@newcontent, $line); - } - - if ( ! $displayname_set ) - { - my $line = "$defaultcompany\t$displaynamestring\t$displaynamevalue\n"; - push(@newcontent, $line); - } - - if ( ! $description_set ) - { - my $line = "$defaultcompany\t$descriptionstring\t$descriptionvalue\n"; - push(@newcontent, $line); - } - - # saving file - installer::files::save_file($filename, \@newcontent); -} - -#################################################################### -# Editing table PatchSequence -#################################################################### - -sub change_patchsequence_table -{ - my ($localmspdir, $allvariables) = @_; - - my $infoline = "Changing content of table \"PatchSequence\"\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $filename = $localmspdir . $installer::globals::separator . "PatchSequence.idt"; - if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" !", "change_patchsequence_table"); } - - my $filecontent = installer::files::read_file($filename); - my @newcontent = (); - - # Copying the header - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) { if ( $i < 3 ) { push(@newcontent, ${$filecontent}[$i]); } } - - # Syntax: PatchFamily Target Sequence Supersede - - my $patchfamily = "SO"; - my $target = ""; - my $patchsequence = get_patchsequence($allvariables); - my $supersede = get_supersede($allvariables); - - if ( $#{$filecontent} >= 3 ) - { - my $line = ${$filecontent}[3]; - if ( $line =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\s$/ ) - { - $patchfamily = $1; - $target = $2; - } - } - - #Adding sequence line, saving PatchFamily - my $newline = "$patchfamily\t$target\t$patchsequence\t$supersede\n"; - push(@newcontent, $newline); - - # saving file - installer::files::save_file($filename, \@newcontent); -} - -#################################################################### -# Setting supersede, "0" for Hotfixes, "1" for ServicePack -#################################################################### - -sub get_supersede -{ - my ( $allvariables ) = @_; - - my $supersede = 0; # if not defined, this is a Hotfix - - if (( $allvariables->{'SERVICEPACK'} ) && ( $allvariables->{'SERVICEPACK'} == 1 )) { $supersede = 1; } - - return $supersede; -} - -#################################################################### -# Setting the sequence of the patch -#################################################################### - -sub get_patchsequence -{ - my ( $allvariables ) = @_; - - my $patchsequence = "1.0"; - - if ( ! $allvariables->{'PACKAGEVERSION'} ) { installer::exiter::exit_program("ERROR: PACKAGEVERSION must be set for msp patch creation!", "get_patchsequence"); } - - my $packageversion = $allvariables->{'PACKAGEVERSION'}; - - if ( $packageversion =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ ) - { - my $major = $1; - my $minor = $2; - my $micro = $3; - my $concat = 100 * $minor + $micro; - $packageversion = $major . "\." . $concat; - } - my $vendornumber = 0; - if ( $allvariables->{'VENDORPATCHVERSION'} ) { $vendornumber = $allvariables->{'VENDORPATCHVERSION'}; } - $patchsequence = $packageversion . "\." . $installer::globals::buildid . "\." . $vendornumber; - - if ( $allvariables->{'PATCHSEQUENCE'} ) { $patchsequence = $allvariables->{'PATCHSEQUENCE'}; } - - return $patchsequence; -} - -#################################################################### -# Editing all tables from pcp file, that need to be edited -#################################################################### - -sub edit_tables -{ - my ($tablelist, $localmspdir, $olddatabase, $newdatabase, $mspfilename, $allvariables, $languagestringref) = @_; - - # table list contains: my $tablelist = "Properties TargetImages UpgradedImages ImageFamilies PatchMetadata PatchSequence"; - - change_properties_table($localmspdir, $mspfilename); - change_targetimages_table($localmspdir, $olddatabase); - change_upgradedimages_table($localmspdir, $newdatabase); - change_imagefamilies_table($localmspdir); - change_patchmetadata_table($localmspdir, $allvariables, $languagestringref); - change_patchsequence_table($localmspdir, $allvariables); -} - -################################################################################# -# Checking, if this is the correct database. -################################################################################# - -sub correct_patch -{ - my ($product, $pro, $langs, $languagestringref) = @_; - - my $correct_patch = 0; - - # Comparing $product with $installer::globals::product and - # $pro with $installer::globals::pro and - # $langs with $languagestringref - - my $product_is_good = 0; - - my $localproduct = $installer::globals::product; - if ( $installer::globals::languagepack ) { $localproduct = $localproduct . "LanguagePack"; } - elsif ( $installer::globals::helppack ) { $localproduct = $localproduct . "HelpPack"; } - - if ( $product eq $localproduct ) { $product_is_good = 1; } - - if ( $product_is_good ) - { - my $pro_is_good = 0; - - if ((( $pro eq "pro" ) && ( $installer::globals::pro )) || (( $pro eq "nonpro" ) && ( ! $installer::globals::pro ))) { $pro_is_good = 1; } - - if ( $pro_is_good ) - { - my $langlisthash = installer::converter::convert_stringlist_into_hash(\$langs, ","); - my $langstringhash = installer::converter::convert_stringlist_into_hash($languagestringref, "_"); - - my $not_included = 0; - foreach my $onelang ( keys %{$langlisthash} ) - { - if ( ! exists($langstringhash->{$onelang}) ) - { - $not_included = 1; - last; - } - } - - if ( ! $not_included ) - { - foreach my $onelanguage ( keys %{$langstringhash} ) - { - if ( ! exists($langlisthash->{$onelanguage}) ) - { - $not_included = 1; - last; - } - } - - if ( ! $not_included ) { $correct_patch = 1; } - } - } - } - - return $correct_patch; -} - -################################################################################# -# Searching for the path to the required patch for this special product. -################################################################################# - -sub get_requiredpatchfile_from_list -{ - my ($filecontent, $languagestringref, $filename) = @_; - - my $patchpath = ""; - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - my $line = ${$filecontent}[$i]; - if ( $line =~ /^\s*$/ ) { next; } # empty line - if ( $line =~ /^\s*\#/ ) { next; } # comment line - - if ( $line =~ /^\s*(.+?)\s*\t+\s*(.+?)\s*\t+\s*(.+?)\s*\t+\s*(.+?)\s*$/ ) - { - my $product = $1; - my $pro = $2; - my $langs = $3; - my $path = $4; - - if (( $pro ne "pro" ) && ( $pro ne "nonpro" )) { installer::exiter::exit_program("ERROR: Wrong syntax in file: $filename. Only \"pro\" or \"nonpro\" allowed in column 1! Line: \"$line\"", "get_databasename_from_list"); } - - if ( correct_patch($product, $pro, $langs, $languagestringref) ) - { - $patchpath = $path; - last; - } - } - else - { - installer::exiter::exit_program("ERROR: Wrong syntax in file: $filename! Line: \"$line\"", "get_requiredpatchfile_from_list"); - } - } - - return $patchpath; -} - -################################################################## -# Converting unicode file to ascii -# to be more precise: uft-16 little endian to ascii -################################################################## - -sub convert_unicode_to_ascii -{ - my ( $filename ) = @_; - - my @localfile = (); - - my $savfilename = $filename . "_before.unicode"; - installer::systemactions::copy_one_file($filename, $savfilename); - - open( IN, "<:encoding(UTF16-LE)", $filename ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for reading", "convert_unicode_to_ascii"); - while ( $line = <IN> ) { - push @localfile, $line; - } - close( IN ); - - if ( open( OUT, ">", $filename ) ) - { - print OUT @localfile; - close(OUT); - } -} - -#################################################################### -# Analyzing the log file created by msimsp.exe to find all -# files included into the patch. -#################################################################### - -sub analyze_msimsp_logfile -{ - my ($logfile, $filesarray) = @_; - - # Reading log file after converting from utf-16 (LE) to ascii - convert_unicode_to_ascii($logfile); - my $logfilecontent = installer::files::read_file($logfile); - - # Creating hash from $filesarray: unique file name -> destination of file - my %filehash = (); - my %destinationcollector = (); - - for ( my $i = 0; $i <= $#{$filesarray}; $i++ ) - { - my $onefile = ${$filesarray}[$i]; - - # Only collecting files with "uniquename" and "destination" - if (( exists($onefile->{'uniquename'}) ) && ( exists($onefile->{'uniquename'}) )) - { - my $uniquefilename = $onefile->{'uniquename'}; - my $destpath = $onefile->{'destination'}; - $filehash{$uniquefilename} = $destpath; - } - } - - # Analyzing log file of msimsp.exe, finding all changed files - # and searching all destinations of unique file names. - # Content in log file: "INFO File Key: <file key> is modified" - # Collecting content in @installer::globals::patchfilecollector - - for ( my $i = 0; $i <= $#{$logfilecontent}; $i++ ) - { - if ( ${$logfilecontent}[$i] =~ /Key\:\s*(.*?) is modified\s*$/ ) - { - my $filekey = $1; - if ( exists($filehash{$filekey}) ) { $destinationcollector{$filehash{$filekey}} = 1; } - else { installer::exiter::exit_program("ERROR: Could not find file key \"$filekey\" in file collector.", "analyze_msimsp_logfile"); } - } - } - - foreach my $onedest ( sort keys %destinationcollector ) { push(@installer::globals::patchfilecollector, "$onedest\n"); } - -} - -#################################################################### -# Creating msp patch files for Windows -#################################################################### - -sub create_msp_patch -{ - my ($installationdir, $includepatharrayref, $allvariables, $languagestringref, $languagesarrayref, $filesarray) = @_; - - my $force = 1; # print this message even in 'quiet' mode - installer::logger::print_message( "\n******************************************\n" ); - installer::logger::print_message( "... creating msp installation set ...\n", $force ); - installer::logger::print_message( "******************************************\n" ); - - $installer::globals::creating_windows_installer_patch = 1; - - my @needed_files = ("msimsp.exe"); # only required for patch creation process - installer::control::check_needed_files_in_path(\@needed_files); - - installer::logger::include_header_into_logfile("Creating msp installation sets:"); - - my $firstdir = $installationdir; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$firstdir); - - my $lastdir = $installationdir; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$lastdir); - - if ( $lastdir =~ /\./ ) { $lastdir =~ s/\./_msp_inprogress\./ } - else { $lastdir = $lastdir . "_msp_inprogress"; } - - # Removing existing directory "_native_packed_inprogress" and "_native_packed_witherror" and "_native_packed" - - my $mspdir = $firstdir . $lastdir; - if ( -d $mspdir ) { installer::systemactions::remove_complete_directory($mspdir); } - - my $olddir = $mspdir; - $olddir =~ s/_inprogress/_witherror/; - if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); } - - $olddir = $mspdir; - $olddir =~ s/_inprogress//; - if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); } - - # Creating the new directory for new installation set - installer::systemactions::create_directory($mspdir); - - $installer::globals::saveinstalldir = $mspdir; - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Starting product installation"); - - # Installing both installation sets - installer::logger::print_message( "... installing products ...\n" ); - my ($olddatabase, $newdatabase) = install_installation_sets($installationdir); - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Starting synchronization of installation sets"); - - # Synchronizing installed products, allowing only different files with PATCH flag - installer::logger::print_message( "... synchronizing installation sets ...\n" ); - synchronize_installation_sets($olddatabase, $newdatabase, $filesarray); - - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Starting pcp file creation"); - - # Create pcp file - installer::logger::print_message( "... creating pcp file ...\n" ); - - my $localmspdir = installer::systemactions::create_directories("msp", $languagestringref); - - if ( ! $allvariables->{'PCPFILENAME'} ) { installer::exiter::exit_program("ERROR: Property \"PCPFILENAME\" has to be defined.", "create_msp_patch"); } - my $pcpfilename = $allvariables->{'PCPFILENAME'}; - - if ( $installer::globals::languagepack ) { $pcpfilename =~ s/.pcp\s*$/languagepack.pcp/; } - elsif ( $installer::globals::helppack ) { $pcpfilename =~ s/.pcp\s*$/helppack.pcp/; } - - # Searching the pcp file in the include pathes - my $fullpcpfilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$pcpfilename, $includepatharrayref, 1); - if ( $$fullpcpfilenameref eq "" ) { installer::exiter::exit_program("ERROR: pcp file not found: $pcpfilename !", "create_msp_patch"); } - my $fullpcpfilenamesource = $$fullpcpfilenameref; - - # Copying pcp file - my $fullpcpfilename = $localmspdir . $installer::globals::separator . $pcpfilename; - installer::systemactions::copy_one_file($fullpcpfilenamesource, $fullpcpfilename); - - # a. Extracting tables from msi database: msidb.exe -d <msifile> -f <directory> -e File Media, ... - # b. Changing content of msi database in tables: File, Media, Directory, FeatureComponent - # c. Including tables into msi database: msidb.exe -d <msifile> -f <directory> -i File Media, ... - - # Unpacking tables from pcp file - extract_all_tables_from_pcpfile($fullpcpfilename, $localmspdir); - - # Tables, that need to be edited - my $tablelist = "Properties TargetImages UpgradedImages ImageFamilies PatchMetadata PatchSequence"; # required tables - - # Saving all tables - check_and_save_tables($tablelist, $localmspdir); - - # Setting the name of the new msp file - my $mspfilename = set_mspfilename($allvariables, $mspdir, $languagesarrayref); - - # Editing tables - edit_tables($tablelist, $localmspdir, $olddatabase, $newdatabase, $mspfilename, $allvariables, $languagestringref); - - # Adding edited tables into pcp file - include_tables_into_pcpfile($fullpcpfilename, $localmspdir, $tablelist); - - # Start msimsp.exe - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Starting msimsp.exe"); - my $msimsplogfile = execute_msimsp($fullpcpfilename, $mspfilename, $localmspdir); - - # Copy final installation set next to msp file - installer::logger::include_timestamp_into_logfile("\nPerformance Info: Copying installation set"); - installer::logger::print_message( "... copying installation set ...\n" ); - - my $oldinstallationsetpath = $installer::globals::updatedatabasepath; - - if ( $^O =~ /cygwin/i ) { $oldinstallationsetpath =~ s/\\/\//g; } - - installer::pathanalyzer::get_path_from_fullqualifiedname(\$oldinstallationsetpath); - installer::systemactions::copy_complete_directory($oldinstallationsetpath, $mspdir); - - # Copying additional patches into the installation set, if required - if (( $allvariables->{'ADDITIONALREQUIREDPATCHES'} ) && ( $allvariables->{'ADDITIONALREQUIREDPATCHES'} ne "" ) && ( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack )) - { - my $filename = $allvariables->{'ADDITIONALREQUIREDPATCHES'}; - - my $fullfilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$filename, $includepatharrayref, 1); - if ( $$fullfilenameref eq "" ) { installer::exiter::exit_program("ERROR: Could not find file with required patches, although it is defined: $filename !", "create_msp_patch"); } - my $fullfilename = $$fullfilenameref; - - # Reading list file - my $listfile = installer::files::read_file($fullfilename); - - # Get name and path of reference database - my $requiredpatchfile = get_requiredpatchfile_from_list($listfile, $languagestringref, $fullfilename); - if ( $requiredpatchfile eq "" ) { installer::exiter::exit_program("ERROR: Could not find path to required patch in file $fullfilename for language(s) $$languagestringref!", "create_msp_patch"); } - - # Copying patch file - installer::systemactions::copy_one_file($requiredpatchfile, $mspdir); - # my $infoline = "Copy $requiredpatchfile to $mspdir\n"; - # push( @installer::globals::logfileinfo, $infoline); - } - - # Find all files included into the patch - # Analyzing the msimsp log file $msimsplogfile - analyze_msimsp_logfile($msimsplogfile, $filesarray); - - # Done - installer::logger::include_timestamp_into_logfile("\nPerformance Info: msp creation done"); - - return $mspdir; -} - -1; diff --git a/solenv/bin/modules/installer/windows/patch.pm b/solenv/bin/modules/installer/windows/patch.pm deleted file mode 100644 index 783373dc1..000000000 --- a/solenv/bin/modules/installer/windows/patch.pm +++ /dev/null @@ -1,155 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::patch; - -use installer::exiter; -use installer::files; -use installer::globals; -use installer::windows::idtglobal; - -#################################################################################### -# Creating the file Upgrade.idt dynamically -# Content: -# UpgradeCode VersionMin VersionMax Language Attributes Remove ActionProperty -#################################################################################### - -sub update_patch_tables -{ - my ($basedir, $allvariables) = @_; - - my $reglocatfile = ""; - my $appsearchfile = ""; - - my $reglocatfilename = $basedir . $installer::globals::separator . "RegLocat.idt"; - my $appsearchfilename = $basedir . $installer::globals::separator . "AppSearc.idt"; - my $signaturefilename = $basedir . $installer::globals::separator . "Signatur.idt"; - - if ( -f $reglocatfilename ) - { - $reglocatfile = installer::files::read_file($reglocatfilename); - } - else - { - my @reglocattable = (); - $reglocatfile = \@reglocattable; - installer::windows::idtglobal::write_idt_header($reglocatfile, "reglocat"); - } - - if ( -f $appsearchfilename ) - { - $appsearchfile = installer::files::read_file($appsearchfilename); - } - else - { - my @appsearchtable = (); - $appsearchfile = \@appsearchtable; - installer::windows::idtglobal::write_idt_header($appsearchfile, "appsearch"); - } - - if ( -f $signaturefilename ) - { - $signaturefile = installer::files::read_file($signaturefilename); - } - else - { - my @signaturetable = (); - $signaturefile = \@signaturetable; - installer::windows::idtglobal::write_idt_header($signaturefile, "signatur"); - } - - # Writing content into this tables - - if ( ! $allvariables->{'PATCHCODEFILE'} ) { installer::exiter::exit_program("ERROR: Variable PATCHCODEFILE must be defined for Windows patches!", "update_patch_tables"); } - my $patchcodesfilename = $installer::globals::idttemplatepath . $installer::globals::separator . $allvariables->{'PATCHCODEFILE'}; - my $patchcodefile = installer::files::read_file($patchcodesfilename); - - my $number = 0; - - for ( my $i = 0; $i <= $#{$patchcodefile}; $i++ ) - { - my $oneline = ${$patchcodefile}[$i]; - - if ( $oneline =~ /^\s*\#/ ) { next; } # this is a comment line - if ( $oneline =~ /^\s*$/ ) { next; } - - my $code = ""; - if ( $oneline =~ /^\s*(\S+)\s/ ) { $code = $1; } - - foreach my $name ( sort keys %installer::globals::installlocations ) - { - $number++; - my $signature = "dir" . $number . "user"; - my $rootvalue = "1"; - my $registryname = ""; - my $registryversion = ""; - - if ( $allvariables->{'SEARCHPRODUCTNAME'} ) { $registryname = $allvariables->{'SEARCHPRODUCTNAME'}; } - else { $registryname = $allvariables->{'PRODUCTNAME'}; } - - if ( $allvariables->{'SEARCHPRODUCTVERSION'} ) { $registryversion = $allvariables->{'SEARCHPRODUCTVERSION'}; } - else { $registryversion = $allvariables->{'PRODUCTVERSION'}; } - - my $key = "Software\\" . $allvariables->{'MANUFACTURER'} . "\\" . $registryname . "\\" . $registryversion . "\\" . $code; - - my $type = 2; - my $property = $name; - - $oneline = $signature . "\t" . $rootvalue . "\t" . $key . "\t" . $name . "\t" . $type . "\n"; - push(@{$reglocatfile}, $oneline); - - $oneline = $property . "\t" . $signature . "\n"; - push(@{$appsearchfile}, $oneline); - - $signature = "dir" . $number . "mach"; - $rootvalue = "2"; - - $oneline = $signature . "\t" . $rootvalue . "\t" . $key . "\t" . $name . "\t" . $type . "\n"; - push(@{$reglocatfile}, $oneline); - - $oneline = $property . "\t" . $signature . "\n"; - push(@{$appsearchfile}, $oneline); - } - } - - # Saving the files - - installer::files::save_file($reglocatfilename ,$reglocatfile); - my $infoline = "Updated idt file: $reglocatfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - - installer::files::save_file($appsearchfilename ,$appsearchfile); - $infoline = "Updated idt file: $appsearchfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - - installer::files::save_file($signaturefilename ,$signaturefile); - $infoline = "Updated idt file: $signaturefilename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -1; diff --git a/solenv/bin/modules/installer/windows/property.pm b/solenv/bin/modules/installer/windows/property.pm deleted file mode 100644 index a13bf3e6a..000000000 --- a/solenv/bin/modules/installer/windows/property.pm +++ /dev/null @@ -1,677 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::property; - -use installer::exiter; -use installer::files; -use installer::globals; -use installer::windows::idtglobal; -use installer::windows::language; - -############################################# -# Setting the properties dynamically -# for the table Property.idt -############################################# - -sub get_arpcomments_for_property_table -{ - my ( $allvariables, $languagestringref ) = @_; - - my $name = $allvariables->{'PRODUCTNAME'}; - my $version = $allvariables->{'PRODUCTVERSION'}; - my $comment = $name . " " . $version; - - my $postversionextension = ""; - if ( $allvariables->{'POSTVERSIONEXTENSION'} ) - { - $postversionextension = $allvariables->{'POSTVERSIONEXTENSION'}; - $comment = $comment . " " . $postversionextension; - } - - if ( $installer::globals::languagepack ) { $comment = $comment . " " . "Language Pack"; } - elsif ( $installer::globals::helppack ) { $comment = $comment . " " . "Help Pack"; } - - if ( $installer::globals::patch ) - { - if ( ! $allvariables->{'WINDOWSPATCHLEVEL'} ) { installer::exiter::exit_program("ERROR: No Patch level defined for Windows patch: WINDOWSPATCHLEVEL", "get_arpcomments_for_property_table"); } - my $patchstring = "Product Update" . " " . $allvariables->{'WINDOWSPATCHLEVEL'}; - $comment = $comment . " " . $patchstring; - } - - my $languagestring = $$languagestringref; - $languagestring =~ s/\_/\,/g; - - $comment = $comment . " ($languagestring)"; - - my $localminor = ""; - if ( $installer::globals::updatepack ) { $localminor = $installer::globals::lastminor; } - else { $localminor = $installer::globals::minor; } - - my $buildidstring = "(" . $installer::globals::build . $localminor . "(Build:" . $installer::globals::buildid . "))"; - - $comment = $comment . " " . $buildidstring; - - return $comment; -} - -sub get_installlevel_for_property_table -{ - my $installlevel = "100"; - return $installlevel; -} - -sub get_ischeckforproductupdates_for_property_table -{ - my $ischeckforproductupdates = "1"; - return $ischeckforproductupdates; -} - -sub get_manufacturer_for_property_table -{ - return $installer::globals::manufacturer; -} - -sub get_productlanguage_for_property_table -{ - my ($language) = @_; - my $windowslanguage = installer::windows::language::get_windows_language($language); - return $windowslanguage; -} - -sub get_language_string -{ - my $langstring = ""; - - for ( my $i = 0; $i <= $#installer::globals::languagenames; $i++ ) - { - $langstring = $langstring . $installer::globals::languagenames[$i] . ", "; - } - - $langstring =~ s/\,\s*$//; - $langstring = "(" . $langstring . ")"; - - return $langstring; -} - -sub get_english_language_string -{ - my $langstring = ""; - - # Sorting value not keys, therefore collecting all values - my %helper = (); - foreach my $lang ( keys %installer::globals::all_required_english_languagestrings ) - { - $helper{$installer::globals::all_required_english_languagestrings{$lang}} = 1; - } - - foreach my $lang ( sort keys %helper ) - { - $langstring = $langstring . $lang . ", "; - } - - $langstring =~ s/\,\s*$//; - $langstring = "(" . $langstring . ")"; - - return $langstring; -} - -sub get_productname($$) -{ - my ( $language, $allvariables ) = @_; - - my $name = $allvariables->{'PRODUCTNAME'}; - - return $name; -} - -sub get_productname_for_property_table($$) -{ - my ( $language, $allvariables ) = @_; - - my $name = get_productname ($language, $allvariables); - my $version = $allvariables->{'PRODUCTVERSION'}; - my $productname = $name . " " . $version; - - my $postversionextension = ""; - if ( $allvariables->{'POSTVERSIONEXTENSION'} ) - { - $postversionextension = $allvariables->{'POSTVERSIONEXTENSION'}; - $productname = $productname . " " . $postversionextension; - } - - my $productextension = ""; - if ( $allvariables->{'PRODUCTEXTENSION'} ) - { - $productextension = $allvariables->{'PRODUCTEXTENSION'}; - $productname = $productname . " " . $productextension; - } - - if ( $installer::globals::languagepack ) - { - my $langstring = get_english_language_string(); # Example: (English, German) - $productname = $name . " " . $version . " Language Pack" . " " . $langstring; - } - elsif ( $installer::globals::helppack ) - { - my $langstring = get_english_language_string(); # New: (English, German) - $productname = $name . " " . $version . " Help Pack" . " " . $langstring; - } - - if ( $installer::globals::patch ) - { - if ( ! $allvariables->{'WINDOWSPATCHLEVEL'} ) { installer::exiter::exit_program("ERROR: No Patch level defined for Windows patch: WINDOWSPATCHLEVEL", "get_productname_for_property_table"); } - my $patchstring = "Product Update" . " " . $allvariables->{'WINDOWSPATCHLEVEL'}; - $productname = $productname . " " . $patchstring; - } - - # Saving this name in hash $allvariables for further usage - $allvariables->{'PROPERTYTABLEPRODUCTNAME'} = $productname; - my $infoline = "Defined variable PROPERTYTABLEPRODUCTNAME: $productname\n"; - push(@installer::globals::logfileinfo, $infoline); - - return $productname; -} - -sub get_quickstarterlinkname_for_property_table($$) -{ - my ( $language, $allvariables ) = @_; - - # no usage of POSTVERSIONEXTENSION for Quickstarter link name! - my $name = get_productname ($language, $allvariables); - my $version = $allvariables->{'PRODUCTVERSION'}; - my $quickstartername = $name . " " . $version; - - my $infoline = "Defined Quickstarter Link name: $quickstartername\n"; - push(@installer::globals::logfileinfo, $infoline); - - return $quickstartername; -} - -sub get_productversion_for_property_table -{ - return $installer::globals::msiproductversion; -} - -####################################################### -# Setting all feature names as Properties. This is -# required for the Windows patch process. -####################################################### - -sub set_featurename_properties_for_patch -{ - ($propertyfile) = @_; - - for ( my $i = 0; $i <= $#installer::globals::featurecollector; $i++ ) - { - my $onepropertyline = $installer::globals::featurecollector[$i] . "\t" . "1" . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - -} - -####################################################### -# Setting some important properties -# (for finding the product in deinstallation process) -####################################################### - -sub set_important_properties -{ - my ($propertyfile, $allvariables, $languagestringref) = @_; - - # Setting new variables with the content of %PRODUCTNAME and %PRODUCTVERSION - if ( $allvariables->{'PRODUCTNAME'} ) - { - my $onepropertyline = "DEFINEDPRODUCT" . "\t" . $allvariables->{'PRODUCTNAME'} . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $allvariables->{'PRODUCTVERSION'} ) - { - my $onepropertyline = "DEFINEDVERSION" . "\t" . $allvariables->{'PRODUCTVERSION'} . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if (( $allvariables->{'PRODUCTNAME'} ) && ( $allvariables->{'PRODUCTVERSION'} ) && ( $allvariables->{'MANUFACTURER'} ) && ( $allvariables->{'PRODUCTCODE'} )) - { - my $onepropertyline = "FINDPRODUCT" . "\t" . "Software\\" . $allvariables->{'MANUFACTURER'} . "\\" . $allvariables->{'PRODUCTNAME'} . $allvariables->{'PRODUCTADDON'} . "\\" . $allvariables->{'PRODUCTVERSION'} . "\\" . $allvariables->{'PRODUCTCODE'} . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $allvariables->{'PRODUCTMAJOR'} ) - { - my $onepropertyline = "PRODUCTMAJOR" . "\t" . $allvariables->{'PRODUCTMAJOR'} . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $allvariables->{'PRODUCTMINOR'} ) - { - my $onepropertyline = "PRODUCTMINOR" . "\t" . $allvariables->{'PRODUCTMINOR'} . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $allvariables->{'PRODUCTBUILDID'} ) - { - my $onepropertyline = "PRODUCTBUILDID" . "\t" . $allvariables->{'PRODUCTBUILDID'} . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $allvariables->{'OOOBASEVERSION'} ) - { - my $onepropertyline = "OOOBASEVERSION" . "\t" . $allvariables->{'OOOBASEVERSION'} . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $allvariables->{'URELAYERVERSION'} ) - { - my $onepropertyline = "URELAYERVERSION" . "\t" . $allvariables->{'URELAYERVERSION'} . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $allvariables->{'BRANDPACKAGEVERSION'} ) - { - my $onepropertyline = "BRANDPACKAGEVERSION" . "\t" . $allvariables->{'BRANDPACKAGEVERSION'} . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $allvariables->{'BASISROOTNAME'} ) - { - my $onepropertyline = "BASISROOTNAME" . "\t" . $allvariables->{'BASISROOTNAME'} . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $allvariables->{'EXCLUDE_FROM_REBASE'} ) - { - my $onepropertyline = "EXCLUDE_FROM_REBASE" . "\t" . $allvariables->{'EXCLUDE_FROM_REBASE'} . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $allvariables->{'PREREQUIREDPATCH'} ) - { - my $onepropertyline = "PREREQUIREDPATCH" . "\t" . $allvariables->{'PREREQUIREDPATCH'} . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - my $onepropertyline = "IGNOREPREREQUIREDPATCH" . "\t" . "1" . "\n"; - push(@{$propertyfile}, $onepropertyline); - - $onepropertyline = "DONTOPTIMIZELIBS" . "\t" . "0" . "\n"; - push(@{$propertyfile}, $onepropertyline); - - if ( $installer::globals::sundirexists ) - { - my $onepropertyline = "SUNDIREXISTS" . "\t" . "1" . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $installer::globals::officedirhostname ) - { - my $onepropertyline = "OFFICEDIRHOSTNAME" . "\t" . $installer::globals::officedirhostname . "\n"; - push(@{$propertyfile}, $onepropertyline); - - my $localofficedirhostname = $installer::globals::officedirhostname; - $localofficedirhostname =~ s/\//\\/g; - $onepropertyline = "OFFICEDIRHOSTNAME_" . "\t" . $localofficedirhostname . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $installer::globals::sundirhostname ) - { - my $onepropertyline = "SUNDIRHOSTNAME" . "\t" . $installer::globals::sundirhostname . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $installer::globals::desktoplinkexists ) - { - my $onepropertyline = "DESKTOPLINKEXISTS" . "\t" . "1" . "\n"; - push(@{$propertyfile}, $onepropertyline); - - $onepropertyline = "CREATEDESKTOPLINK" . "\t" . "1" . "\n"; # Setting the default - push(@{$propertyfile}, $onepropertyline); - } - - if ( $installer::globals::patch ) - { - my $onepropertyline = "ISPATCH" . "\t" . "1" . "\n"; - push(@{$propertyfile}, $onepropertyline); - - $onepropertyline = "SETUP_USED" . "\t" . "0" . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - if ( $installer::globals::languagepack ) - { - my $onepropertyline = "ISLANGUAGEPACK" . "\t" . "1" . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - elsif ( $installer::globals::helppack ) - { - my $onepropertyline = "ISHELPPACK" . "\t" . "1" . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - my $languagesline = "PRODUCTALLLANGUAGES" . "\t" . $$languagestringref . "\n"; - push(@{$propertyfile}, $languagesline); - - if (( $allvariables->{'PRODUCTEXTENSION'} ) && ( $allvariables->{'PRODUCTEXTENSION'} eq "Beta" )) - { - # my $registryline = "WRITE_REGISTRY" . "\t" . "0" . "\n"; - # push(@{$propertyfile}, $registryline); - my $betainfoline = "BETAPRODUCT" . "\t" . "1" . "\n"; - push(@{$propertyfile}, $betainfoline); - } - elsif ( $allvariables->{'DEVELOPMENTPRODUCT'} ) - { - my $registryline = "WRITE_REGISTRY" . "\t" . "0" . "\n"; - push(@{$propertyfile}, $registryline); - } - else - { - my $registryline = "WRITE_REGISTRY" . "\t" . "1" . "\n"; # Default: Write complete registry - push(@{$propertyfile}, $registryline); - } - - # Adding also used tree conditions for multilayer products. - # These are saved in %installer::globals::usedtreeconditions - foreach my $treecondition (keys %installer::globals::usedtreeconditions) - { - my $onepropertyline = $treecondition . "\t" . "1" . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - # No more license dialog for selected products - if ( $allvariables->{'HIDELICENSEDIALOG'} ) - { - my $onepropertyline = "HIDEEULA" . "\t" . "1" . "\n"; - - my $already_defined = 0; - - for ( my $i = 0; $i <= $#{$propertyfile}; $i++ ) - { - if ( ${$propertyfile}[$i] =~ /^\s*HIDEEULA\t/ ) - { - ${$propertyfile}[$i] = $onepropertyline; - $already_defined = 1; - last; - } - } - - if ( ! $already_defined ) - { - push(@{$propertyfile}, $onepropertyline); - } - } - - # Setting .NET requirements - if ( $installer::globals::required_dotnet_version ne "" ) - { - my $onepropertyline = "REQUIRED_DOTNET_VERSION" . "\t" . $installer::globals::required_dotnet_version . "\n"; - push(@{$propertyfile}, $onepropertyline); - - $onepropertyline = "DOTNET_SUFFICIENT" . "\t" . "1" . "\n"; # default value for found .NET - push(@{$propertyfile}, $onepropertyline); - } - -} - -####################################################### -# Setting properties needed for ms file type registration -####################################################### - -sub set_ms_file_types_properties -{ - my ($propertyfile) = @_; - - push(@{$propertyfile}, "REGISTER_PPS" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_PPSX" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_PPSM" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_PPAM" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_PPT" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_PPTX" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_PPTM" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_POT" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_POTX" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_POTM" . "\t" . "0" . "\n"); - - push(@{$propertyfile}, "REGISTER_DOC" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_DOCX" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_DOCM" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_DOT" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_DOTX" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_DOTM" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_RTF" . "\t" . "0" . "\n"); - - push(@{$propertyfile}, "REGISTER_XLS" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_XLSX" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_XLSM" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_XLSB" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_XLAM" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_XLT" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_XLTX" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_XLTM" . "\t" . "0" . "\n"); - - push(@{$propertyfile}, "REGISTER_NO_MSO_TYPES" . "\t" . "0" . "\n"); - push(@{$propertyfile}, "REGISTER_ALL_MSO_TYPES" . "\t" . "0" . "\n"); -} - -#################################################################################### -# Updating the file Property.idt dynamically -# Content: -# Property Value -#################################################################################### - -sub update_property_table -{ - my ($basedir, $language, $allvariables, $languagestringref) = @_; - - my $properyfilename = $basedir . $installer::globals::separator . "Property.idt"; - - my $propertyfile = installer::files::read_file($properyfilename); - - # Getting the new values - # Some values (arpcomments, arpcontacts, ...) are inserted from the Property.mlf - - my $arpcomments = get_arpcomments_for_property_table($allvariables, $languagestringref); - my $installlevel = get_installlevel_for_property_table(); - my $ischeckforproductupdates = get_ischeckforproductupdates_for_property_table(); - my $manufacturer = get_manufacturer_for_property_table(); - my $productlanguage = get_productlanguage_for_property_table($language); - my $productname = get_productname_for_property_table($language, $allvariables); - my $productversion = get_productversion_for_property_table(); - my $quickstarterlinkname = get_quickstarterlinkname_for_property_table($language, $allvariables); - - # Updating the values - - for ( my $i = 0; $i <= $#{$propertyfile}; $i++ ) - { - ${$propertyfile}[$i] =~ s/\bARPCOMMENTSTEMPLATE\b/$arpcomments/; - ${$propertyfile}[$i] =~ s/\bINSTALLLEVELTEMPLATE\b/$installlevel/; - ${$propertyfile}[$i] =~ s/\bISCHECKFORPRODUCTUPDATESTEMPLATE\b/$ischeckforproductupdates/; - ${$propertyfile}[$i] =~ s/\bMANUFACTURERTEMPLATE\b/$manufacturer/; - ${$propertyfile}[$i] =~ s/\bPRODUCTLANGUAGETEMPLATE\b/$productlanguage/; - ${$propertyfile}[$i] =~ s/\bPRODUCTNAMETEMPLATE\b/$productname/; - ${$propertyfile}[$i] =~ s/\bPRODUCTVERSIONTEMPLATE\b/$productversion/; - ${$propertyfile}[$i] =~ s/\bQUICKSTARTERLINKNAMETEMPLATE\b/$quickstarterlinkname/; - } - - # Setting variables into propertytable - set_important_properties($propertyfile, $allvariables, $languagestringref); - - # Setting feature names as properties for Windows patch mechanism - if ( $installer::globals::patch ) { set_featurename_properties_for_patch($propertyfile); } - - # Setting variables for register for ms file types - set_ms_file_types_properties($propertyfile); - - # Saving the file - - installer::files::save_file($properyfilename ,$propertyfile); - my $infoline = "Updated idt file: $properyfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -#################################################################################### -# Setting language specific Properties in file Property.idt dynamically -# Adding: -# is1033 = 1 -# isMulti = 1 -#################################################################################### - -sub set_languages_in_property_table -{ - my ($basedir, $languagesarrayref) = @_; - - my $properyfilename = $basedir . $installer::globals::separator . "Property.idt"; - my $propertyfile = installer::files::read_file($properyfilename); - - # Setting the component properties saved in %installer::globals::languageproperties - foreach my $localproperty ( keys %installer::globals::languageproperties ) - { - $onepropertyline = $localproperty . "\t" . $installer::globals::languageproperties{$localproperty} . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - # Setting the info about multilingual installation in property "isMulti" - - my $propertyname = "isMulti"; - my $ismultivalue = 0; - - if ( $installer::globals::ismultilingual ) { $ismultivalue = 1; } - - my $onepropertyline = $propertyname . "\t" . $ismultivalue . "\n"; - push(@{$propertyfile}, $onepropertyline); - - # setting the ARPPRODUCTICON - - if ($installer::globals::sofficeiconadded) # set in shortcut.pm - { - $onepropertyline = "ARPPRODUCTICON" . "\t" . "soffice.ico" . "\n"; - push(@{$propertyfile}, $onepropertyline); - } - - # Saving the file - - installer::files::save_file($properyfilename ,$propertyfile); - my $infoline = "Added language content into idt file: $properyfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -############################################################ -# Setting the ProductCode and the UpgradeCode -# into the Property table. Both have to be stored -# in the global file $installer::globals::codefilename -############################################################ - -sub set_codes_in_property_table -{ - my ($basedir) = @_; - - # Reading the property file - - my $properyfilename = $basedir . $installer::globals::separator . "Property.idt"; - my $propertyfile = installer::files::read_file($properyfilename); - - # Updating the values - - for ( my $i = 0; $i <= $#{$propertyfile}; $i++ ) - { - ${$propertyfile}[$i] =~ s/\bPRODUCTCODETEMPLATE\b/$installer::globals::productcode/; - ${$propertyfile}[$i] =~ s/\bUPGRADECODETEMPLATE\b/$installer::globals::upgradecode/; - } - - # Saving the property file - - installer::files::save_file($properyfilename ,$propertyfile); - my $infoline = "Added language content into idt file: $properyfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -############################################################ -# Setting the variable REGKEYPRODPATH, that is used -# by the language packs. -############################################################ - -sub set_regkeyprodpath_in_property_table -{ - my ($basedir, , $allvariables) = @_; - - # Reading the property file - - my $properyfilename = $basedir . $installer::globals::separator . "Property.idt"; - my $propertyfile = installer::files::read_file($properyfilename); - - my $name = $allvariables->{'PRODUCTNAME'}; - my $version = $allvariables->{'PRODUCTVERSION'}; - - my $onepropertyline = "REGKEYPRODPATH" . "\t" . "Software" . "\\" . $installer::globals::manufacturer . "\\". $name; - - push(@{$propertyfile}, $onepropertyline); - - # Saving the property file - - installer::files::save_file($properyfilename ,$propertyfile); - my $infoline = "Added language content into idt file: $properyfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -############################################################ -# Changing default for MS file type registration -# in Beta products. -############################################################ - -sub update_checkbox_table -{ - my ($basedir, $allvariables) = @_; - - if (( $allvariables->{'PRODUCTEXTENSION'} ) && ( $allvariables->{'PRODUCTEXTENSION'} eq "Beta" )) - { - my $checkboxfilename = $basedir . $installer::globals::separator . "CheckBox.idt"; - - if ( -f $checkboxfilename ) - { - my $checkboxfile = installer::files::read_file($checkboxfilename); - - my $checkboxline = "SELECT_WORD" . "\t" . "0" . "\n"; - push(@{$checkboxfile}, $checkboxline); - $checkboxline = "SELECT_EXCEL" . "\t" . "0" . "\n"; - push(@{$checkboxfile}, $checkboxline); - $checkboxline = "SELECT_POWERPOINT" . "\t" . "0" . "\n"; - push(@{$checkboxfile}, $checkboxline); - - # Saving the property file - installer::files::save_file($checkboxfilename ,$checkboxfile); - my $infoline = "Added ms file type defaults into idt file: $checkboxfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - } -} - -1; diff --git a/solenv/bin/modules/installer/windows/registry.pm b/solenv/bin/modules/installer/windows/registry.pm deleted file mode 100644 index 92a6bcbf1..000000000 --- a/solenv/bin/modules/installer/windows/registry.pm +++ /dev/null @@ -1,470 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::registry; - -use installer::files; -use installer::globals; -use installer::worker; -use installer::windows::idtglobal; - -##################################################### -# Generating the component name from a registryitem -##################################################### - -sub get_registry_component_name -{ - my ($registryref, $allvariables) = @_; - - # In this function exists the rule to create components from registryitems - # Rule: - # The componentname can be directly taken from the ModuleID. - # All registryitems belonging to one module can get the same component. - - my $componentname = ""; - my $isrootmodule = 0; - - if ( $registryref->{'ModuleID'} ) { $componentname = $registryref->{'ModuleID'}; } - - $componentname =~ s/\\/\_/g; - $componentname =~ s/\//\_/g; - $componentname =~ s/\-/\_/g; - $componentname =~ s/\_\s*$//g; - - $componentname = lc($componentname); # componentnames always lowercase - - if ( $componentname eq "gid_module_root" ) { $isrootmodule = 1; } - - # Attention: Maximum length for the componentname is 72 - - # identifying this component as registryitem component - $componentname = "registry_" . $componentname; - - $componentname =~ s/gid_module_/g_m_/g; - $componentname =~ s/_optional_/_o_/g; - $componentname =~ s/_javafilter_/_jf_/g; - - # This componentname must be more specific - my $addon = "_"; - if ( $allvariables->{'PRODUCTNAME'} ) { $addon = $addon . $allvariables->{'PRODUCTNAME'}; } - if ( $allvariables->{'PRODUCTVERSION'} ) { $addon = $addon . $allvariables->{'PRODUCTVERSION'}; } - $addon = lc($addon); - $addon =~ s/ //g; - $addon =~ s/-//g; - $addon =~ s/\.//g; - - my $styles = ""; - if ( $registryref->{'Styles'} ) { $styles = $registryref->{'Styles'}; } - - # Layer links must have unique Component GUID for all products. This is necessary, because only the - # uninstallation of the last product has to delete registry keys. - if ( $styles =~ /\bLAYER_REGISTRY\b/ ) - { - $componentname = "g_m_root_registry_layer_ooo_reglayer"; - # Styles USE_URELAYERVERSION, USE_OOOBASEVERSION - if ( $styles =~ /\bUSE_URELAYERVERSION\b/ ) { $addon = "_ure_" . $allvariables->{'URELAYERVERSION'}; } - if ( $styles =~ /\bUSE_OOOBASEVERSION\b/ ) { $addon = "_basis_" . $allvariables->{'OOOBASEVERSION'}; } - $addon =~ s/\.//g; - } - - $componentname = $componentname . $addon; - - if (( $styles =~ /\bLANGUAGEPACK\b/ ) && ( $installer::globals::languagepack )) { $componentname = $componentname . "_lang"; } - elsif (( $styles =~ /\bHELPPACK\b/ ) && ( $installer::globals::helppack )) { $componentname = $componentname . "_help"; } - if ( $styles =~ /\bALWAYS_REQUIRED\b/ ) { $componentname = $componentname . "_forced"; } - - # Attention: Maximum length for the componentname is 72 - # %installer::globals::allregistrycomponents_in_this_database_ : resetted for each database - # %installer::globals::allregistrycomponents_ : not resetted for each database - # Component strings must be unique for the complete product, because they are used for - # the creation of the globally unique identifier. - - my $fullname = $componentname; # This can be longer than 72 - - if (( exists($installer::globals::allregistrycomponents_{$fullname}) ) && ( ! exists($installer::globals::allregistrycomponents_in_this_database_{$fullname}) )) - { - # This is not allowed: One component cannot be installed with different packages. - installer::exiter::exit_program("ERROR: Windows registry component \"$fullname\" is already included into another package. This is not allowed.", "get_registry_component_name"); - } - - if ( exists($installer::globals::allregistrycomponents_{$fullname}) ) - { - $componentname = $installer::globals::allregistrycomponents_{$fullname}; - } - else - { - if ( length($componentname) > 60 ) - { - $componentname = generate_new_short_registrycomponentname($componentname); # This has to be unique for the complete product, not only one package - } - - $installer::globals::allregistrycomponents_{$fullname} = $componentname; - $installer::globals::allregistrycomponents_in_this_database_{$fullname} = 1; - } - - if ( $isrootmodule ) { $installer::globals::registryrootcomponent = $componentname; } - - return $componentname; -} - -######################################################### -# Create a shorter version of a long component name, -# because maximum length in msi database is 72. -# Attention: In multi msi installation sets, the short -# names have to be unique over all packages, because -# this string is used to create the globally unique id -# -> no resetting of -# %installer::globals::allshortregistrycomponents -# after a package was created. -######################################################### - -sub generate_new_short_registrycomponentname -{ - my ($componentname) = @_; - - my $shortcomponentname = ""; - my $counter = 1; - - my $startversion = substr($componentname, 0, 60); # taking only the first 60 characters - $startversion = $startversion . "_"; - - $shortcomponentname = $startversion . $counter; - - while ( exists($installer::globals::allshortregistrycomponents{$shortcomponentname}) ) - { - $counter++; - $shortcomponentname = $startversion . $counter; - } - - $installer::globals::allshortregistrycomponents{$shortcomponentname} = 1; - - return $shortcomponentname; -} - -############################################################## -# Returning identifier for registry table. -############################################################## - -sub get_registry_identifier -{ - my ($registry) = @_; - - my $identifier = ""; - - if ( $registry->{'gid'} ) { $identifier = $registry->{'gid'}; } - - $identifier = lc($identifier); # always lower case - - # Attention: Maximum length is 72 - - $identifier =~ s/gid_regitem_/g_r_/; - $identifier =~ s/_soffice_/_s_/; - $identifier =~ s/_clsid_/_c_/; - $identifier =~ s/_currentversion_/_cv_/; - $identifier =~ s/_microsoft_/_ms_/; - $identifier =~ s/_manufacturer_/_mf_/; - $identifier =~ s/_productname_/_pn_/; - $identifier =~ s/_productversion_/_pv_/; - $identifier =~ s/_staroffice_/_so_/; - $identifier =~ s/_software_/_sw_/; - $identifier =~ s/_capabilities_/_cap_/; - $identifier =~ s/_classpath_/_cp_/; - $identifier =~ s/_extension_/_ex_/; - $identifier =~ s/_fileassociations_/_fa_/; - $identifier =~ s/_propertysheethandlers_/_psh_/; - $identifier =~ s/__/_/g; - - # Saving this in the registry collector - - $registry->{'uniquename'} = $identifier; - - return $identifier; -} - -################################################################## -# Returning root value for registry table. -################################################################## - -sub get_registry_root -{ - my ($registry) = @_; - - my $rootvalue = 0; # Default: Parent is KKEY_CLASSES_ROOT - my $scproot = ""; - - if ( $registry->{'ParentID'} ) { $scproot = $registry->{'ParentID'}; } - - if ( $scproot eq "PREDEFINED_HKEY_LOCAL_MACHINE" ) { $rootvalue = -1; } - - if ( $scproot eq "PREDEFINED_HKEY_CLASSES_ROOT" ) { $rootvalue = 0; } - - if ( $scproot eq "PREDEFINED_HKEY_CURRENT_USER_ONLY" ) { $rootvalue = 1; } - - if ( $scproot eq "PREDEFINED_HKEY_LOCAL_MACHINE_ONLY" ) { $rootvalue = 2; } - - return $rootvalue; -} - -############################################################## -# Returning key for registry table. -############################################################## - -sub get_registry_key -{ - my ($registry, $allvariableshashref) = @_; - - my $key = ""; - - if ( $registry->{'Subkey'} ) { $key = $registry->{'Subkey'}; } - - if ( $key =~ /\%/ ) { $key = installer::worker::replace_variables_in_string($key, $allvariableshashref); } - - return $key; -} - -############################################################## -# Returning name for registry table. -############################################################## - -sub get_registry_name -{ - my ($registry, $allvariableshashref) = @_; - - my $name = ""; - - if ( $registry->{'Name'} ) { $name = $registry->{'Name'}; } - - if ( $name =~ /\%/ ) { $name = installer::worker::replace_variables_in_string($name, $allvariableshashref); } - - return $name; -} - -############################################################## -# Returning value for registry table. -############################################################## - -sub get_registry_value -{ - my ($registry, $allvariableshashref) = @_; - - my $value = ""; - - if ( $registry->{'Value'} ) { $value = $registry->{'Value'}; } - - $value =~ s/\\\"/\"/g; # no more masquerading of '"' - $value =~ s/\\\\\s*$/\\/g; # making "\\" at end of value to "\" - $value =~ s/\<progpath\>/\[INSTALLLOCATION\]/; - $value =~ s/\[INSTALLLOCATION\]\\/\[INSTALLLOCATION\]/; # removing "\" after "[INSTALLLOCATION]" - - if ( $value =~ /\%/ ) { $value = installer::worker::replace_variables_in_string($value, $allvariableshashref); } - - return $value; -} - -############################################################## -# Returning 64 bit value for registry table. -############################################################## - -sub get_registry_val64 -{ - my ($registry, $allvariableshashref) = @_; - - my $value = ""; - - if ( $registry->{'Val64'} ) { $value = $registry->{'Val64'}; } - - $value =~ s/\\\"/\"/g; # no more masquerading of '"' - $value =~ s/\\\\\s*$/\\/g; # making "\\" at end of value to "\" - $value =~ s/\<progpath\>/\[INSTALLLOCATION\]/; - $value =~ s/\[INSTALLLOCATION\]\\/\[INSTALLLOCATION\]/; # removing "\" after "[INSTALLLOCATION]" - - if ( $value =~ /\%/ ) { $value = installer::worker::replace_variables_in_string($value, $allvariableshashref); } - - return $value; -} - -############################################################## -# Returning component for registry table. -############################################################## - -sub get_registry_component -{ - my ($registry, $allvariables) = @_; - - # All registry items belonging to one module can - # be included into one component - - my $componentname = get_registry_component_name($registry, $allvariables); - - # saving componentname in the registryitem collector - - $registry->{'componentname'} = $componentname; - - return $componentname; -} - -###################################################### -# Adding the content of -# @installer::globals::userregistrycollector -# to the registry table. The content was collected -# in create_files_table() in file.pm. -###################################################### - -sub add_userregs_to_registry_table -{ - my ( $registrytable, $allvariables ) = @_; - - for ( my $i = 0; $i <= $#installer::globals::userregistrycollector; $i++ ) - { - my $onefile = $installer::globals::userregistrycollector[$i]; - - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - - my %registry = (); - - $registry{'Registry'} = $onefile->{'userregkeypath'}; - $registry{'Root'} = "1"; # always HKCU - $registry{'Key'} = "Software\\$allvariables->{'MANUFACTURER'}\\$allvariables->{'PRODUCTNAME'} $allvariables->{'PRODUCTVERSION'}\\"; - if ( $onefile->{'needs_user_registry_key'} ) { $registry{'Key'} = $registry{'Key'} . "StartMenu"; } - else { $registry{'Key'} = $registry{'Key'} . "ShellNew"; } - $registry{'Name'} = $onefile->{'Name'}; - $registry{'Value'} = "1"; - $registry{'Component_'} = $onefile->{'componentname'}; - - my $oneline = $registry{'Registry'} . "\t" . $registry{'Root'} . "\t" . $registry{'Key'} . "\t" - . $registry{'Name'} . "\t" . $registry{'Value'} . "\t" . $registry{'Component_'} . "\n"; - - push(@{$registrytable}, $oneline); - } -} - -###################################################### -# Creating the file Registry.idt dynamically -# Content: -# Registry Root Key Name Value Component_ -###################################################### - -sub create_registry_table -{ - my ($registryref, $allregistrycomponentsref, $basedir, $languagesarrayref, $allvariableshashref) = @_; - - for ( my $m = 0; $m <= $#{$languagesarrayref}; $m++ ) - { - my $onelanguage = ${$languagesarrayref}[$m]; - - my @registrytable = (); - my @reg64table = (); - - installer::windows::idtglobal::write_idt_header(\@registrytable, "registry"); - installer::windows::idtglobal::write_idt_header(\@reg64table, "reg64"); - - for ( my $i = 0; $i <= $#{$registryref}; $i++ ) - { - my $oneregistry = ${$registryref}[$i]; - - # Controlling the language! - # Only language independent folderitems or folderitems with the correct language - # will be included into the table - - if (! (!(( $oneregistry->{'ismultilingual'} )) || ( $oneregistry->{'specificlanguage'} eq $onelanguage )) ) { next; } - - my %registry = (); - - $registry{'Registry'} = get_registry_identifier($oneregistry); - $registry{'Root'} = get_registry_root($oneregistry); - $registry{'Key'} = get_registry_key($oneregistry, $allvariableshashref); - $registry{'Name'} = get_registry_name($oneregistry, $allvariableshashref); - $registry{'Value'} = get_registry_value($oneregistry, $allvariableshashref); - $registry{'Val64'} = get_registry_val64($oneregistry, $allvariableshashref); - $registry{'Component_'} = get_registry_component($oneregistry, $allvariableshashref); - - # Collecting all components - if (!(installer::existence::exists_in_array($registry{'Component_'}, $allregistrycomponentsref))) - { - push(@{$allregistrycomponentsref}, $registry{'Component_'}); - } - - # Collecting all components with DONT_DELETE style - my $style = ""; - if ( $oneregistry->{'Styles'} ) { $style = $oneregistry->{'Styles'}; } - if ( $style =~ /\bDONT_DELETE\b/ ) { $installer::globals::dontdeletecomponents{$registry{'Component_'}} = 1; } - - # Saving upgradekey to write this into setup.ini for minor upgrades - if ( $style =~ /\bUPGRADEKEY\b/ ) { $installer::globals::minorupgradekey = $registry{'Key'}; } - - # Collecting all registry components with ALWAYS_REQUIRED style - if ( ! ( $style =~ /\bALWAYS_REQUIRED\b/ )) - { - # Setting a component condition for unforced registry components! - # Only write into registry, if WRITE_REGISTRY is set. - if ( $oneregistry->{'ComponentCondition'} ) { $oneregistry->{'ComponentCondition'} = "(" . $oneregistry->{'ComponentCondition'} . ") AND (WRITE_REGISTRY=1)"; } - else { $oneregistry->{'ComponentCondition'} = "WRITE_REGISTRY=1"; } - } - - # Collecting all component conditions - if ( $oneregistry->{'ComponentCondition'} ) - { - if ( ! exists($installer::globals::componentcondition{$registry{'Component_'}})) - { - $installer::globals::componentcondition{$registry{'Component_'}} = $oneregistry->{'ComponentCondition'}; - } - } - - my $oneline = $registry{'Registry'} . "\t" . $registry{'Root'} . "\t" . $registry{'Key'} . "\t" - . $registry{'Name'} . "\t" . $registry{'Value'} . "\t" . $registry{'Component_'} . "\n"; - - my $oneline64 = $registry{'Registry'} . "\t" . $registry{'Root'} . "\t" . $registry{'Key'} . "\t" - . $registry{'Name'} . "\t" . $registry{'Val64'} . "\t" . $registry{'Component_'} . "\n"; - - if ( ! ( $style =~ /\bX64_ONLY\b/ )) { push(@registrytable, $oneline); } # standard registry table for 32 Bit - if (( $style =~ /\bX64\b/ ) || ( $style =~ /\bX64_ONLY\b/ )) { push(@reg64table , $oneline64); } - } - - # If there are added user registry keys for files collected in - # @installer::globals::userregistrycollector (file.pm), then - # this registry keys have to be added now. This is necessary for - # files in PREDEFINED_OSSHELLNEWDIR, because their component - # needs as KeyPath a RegistryItem in HKCU. - - if ( $installer::globals::addeduserregitrykeys ) { add_userregs_to_registry_table(\@registrytable, $allvariableshashref); } - - # Saving the file - - my $registrytablename = $basedir . $installer::globals::separator . "Registry.idt" . "." . $onelanguage; - installer::files::save_file($registrytablename ,\@registrytable); - my $infoline = "Created idt file: $registrytablename\n"; - push(@installer::globals::logfileinfo, $infoline); - - $registrytablename = $basedir . $installer::globals::separator . "Reg64.idt" . "." . $onelanguage; - installer::files::save_file($registrytablename ,\@reg64table ); - $infoline = "Created idt file: $registrytablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } -} - -1; diff --git a/solenv/bin/modules/installer/windows/removefile.pm b/solenv/bin/modules/installer/windows/removefile.pm deleted file mode 100644 index e65ac3979..000000000 --- a/solenv/bin/modules/installer/windows/removefile.pm +++ /dev/null @@ -1,152 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::removefile; - -use installer::files; -use installer::globals; -use installer::windows::idtglobal; - -######################################################################## -# Returning the FileKey for a folderitem for removefile table. -######################################################################## - -sub get_removefile_filekey -{ - my ($folderitem) = @_; - - # returning the unique identifier - - my $identifier = "remove_" . $folderitem->{'directory'}; - - $identifier = lc($identifier); - - return $identifier; -} - -######################################################################## -# Returning the Component for a folderitem for removefile table. -######################################################################## - -sub get_removefile_component -{ - my ($folderitem) = @_; - - return $folderitem->{'component'}; -} - -######################################################################## -# Returning the FileName for a folderitem for removefile table. -######################################################################## - -sub get_removefile_filename -{ - my ($folderitem) = @_; - - # return nothing: The assigned directory will be removed - - return ""; -} - -######################################################################## -# Returning the DirProperty for a folderitem for removefile table. -######################################################################## - -sub get_removefile_dirproperty -{ - my ($folderitem) = @_; - - return $folderitem->{'directory'}; -} - -######################################################################## -# Returning the InstallMode for a folderitem for removefile table. -######################################################################## - -sub get_removefile_installmode -{ - my ($folderitem) = @_; - - # always returning "2": The file is only removed, if the assigned - # component is removed. Name: msidbRemoveFileInstallModeOnRemove - - return 2; -} - -########################################################################################################### -# Creating the file RemoveFi.idt dynamically -# Content: -# FileKey Component_ FileName DirProperty InstallMode -########################################################################################################### - -sub create_removefile_table -{ - my ($folderitemsref, $basedir) = @_; - - my @removefiletable = (); - - installer::windows::idtglobal::write_idt_header(\@removefiletable, "removefile"); - - # Only the directories created for the FolderItems have to be deleted - # with the information in the table RemoveFile - - my @directorycollector = (); - - for ( my $i = 0; $i <= $#{$folderitemsref}; $i++ ) - { - my $onelink = ${$folderitemsref}[$i]; - - if ( $onelink->{'used'} == 0 ) { next; } - - if ( installer::existence::exists_in_array($onelink->{'directory'}, \@directorycollector)) { next; } - - push(@directorycollector, $onelink->{'directory'}); - - my %removefile = (); - - $removefile{'FileKey'} = get_removefile_filekey($onelink); - $removefile{'Component_'} = get_removefile_component($onelink); - $removefile{'FileName'} = get_removefile_filename($onelink); - $removefile{'DirProperty'} = get_removefile_dirproperty($onelink); - $removefile{'InstallMode'} = get_removefile_installmode($onelink); - - my $oneline = $removefile{'FileKey'} . "\t" . $removefile{'Component_'} . "\t" . $removefile{'FileName'} . "\t" - . $removefile{'DirProperty'} . "\t" . $removefile{'InstallMode'} . "\n"; - - push(@removefiletable, $oneline); - } - - # Saving the file - - my $removefiletablename = $basedir . $installer::globals::separator . "RemoveFi.idt"; - installer::files::save_file($removefiletablename ,\@removefiletable); - my $infoline = "Created idt file: $removefiletablename\n"; - push(@installer::globals::logfileinfo, $infoline); - -} - -1;
\ No newline at end of file diff --git a/solenv/bin/modules/installer/windows/selfreg.pm b/solenv/bin/modules/installer/windows/selfreg.pm deleted file mode 100644 index 6d81415d5..000000000 --- a/solenv/bin/modules/installer/windows/selfreg.pm +++ /dev/null @@ -1,88 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::selfreg; - -use installer::exiter; -use installer::files; -use installer::globals; -use installer::worker; -use installer::windows::idtglobal; - -############################################################## -# Returning the cost for the selfreg table. -############################################################## - -sub get_selfreg_cost -{ - my ( $onefile ) = @_; - - return "0"; -} - -#################################################################################### -# Creating the file SelfReg.idt dynamically -# Content: -# File_ Cost -# UpgradeCode VersionMin VersionMax Language Attributes Remove ActionProperty -#################################################################################### - -sub create_selfreg_table -{ - my ($filesref, $basedir) = @_; - - my @selfregtable = (); - - installer::windows::idtglobal::write_idt_header(\@selfregtable, "selfreg"); - - # Registering all libraries with flag "SELFREG" - - my $selfregfiles = installer::worker::collect_all_items_with_special_flag($filesref, "SELFREG"); - - for ( my $i = 0; $i <= $#{$selfregfiles}; $i++ ) - { - my $onefile = ${$selfregfiles}[$i]; - - my %selfreg = (); - - $selfreg{'File_'} = $onefile->{'uniquename'}; - $selfreg{'Cost'} = get_selfreg_cost($onefile); - - my $oneline = $selfreg{'File_'} . "\t" . $selfreg{'Cost'} . "\n"; - - push(@selfregtable, $oneline); - } - - # Saving the file - - my $selfregtablename = $basedir . $installer::globals::separator . "SelfReg.idt"; - installer::files::save_file($selfregtablename ,\@selfregtable); - my $infoline = "Created idt file: $selfregtablename\n"; - push(@installer::globals::logfileinfo, $infoline); -} - -1;
\ No newline at end of file diff --git a/solenv/bin/modules/installer/windows/shortcut.pm b/solenv/bin/modules/installer/windows/shortcut.pm deleted file mode 100644 index 91e630261..000000000 --- a/solenv/bin/modules/installer/windows/shortcut.pm +++ /dev/null @@ -1,696 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::shortcut; - -use installer::existence; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::windows::idtglobal; - -############################################################## -# Returning the file object for the msiassembly table. -############################################################## - -sub get_file_by_name -{ - my ( $filesref, $filename ) = @_; - - my $foundfile = 0; - my $onefile; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - $onefile = ${$filesref}[$i]; - my $name = $onefile->{'Name'}; - - if ( $name eq $filename ) - { - $foundfile = 1; - last; - } - } - - if (! $foundfile ) { $onefile = ""; } - - return $onefile; -} - -############################################################## -# Returning identifier for shortcut table. -############################################################## - -sub get_shortcut_identifier -{ - my ($shortcut) = @_; - - my $identifier = $shortcut->{'gid'}; - - return $identifier; -} - -############################################################## -# Returning directory for shortcut table. -############################################################## - -sub get_shortcut_directory -{ - my ($shortcut, $dirref) = @_; - - # For shortcuts it is easy to convert the gid_Dir_Abc into the unique name in - # the directory table, for instance help_en_simpressidx. - # For files (components) this is not so easy, because files can be included - # in zip files with subdirectories that are not defined in scp. - - my $onedir; - my $shortcutdirectory = $shortcut->{'Dir'}; - my $directory = ""; - my $found = 0; - - for ( my $i = 0; $i <= $#{$dirref}; $i++ ) - { - $onedir = ${$dirref}[$i]; - my $directorygid = $onedir->{'Dir'}; - - if ( $directorygid eq $shortcutdirectory ) - { - $found = 1; - last; - } - } - - if (!($found)) - { - installer::exiter::exit_program("ERROR: Did not find DirectoryID $shortcutdirectory in directory collection for shortcut", "get_shortcut_directory"); - } - - $directory = $onedir->{'uniquename'}; - - if ($directory eq "") { $directory = "INSTALLLOCATION"; } # Shortcuts in the root directory - - return $directory; -} - -############################################################## -# Returning name for shortcut table. -############################################################## - -sub get_shortcut_name -{ - my ($shortcut, $shortnamesref, $onelanguage) = @_; - - my $returnstring; - - my $name = $shortcut->{'Name'}; - - my $shortstring = installer::windows::idtglobal::make_eight_three_conform($name, "shortcut", $shortnamesref); - $shortstring =~ s/\s/\_/g; # replacing white spaces with underline - - if ( $shortstring eq $name ) { $returnstring = $name; } # nothing changed - else {$returnstring = $shortstring . "\|" . $name; } - - return $returnstring; -} - -############################################################## -# Returning component for shortcut table. -############################################################## - -sub get_shortcut_component -{ - my ($shortcut, $filesref) = @_; - - my $onefile; - my $component = ""; - my $found = 0; - my $shortcut_fileid = $shortcut->{'FileID'}; - - my $absolute_filename = 0; - if ( $shortcut->{'Styles'} ) { $styles = $shortcut->{'Styles'}; } - if ( $styles =~ /\bABSOLUTE_FILENAME\b/ ) { $absolute_filename = 1; } # FileID contains an absolute filename - if ( $styles =~ /\bUSE_HELPER_FILENAME\b/ ) { $absolute_filename = 1; } # ComponentIDFile contains id of a helper file - - # if the FileID contains an absolute filename, therefore the entry for "ComponentIDFile" has to be used. - if ( $absolute_filename ) { $shortcut_fileid = $shortcut->{'ComponentIDFile'}; } - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - $onefile = ${$filesref}[$i]; - my $filegid = $onefile->{'gid'}; - - if ( $filegid eq $shortcut_fileid ) - { - $found = 1; - last; - } - } - - if (!($found)) - { - installer::exiter::exit_program("ERROR: Did not find FileID $shortcut_fileid in file collection for shortcut", "get_shortcut_component"); - } - - $component = $onefile->{'componentname'}; - - # finally saving the componentname in the folderitem collector - - $shortcut->{'component'} = $component; - - return $component; -} - -############################################################## -# Returning target for shortcut table. -############################################################## - -sub get_shortcut_target -{ - my ($shortcut, $filesref) = @_; - - my $target = ""; - my $found = 0; - my $shortcut_fileid = $shortcut->{'FileID'}; - my $onefile; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - $onefile = ${$filesref}[$i]; - my $filegid = $onefile->{'gid'}; - - if ( $filegid eq $shortcut_fileid ) - { - $found = 1; - last; - } - } - - if (!($found)) - { - installer::exiter::exit_program("ERROR: Did not find FileID $shortcut_fileid in file collection for shortcut", "get_shortcut_target"); - } - - if ( $onefile->{'Name'} ) - { - $target = $onefile->{'Name'}; - } - - $target = "\[\#" . $target . "\]"; # format for Non-Advertised shortcuts - - return $target; -} - -############################################################## -# Returning arguments for shortcut table. -############################################################## - -sub get_shortcut_arguments -{ - my ($shortcut) = @_; - - return ""; -} - -############################################################## -# Returning the localized description for shortcut table. -############################################################## - -sub get_shortcut_description -{ - my ($shortcut, $onelanguage) = @_; - - my $description = ""; - if ( $shortcut->{'Tooltip'} ) { $description = $shortcut->{'Tooltip'}; } - - return $description; -} - -############################################################## -# Returning hotkey for shortcut table. -############################################################## - -sub get_shortcut_hotkey -{ - my ($shortcut) = @_; - - return ""; -} - -############################################################## -# Returning icon for shortcut table. -############################################################## - -sub get_shortcut_icon -{ - my ($shortcut) = @_; - - return ""; -} - -############################################################## -# Returning iconindex for shortcut table. -############################################################## - -sub get_shortcut_iconindex -{ - my ($shortcut) = @_; - - return ""; -} - -############################################################## -# Returning show command for shortcut table. -############################################################## - -sub get_shortcut_showcmd -{ - my ($shortcut) = @_; - - return ""; -} - -############################################################## -# Returning working directory for shortcut table. -############################################################## - -sub get_shortcut_wkdir -{ - my ($shortcut) = @_; - - return ""; -} - -#################################################################### -# Returning working directory for shortcut table for FolderItems. -#################################################################### - -sub get_folderitem_wkdir -{ - my ($onelink, $dirref) = @_; - - # For shortcuts it is easy to convert the gid_Dir_Abc into the unique name in - # the directory table, for instance help_en_simpressidx. - - my $onedir; - my $workingdirectory = ""; - if ( $onelink->{'WkDir'} ) { $workingdirectory = $onelink->{'WkDir'}; } - my $directory = ""; - - if ( $workingdirectory ) - { - my $found = 0; - - for ( my $i = 0; $i <= $#{$dirref}; $i++ ) - { - $onedir = ${$dirref}[$i]; - my $directorygid = $onedir->{'Dir'}; - - if ( $directorygid eq $workingdirectory ) - { - $found = 1; - last; - } - } - - if (!($found)) - { - installer::exiter::exit_program("ERROR: Did not find DirectoryID $workingdirectory in directory collection for FolderItem", "get_folderitem_wkdir"); - } - - $directory = $onedir->{'uniquename'}; - - if ($directory eq "") { $directory = "INSTALLLOCATION"; } - } - - return $directory; -} - -################################################################### -# Returning the directory for a folderitem for shortcut table. -################################################################### - -sub get_folderitem_directory -{ - my ($shortcut) = @_; - - my $directory = "$installer::globals::officemenufolder"; # default - - # The default is not correct for the - # PREDEFINED folders, like PREDEFINED_AUTOSTART - - if ( $shortcut->{'FolderID'} eq "PREDEFINED_AUTOSTART" ) - { - $directory = $installer::globals::startupfolder; - } - - if ( $shortcut->{'FolderID'} eq "PREDEFINED_DESKTOP" ) - { - $directory = $installer::globals::desktopfolder; - $installer::globals::desktoplinkexists = 1; - } - - if ( $shortcut->{'FolderID'} eq "PREDEFINED_STARTMENU" ) - { - $directory = $installer::globals::startmenufolder; - } - - # saving the directory in the folderitems collector - - $shortcut->{'directory'} = $directory; - - return $directory; -} - -######################################################################## -# Returning the target (feature) for a folderitem for shortcut table. -# For non-advertised shortcuts this is a formatted string. -######################################################################## - -sub get_folderitem_target -{ - my ($shortcut, $filesref) = @_; - - my $onefile; - my $target = ""; - my $found = 0; - my $shortcut_fileid = $shortcut->{'FileID'}; - - my $styles = ""; - my $nonadvertised = 0; - my $absolute_filename = 0; - if ( $shortcut->{'Styles'} ) { $styles = $shortcut->{'Styles'}; } - if ( $styles =~ /\bNON_ADVERTISED\b/ ) { $nonadvertised = 1; } # this is a non-advertised shortcut - if ( $styles =~ /\bABSOLUTE_FILENAME\b/ ) { $absolute_filename = 1; } # FileID contains an absolute filename - - # if the FileID contains an absolute filename this can simply be returned as target for the shortcut table. - if ( $absolute_filename ) - { - $shortcut->{'target'} = $shortcut_fileid; - return $shortcut_fileid; - } - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - $onefile = ${$filesref}[$i]; - my $filegid = $onefile->{'gid'}; - - if ( $filegid eq $shortcut_fileid ) - { - $found = 1; - last; - } - } - - if (!($found)) - { - installer::exiter::exit_program("ERROR: Did not find FileID $shortcut_fileid in file collection for folderitem", "get_folderitem_target"); - } - - # Non advertised shortcuts do not return the feature, but the path to the file - if ( $nonadvertised ) - { - $target = "\[" . $onefile->{'uniquedirname'} . "\]" . "\\" . $onefile->{'Name'}; - $shortcut->{'target'} = $target; - return $target; - } - - # the rest only for advertised shortcuts, which contain the feature in the shortcut table. - - if ( $onefile->{'modules'} ) { $target = $onefile->{'modules'}; } - - # If modules contains a list of modules, only taking the first one. - # But this should never be needed - - if ( $target =~ /^\s*(.*?)\,/ ) { $target = $1; } - - # Attention: Maximum feature length is 38! - installer::windows::idtglobal::shorten_feature_gid(\$target); - - # and finally saving the target in the folderitems collector - - $shortcut->{'target'} = $target; - - return $target; -} - -######################################################################## -# Returning the arguments for a folderitem for shortcut table. -######################################################################## - -sub get_folderitem_arguments -{ - my ($shortcut) = @_; - - my $parameter = ""; - - if ( $shortcut->{'Parameter'} ) { $parameter = $shortcut->{'Parameter'}; } - - return $parameter; -} - -######################################################################## -# Returning the icon for a folderitem for shortcut table. -# The returned value has to be defined in the icon table. -######################################################################## - -sub get_folderitem_icon -{ - my ($shortcut, $filesref, $iconfilecollector) = @_; - - my $styles = ""; - if ( $shortcut->{'Styles'} ) { $styles = $shortcut->{'Styles'}; } - if ( $styles =~ /\bNON_ADVERTISED\b/ ) { return ""; } # no icon for non-advertised shortcuts - - my $iconfilegid = ""; - - if ( $shortcut->{'IconFile'} ) { $iconfilegid = $shortcut->{'IconFile'}; } - else { $iconfilegid = $shortcut->{'FileID'}; } - - my $onefile; - my $found = 0; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - $onefile = ${$filesref}[$i]; - my $filegid = $onefile->{'gid'}; - - if ( $filegid eq $iconfilegid ) - { - $found = 1; - last; - } - } - - if (!($found)) - { - installer::exiter::exit_program("ERROR: Did not find FileID $iconfilegid in file collection", "get_folderitem_icon"); - } - - $iconfile = $onefile->{'Name'}; - - # collecting all icon files to copy them into the icon directory - - my $sourcepath = $onefile->{'sourcepath'}; - - if (! installer::existence::exists_in_array($sourcepath, $iconfilecollector)) - { - push(@{$iconfilecollector}, $sourcepath); - } - - return $iconfile; -} - -######################################################################## -# Returning the iconindex for a folderitem for shortcut table. -######################################################################## - -sub get_folderitem_iconindex -{ - my ($shortcut) = @_; - - my $styles = ""; - if ( $shortcut->{'Styles'} ) { $styles = $shortcut->{'Styles'}; } - if ( $styles =~ /\bNON_ADVERTISED\b/ ) { return ""; } # no iconindex for non-advertised shortcuts - - my $iconid = 0; - - if ( $shortcut->{'IconID'} ) { $iconid = $shortcut->{'IconID'}; } - - return $iconid; -} - -######################################################################## -# Returning the show command for a folderitem for shortcut table. -######################################################################## - -sub get_folderitem_showcmd -{ - my ($shortcut) = @_; - - return "1"; -} - -########################################################################################################### -# Creating the file Shortcut.idt dynamically -# Content: -# Shortcut Directory_ Name Component_ Target Arguments Description Hotkey Icon_ IconIndex ShowCmd WkDir -########################################################################################################### - -sub create_shortcut_table -{ - my ($filesref, $linksref, $folderref, $folderitemsref, $dirref, $basedir, $languagesarrayref, $includepatharrayref, $iconfilecollector) = @_; - - for ( my $m = 0; $m <= $#{$languagesarrayref}; $m++ ) - { - my $onelanguage = ${$languagesarrayref}[$m]; - - my @shortcuttable = (); - - my @shortnames = (); # to collect all short names - - installer::windows::idtglobal::write_idt_header(\@shortcuttable, "shortcut"); - - # First the links, defined in scp as ShortCut - - for ( my $i = 0; $i <= $#{$linksref}; $i++ ) - { - my $onelink = ${$linksref}[$i]; - - # Controlling the language! - # Only language independent folderitems or folderitems with the correct language - # will be included into the table - - if (! (!(( $onelink->{'ismultilingual'} )) || ( $onelink->{'specificlanguage'} eq $onelanguage )) ) { next; } - - my %shortcut = (); - - $shortcut{'Shortcut'} = get_shortcut_identifier($onelink); - $shortcut{'Directory_'} = get_shortcut_directory($onelink, $dirref); - $shortcut{'Name'} = get_shortcut_name($onelink, \@shortnames, $onelanguage); # localized name - $shortcut{'Component_'} = get_shortcut_component($onelink, $filesref); - $shortcut{'Target'} = get_shortcut_target($onelink, $filesref); - $shortcut{'Arguments'} = get_shortcut_arguments($onelink); - $shortcut{'Description'} = get_shortcut_description($onelink, $onelanguage); # localized description - $shortcut{'Hotkey'} = get_shortcut_hotkey($onelink); - $shortcut{'Icon_'} = get_shortcut_icon($onelink); - $shortcut{'IconIndex'} = get_shortcut_iconindex($onelink); - $shortcut{'ShowCmd'} = get_shortcut_showcmd($onelink); - $shortcut{'WkDir'} = get_shortcut_wkdir($onelink); - - my $oneline = $shortcut{'Shortcut'} . "\t" . $shortcut{'Directory_'} . "\t" . $shortcut{'Name'} . "\t" - . $shortcut{'Component_'} . "\t" . $shortcut{'Target'} . "\t" . $shortcut{'Arguments'} . "\t" - . $shortcut{'Description'} . "\t" . $shortcut{'Hotkey'} . "\t" . $shortcut{'Icon_'} . "\t" - . $shortcut{'IconIndex'} . "\t" . $shortcut{'ShowCmd'} . "\t" . $shortcut{'WkDir'} . "\n"; - - push(@shortcuttable, $oneline); - } - - # Second the entries into the start menu, defined in scp as Folder and Folderitem - # These shortcuts will fill the icons table. - - for ( my $i = 0; $i <= $#{$folderref}; $i++ ) - { - my $foldergid = ${$folderref}[$i]->{'gid'}; - - # iterating over all folderitems for this folder - - for ( my $j = 0; $j <= $#{$folderitemsref}; $j++ ) - { - my $onelink = ${$folderitemsref}[$j]; - - # Controlling the language! - # Only language independent folderitems or folderitems with the correct language - # will be included into the table - - if (! (!(( $onelink->{'ismultilingual'} )) || ( $onelink->{'specificlanguage'} eq $onelanguage )) ) { next; } - - # controlling the folder - - my $localused = 0; - - if ( $onelink->{'used'} ) { $localused = $onelink->{'used'}; } - - if (!($localused == 1)) { $onelink->{'used'} = "0"; } # no resetting - - if (!( $onelink->{'FolderID'} eq $foldergid )) { next; } - - $onelink->{'used'} = "1"; - - my %shortcut = (); - - $shortcut{'Shortcut'} = get_shortcut_identifier($onelink); - $shortcut{'Directory_'} = get_folderitem_directory($onelink); - $shortcut{'Name'} = get_shortcut_name($onelink, \@shortnames, $onelanguage); # localized name - $shortcut{'Component_'} = get_shortcut_component($onelink, $filesref); - $shortcut{'Target'} = get_folderitem_target($onelink, $filesref); - $shortcut{'Arguments'} = get_folderitem_arguments($onelink); - $shortcut{'Description'} = get_shortcut_description($onelink, $onelanguage); # localized description - $shortcut{'Hotkey'} = get_shortcut_hotkey($onelink); - $shortcut{'Icon_'} = get_folderitem_icon($onelink, $filesref, $iconfilecollector); - $shortcut{'IconIndex'} = get_folderitem_iconindex($onelink); - $shortcut{'ShowCmd'} = get_folderitem_showcmd($onelink); - $shortcut{'WkDir'} = get_folderitem_wkdir($onelink, $dirref); - - my $oneline = $shortcut{'Shortcut'} . "\t" . $shortcut{'Directory_'} . "\t" . $shortcut{'Name'} . "\t" - . $shortcut{'Component_'} . "\t" . $shortcut{'Target'} . "\t" . $shortcut{'Arguments'} . "\t" - . $shortcut{'Description'} . "\t" . $shortcut{'Hotkey'} . "\t" . $shortcut{'Icon_'} . "\t" - . $shortcut{'IconIndex'} . "\t" . $shortcut{'ShowCmd'} . "\t" . $shortcut{'WkDir'} . "\n"; - - push(@shortcuttable, $oneline); - } - } - - # The soffice.ico has to be included into the icon table - # as icon for the ARP applet - - my $onefile = ""; - my $sofficefile = "soffice.ico"; - - my $sourcepathref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$sofficefile, $includepatharrayref, 0); - - if ($$sourcepathref eq "") { installer::exiter::exit_program("ERROR: Could not find $sofficefile as icon!", "create_shortcut_table"); } - - if (! installer::existence::exists_in_array($$sourcepathref, $iconfilecollector)) - { - unshift(@{$iconfilecollector}, $$sourcepathref); - $installer::globals::sofficeiconadded = 1; - } - - my $localinfoline = "Added icon file $$sourcepathref for language pack into icon file collector.\n"; - push(@installer::globals::logfileinfo, $localinfoline); - - # Saving the file - - my $shortcuttablename = $basedir . $installer::globals::separator . "Shortcut.idt" . "." . $onelanguage; - installer::files::save_file($shortcuttablename ,\@shortcuttable); - my $infoline = "Created idt file: $shortcuttablename\n"; - push(@installer::globals::logfileinfo, $infoline); - } -} - - -1; diff --git a/solenv/bin/modules/installer/windows/sign.pm b/solenv/bin/modules/installer/windows/sign.pm deleted file mode 100644 index 629ddbaec..000000000 --- a/solenv/bin/modules/installer/windows/sign.pm +++ /dev/null @@ -1,1242 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::sign; - -use Cwd; -use installer::converter; -use installer::existence; -use installer::files; -use installer::globals; -use installer::scriptitems; -use installer::worker; -use installer::windows::admin; - -######################################################## -# Copying an existing Windows installation set. -######################################################## - -sub copy_install_set -{ - my ( $installsetpath ) = @_; - - installer::logger::include_header_into_logfile("Start: Copying installation set $installsetpath"); - - my $infoline = ""; - - my $dirname = $installsetpath; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$dirname); - - my $path = $installsetpath; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$path); - - $path =~ s/\Q$installer::globals::separator\E\s*$//; - - if ( $dirname =~ /\./ ) { $dirname =~ s/\./_signed_inprogress./; } - else { $dirname = $dirname . "_signed_inprogress"; } - - my $newpath = $path . $installer::globals::separator . $dirname; - my $removepath = $newpath; - $removepath =~ s/_inprogress/_witherror/; - - if ( -d $newpath ) { installer::systemactions::remove_complete_directory($newpath, 1); } - if ( -d $removepath ) { installer::systemactions::remove_complete_directory($removepath, 1); } - - $infoline = "Copy installation set from $installsetpath to $newpath\n"; - push( @installer::globals::logfileinfo, $infoline); - - $installsetpath = installer::systemactions::copy_complete_directory($installsetpath, $newpath); - - installer::logger::include_header_into_logfile("End: Copying installation set $installsetpath"); - - return $newpath; -} - -######################################################## -# Renaming an existing Windows installation set. -######################################################## - -sub rename_install_set -{ - my ( $installsetpath ) = @_; - - my $infoline = ""; - - my $dirname = $installsetpath; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$dirname); - - my $path = $installsetpath; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$path); - - $path =~ s/\Q$installer::globals::separator\E\s*$//; - - if ( $dirname =~ /\./ ) { $dirname =~ s/\./_inprogress./; } - else { $dirname = $dirname . "_inprogress"; } - - my $newpath = $path . $installer::globals::separator . $dirname; - my $removepath = $newpath; - $removepath =~ s/_inprogress/_witherror/; - - if ( -d $newpath ) { installer::systemactions::remove_complete_directory($newpath, 1); } - if ( -d $removepath ) { installer::systemactions::remove_complete_directory($removepath, 1); } - - $installsetpath = installer::systemactions::rename_directory($installsetpath, $newpath); - - return $newpath; -} - -######################################################### -# Checking the local system -# Checking existence of needed files in include path -######################################################### - -sub check_system_path -{ - # The following files have to be found in the environment variable PATH - # Only, if \"-sign\" is used. - # Windows : "msicert.exe", "diff.exe", "msidb.exe", "signtool.exe" - - my @needed_files_in_path = ("msicert.exe", "msidb.exe", "signtool.exe", "diff.exe"); - if ( $installer::globals::internal_cabinet_signing ) - { - push(@needed_files_in_path, "cabarc.exe"); - push(@needed_files_in_path, "makecab.exe"); - } - - my $onefile; - my $error = 0; - my $pathvariable = $ENV{'PATH'}; - my $local_pathseparator = $installer::globals::pathseparator; - - if( $^O =~ /cygwin/i ) - { # When using cygwin's perl the PATH variable is POSIX style and ... - $pathvariable = qx{cygpath -mp "$pathvariable"} ; - # has to be converted to DOS style for further use. - $local_pathseparator = ';'; - } - - my $patharrayref = installer::converter::convert_stringlist_into_array(\$pathvariable, $local_pathseparator); - - $installer::globals::patharray = $patharrayref; - - foreach my $onefile ( @needed_files_in_path ) - { - installer::logger::print_message( "...... searching $onefile ..." ); - - my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$onefile, $patharrayref , 0); - - if ( $$fileref eq "" ) - { - $error = 1; - installer::logger::print_error( "$onefile not found\n" ); - } - else - { - installer::logger::print_message( "\tFound: $$fileref\n" ); - } - } - - $installer::globals::signfiles_checked = 1; - - if ( $error ) { installer::exiter::exit_program("ERROR: Could not find all needed files in path!", "check_system_path"); } -} - -###################################################### -# Making systemcall -###################################################### - -sub make_systemcall -{ - my ($systemcall, $displaysystemcall) = @_; - - installer::logger::print_message( "... $displaysystemcall ...\n" ); - - my $success = 1; - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $displaysystemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$displaysystemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - $success = 0; - } - else - { - $infoline = "Success: Executed \"$displaysystemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return $success; -} - -###################################################### -# Making systemcall with warning -###################################################### - -sub make_systemcall_with_warning -{ - my ($systemcall, $displaysystemcall) = @_; - - installer::logger::print_message( "... $displaysystemcall ...\n" ); - - my $success = 1; - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $displaysystemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "WARNING: Could not execute \"$displaysystemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - $success = 0; - } - else - { - $infoline = "Success: Executed \"$displaysystemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return $success; -} - -###################################################### -# Making systemcall with more return data -###################################################### - -sub execute_open_system_call -{ - my ( $systemcall ) = @_; - - my @openoutput = (); - my $success = 1; - - my $comspec = $ENV{COMSPEC}; - $comspec = $comspec . " -c "; - - if( $^O =~ /cygwin/i ) - { - $comspec = ""; - } - - my $localsystemcall = "$comspec $systemcall 2>&1 |"; - - open( OPN, "$localsystemcall") or warn "Can't execute $localsystemcall\n"; - while (<OPN>) { push(@openoutput, $_); } - close (OPN); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - $success = 0; - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return ($success, \@openoutput); -} - -######################################################## -# Reading first line of pw file. -######################################################## - -sub get_pw -{ - my ( $file ) = @_; - - my $filecontent = installer::files::read_file($file); - - my $pw = ${$filecontent}[0]; - $pw =~ s/^\s*//; - $pw =~ s/\s*$//; - - return $pw; -} - -######################################################## -# Counting the keys of a hash. -######################################################## - -sub get_hash_count -{ - my ($hashref) = @_; - - my $counter = 0; - - foreach my $key ( keys %{$hashref} ) { $counter++; } - - return $counter; -} - -############################################################ -# Collect all last files in a cabinet file. This is -# necessary to control, if the cabinet file was damaged -# by calling signtool.exe. -############################################################ - -sub analyze_file_file -{ - my ($filecontent) = @_; - - my %filenamehash = (); - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i < 3 ) { next; } - - if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - my $name = $1; - my $sequence = $8; - - $filenamehash{$sequence} = $name; - } - } - - return ( \%filenamehash ); -} - -############################################################ -# Collect all DiskIds to the corresponding cabinet files. -############################################################ - -sub analyze_media_file -{ - my ($filecontent) = @_; - - my %diskidhash = (); - my %lastsequencehash = (); - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if ( $i < 3 ) { next; } - - if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) - { - my $diskid = $1; - my $lastsequence = $2; - my $cabfile = $4; - - $diskidhash{$cabfile} = $diskid; - $lastsequencehash{$cabfile} = $lastsequence; - } - } - - return ( \%diskidhash, \%lastsequencehash ); -} - -######################################################## -# Collect all DiskIds from database table "Media". -######################################################## - -sub collect_diskid_from_media_table -{ - my ($msidatabase, $languagestring) = @_; - - # creating working directory - my $workdir = installer::systemactions::create_directories("media", \$languagestring); - installer::windows::admin::extract_tables_from_pcpfile($msidatabase, $workdir, "Media File"); - - # Reading tables - my $filename = $workdir . $installer::globals::separator . "Media.idt"; - if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find required file: $filename !", "collect_diskid_from_media_table"); } - my $filecontent = installer::files::read_file($filename); - my ( $diskidhash, $lastsequencehash ) = analyze_media_file($filecontent); - - $filename = $workdir . $installer::globals::separator . "File.idt"; - if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find required file: $filename !", "collect_diskid_from_media_table"); } - $filecontent = installer::files::read_file($filename); - my $filenamehash = analyze_file_file($filecontent); - - return ( $diskidhash, $filenamehash, $lastsequencehash ); -} - -######################################################## -# Check, if this installation set contains -# internal cabinet files included into the msi -# database. -######################################################## - -sub check_for_internal_cabfiles -{ - my ($cabfilehash) = @_; - - my $contains_internal_cabfiles = 0; - my %allcabfileshash = (); - - foreach my $filename ( keys %{$cabfilehash} ) - { - if ( $filename =~ /^\s*\#/ ) # starting with a hash - { - $contains_internal_cabfiles = 1; - # setting real filename without hash as key and name with hash as value - my $realfilename = $filename; - $realfilename =~ s/^\s*\#//; - $allcabfileshash{$realfilename} = $filename; - } - } - - return ( $contains_internal_cabfiles, \%allcabfileshash ); -} - -######################################################## -# Collecting all files in an installation set. -######################################################## - -sub analyze_installset_content -{ - my ( $installsetpath ) = @_; - - my @sourcefiles = (); - my $pathstring = ""; - installer::systemactions::read_complete_directory($installsetpath, $pathstring, \@sourcefiles); - - if ( ! ( $#sourcefiles > -1 )) { installer::exiter::exit_program("ERROR: No file in installation set. Path: $installsetpath !", "analyze_installset_content"); } - - my %allcabfileshash = (); - my %allmsidatabaseshash = (); - my %allfileshash = (); - my $contains_external_cabfiles = 0; - my $msidatabase = ""; - my $contains_msidatabase = 0; - - for ( my $j = 0; $j <= $#sourcefiles; $j++ ) - { - if ( $sourcefiles[$j] =~ /\.cab\s*$/ ) { $allcabfileshash{$sourcefiles[$j]} = 1; } - else - { - if ( $sourcefiles[$j] =~ /\.txt\s*$/ ) { next; } - if ( $sourcefiles[$j] =~ /\.html\s*$/ ) { next; } - if ( $sourcefiles[$j] =~ /\.ini\s*$/ ) { next; } - if ( $sourcefiles[$j] =~ /\.bmp\s*$/ ) { next; } - if ( $sourcefiles[$j] =~ /\.msi\s*$/ ) - { - if ( $msidatabase eq "" ) { $msidatabase = $sourcefiles[$j]; } - else { installer::exiter::exit_program("ERROR: There is more than one msi database in installation set. Path: $installsetpath !", "analyze_installset_content"); } - } - $allfileshash{$sourcefiles[$j]} = 1; - } - } - - # Is there at least one cab file in the installation set? - my $cabcounter = get_hash_count(\%allcabfileshash); - if ( $cabcounter > 0 ) { $contains_external_cabfiles = 1; } - - # How about a cab file without a msi database? - if (( $cabcounter > 0 ) && ( $msidatabase eq "" )) { installer::exiter::exit_program("ERROR: There is no msi database in the installation set, but an external cabinet file. Path: $installsetpath !", "collect_installset_content"); } - - if ( $msidatabase ne "" ) { $contains_msidatabase = 1; } - - return (\%allcabfileshash, \%allfileshash, $msidatabase, $contains_external_cabfiles, $contains_msidatabase, \@sourcefiles); -} - -######################################################## -# Adding content of external cabinet files into the -# msi database -######################################################## - -sub msicert_database -{ - my ($msidatabase, $allcabfiles, $cabfilehash, $internalcabfile) = @_; - - my $fullsuccess = 1; - - foreach my $cabfile ( keys %{$allcabfiles} ) - { - my $origfilesize = -s $cabfile; - - my $mediacabfilename = $cabfile; - if ( $internalcabfile ) { $mediacabfilename = "\#" . $mediacabfilename; } - if ( ! exists($cabfilehash->{$mediacabfilename}) ) { installer::exiter::exit_program("ERROR: Could not determine DiskId from media table for cabinet file \"$cabfile\" !", "msicert_database"); } - my $diskid = $cabfilehash->{$mediacabfilename}; - - my $systemcall = "msicert.exe -d $msidatabase -m $diskid -c $cabfile -h"; - $success = make_systemcall($systemcall, $systemcall); - if ( ! $success ) { $fullsuccess = 0; } - - # size of cabinet file must not change - my $finalfilesize = -s $cabfile; - - if ( $origfilesize != $finalfilesize ) { installer::exiter::exit_program("ERROR: msicert.exe changed size of cabinet file !", "msicert_database"); } - } - - return $fullsuccess; -} - -######################################################## -# Checking if cabinet file was broken by signtool. -######################################################## - -sub cabinet_cosistency_check -{ - my ( $onefile, $followmeinfohash, $filenamehash, $lastsequencehash, $temppath ) = @_; - - my $infoline = "Making consistency check of $onefile\n"; - push( @installer::globals::logfileinfo, $infoline); - my $expandfile = "expand.exe"; # Has to be in the path - - if ( $^O =~ /cygwin/i ) - { - $expandfile = qx(cygpath -u "$ENV{WINDIR}"/System32/expand.exe); - chomp $expandfile; - } - - if ( $filenamehash == 0 ) - { - $infoline = "Warning: Stopping consistency check: Important hash of filenames is empty!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - elsif ( $lastsequencehash == 0 ) - { - $infoline = "Warning: Stopping consistency check; Important hash of last sequences is empty!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else # both hashes are available - { - # $onefile contains only the name of the cabinet file without path - my $sequence = $lastsequencehash->{$onefile}; - my $lastfile = $filenamehash->{$sequence}; - $infoline = "Check of $onefile: Sequence: $sequence is file: $lastfile\n"; - push( @installer::globals::logfileinfo, $infoline); - - # Therefore the file $lastfile need to be binary compared. - # It has to be expanded from the cabinet file - # of the original installation set and from the - # newly signed cabinet file. - - # How about cabinet files extracted from msi database? - my $finalinstalldir = $followmeinfohash->{'finalinstalldir'}; - - $finalinstalldir =~ s/\\\s*$//; - $finalinstalldir =~ s/\/\s*$//; - my $sourcecabfile = $finalinstalldir . $installer::globals::separator . $onefile; - my $currentpath = cwd(); - my $destcabfile = $currentpath . $installer::globals::separator . $onefile; - - if ( $^O =~ /cygwin/i ) - { - chomp( $destcabfile = qx{cygpath -w "$destcabfile"} ); - $destcabfile =~ s/\\/\//g; - } - - if ( ! -f $sourcecabfile ) - { - $infoline = "WARNING: Check of cab file cannot happen, because source cabinet file was not found: $sourcecabfile\n"; - push( @installer::globals::logfileinfo, $infoline); - } - elsif ( ! -f $destcabfile ) - { - $infoline = "WARNING: Check of cab file cannot happen, because destination cabinet file was not found: $sourcecabfile\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else # everything is okay for the check - { - my $diffpath = get_diff_path($temppath); - - my $origdiffpath = $diffpath . $installer::globals::separator . "orig"; - my $newdiffpath = $diffpath . $installer::globals::separator . "new"; - - if ( ! -d $origdiffpath ) { mkdir($origdiffpath); } - if ( ! -d $newdiffpath ) { mkdir($newdiffpath); } - - my $systemcall = "$expandfile $sourcecabfile $origdiffpath -f:$lastfile "; - $infoline = $systemcall . "\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $success = make_systemcall($systemcall, $systemcall); - if ( ! $success ) { installer::exiter::exit_program("ERROR: Could not successfully execute: $systemcall !", "cabinet_cosistency_check"); } - - $systemcall = "$expandfile $destcabfile $newdiffpath -f:$lastfile "; - $infoline = $systemcall . "\n"; - push( @installer::globals::logfileinfo, $infoline); - - $success = make_systemcall($systemcall, $systemcall); - if ( ! $success ) { installer::exiter::exit_program("ERROR: Could not successfully execute: $systemcall !", "cabinet_cosistency_check"); } - - # and finally the two files can be diffed. - my $origfile = $origdiffpath . $installer::globals::separator . $lastfile; - my $newfile = $newdiffpath . $installer::globals::separator . $lastfile; - - if ( ! -f $origfile ) { installer::exiter::exit_program("ERROR: Unpacked original file not found: $origfile !", "cabinet_cosistency_check"); } - if ( ! -f $newfile ) { installer::exiter::exit_program("ERROR: Unpacked new file not found: $newfile !", "cabinet_cosistency_check"); } - - my $origsize = -s $origfile; - my $newsize = -s $newfile; - - if ( $origsize != $newsize ) # This shows an error! - { - $infoline = "ERROR: Different filesize after signtool.exe was used. Original: $origsize Bytes, new: $newsize. File: $lastfile\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: The cabinet file $destcabfile is broken after signtool.exe signed this file !", "cabinet_cosistency_check"); - } - else - { - $infoline = "Same size of last file in cabinet file after usage of signtool.exe: $newsize (File: $lastfile)\n"; - push( @installer::globals::logfileinfo, $infoline); - - # Also making a binary diff? - - my $difffile = "diff.exe"; # has to be in the path - $systemcall = "$difffile $origfile $newfile"; - $infoline = $systemcall . "\n"; - $returnvalue = make_systemcall($systemcall, $systemcall); - - my $success = $?; - - if ( $success == 0 ) - { - $infoline = "Last files are identical after signing cabinet file (File: $lastfile)\n"; - push( @installer::globals::logfileinfo, $infoline); - } - elsif ( $success == 1 ) - { - $infoline = "ERROR: Last files are different after signing cabinet file (File: $lastfile)\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Last files are different after signing cabinet file (File: $lastfile)!", "cabinet_cosistency_check"); - } - else - { - $infoline = "ERROR: Problem occurred calling diff.exe (File: $lastfile)\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Problem occurred calling diff.exe (File: $lastfile) !", "cabinet_cosistency_check"); - } - } - } - } - -} - -######################################################## -# Signing a list of files -######################################################## - -sub sign_files -{ - my ( $followmeinfohash, $allfiles, $pw, $cabinternal, $filenamehash, $lastsequencehash, $temppath ) = @_; - - my $infoline = ""; - my $fullsuccess = 1; - my $maxcounter = 3; - - my $productname = ""; - if ( $followmeinfohash->{'allvariableshash'}->{'PRODUCTNAME'} ) { $productname = "/d " . "\"$followmeinfohash->{'allvariableshash'}->{'PRODUCTNAME'}\""; } - my $url = ""; - if (( ! exists($followmeinfohash->{'allvariableshash'}->{'OPENSOURCE'}) ) || ( $followmeinfohash->{'allvariableshash'}->{'OPENSOURCE'} == 0 )) { $url = "/du " . "\"http://www.sun.com\""; } - else { $url = "/du " . "\"http://www.openoffice.org\""; } - my $timestampurl = "http://timestamp.verisign.com/scripts/timestamp.dll"; - - my $pfxfilepath = $installer::globals::pfxfile; - - if( $^O =~ /cygwin/i ) - { - $pfxfilepath = qx{cygpath -w "$pfxfilepath"}; - $pfxfilepath =~ s/\\/\\\\/g; - $pfxfilepath =~ s/\s*$//g; - } - - foreach my $onefile ( reverse sort keys %{$allfiles} ) - { - if ( already_certified($onefile) ) - { - $infoline = "Already certified: Skipping file $onefile\n"; - push( @installer::globals::logfileinfo, $infoline); - next; - } - - my $counter = 1; - my $success = 0; - - while (( $counter <= $maxcounter ) && ( ! $success )) - { - if ( $counter > 1 ) { installer::logger::print_message( "\n\n... repeating file $onefile ...\n" ); } - if ( $cabinternal ) { installer::logger::print_message(" Signing: $onefile\n"); } - my $systemcall = "signtool.exe sign /f \"$pfxfilepath\" /p $pw $productname $url /t \"$timestampurl\" \"$onefile\""; - my $displaysystemcall = "signtool.exe sign /f \"$pfxfilepath\" /p ***** $productname $url /t \"$timestampurl\" \"$onefile\""; - $success = make_systemcall_with_warning($systemcall, $displaysystemcall); - $counter++; - } - - # Special check for cabinet files, that sometimes get damaged by signtool.exe - if (( $success ) && ( $onefile =~ /\.cab\s*$/ ) && ( ! $cabinternal )) - { - cabinet_cosistency_check($onefile, $followmeinfohash, $filenamehash, $lastsequencehash, $temppath); - } - - if ( ! $success ) - { - $fullsuccess = 0; - installer::exiter::exit_program("ERROR: Could not sign file: $onefile!", "sign_files"); - } - } - - return $fullsuccess; -} - -########################################################################## -# Lines in ddf files must not contain more than 256 characters -########################################################################## - -sub check_ddf_file -{ - my ( $ddffile, $ddffilename ) = @_; - - my $maxlength = 0; - my $maxline = 0; - my $linelength = 0; - my $linenumber = 0; - - for ( my $i = 0; $i <= $#{$ddffile}; $i++ ) - { - my $oneline = ${$ddffile}[$i]; - - $linelength = length($oneline); - $linenumber = $i + 1; - - if ( $linelength > 256 ) - { - installer::exiter::exit_program("ERROR \"$ddffilename\" line $linenumber: Lines in ddf files must not contain more than 256 characters!", "check_ddf_file"); - } - - if ( $linelength > $maxlength ) - { - $maxlength = $linelength; - $maxline = $linenumber; - } - } - - my $infoline = "Check of ddf file \"$ddffilename\": Maximum length \"$maxlength\" in line \"$maxline\" (allowed line length: 256 characters)\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -################################################################# -# Setting the path, where the cab files are unpacked. -################################################################# - -sub get_cab_path -{ - my ($temppath) = @_; - - my $cabpath = "cabs_" . $$; - $cabpath = $temppath . $installer::globals::separator . $cabpath; - if ( ! -d $cabpath ) { installer::systemactions::create_directory($cabpath); } - - return $cabpath; -} - -################################################################# -# Setting the path, where the diff can happen. -################################################################# - -sub get_diff_path -{ - my ($temppath) = @_; - - my $diffpath = "diff_" . $$; - $diffpath = $temppath . $installer::globals::separator . $diffpath; - if ( ! -d $diffpath ) { installer::systemactions::create_directory($diffpath); } - - return $diffpath; -} - -################################################################# -# Exclude all cab files from the msi database. -################################################################# - -sub extract_cabs_from_database -{ - my ($msidatabase, $allcabfiles) = @_; - - installer::logger::include_header_into_logfile("Extracting cabs from msi database"); - - my $infoline = ""; - my $fullsuccess = 1; - my $msidb = "msidb.exe"; # Has to be in the path - - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - $msidatabase =~ s/\//\\\\/g; - - foreach my $onefile ( keys %{$allcabfiles} ) - { - my $systemcall = $msidb . " -d " . $msidatabase . " -x " . $onefile; - my $success = make_systemcall($systemcall, $systemcall); - if ( ! $success ) { $fullsuccess = 0; } - - # and removing the stream from the database - $systemcall = $msidb . " -d " . $msidatabase . " -k " . $onefile; - $success = make_systemcall($systemcall, $systemcall); - if ( ! $success ) { $fullsuccess = 0; } - } - - return $fullsuccess; -} - -################################################################# -# Include cab files into the msi database. -################################################################# - -sub include_cabs_into_database -{ - my ($msidatabase, $allcabfiles) = @_; - - installer::logger::include_header_into_logfile("Including cabs into msi database"); - - my $infoline = ""; - my $fullsuccess = 1; - my $msidb = "msidb.exe"; # Has to be in the path - - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - $msidatabase =~ s/\//\\\\/g; - - foreach my $onefile ( keys %{$allcabfiles} ) - { - my $systemcall = $msidb . " -d " . $msidatabase . " -a " . $onefile; - my $success = make_systemcall($systemcall, $systemcall); - if ( ! $success ) { $fullsuccess = 0; } - } - - return $fullsuccess; -} - -######################################################## -# Reading the order of the files inside the -# cabinet files. -######################################################## - -sub read_cab_file -{ - my ($cabfilename) = @_; - - installer::logger::print_message( "\n... reading cabinet file $cabfilename ...\n" ); - my $infoline = "Reading cabinet file $cabfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $systemcall = "cabarc.exe" . " L " . $cabfilename; - push(@logfile, "$systemcall\n"); - - my ($success, $fileorder) = execute_open_system_call($systemcall); - - my @allfiles = (); - - for ( my $i = 0; $i <= $#{$fileorder}; $i++ ) - { - my $line = ${$fileorder}[$i]; - if ( $line =~ /^\s*(.*?)\s+\d+\s+\d+\/\d+\/\d+\s+\d+\:\d+\:\d+\s+[\w-]+\s*$/ ) - { - my $filename = $1; - push(@allfiles, $filename); - } - } - - return \@allfiles; -} - -######################################################## -# Unpacking a cabinet file. -######################################################## - -sub unpack_cab_file -{ - my ($cabfilename, $temppath) = @_; - - installer::logger::print_message( "\n... unpacking cabinet file $cabfilename ...\n" ); - my $infoline = "Unpacking cabinet file $cabfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $dirname = $cabfilename; - $dirname =~ s/\.cab\s*$//; - my $workingpath = $temppath . $installer::globals::separator . "unpack_". $dirname . "_" . $$; - if ( ! -d $workingpath ) { installer::systemactions::create_directory($workingpath); } - - # changing into unpack directory - my $from = cwd(); - chdir($workingpath); - - my $fullcabfilename = $from . $installer::globals::separator . $cabfilename; - - if( $^O =~ /cygwin/i ) - { - $fullcabfilename = qx{cygpath -w "$fullcabfilename"}; - $fullcabfilename =~ s/\\/\\\\/g; - $fullcabfilename =~ s/\s*$//g; - } - - my $systemcall = "cabarc.exe" . " -p X " . $fullcabfilename; - $success = make_systemcall($systemcall, $systemcall); - if ( ! $success ) { installer::exiter::exit_program("ERROR: Could not unpack cabinet file: $fullcabfilename!", "unpack_cab_file"); } - - # returning to directory - chdir($from); - - return $workingpath; -} - -######################################################## -# Returning the header of a ddf file. -######################################################## - -sub get_ddf_file_header -{ - my ($ddffileref, $cabinetfile, $installdir) = @_; - - my $oneline; - my $compressionlevel = 2; - - if( $^O =~ /cygwin/i ) - { - $installdir = qx{cygpath -w "$installdir"}; - $installdir =~ s/\s*$//g; - } - - $oneline = ".Set CabinetName1=" . $cabinetfile . "\n"; - push(@{$ddffileref} ,$oneline); - $oneline = ".Set ReservePerCabinetSize=128\n"; # This reserves space for a digital signature. - push(@{$ddffileref} ,$oneline); - $oneline = ".Set MaxDiskSize=2147483648\n"; # This allows the .cab file to get a size of 2 GB. - push(@{$ddffileref} ,$oneline); - $oneline = ".Set CompressionType=LZX\n"; - push(@{$ddffileref} ,$oneline); - $oneline = ".Set Compress=ON\n"; - push(@{$ddffileref} ,$oneline); - $oneline = ".Set CompressionLevel=$compressionlevel\n"; - push(@{$ddffileref} ,$oneline); - $oneline = ".Set Cabinet=ON\n"; - push(@{$ddffileref} ,$oneline); - $oneline = ".Set DiskDirectoryTemplate=" . $installdir . "\n"; - push(@{$ddffileref} ,$oneline); -} - -######################################################## -# Writing content into ddf file. -######################################################## - -sub put_all_files_into_ddffile -{ - my ($ddffile, $allfiles, $workingpath) = @_; - - $workingpath =~ s/\//\\/g; - - for ( my $i = 0; $i <= $#{$allfiles}; $i++ ) - { - my $filename = ${$allfiles}[$i]; - if( $^O =~ /cygwin/i ) { $filename =~ s/\//\\/g; } # Backslash for Cygwin! - if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file: $filename!", "put_all_files_into_ddffile"); } - my $infoline = "\"" . $filename . "\"" . " " . ${$allfiles}[$i] . "\n"; - push( @{$ddffile}, $infoline); - } -} - -######################################################## -# Packing a cabinet file. -######################################################## - -sub do_pack_cab_file -{ - my ($cabfilename, $allfiles, $workingpath, $temppath) = @_; - - installer::logger::print_message( "\n... packing cabinet file $cabfilename ...\n" ); - my $infoline = "Packing cabinet file $cabfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( -f $cabfilename ) { unlink($cabfilename); } # removing cab file - if ( -f $cabfilename ) { installer::exiter::exit_program("ERROR: Failed to remove file: $cabfilename!", "do_pack_cab_file"); } - - # generate ddf file for makecab.exe - my @ddffile = (); - - my $dirname = $cabfilename; - $dirname =~ s/\.cab\s*$//; - my $ddfpath = $temppath . $installer::globals::separator . "ddf_". $dirname . "_" . $$; - - my $ddffilename = $cabfilename; - $ddffilename =~ s/.cab/.ddf/; - $ddffilename = $ddfpath . $installer::globals::separator . $ddffilename; - - if ( ! -d $ddfpath ) { installer::systemactions::create_directory($ddfpath); } - - my $from = cwd(); - - chdir($workingpath); # changing into the directory with the unpacked files - - get_ddf_file_header(\@ddffile, $cabfilename, $from); - put_all_files_into_ddffile(\@ddffile, $allfiles, $workingpath); - # lines in ddf files must not be longer than 256 characters - check_ddf_file(\@ddffile, $ddffilename); - - installer::files::save_file($ddffilename, \@ddffile); - - if( $^O =~ /cygwin/i ) - { - $ddffilename = qx{cygpath -w "$ddffilename"}; - $ddffilename =~ s/\\/\\\\/g; - $ddffilename =~ s/\s*$//g; - } - - my $systemcall = "makecab.exe /V1 /F " . $ddffilename; - my $success = make_systemcall($systemcall, $systemcall); - if ( ! $success ) { installer::exiter::exit_program("ERROR: Could not pack cabinet file!", "do_pack_cab_file"); } - - chdir($from); - - return ($success); -} - -######################################################## -# Extraction the file extension from a file -######################################################## - -sub get_extension -{ - my ( $file ) = @_; - - my $extension = ""; - - if ( $file =~ /^\s*(.*)\.(\w+?)\s*$/ ) { $extension = $2; } - - return $extension; -} - -######################################################## -# Checking, if a file already contains a certificate. -# This must not be overwritten. -######################################################## - -sub already_certified -{ - my ( $filename ) = @_; - - my $success = 1; - my $is_certified = 0; - - my $systemcall = "signtool.exe verify /q /pa \"$filename\""; - my $returnvalue = system($systemcall); - - if ( $returnvalue ) { $success = 0; } - - if ( $success ) - { - $is_certified = 1; - installer::logger::print_message( "... already certified -> skipping $filename ...\n" ); - } - - return $is_certified; -} - -######################################################## -# Signing the files, that are included into -# cabinet files. -######################################################## - -sub sign_files_in_cabinet_files -{ - my ( $followmeinfohash, $allcabfiles, $pw, $temppath ) = @_; - - my $complete_success = 1; - my $from = cwd(); - - foreach my $cabfilename ( keys %{$allcabfiles} ) - { - my $success = 1; - - # saving order of files in cab file - my $fileorder = read_cab_file($cabfilename); - - # unpack into $working path - my $workingpath = unpack_cab_file($cabfilename, $temppath); - - chdir($workingpath); - - # sign files - my %allfileshash = (); - foreach my $onefile ( @{$fileorder} ) - { - my $extension = get_extension($onefile); - if ( exists( $installer::globals::sign_extensions{$extension} ) ) - { - $allfileshash{$onefile} = 1; - } - } - $success = sign_files($followmeinfohash, \%allfileshash, $pw, 1, 0, 0, $temppath); - if ( ! $success ) { $complete_success = 0; } - - chdir($from); - - # pack into new directory - do_pack_cab_file($cabfilename, $fileorder, $workingpath, $temppath); - } - - return $complete_success; -} - -######################################################## -# Comparing the content of two directories. -# Only filesize is compared. -######################################################## - -sub compare_directories -{ - my ( $dir1, $dir2, $files ) = @_; - - $dir1 =~ s/\\\s*//; - $dir2 =~ s/\\\s*//; - $dir1 =~ s/\/\s*//; - $dir2 =~ s/\/\s*//; - - my $infoline = "Comparing directories: $dir1 and $dir2\n"; - push( @installer::globals::logfileinfo, $infoline); - - foreach my $onefile ( @{$files} ) - { - my $file1 = $dir1 . $installer::globals::separator . $onefile; - my $file2 = $dir2 . $installer::globals::separator . $onefile; - - if ( ! -f $file1 ) { installer::exiter::exit_program("ERROR: Missing file : $file1!", "compare_directories"); } - if ( ! -f $file2 ) { installer::exiter::exit_program("ERROR: Missing file : $file2!", "compare_directories"); } - - my $size1 = -s $file1; - my $size2 = -s $file2; - - $infoline = "Comparing files: $file1 ($size1) and $file2 ($size2)\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( $size1 != $size2 ) - { - installer::exiter::exit_program("ERROR: File defect after copy (different size) $file1 ($size1 bytes) and $file2 ($size2 bytes)!", "compare_directories"); - } - } -} - -######################################################## -# Signing an existing Windows installation set. -######################################################## - -sub sign_install_set -{ - my ($followmeinfohash, $make_copy, $temppath) = @_; - - my $installsetpath = $followmeinfohash->{'finalinstalldir'}; - - installer::logger::include_header_into_logfile("Start: Signing installation set $installsetpath"); - - my $complete_success = 1; - my $success = 1; - - my $infoline = "Signing installation set in $installsetpath\n"; - push( @installer::globals::logfileinfo, $infoline); - - # check required files. - if ( ! $installer::globals::signfiles_checked ) { check_system_path(); } - - # get cerficate information - my $pw = get_pw($installer::globals::pwfile); - - # making a copy of the installation set, if required - if ( $make_copy ) { $installsetpath = copy_install_set($installsetpath); } - else { $installsetpath = rename_install_set($installsetpath); } - - # collecting all files in the installation set - my ($allcabfiles, $allfiles, $msidatabase, $contains_external_cabfiles, $contains_msidatabase, $sourcefiles) = analyze_installset_content($installsetpath); - - if ( $make_copy ) { compare_directories($installsetpath, $followmeinfohash->{'finalinstalldir'}, $sourcefiles); } - - # changing into installation set - my $from = cwd(); - my $fullmsidatabase = $installsetpath . $installer::globals::separator . $msidatabase; - - if( $^O =~ /cygwin/i ) - { - $fullmsidatabase = qx{cygpath -w "$fullmsidatabase"}; - $fullmsidatabase =~ s/\\/\\\\/g; - $fullmsidatabase =~ s/\s*$//g; - } - - chdir($installsetpath); - - if ( $contains_msidatabase ) - { - # exclude media table from msi database and get all diskids. - my ( $cabfilehash, $filenamehash, $lastsequencehash ) = collect_diskid_from_media_table($msidatabase, $followmeinfohash->{'languagestring'}); - - # Check, if there are internal cab files - my ( $contains_internal_cabfiles, $all_internal_cab_files) = check_for_internal_cabfiles($cabfilehash); - - if ( $contains_internal_cabfiles ) - { - my $cabpath = get_cab_path($temppath); - chdir($cabpath); - - # Exclude all cabinet files from database - $success = extract_cabs_from_database($fullmsidatabase, $all_internal_cab_files); - if ( ! $success ) { $complete_success = 0; } - - if ( $installer::globals::internal_cabinet_signing ) { sign_files_in_cabinet_files($followmeinfohash, $all_internal_cab_files, $pw, $temppath); } - - $success = sign_files($followmeinfohash, $all_internal_cab_files, $pw, 0, $filenamehash, $lastsequencehash, $temppath); - if ( ! $success ) { $complete_success = 0; } - $success = msicert_database($fullmsidatabase, $all_internal_cab_files, $cabfilehash, 1); - if ( ! $success ) { $complete_success = 0; } - - # Include all cabinet files into database - $success = include_cabs_into_database($fullmsidatabase, $all_internal_cab_files); - if ( ! $success ) { $complete_success = 0; } - chdir($installsetpath); - } - - # Warning: There might be a problem with very big cabinet files - # signing all external cab files first - if ( $contains_external_cabfiles ) - { - if ( $installer::globals::internal_cabinet_signing ) { sign_files_in_cabinet_files($followmeinfohash, $allcabfiles, $pw, $temppath); } - - $success = sign_files($followmeinfohash, $allcabfiles, $pw, 0, $filenamehash, $lastsequencehash, $temppath); - if ( ! $success ) { $complete_success = 0; } - $success = msicert_database($msidatabase, $allcabfiles, $cabfilehash, 0); - if ( ! $success ) { $complete_success = 0; } - } - } - - # finally all other files can be signed - $success = sign_files($followmeinfohash, $allfiles, $pw, 0, 0, 0, $temppath); - if ( ! $success ) { $complete_success = 0; } - - # and changing back - chdir($from); - - installer::logger::include_header_into_logfile("End: Signing installation set $installsetpath"); - - return ($installsetpath); -} - -1; diff --git a/solenv/bin/modules/installer/windows/strip.pm b/solenv/bin/modules/installer/windows/strip.pm deleted file mode 100644 index f1733dac4..000000000 --- a/solenv/bin/modules/installer/windows/strip.pm +++ /dev/null @@ -1,159 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::strip; - -use File::Temp qw(tmpnam); -use installer::converter; -use installer::existence; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::systemactions; - -##################################################################### -# Checking whether a file has to be stripped -##################################################################### - -sub need_to_strip -{ - my ( $filename ) = @_; - - my $strip = 0; - - # Check using the "nm" command - - $filename =~ s/\\/\\\\/g; - - open (FILE, "nm $filename 2>&1 |"); - my $nmoutput = <FILE>; - close (FILE); - - if ( $nmoutput && !( $nmoutput =~ /no symbols/i || $nmoutput =~ /not recognized/i )) { $strip = 1; } - - return $strip -} - -##################################################################### -# Checking whether a file has to be stripped -##################################################################### - -sub do_strip -{ - my ( $filename ) = @_; - - my $systemcall = "strip" . " " . $filename; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not strip $filename!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "SUCCESS: Stripped library $filename!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -##################################################################### -# Resolving all variables in the packagename. -##################################################################### - -sub strip_binaries -{ - my ( $filelist, $languagestringref ) = @_; - - installer::logger::include_header_into_logfile("Stripping files:"); - - my $strippeddirbase = installer::systemactions::create_directories("stripped", $languagestringref); - - if (! installer::existence::exists_in_array($strippeddirbase, \@installer::globals::removedirs)) - { - push(@installer::globals::removedirs, $strippeddirbase); - } - - my ($tmpfilehandle, $tmpfilename) = tmpnam(); - open SOURCEPATHLIST, ">$tmpfilename" or die "oops...\n"; - for ( my $i = 0; $i <= $#{$filelist}; $i++ ) - { - print SOURCEPATHLIST "${$filelist}[$i]->{'sourcepath'}\n"; - } - close SOURCEPATHLIST; - my @filetypelist = qx{file -f "$tmpfilename"}; - chomp @filetypelist; - unlink "$tmpfilename" or die "oops\n"; - for ( my $i = 0; $i <= $#{$filelist}; $i++ ) - { - ${$filelist}[$i]->{'is_executable'} = ( $filetypelist[$i] =~ /:.*PE executable/ ); - } - - if ( $^O =~ /cygwin/i ) { installer::worker::generate_cygwin_pathes($filelist); } - - for ( my $i = 0; $i <= $#{$filelist}; $i++ ) - { - my $sourcefilename = ${$filelist}[$i]->{'cyg_sourcepath'}; - - if ( ${$filelist}[$i]->{'is_executable'} && need_to_strip($sourcefilename) ) - { - my $shortfilename = $sourcefilename; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$shortfilename); - - $infoline = "Strip: $shortfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - # copy file into directory for stripped libraries - - my $onelanguage = ${$filelist}[$i]->{'specificlanguage'}; - - # files without language into directory "00" - - if ($onelanguage eq "") { $onelanguage = "00"; } - - my $strippeddir = $strippeddirbase . $installer::globals::separator . $onelanguage; - installer::systemactions::create_directory($strippeddir); # creating language specific subdirectories - - my $destfilename = $strippeddir . $installer::globals::separator . $shortfilename; - installer::systemactions::copy_one_file($sourcefilename, $destfilename); - - # change sourcepath in files collector - - ${$filelist}[$i]->{'sourcepath'} = $destfilename; - - # strip file - - do_strip($destfilename); - } - } -} - -1; diff --git a/solenv/bin/modules/installer/windows/update.pm b/solenv/bin/modules/installer/windows/update.pm deleted file mode 100644 index 9e96e85c5..000000000 --- a/solenv/bin/modules/installer/windows/update.pm +++ /dev/null @@ -1,600 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::update; - -use installer::converter; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::pathanalyzer; -use installer::systemactions; - -################################################################################# -# Extracting all tables from an msi database -################################################################################# - -sub extract_all_tables_from_msidatabase -{ - my ($fulldatabasepath, $workdir) = @_; - - my $msidb = "msidb.exe"; # Has to be in the path - my $infoline = ""; - my $systemcall = ""; - my $returnvalue = ""; - my $extraslash = ""; # Has to be set for non-ActiveState perl - - # Export of all tables by using "*" - - if ( $^O =~ /cygwin/i ) { - # msidb.exe really wants backslashes. (And double escaping because system() expands the string.) - $fulldatabasepath =~ s/\//\\\\/g; - $workdir =~ s/\//\\\\/g; - $extraslash = "\\"; - } - - $systemcall = $msidb . " -d " . $fulldatabasepath . " -f " . $workdir . " -e " . $extraslash . "*"; - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute $systemcall !\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Could not exclude tables from msi database: $fulldatabasepath !", "extract_all_tables_from_msidatabase"); - } - else - { - $infoline = "Success: Executed $systemcall successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -################################################################################# -# Collecting the keys from the first line of the idt file -################################################################################# - -sub collect_all_keys -{ - my ($line) = @_; - - my @allkeys = (); - my $rownumber = 0; - my $onekey = ""; - - while ( $line =~ /^\s*(\S+?)\t(.*)$/ ) - { - $onekey = $1; - $line = $2; - $rownumber++; - push(@allkeys, $onekey); - } - - # and the last key - - $onekey = $line; - $onekey =~ s/^\s*//g; - $onekey =~ s/\s*$//g; - - $rownumber++; - push(@allkeys, $onekey); - - return (\@allkeys, $rownumber); -} - -################################################################################# -# Analyzing the content of one line of an idt file -################################################################################# - -sub get_oneline_hash -{ - my ($line, $allkeys, $rownumber) = @_; - - my $counter = 0; - my %linehash = (); - - $line =~ s/^\s*//; - $line =~ s/\s*$//; - - my $value = ""; - my $onekey = ""; - - while ( $line =~ /^(.*?)\t(.*)$/ ) - { - $value = $1; - $line = $2; - $onekey = ${$allkeys}[$counter]; - $linehash{$onekey} = $value; - $counter++; - } - - # the last column - - $value = $line; - $onekey = ${$allkeys}[$counter]; - - $linehash{$onekey} = $value; - - return \%linehash; -} - -################################################################################# -# Analyzing the content of an idt file -################################################################################# - -sub analyze_idt_file -{ - my ($filecontent) = @_; - - my %table = (); - # keys are written in first line - my ($allkeys, $rownumber) = collect_all_keys(${$filecontent}[0]); - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; } - - my $onelinehash = get_oneline_hash(${$filecontent}[$i], $allkeys, $rownumber); - my $linekey = $i - 2; # ! : The linenumber is the unique key !? Always decrease by two, because of removed first three lines. - $table{$linekey} = $onelinehash; - } - - return \%table; -} - -################################################################################# -# Reading all idt files in a specified directory -################################################################################# - -sub read_all_tables_from_msidatabase -{ - my ($workdir) = @_; - - my %database = (); - - my $ext = "idt"; - - my $allidtfiles = installer::systemactions::find_file_with_file_extension($ext, $workdir); - - for ( my $i = 0; $i <= $#{$allidtfiles}; $i++ ) - { - my $onefilename = ${$allidtfiles}[$i]; - my $longonefilename = $workdir . $installer::globals::separator . $onefilename; - if ( ! -f $longonefilename ) { installer::exiter::exit_program("ERROR: Could not find idt file: $longonefilename!", "read_all_tables_from_msidatabase"); } - my $filecontent = installer::files::read_file($longonefilename); - my $idtcontent = analyze_idt_file($filecontent); - my $key = $onefilename; - $key =~ s/\.idt\s*$//; - $database{$key} = $idtcontent; - } - - return \%database; -} - -################################################################################# -# Checking, if this is the correct database. -################################################################################# - -sub correct_database -{ - my ($product, $pro, $langs, $languagestringref) = @_; - - my $correct_database = 0; - - # Comparing $product with $installer::globals::product and - # $pro with $installer::globals::pro and - # $langs with $languagestringref - - my $product_is_good = 0; - - my $localproduct = $installer::globals::product; - if ( $installer::globals::languagepack ) { $localproduct = $localproduct . "LanguagePack"; } - elsif ( $installer::globals::helppack ) { $localproduct = $localproduct . "HelpPack"; } - - if ( $product eq $localproduct ) { $product_is_good = 1; } - - if ( $product_is_good ) - { - my $pro_is_good = 0; - - if ((( $pro eq "pro" ) && ( $installer::globals::pro )) || (( $pro eq "nonpro" ) && ( ! $installer::globals::pro ))) { $pro_is_good = 1; } - - if ( $pro_is_good ) - { - my $langlisthash = installer::converter::convert_stringlist_into_hash(\$langs, ","); - my $langstringhash = installer::converter::convert_stringlist_into_hash($languagestringref, "_"); - - my $not_included = 0; - foreach my $onelang ( keys %{$langlisthash} ) - { - if ( ! exists($langstringhash->{$onelang}) ) - { - $not_included = 1; - last; - } - } - - if ( ! $not_included ) - { - foreach my $onelanguage ( keys %{$langstringhash} ) - { - if ( ! exists($langlisthash->{$onelanguage}) ) - { - $not_included = 1; - last; - } - } - - if ( ! $not_included ) { $correct_database = 1; } - } - } - } - - return $correct_database; -} - -################################################################################# -# Searching for the path to the reference database for this special product. -################################################################################# - -sub get_databasename_from_list -{ - my ($filecontent, $languagestringref, $filename) = @_; - - my $databasepath = ""; - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - my $line = ${$filecontent}[$i]; - if ( $line =~ /^\s*$/ ) { next; } # empty line - if ( $line =~ /^\s*\#/ ) { next; } # comment line - - if ( $line =~ /^\s*(.+?)\s*\t+\s*(.+?)\s*\t+\s*(.+?)\s*\t+\s*(.+?)\s*$/ ) - { - my $product = $1; - my $pro = $2; - my $langs = $3; - my $path = $4; - - if (( $pro ne "pro" ) && ( $pro ne "nonpro" )) { installer::exiter::exit_program("ERROR: Wrong syntax in file: $filename. Only \"pro\" or \"nonpro\" allowed in column 1! Line: \"$line\"", "get_databasename_from_list"); } - - if ( correct_database($product, $pro, $langs, $languagestringref) ) - { - $databasepath = $path; - last; - } - } - else - { - installer::exiter::exit_program("ERROR: Wrong syntax in file: $filename! Line: \"$line\"", "get_databasename_from_list"); - } - } - - return $databasepath; -} - -################################################################################# -# Reading an existing database completely -################################################################################# - -sub readdatabase -{ - my ($allvariables, $languagestringref, $includepatharrayref) = @_; - - my $database = ""; - my $infoline = ""; - - if ( ! $allvariables->{'UPDATE_DATABASE_LISTNAME'} ) { installer::exiter::exit_program("ERROR: If \"UPDATE_DATABASE\" is set, \"UPDATE_DATABASE_LISTNAME\" is required.", "Main"); } - my $listfilename = $allvariables->{'UPDATE_DATABASE_LISTNAME'}; - - # Searching the list in the include pathes - my $listname = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$listfilename, $includepatharrayref, 1); - if ( $$listname eq "" ) { installer::exiter::exit_program("ERROR: List file not found: $listfilename !", "readdatabase"); } - my $completelistname = $$listname; - - # Reading list file - my $listfile = installer::files::read_file($completelistname); - - # Get name and path of reference database - my $databasename = get_databasename_from_list($listfile, $languagestringref, $completelistname); - - # If the correct database was not found, this is not necessarily an error. But in this case, this is not an update packaging process! - if (( $databasename ) && ( $databasename ne "" )) # This is an update packaging process! - { - $installer::globals::updatedatabase = 1; - installer::logger::print_message( "... update process, using database $databasename ...\n" ); - $infoline = "\nDatabase found in $completelistname: \"$databasename\"\n\n"; - # Saving in global variable - $installer::globals::updatedatabasepath = $databasename; - } - else - { - $infoline = "\nNo database found in $completelistname. This is no update process!\n\n"; - } - push( @installer::globals::logfileinfo, $infoline); - - if ( $installer::globals::updatedatabase ) - { - if ( ! -f $databasename ) { installer::exiter::exit_program("ERROR: Could not find reference database: $databasename!", "readdatabase"); } - - my $msifilename = $databasename; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$msifilename); - - installer::logger::include_timestamp_into_logfile("Performance Info: readdatabase start"); - - # create directory for unpacking - my $databasedir = installer::systemactions::create_directories("database", $languagestringref); - - # copy database - my $fulldatabasepath = $databasedir . $installer::globals::separator . $msifilename; - installer::systemactions::copy_one_file($databasename, $fulldatabasepath); - - installer::logger::include_timestamp_into_logfile("Performance Info: readdatabase: before extracting tables"); - - # extract all tables from database - extract_all_tables_from_msidatabase($fulldatabasepath, $databasedir); - - installer::logger::include_timestamp_into_logfile("Performance Info: readdatabase: before reading tables"); - - # read all tables - $database = read_all_tables_from_msidatabase($databasedir); - - # Test output: - - # foreach my $key1 ( keys %{$database} ) - # { - # print "Test1: $key1\n"; - # foreach my $key2 ( keys %{$database->{$key1}} ) - # { - # print "\tTest2: $key2\n"; - # foreach my $key3 ( keys %{$database->{$key1}->{$key2}} ) - # { - # print "\t\tTest3: $key3: $database->{$key1}->{$key2}->{$key3}\n"; - # } - # } - # } - - # Example: File table - - # my $filetable = $database->{'File'}; - # foreach my $linenumber ( keys %{$filetable} ) - # { - # print "Test Filenumber: $linenumber\n"; - # foreach my $key ( keys %{$filetable->{$linenumber}} ) - # { - # print "\t\tTest: $key: $filetable->{$linenumber}->{$key}\n"; - # } - # } - - # Example: Searching for ProductCode in table Property - - # my $column1 = "Property"; - # my $column2 = "Value"; - # my $searchkey = "ProductCode"; - # my $propertytable = $database->{'Property'}; - # foreach my $linenumber ( keys %{$propertytable} ) - # { - # if ( $propertytable->{$linenumber}->{$column1} eq $searchkey ) - # { - # print("Test: $searchkey : $propertytable->{$linenumber}->{$column2}\n"); - # } - # } - - installer::logger::include_timestamp_into_logfile("Performance Info: readdatabase end"); - } - - return $database; -} - -################################################################################# -# Files can be included in merge modules. This is also important for update. -################################################################################# - -sub readmergedatabase -{ - my ( $mergemodules, $languagestringref, $includepatharrayref ) = @_; - - installer::logger::include_timestamp_into_logfile("Performance Info: readmergedatabase start"); - - my $mergemoduledir = installer::systemactions::create_directories("mergedatabase", $languagestringref); - - my %allmergefiles = (); - - $installer::globals::mergemodulenumber = $#{$mergemodules} + 1; - - foreach my $mergemodule ( @{$mergemodules} ) - { - my $filename = $mergemodule->{'Name'}; - my $mergefile = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$filename, $includepatharrayref, 1); - - if ( $$mergefile eq "" ) { installer::exiter::exit_program("ERROR: msm file not found: $filename !", "readmergedatabase"); } - my $completesource = $$mergefile; - - my $mergegid = $mergemodule->{'gid'}; - my $workdir = $mergemoduledir . $installer::globals::separator . $mergegid; - if ( ! -d $workdir ) { installer::systemactions::create_directory($workdir); } - - my $completedest = $workdir . $installer::globals::separator . $filename; - installer::systemactions::copy_one_file($completesource, $completedest); - if ( ! -f $completedest ) { installer::exiter::exit_program("ERROR: msm file not found: $completedest !", "readmergedatabase"); } - - # extract all tables from database - extract_all_tables_from_msidatabase($completedest, $workdir); - - # read all tables - my $onemergefile = read_all_tables_from_msidatabase($workdir); - - $allmergefiles{$mergegid} = $onemergefile; - } - - foreach my $mergefilegid ( keys %allmergefiles ) - { - my $onemergefile = $allmergefiles{$mergefilegid}; - my $filetable = $onemergefile->{'File'}; - - foreach my $linenumber ( keys %{$filetable} ) - { - # Collecting all files from merge modules in global hash - $installer::globals::mergemodulefiles{$filetable->{$linenumber}->{'File'}} = 1; - } - } - - installer::logger::include_timestamp_into_logfile("Performance Info: readmergedatabase end"); -} - -################################################################################# -# Creating several useful hashes from old database -################################################################################# - -sub create_database_hashes -{ - my ( $database ) = @_; - - # 1. Hash ( Component -> UniqueFileName ), required in File table. - # Read from File table. - - my %uniquefilename = (); - my %allupdatesequences = (); - my %allupdatecomponents = (); - my %allupdatefileorder = (); - my %allupdatecomponentorder = (); - my %revuniquefilename = (); - my %revshortfilename = (); - my %shortdirname = (); - my %componentid = (); - my %componentidkeypath = (); - my %alloldproperties = (); - my %allupdatelastsequences = (); - my %allupdatediskids = (); - - my $filetable = $database->{'File'}; - - foreach my $linenumber ( keys %{$filetable} ) - { - my $comp = $filetable->{$linenumber}->{'Component_'}; - my $uniquename = $filetable->{$linenumber}->{'File'}; - my $filename = $filetable->{$linenumber}->{'FileName'}; - my $sequence = $filetable->{$linenumber}->{'Sequence'}; - - my $shortname = ""; - if ( $filename =~ /^\s*(.*?)\|\s*(.*?)\s*$/ ) - { - $shortname = $1; - $filename = $2; - } - - # unique is the combination of $component and $filename - my $key = "$comp/$filename"; - - if ( exists($uniquefilename{$key}) ) { installer::exiter::exit_program("ERROR: Component/FileName \"$key\" is not unique in table \"File\" !", "create_database_hashes"); } - - my $value = $uniquename; - if ( $shortname ne "" ) { $value = "$uniquename;$shortname"; } - $uniquefilename{$key} = $value; # saving the unique keys and short names in hash - - # Saving reverse keys too - $revuniquefilename{$uniquename} = $key; - if ( $shortname ne "" ) { $revshortfilename{$shortname} = $key; } - - # Saving Sequences for unique names (and also components) - $allupdatesequences{$uniquename} = $sequence; - $allupdatecomponents{$uniquename} = $comp; - - # Saving unique names and components for sequences - $allupdatefileorder{$sequence} = $uniquename; - $allupdatecomponentorder{$sequence} = $comp; - } - - # 2. Hash, required in Directory table. - - my $dirtable = $database->{'Directory'}; - - foreach my $linenumber ( keys %{$dirtable} ) - { - my $dir = $dirtable->{$linenumber}->{'Directory'}; # this is a unique name - my $defaultdir = $dirtable->{$linenumber}->{'DefaultDir'}; - - my $shortname = ""; - if ( $defaultdir =~ /^\s*(.*?)\|\s*(.*?)\s*$/ ) - { - $shortname = $1; - $shortdirname{$dir} = $shortname; # collecting only the short names - } - } - - # 3. Hash, collecting info from Component table. - # ComponentID and KeyPath have to be reused. - - my $comptable = $database->{'Component'}; - - foreach my $linenumber ( keys %{$comptable} ) - { - my $comp = $comptable->{$linenumber}->{'Component'}; - my $compid = $comptable->{$linenumber}->{'ComponentId'}; - my $keypath = $comptable->{$linenumber}->{'KeyPath'}; - - $componentid{$comp} = $compid; - $componentidkeypath{$comp} = $keypath; - } - - # 4. Hash, property table, required for ProductCode and Installlocation. - - my $proptable = $database->{'Property'}; - - foreach my $linenumber ( keys %{$proptable} ) - { - my $prop = $proptable->{$linenumber}->{'Property'}; - my $value = $proptable->{$linenumber}->{'Value'}; - - $alloldproperties{$prop} = $value; - } - - # 5. Media table, getting last sequence - - my $mediatable = $database->{'Media'}; - $installer::globals::updatelastsequence = 0; - - foreach my $linenumber ( keys %{$mediatable} ) - { - my $cabname = $mediatable->{$linenumber}->{'Cabinet'}; - my $lastsequence = $mediatable->{$linenumber}->{'LastSequence'}; - my $diskid = $mediatable->{$linenumber}->{'DiskId'}; - $allupdatelastsequences{$cabname} = $lastsequence; - $allupdatediskids{$cabname} = $diskid; - - if ( $lastsequence > $installer::globals::updatelastsequence ) { $installer::globals::updatelastsequence = $lastsequence; } - } - - $installer::globals::updatesequencecounter = $installer::globals::updatelastsequence; - - return (\%uniquefilename, \%revuniquefilename, \%revshortfilename, \%allupdatesequences, \%allupdatecomponents, \%allupdatefileorder, \%allupdatecomponentorder, \%shortdirname, \%componentid, \%componentidkeypath, \%alloldproperties, \%allupdatelastsequences, \%allupdatediskids); -} - - -1; diff --git a/solenv/bin/modules/installer/windows/upgrade.pm b/solenv/bin/modules/installer/windows/upgrade.pm deleted file mode 100644 index 69041664b..000000000 --- a/solenv/bin/modules/installer/windows/upgrade.pm +++ /dev/null @@ -1,168 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::windows::upgrade; - -use installer::exiter; -use installer::files; -use installer::globals; -use installer::windows::idtglobal; - -#################################################################################### -# Creating the file Upgrade.idt dynamically -# Content: -# UpgradeCode VersionMin VersionMax Language Attributes Remove ActionProperty -#################################################################################### - -sub create_upgrade_table -{ - my ($basedir, $allvariableshashref) = @_; - - my @upgradetable = (); - - # fix for problematic OOo 1.9 versions - my $include_ooo_fix = 0; - my $ooomaxnew = ""; - if (($installer::globals::product =~ /^\s*OpenOffice/i ) && ( ! ( $installer::globals::product =~ /SDK/i )) && ( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack )) - { - $include_ooo_fix = 1; - $ooomaxnew = "34.0.0"; - } - - installer::windows::idtglobal::write_idt_header(\@upgradetable, "upgrade"); - - # Setting also $installer::globals::msimajorproductversion, that is for example "3.0.0", to differ between old products for OOo 2.x and - # older products from OOo 3.x. The latter must be removed always, the removal of the first is controlled with a checkbox. - my $newline = $installer::globals::upgradecode . "\t" . "\t" . $installer::globals::msimajorproductversion . "\t" . "\t" . "0" . "\t" . "\t" . "OLDPRODUCTS" . "\n"; - push(@upgradetable, $newline); - - # Setting all products, that must be removed. - # $newline = $installer::globals::upgradecode . "\t" . $installer::globals::msimajorproductversion . "\t" . $installer::globals::msiproductversion . "\t" . "\t" . "257" . "\t" . "\t" . "OLDPRODUCTSSAMEMAJOR" . "\n"; - $newline = $installer::globals::upgradecode . "\t" . $installer::globals::msimajorproductversion . "\t" . $installer::globals::msiproductversion . "\t" . "\t" . "769" . "\t" . "\t" . "OLDPRODUCTSSAMEMAJOR" . "\n"; - push(@upgradetable, $newline); - - if ( ! $installer::globals::patch ) - { - # preventing downgrading - $newline = $installer::globals::upgradecode . "\t" . $installer::globals::msiproductversion . "\t" . $ooomaxnew . "\t" . "\t" . "2" . "\t" . "\t" . "NEWPRODUCTS" . "\n"; - push(@upgradetable, $newline); - - # $newline = $installer::globals::upgradecode . "\t" . $installer::globals::msiproductversion . "\t" . $ooomaxnew . "\t" . "\t" . "258" . "\t" . "\t" . "SAMEPRODUCTS" . "\n"; - # push(@upgradetable, $newline); - - if ( $include_ooo_fix ) - { - $newline = $installer::globals::upgradecode . "\t" . "35.0.0" . "\t" . "36.0.0" . "\t" . "\t" . "1" . "\t" . "\t" . "OLDPRODUCTS2" . "\n"; - push(@upgradetable, $newline); - } - - # if (( $allvariableshashref->{'PATCHUPGRADECODE'} ) && ( ! $installer::globals::languagepack )) - # { - # $newline = $allvariableshashref->{'PATCHUPGRADECODE'} . "\t" . "\t" . $installer::globals::msiproductversion . "\t" . "\t" . "1" . "\t" . "\t" . "OLDPRODUCTSPATCH" . "\n"; - # push(@upgradetable, $newline); - # - # $newline = $allvariableshashref->{'PATCHUPGRADECODE'} . "\t" . $installer::globals::msiproductversion . "\t" . "\t" . "\t" . "2" . "\t" . "\t" . "NEWPRODUCTSPATCH" . "\n"; - # push(@upgradetable, $newline); - # - # $newline = $allvariableshashref->{'PATCHUPGRADECODE'} . "\t" . $installer::globals::msiproductversion . "\t" . "\t" . "\t" . "258" . "\t" . "\t" . "SAMEPRODUCTSPATCH" . "\n"; - # push(@upgradetable, $newline); - # } - - # also searching for the beta - - if (( $allvariableshashref->{'BETAUPGRADECODE'} ) && ( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack )) - { - $newline = $allvariableshashref->{'BETAUPGRADECODE'} . "\t" . "1.0" . "\t" . "\t" . "\t" . "1" . "\t" . "\t" . "BETAPRODUCTS" . "\n"; - push(@upgradetable, $newline); - } - - # also searching for the stub - - if (( $allvariableshashref->{'STUBUPGRADECODE'} ) && ( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack )) - { - $newline = $allvariableshashref->{'STUBUPGRADECODE'} . "\t" . "1.0" . "\t" . "\t" . "\t" . "1" . "\t" . "\t" . "STUBPRODUCTS" . "\n"; - push(@upgradetable, $newline); - } - - # searching for all older patches and languagepacks (defined in a extra file) - - if (( $allvariableshashref->{'REMOVE_UPGRADE_CODE_FILE'} ) && ( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack )) - { - my $filename = $allvariableshashref->{'REMOVE_UPGRADE_CODE_FILE'}; - my $langpackcodefilename = $installer::globals::idttemplatepath . $installer::globals::separator . $filename; - if ( ! -f $langpackcodefilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$langpackcodefilename\".", "create_upgrade_table"); } - - my $filecontent = installer::files::read_file($langpackcodefilename); - my $newlines = analyze_file_for_upgrade_table($filecontent); - - for ( my $i = 0; $i <= $#{$newlines}; $i++ ) { push(@upgradetable, ${$newlines}[$i]); } - } - } - - # No upgrade for Beta versions! - - if (( $allvariableshashref->{'PRODUCTEXTENSION'} eq "Beta" ) && ( ! $installer::globals::patch ) && ( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack )) - { - @upgradetable = (); - installer::windows::idtglobal::write_idt_header(\@upgradetable, "upgrade"); - my $infoline = "Beta product -> empty Upgrade table\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - # Saving the file - - my $upgradetablename = $basedir . $installer::globals::separator . "Upgrade.idt"; - installer::files::save_file($upgradetablename ,\@upgradetable); - my $infoline = "Created idt file: $upgradetablename\n"; - push(@installer::globals::logfileinfo, $infoline); -} - -############################################################## -# Reading the file with UpgradeCodes of old products, -# that can be removed, if the user wants to remove them. -############################################################## - -sub analyze_file_for_upgrade_table -{ - my ($filecontent) = @_; - - my @allnewlines = (); - - for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) - { - my $line = ${$filecontent}[$i]; - if ( $line =~ /^\s*$/ ) { next; } # empty lines can be ignored - if ( $line =~ /^\s*\#/ ) { next; } # comment lines starting with a hash - - if ( $line =~ /^(.*)\t(.*)\t(.*)\t(.*)\t(.*)\t(.*)\t(.*)$/ ) { push(@allnewlines, $line); } - else { installer::exiter::exit_program("ERROR: Wrong syntax in file for upgrade table", "analyze_file_for_upgrade_table"); } - } - - return \@allnewlines; -} - -1; diff --git a/solenv/bin/modules/installer/worker.pm b/solenv/bin/modules/installer/worker.pm deleted file mode 100644 index af571dc3d..000000000 --- a/solenv/bin/modules/installer/worker.pm +++ /dev/null @@ -1,3374 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::worker; - -use Cwd; -use File::Copy; -use File::stat; -use File::Temp qw(tmpnam); -use File::Path; -use installer::control; -use installer::converter; -use installer::existence; -use installer::exiter; -use installer::files; -use installer::globals; -use installer::logger; -use installer::pathanalyzer; -use installer::scpzipfiles; -use installer::scriptitems; -use installer::sorter; -use installer::systemactions; -use installer::windows::language; - -##################################################################### -# Unpacking all files ending with tar.gz in a specified directory -##################################################################### - -sub unpack_all_targzfiles_in_directory -{ - my ( $directory ) = @_; - - installer::logger::include_header_into_logfile("Unpacking tar.gz files:"); - - installer::logger::print_message( "... unpacking tar.gz files ... \n" ); - - my $localdirectory = $directory . $installer::globals::separator . "packages"; - my $alltargzfiles = installer::systemactions::find_file_with_file_extension("tar.gz", $localdirectory); - - for ( my $i = 0; $i <= $#{$alltargzfiles}; $i++ ) - { - my $onefile = $localdirectory . $installer::globals::separator . ${$alltargzfiles}[$i]; - - my $systemcall = "cd $localdirectory; cat ${$alltargzfiles}[$i] \| gunzip \| tar -xf -"; - $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } -} - -######################################### -# Copying installation sets to ship -######################################### - -sub copy_install_sets_to_ship -{ - my ( $destdir, $shipinstalldir ) = @_; - - installer::logger::include_header_into_logfile("Copying installation set to ship:"); - - my $dirname = $destdir; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$dirname); - $dirname = $dirname . "_inprogress"; - my $localshipinstalldir = $shipinstalldir . $installer::globals::separator . $dirname; - if ( ! -d $localshipinstalldir ) { installer::systemactions::create_directory_structure($localshipinstalldir); } - - # copy installation set to /ship ($localshipinstalldir) - installer::logger::print_message( "... copy installation set from " . $destdir . " to " . $localshipinstalldir . "\n" ); - installer::systemactions::copy_complete_directory($destdir, $localshipinstalldir); - - # unpacking the tar.gz file for Solaris - if ( $installer::globals::issolarisbuild ) { unpack_all_targzfiles_in_directory($localshipinstalldir); } - - $localshipinstalldir = installer::systemactions::rename_string_in_directory($localshipinstalldir, "_inprogress", ""); - - return $localshipinstalldir; -} - -######################################### -# Copying installation sets to ship -######################################### - -sub link_install_sets_to_ship -{ - my ( $destdir, $shipinstalldir ) = @_; - - installer::logger::include_header_into_logfile("Linking installation set to ship:"); - - my $infoline = "... destination directory: $shipinstalldir ...\n"; - installer::logger::print_message( $infoline ); - push( @installer::globals::logfileinfo, $infoline); - - if ( ! -d $shipinstalldir) - { - $infoline = "Creating directory: $shipinstalldir\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::systemactions::create_directory_structure($shipinstalldir); - $infoline = "Created directory: $shipinstalldir\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - my $dirname = $destdir; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$dirname); - - my $localshipinstalldir = $shipinstalldir . $installer::globals::separator . $dirname; - - # link installation set to /ship ($localshipinstalldir) - installer::logger::print_message( "... linking installation set from " . $destdir . " to " . $localshipinstalldir . "\n" ); - - my $systemcall = "ln -s $destdir $localshipinstalldir"; - - $returnvalue = system($systemcall); - - $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not create link \"$localshipinstalldir\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Created link \"$localshipinstalldir\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return $localshipinstalldir; -} - -######################################### -# Create checksum file -######################################### - -sub make_checksum_file -{ - my ( $filesref, $includepatharrayref ) = @_; - - my @checksum = (); - - my $checksumfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$installer::globals::checksumfile, $includepatharrayref, 1); - if ( $$checksumfileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find file $installer::globals::checksumfile !", "make_checksum_file"); } - - my $systemcall = "$$checksumfileref"; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - $systemcall = $systemcall . " " . $onefile->{'sourcepath'}; # very very long systemcall - - if ((( $i > 0 ) && ( $i%100 == 0 )) || ( $i == $#{$filesref} )) # limiting to 100 files - { - $systemcall = $systemcall . " \|"; - - my @localchecksum = (); - open (CHECK, "$systemcall"); - @localchecksum = <CHECK>; - close (CHECK); - - for ( my $j = 0; $j <= $#localchecksum; $j++ ) { push(@checksum, $localchecksum[$j]); } - - $systemcall = "$$checksumfileref"; # reset the system call - } - } - - return \@checksum; -} - -######################################### -# Saving the checksum file -######################################### - -sub save_checksum_file -{ - my ($current_install_number, $installchecksumdir, $checksumfile) = @_; - - my $numberedchecksumfilename = $installer::globals::checksumfilename; - $numberedchecksumfilename =~ s/\./_$current_install_number\./; # checksum.txt -> checksum_01.txt - installer::files::save_file($installchecksumdir . $installer::globals::separator . $numberedchecksumfilename, $checksumfile); -} - -################################################# -# Writing some global information into -# the list of files without flag PATCH -################################################# - -sub write_nopatchlist_header -{ - my ( $content ) = @_; - - my @header = (); - my $infoline = "This is a list of files, that are defined in scp-projects without\n"; - push(@header, $infoline); - $infoline = "flag \"PATCH\". Important: This does not mean in any case, that \n"; - push(@header, $infoline); - $infoline = "this files are included into or excluded from a patch. \n\n"; - push(@header, $infoline); - $infoline = "Exception Linux: A patch rpm is a complete rpm. This means that all \n"; - push(@header, $infoline); - $infoline = "files are included into a patch rpm, if only one file of the rpm has the \n"; - push(@header, $infoline); - $infoline = "style \"PATCH\". \n\n"; - push(@header, $infoline); - - for ( my $i = 0; $i <= $#header; $i++ ) { push(@{$content},$header[$i]); } -} - -################################################# -# Creating the content of the list of files -# without flag PATCH. -# All files are saved in -# @{$installer::globals::nopatchfilecollector} -################################################# - -sub create_nopatchlist -{ - my @content =(); - - write_nopatchlist_header(\@content); - - for ( my $i = 0; $i <= $#{$installer::globals::nopatchfilecollector}; $i++ ) - { - my $onefile = ${$installer::globals::nopatchfilecollector}[$i]; - my $oneline = $onefile->{'destination'}; - if ( $onefile->{'zipfilename'} ) { $oneline = $oneline . " (" . $onefile->{'zipfilename'} . ")"; } - $oneline = $oneline . "\n"; - push(@content, $oneline); - } - - return \@content; -} - -######################################### -# Saving the patchlist file -######################################### - -sub save_patchlist_file -{ - my ($installlogdir, $patchlistfilename) = @_; - - my $installpatchlistdir = installer::systemactions::create_directory_next_to_directory($installlogdir, "patchlist"); - $patchlistfilename =~ s/log\_/patchfiles\_/; - $patchlistfilename =~ s/\.log/\.txt/; - installer::files::save_file($installpatchlistdir . $installer::globals::separator . $patchlistfilename, \@installer::globals::patchfilecollector); - installer::logger::print_message( "... creating patchlist file $patchlistfilename \n" ); - - if (( $installer::globals::patch ) && ( ! $installer::globals::creating_windows_installer_patch )) # only for non-Windows patches - { - $patchlistfilename =~ s/patchfiles\_/nopatchfiles\_/; - my $nopatchlist = create_nopatchlist(); - installer::files::save_file($installpatchlistdir . $installer::globals::separator . $patchlistfilename, $nopatchlist); - installer::logger::print_message( "... creating patch exclusion file $patchlistfilename \n" ); - } - -} - -############################################################### -# Removing all directories of a special language -# in the directory $basedir -############################################################### - -sub remove_old_installation_sets -{ - my ($basedir) = @_; - - installer::logger::print_message( "... removing old installation directories ...\n" ); - - my $removedir = $basedir; - - if ( -d $removedir ) { installer::systemactions::remove_complete_directory($removedir, 1); } - - # looking for non successful old installation sets - - $removedir = $basedir . "_witherror"; - if ( -d $removedir ) { installer::systemactions::remove_complete_directory($removedir, 1); } - - $removedir = $basedir . "_inprogress"; - if ( -d $removedir ) { installer::systemactions::remove_complete_directory($removedir, 1); } - - # finally the $basedir can be created empty - - if ( $installer::globals::localinstalldirset ) { installer::systemactions::create_directory_structure($basedir); } - - installer::systemactions::create_directory($basedir); -} - -############################################################### -# Removing all non successful installation sets on ship -############################################################### - -sub remove_old_ship_installation_sets -{ - my ($fulldir, $counter) = @_; - - installer::logger::print_message( "... removing old installation directories ...\n" ); - - my $basedir = $fulldir; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir); - - # collecting all directories next to the new installation directory - my $alldirs = installer::systemactions::get_all_directories($basedir); - - if ( $fulldir =~ /^\s*(.*?inprogress\-)(\d+)(.*?)\s*$/ ) - { - my $pre_inprogress = $1; # $pre still contains "inprogress" - my $number = $2; - my $post = $3; - my $pre_witherror = $pre_inprogress; - $pre_witherror =~ s/inprogress/witherror/; - - for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) - { - if ( ${$alldirs}[$i] eq $fulldir ) { next; } # do not delete the newly created directory - - if ( ${$alldirs}[$i] =~ /^\s*\Q$pre_inprogress\E\d+\Q$post\E\s*$/ ) # removing old "inprogress" directories - { - installer::systemactions::remove_complete_directory(${$alldirs}[$i], 1); - } - - if ( ${$alldirs}[$i] =~ /^\s*\Q$pre_witherror\E\d+\Q$post\E\s*$/ ) # removing old "witherror" directories - { - installer::systemactions::remove_complete_directory(${$alldirs}[$i], 1); - } - } - } -} - -############################################################### -# Creating the installation directory structure -############################################################### - -sub create_installation_directory -{ - my ($shipinstalldir, $languagestringref, $current_install_number_ref) = @_; - - my $installdir = ""; - - my $languageref = $languagestringref; - - if ( $installer::globals::updatepack ) - { - $installdir = $shipinstalldir; - installer::systemactions::create_directory_structure($installdir); - $$current_install_number_ref = installer::systemactions::determine_maximum_number($installdir, $languageref); - $installdir = installer::systemactions::rename_string_in_directory($installdir, "number", $$current_install_number_ref); - remove_old_ship_installation_sets($installdir); - } - else - { - $installdir = installer::systemactions::create_directories("install", $languageref); - installer::logger::print_message( "... creating installation set in $installdir ...\n" ); - remove_old_installation_sets($installdir); - my $inprogressinstalldir = $installdir . "_inprogress"; - installer::systemactions::rename_directory($installdir, $inprogressinstalldir); - $installdir = $inprogressinstalldir; - } - - $installer::globals::saveinstalldir = $installdir; # saving directory globally, in case of exiting - - return $installdir; -} - -############################################################### -# Analyzing and creating the log file -############################################################### - -sub analyze_and_save_logfile -{ - my ($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number) = @_; - - my $is_success = 1; - my $finalinstalldir = ""; - - installer::logger::print_message( "... checking log file " . $loggingdir . $installer::globals::logfilename . "\n" ); - - my $contains_error = installer::control::check_logfile(\@installer::globals::logfileinfo); - - # Dependent from the success, the installation directory can be renamed. - - if ( $contains_error ) - { - my $errordir = installer::systemactions::rename_string_in_directory($installdir, "_inprogress", "_witherror"); - # Error output to STDERR - for ( my $j = 0; $j <= $#installer::globals::errorlogfileinfo; $j++ ) - { - my $line = $installer::globals::errorlogfileinfo[$j]; - $line =~ s/\s*$//g; - installer::logger::print_error( $line ); - } - $is_success = 0; - - $finalinstalldir = $errordir; - } - else - { - my $destdir = ""; - - if ( $installer::globals::updatepack ) - { - if ( $installdir =~ /_download_inprogress/ ) { $destdir = installer::systemactions::rename_string_in_directory($installdir, "_download_inprogress", "_download"); } - elsif ( $installdir =~ /_jds_inprogress/ ) { $destdir = installer::systemactions::rename_string_in_directory($installdir, "_jds_inprogress", "_jds"); } - elsif ( $installdir =~ /_msp_inprogress/ ) { $destdir = installer::systemactions::rename_string_in_directory($installdir, "_msp_inprogress", "_msp"); } - else - { - if ( $installdir =~ /_packed/ ) { $destdir = installer::systemactions::rename_string_in_directory($installdir, "_inprogress", ""); } - else { $destdir = installer::systemactions::rename_string_in_directory($installdir, "_inprogress", "_packed"); } - } - } - else - { - $destdir = installer::systemactions::rename_string_in_directory($installdir, "_inprogress", ""); - } - - $finalinstalldir = $destdir; - } - - # Saving the logfile in the log file directory and additionally in a log directory in the install directory - - my $numberedlogfilename = $installer::globals::logfilename; - if ( $installer::globals::updatepack ) { $numberedlogfilename =~ s /log_/log_$current_install_number\_/; } - installer::logger::print_message( "... creating log file $numberedlogfilename \n" ); - installer::files::save_file($loggingdir . $numberedlogfilename, \@installer::globals::logfileinfo); - installer::files::save_file($installlogdir . $installer::globals::separator . $numberedlogfilename, \@installer::globals::logfileinfo); - - # Saving the checksumfile in a checksum directory in the install directory - # installer::worker::save_checksum_file($current_install_number, $installchecksumdir, $checksumfile); - - # Saving the list of patchfiles in a patchlist directory in the install directory - if (( $installer::globals::patch ) || ( $installer::globals::creating_windows_installer_patch )) { installer::worker::save_patchlist_file($installlogdir, $numberedlogfilename); } - - if ( $installer::globals::creating_windows_installer_patch ) { $installer::globals::creating_windows_installer_patch = 0; } - - # Exiting the packaging process, if an error occurred. - # This is important, to get an error code "-1", if an error was found in the log file, - # that did not break the packaging process - - if ( ! $is_success) { installer::exiter::exit_program("ERROR: Found an error in the logfile. Packaging failed.", "analyze_and_save_logfile"); } - - return ($is_success, $finalinstalldir); -} - -############################################################### -# Analyzing and creating the log file -############################################################### - -sub save_logfile_after_linking -{ - my ($loggingdir, $installlogdir, $current_install_number) = @_; - - # Saving the logfile in the log file directory and additionally in a log directory in the install directory - my $numberedlogfilename = $installer::globals::logfilename; - if ( $installer::globals::updatepack ) { $numberedlogfilename =~ s /log_/log_$current_install_number\_/; } - installer::logger::print_message( "... creating log file $numberedlogfilename \n" ); - installer::files::save_file($loggingdir . $numberedlogfilename, \@installer::globals::logfileinfo); - installer::files::save_file($installlogdir . $installer::globals::separator . $numberedlogfilename, \@installer::globals::logfileinfo); -} - -############################################################### -# Removing all directories that are saved in the -# global directory @installer::globals::removedirs -############################################################### - -sub clean_output_tree -{ - installer::logger::print_message( "... cleaning the output tree ...\n" ); - - for ( my $i = 0; $i <= $#installer::globals::removedirs; $i++ ) - { - if ( -d $installer::globals::removedirs[$i] ) - { - installer::logger::print_message( "... removing directory $installer::globals::removedirs[$i] ...\n" ); - installer::systemactions::remove_complete_directory($installer::globals::removedirs[$i], 1); - } - } - - # Last try to remove the ship test directory - - if ( $installer::globals::shiptestdirectory ) - { - if ( -d $installer::globals::shiptestdirectory ) - { - my $infoline = "Last try to remove $installer::globals::shiptestdirectory . \n"; - push(@installer::globals::logfileinfo, $infoline); - my $systemcall = "rmdir $installer::globals::shiptestdirectory"; - my $returnvalue = system($systemcall); - } - } -} - -############################################################### -# Removing all directories that are saved in the -# global directory @installer::globals::jdsremovedirs -############################################################### - -sub clean_jds_temp_dirs -{ - installer::logger::print_message( "... cleaning jds directories ...\n" ); - - for ( my $i = 0; $i <= $#installer::globals::jdsremovedirs; $i++ ) - { - if ( -d $installer::globals::jdsremovedirs[$i] ) - { - installer::logger::print_message( "... removing directory $installer::globals::jdsremovedirs[$i] ...\n" ); - installer::systemactions::remove_complete_directory($installer::globals::jdsremovedirs[$i], 1); - } - } -} - -########################################################### -# Setting one language in the language independent -# array of include paths with $(LANG) -########################################################### - -sub get_language_specific_include_pathes -{ - my ( $patharrayref, $onelanguage ) = @_; - - my @patharray = (); - - for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) - { - my $line = ${$patharrayref}[$i]; - $line =~ s/\$\(LANG\)/$onelanguage/g; - push(@patharray ,$line); - } - - return \@patharray; -} - -############################################################## -# Returning the first item with a defined flag -############################################################## - -sub return_first_item_with_special_flag -{ - my ($itemsref, $flag) = @_; - - my $firstitem = ""; - - for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) - { - my $oneitem = ${$itemsref}[$i]; - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'} }; - - if ( $styles =~ /\b$flag\b/ ) - { - $firstitem = $oneitem; - last; - } - } - - return $firstitem; -} - -############################################################## -# Collecting all items with a defined flag -############################################################## - -sub collect_all_items_with_special_flag -{ - my ($itemsref, $flag) = @_; - - my @allitems = (); - - for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) - { - my $oneitem = ${$itemsref}[$i]; - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'} }; - - if ( $styles =~ /\b$flag\b/ ) - { - push( @allitems, $oneitem ); - } - } - - return \@allitems; -} - -############################################################## -# Collecting all files without patch flag in -# $installer::globals::nopatchfilecollector -############################################################## - -sub collect_all_files_without_patch_flag -{ - my ($filesref) = @_; - - my $newfiles = collect_all_items_without_special_flag($filesref, "PATCH"); - - for ( my $i = 0; $i <= $#{$newfiles}; $i++ ) { push(@{$installer::globals::nopatchfilecollector}, ${$newfiles}[$i]); } -} - -############################################################## -# Collecting all items without a defined flag -############################################################## - -sub collect_all_items_without_special_flag -{ - my ($itemsref, $flag) = @_; - - my @allitems = (); - - for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) - { - my $oneitem = ${$itemsref}[$i]; - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'} }; - - if ( !( $styles =~ /\b$flag\b/ )) - { - push( @allitems, $oneitem ); - } - } - - return \@allitems; -} - -############################################################## -# Removing all items with a defined flag from collector -############################################################## - -sub remove_all_items_with_special_flag -{ - my ($itemsref, $flag) = @_; - - my @allitems = (); - - for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) - { - my $oneitem = ${$itemsref}[$i]; - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'} }; - if ( $styles =~ /\b$flag\b/ ) - { - my $infoline = "Attention: Removing from collector: $oneitem->{'Name'} !\n"; - push( @installer::globals::logfileinfo, $infoline); - if ( $flag eq "BINARYTABLE_ONLY" ) { push(@installer::globals::binarytableonlyfiles, $oneitem); } - next; - } - push( @allitems, $oneitem ); - } - - return \@allitems; -} - -########################################################### -# Mechanism for simple installation without packing -########################################################### - -sub install_simple ($$$$$$) -{ - my ($packagename, $languagestring, $directoriesarray, $filesarray, $linksarray, $unixlinksarray) = @_; - - # locate GNU cp on the system - my $gnucp = 'cp'; - if ( $ENV{'GNUCOPY'} ) { $gnucp = $ENV{'GNUCOPY'}; } - my $copyopts = '-af'; - $copyopts = '-PpRf' unless ( $ENV{'GNUCOPY'} ); # if not gnucopy, assume POSIX copy - - installer::logger::print_message( "... installing module $packagename ...\n" ); - - my $destdir = $installer::globals::destdir; - my @lines = (); - - installer::logger::print_message( "DestDir: $destdir \n" ); - installer::logger::print_message( "Rootpath: $installer::globals::rootpath \n" ); - - `mkdir -p $destdir` if $destdir ne ""; - `mkdir -p $destdir$installer::globals::rootpath`; - - # Create Directories - for ( my $i = 0; $i <= $#{$directoriesarray}; $i++ ) - { - my $onedir = ${$directoriesarray}[$i]; - my $dir = ""; - - if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; } - - if ((!($dir =~ /\bPREDEFINED_/ )) || ( $dir =~ /\bPREDEFINED_PROGDIR\b/ )) - { - my $hostname = $onedir->{'HostName'}; - - # ignore '.' subdirectories - next if ( $hostname =~ m/\.$/ ); - # remove './' from the path - $hostname =~ s/\.\///g; - - # printf "mkdir $destdir$hostname\n"; - mkdir $destdir . $hostname; - push @lines, "%dir " . $hostname . "\n"; - } - } - - for ( my $i = 0; $i <= $#{$filesarray}; $i++ ) - { - my $onefile = ${$filesarray}[$i]; - my $unixrights = $onefile->{'UnixRights'}; - my $destination = $onefile->{'destination'}; - my $sourcepath = $onefile->{'sourcepath'}; - - # This is necessary to install SDK that includes files with $ in its name - # Otherwise, the following shell commands does not work and the file list - # is not correct - $destination =~ s/\$\$/\$/; - $sourcepath =~ s/\$\$/\$/; - - # remove './' from the path - $sourcepath =~ s/\.\///g; - $destination =~ s/\.\///g; - - push @lines, "$destination\n"; - if(-d "$destdir$destination"){ - rmtree("$destdir$destination"); - } - if(-e "$destdir$destination") { - unlink "$destdir$destination"; - } - - copy ("$sourcepath", "$destdir$destination") || die "Can't copy file: $sourcepath -> $destdir$destination $!"; - my $sourcestat = stat($sourcepath); - utime ($sourcestat->atime, $sourcestat->mtime, "$destdir$destination"); - chmod (oct($unixrights), "$destdir$destination") || die "Can't change permissions: $!"; - push @lines, "$destination\n"; - } - - for ( my $i = 0; $i <= $#{$linksarray}; $i++ ) - { - my $onelink = ${$linksarray}[$i]; - my $destination = $onelink->{'destination'}; - my $destinationfile = $onelink->{'destinationfile'}; - - if(-e "$destdir$destination") { - unlink "$destdir$destination"; - } - symlink ("$destinationfile", "$destdir$destination") || die "Can't create symlink: $!"; - push @lines, "$destination\n"; - } - - for ( my $i = 0; $i <= $#{$unixlinksarray}; $i++ ) - { - my $onelink = ${$unixlinksarray}[$i]; - my $target = $onelink->{'Target'}; - my $destination = $onelink->{'destination'}; - - `ln -sf '$target' '$destdir$destination'`; - push @lines, "$destination\n"; - } - - if ( $destdir ne "" ) - { - my $filelist; - my $fname = $installer::globals::destdir . "/$packagename"; - open ($filelist, ">$fname") || die "Can't open $fname: $!"; - print $filelist @lines; - close ($filelist); - } - -} - -########################################################### -# Adding shellnew files into files collector for -# user installation -########################################################### - -sub add_shellnewfile_into_filesarray -{ - my ($filesref, $onefile, $inffile) = @_; - - my %shellnewfile = (); - my $shellnewfileref = \%shellnewfile; - - installer::converter::copy_item_object($inffile, $shellnewfileref); - - $shellnewfileref->{'Name'} = $onefile->{'Name'}; - $shellnewfileref->{'sourcepath'} = $onefile->{'sourcepath'}; - $shellnewfileref->{'gid'} = $onefile->{'gid'} . "_Userinstall"; - - # the destination has to be adapted - my $destination = $inffile->{'destination'}; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$destination); - $destination = $destination . $onefile->{'Name'}; - $shellnewfileref->{'destination'} = $destination; - - # add language specific inffile into filesarray - push(@{$filesref}, $shellnewfileref); -} - -########################################################### -# Replacing one placehoder in template file -########################################################### - -sub replace_in_template_file -{ - my ($templatefile, $placeholder, $newstring) = @_; - - for ( my $i = 0; $i <= $#{$templatefile}; $i++ ) - { - ${$templatefile}[$i] =~ s/\Q$placeholder\E/$newstring/g; - } -} - -########################################################### -# Replacing one placehoder with an array in template file -########################################################### - -sub replace_array_in_template_file -{ - my ($templatefile, $placeholder, $arrayref) = @_; - - for ( my $i = 0; $i <= $#{$templatefile}; $i++ ) - { - if ( ${$templatefile}[$i] =~ /\Q$placeholder\E/ ) - { - my @return = splice(@{$templatefile}, $i, 1, @{$arrayref}); - } - } -} - -########################################################### -# Collecting all modules from registry items -########################################################### - -sub collect_all_modules -{ - my ($registryitemsref) = @_; - - my @allmodules = (); - - for ( my $i = 0; $i <= $#{$registryitemsref}; $i++ ) - { - $registryitem = ${$registryitemsref}[$i]; - my $module = $registryitem->{'ModuleID'}; - - if ( ! installer::existence::exists_in_array($module, \@allmodules) ) - { - push(@allmodules, $module); - } - } - - return \@allmodules; -} - -########################################################### -# Changing the content of the inf file -########################################################### - -sub write_content_into_inf_file -{ - my ($templatefile, $filesref, $registryitemsref, $folderref, $folderitemsref, $modulesref, $onelanguage, $inffile, $firstlanguage, $allvariableshashref) = @_; - - # First part: Shellnew files - # SHELLNEWFILESPLACEHOLDER - - my $rootmodule = 0; - # inf files can be assigned to "gid_Module_Root_Files_2" - if ( $inffile->{'modules'} =~ /Module_Root/i ) { $rootmodule = 1; } - - if ( $rootmodule ) - { - my $shellnewstring = ""; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - my $directory = $onefile->{'Dir'}; - - if ( $directory =~ /\bPREDEFINED_OSSHELLNEWDIR\b/ ) - { - $shellnewstring = $shellnewstring . $onefile->{'Name'} . "\n"; - if (( $firstlanguage ) && ( ! $installer::globals::shellnewfilesadded )) { add_shellnewfile_into_filesarray($filesref, $onefile, $inffile); } - } - } - - $shellnewstring =~ s/\s*$//; - replace_in_template_file($templatefile, "SHELLNEWFILESPLACEHOLDER", $shellnewstring); - - $installer::globals::shellnewfilesadded = 1; - } - - # Second part: Start menu entries - - # The OfficeMenuFolder is defined as: $productname . " " . $productversion; - - my $productname = $allvariableshashref->{'PRODUCTNAME'}; - my $productversion = $allvariableshashref->{'PRODUCTVERSION'}; - my $productkey = $productname . " " . $productversion; - - replace_in_template_file($templatefile, "OFFICEFOLDERPLACEHOLDER", $productkey); - - # Setting name target and infotip for all applications - - for ( my $i = 0; $i <= $#{$folderitemsref}; $i++ ) - { - my $folderitem = ${$folderitemsref}[$i]; - - my $styles = ""; - if ( $folderitem->{'Styles'} ) { $styles = $folderitem->{'Styles'}; } - if ( $styles =~ /\bNON_ADVERTISED\b/ ) { next; } # no entry for non-advertised shortcuts - - if (( ! $folderitem->{'ismultilingual'} ) || (( $folderitem->{'ismultilingual'} ) && ( $folderitem->{'specificlanguage'} eq $onelanguage ))) - { - my $gid = $folderitem->{'gid'}; - my $app = $gid; - $app =~ s/gid_Folderitem_//; - $app = uc($app); - - my $name = $folderitem->{'Name'}; - my $placeholder = "PLACEHOLDER_FOLDERITEM_NAME_" . $app; - replace_in_template_file($templatefile, $placeholder, $name); - - my $tooltip = $folderitem->{'Tooltip'}; - $placeholder = "PLACEHOLDER_FOLDERITEM_TOOLTIP_" . $app; - replace_in_template_file($templatefile, $placeholder, $tooltip); - - my $executablegid = $folderitem->{'FileID'}; - my $exefile = installer::existence::get_specified_file($filesref, $executablegid); - my $exefilename = $exefile->{'Name'}; - $placeholder = "PLACEHOLDER_FOLDERITEM_TARGET_" . $app; - replace_in_template_file($templatefile, $placeholder, $exefilename); - } - } - - # Third part: Windows registry entries - - # collecting all modules - - my $allmodules = collect_all_modules($registryitemsref); - - my @registryitems = (); - my $allsectionsstring = ""; - - for ( my $j = 0; $j <= $#{$allmodules}; $j++ ) - { - my $moduleid = ${$allmodules}[$j]; - - my $inffilemodule = $inffile->{'modules'}; - # inf files can be assigned to "gid_Module_Root_Files_2", but RegistryItems to "gid_Module_Root" - if ( $inffilemodule =~ /Module_Root/i ) { $inffilemodule = $installer::globals::rootmodulegid; } - - if ( ! ( $moduleid eq $inffilemodule )) { next; } - - my $shortmodulename = $moduleid; - $shortmodulename =~ s/gid_Module_//; - my $sectionname = "InstRegKeys." . $shortmodulename; - $allsectionsstring = $allsectionsstring . $sectionname . ","; - my $sectionheader = "\[" . $sectionname . "\]" . "\n"; - push(@registryitems, $sectionheader); - - for ( my $i = 0; $i <= $#{$registryitemsref}; $i++ ) - { - my $registryitem = ${$registryitemsref}[$i]; - - if ( ! ( $registryitem->{'ModuleID'} eq $moduleid )) { next; } - - if (( ! $registryitem->{'ismultilingual'} ) || (( $registryitem->{'ismultilingual'} ) && ( $registryitem->{'specificlanguage'} eq $onelanguage ))) - { - # Syntax: HKCR,".bau",,,"soffice.StarConfigFile.6" - - my $regroot = ""; - my $parentid = ""; - if ( $registryitem->{'ParentID'} ) { $parentid = $registryitem->{'ParentID'}; } - if ( $parentid eq "PREDEFINED_HKEY_CLASSES_ROOT" ) { $regroot = "HKCR"; } - if ( $parentid eq "PREDEFINED_HKEY_LOCAL_MACHINE" ) { $regroot = "HKCU"; } - - my $subkey = ""; - if ( $registryitem->{'Subkey'} ) { $subkey = $registryitem->{'Subkey'}; } - if ( $subkey ne "" ) { $subkey = "\"" . $subkey . "\""; } - - my $valueentryname = ""; - if ( $registryitem->{'Name'} ) { $valueentryname = $registryitem->{'Name'}; } - if ( $valueentryname ne "" ) { $valueentryname = "\"" . $valueentryname . "\""; } - - my $flag = ""; - - my $value = ""; - if ( $registryitem->{'Value'} ) { $value = $registryitem->{'Value'}; } - if ( $value =~ /\<progpath\>/ ) { $value =~ s/\\\"/\"\"/g; } # Quoting for INF is done by double "" - $value =~ s/\\\"/\"/g; # no more masquerading of '"' - $value =~ s/\<progpath\>/\%INSTALLLOCATION\%/g; - if ( $value ne "" ) { $value = "\"" . $value . "\""; } - - my $oneline = $regroot . "," . $subkey . "," . $valueentryname . "," . $flag . "," . $value . "\n"; - - push(@registryitems, $oneline); - } - } - - push(@registryitems, "\n"); # empty line after each section - } - - # replacing the $allsectionsstring - $allsectionsstring =~ s/\,\s*$//; - replace_in_template_file($templatefile, "ALLREGISTRYSECTIONSPLACEHOLDER", $allsectionsstring); - - # replacing the placeholder for all registry keys - replace_array_in_template_file($templatefile, "REGISTRYKEYSPLACEHOLDER", \@registryitems); - -} - -########################################################### -# Creating inf files for local user system integration -########################################################### - -sub create_inf_file -{ - my ($filesref, $registryitemsref, $folderref, $folderitemsref, $modulesref, $languagesarrayref, $languagestringref, $allvariableshashref) = @_; - - # collecting all files with flag INFFILE - - my $inf_files = collect_all_items_with_special_flag($filesref ,"INFFILE"); - - if ( $#{$inf_files} > -1 ) - { - # create new language specific inffile - installer::logger::include_header_into_logfile("Creating inf files:"); - - my $infdirname = "inffiles"; - my $infdir = installer::systemactions::create_directories($infdirname, $languagestringref); - - my $infoline = "Number of inf files: $#{$inf_files} + 1 \n"; - push( @installer::globals::logfileinfo, $infoline); - - # there are inffiles for all modules - - for ( my $i = 0; $i <= $#{$inf_files}; $i++ ) - { - my $inffile = ${$inf_files}[$i]; - my $inf_file_name = $inffile->{'Name'}; - - my $templatefilename = $inffile->{'sourcepath'}; - - if ( ! -f $templatefilename ) { installer::exiter::exit_program("ERROR: Could not find file $templatefilename !", "create_inf_file"); } - - # iterating over all languages - - for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ ) # iterating over all languages - { - my $firstlanguage = 0; - if ( $j == 0 ) { $firstlanguage = 1; } - - my $onelanguage = ${$languagesarrayref}[$j]; - - $infoline = "Templatefile: $inf_file_name, Language: $onelanguage \n"; - push( @installer::globals::logfileinfo, $infoline); - - my $templatefile = installer::files::read_file($templatefilename); - - my $linesbefore = $#{$templatefile}; - - write_content_into_inf_file($templatefile, $filesref, $registryitemsref, $folderref, $folderitemsref, $modulesref, $onelanguage, $inffile, $firstlanguage, $allvariableshashref); - - $infoline = "Lines change: From $linesbefore to $#{$templatefile}.\n"; - push( @installer::globals::logfileinfo, $infoline); - - # rename language specific inffile - my $language_inf_file_name = $inf_file_name; - my $windowslanguage = installer::windows::language::get_windows_language($onelanguage); - $language_inf_file_name =~ s/\.inf/_$windowslanguage\.inf/; - - my $sourcepath = $infdir . $installer::globals::separator . $language_inf_file_name; - installer::files::save_file($sourcepath, $templatefile); - - $infoline = "Saving file: $sourcepath\n"; - push( @installer::globals::logfileinfo, $infoline); - - # creating new file object - - my %languageinffile = (); - my $languageinifileref = \%languageinffile; - - if ( $j < $#{$languagesarrayref} ) { installer::converter::copy_item_object($inffile, $languageinifileref); } - else { $languageinifileref = $inffile; } - - $languageinifileref->{'Name'} = $language_inf_file_name; - $languageinifileref->{'sourcepath'} = $sourcepath; - # destination and gid also have to be adapted - $languageinifileref->{'gid'} = $languageinifileref->{'gid'} . "_" . $onelanguage; - my $destination = $languageinifileref->{'destination'}; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$destination); - $destination = $destination . $language_inf_file_name; - $languageinifileref->{'destination'} = $destination; - - # add language specific inffile into filesarray - if ( $j < $#{$languagesarrayref} ) { push(@{$filesref}, $languageinifileref); } - } - } - } -} - -########################################################### -# Selecting patch items -########################################################### - -sub select_patch_items -{ - my ( $itemsref, $itemname ) = @_; - - installer::logger::include_header_into_logfile("Selecting items for patches. Item: $itemname"); - - my @itemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) - { - my $oneitem = ${$itemsref}[$i]; - - my $name = $oneitem->{'Name'}; - if (( $name =~ /\bLICENSE/ ) || ( $name =~ /\bREADME/ )) - { - push(@itemsarray, $oneitem); - next; - } - - # Items with style "PATCH" have to be included into the patch - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - if ( $styles =~ /\bPATCH\b/ ) { push(@itemsarray, $oneitem); } - } - - return \@itemsarray; -} - -########################################################### -# Selecting patch items -########################################################### - -sub select_patch_items_without_name -{ - my ( $itemsref, $itemname ) = @_; - - installer::logger::include_header_into_logfile("Selecting RegistryItems for patches"); - - my @itemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) - { - my $oneitem = ${$itemsref}[$i]; - - # Items with style "PATCH" have to be included into the patch - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - if ( $styles =~ /\bPATCH\b/ ) { push(@itemsarray, $oneitem); } - } - - return \@itemsarray; -} - -########################################################### -# Selecting langpack items -########################################################### - -sub select_langpack_items -{ - my ( $itemsref, $itemname ) = @_; - - installer::logger::include_header_into_logfile("Selecting RegistryItems for Language Packs"); - - my @itemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) - { - my $oneitem = ${$itemsref}[$i]; - - # Items with style "LANGUAGEPACK" have to be included into the patch - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - if (( $styles =~ /\bLANGUAGEPACK\b/ ) || ( $styles =~ /\bFORCELANGUAGEPACK\b/ )) { push(@itemsarray, $oneitem); } - } - - return \@itemsarray; -} - -########################################################### -# Selecting helppack items -########################################################### - -sub select_helppack_items -{ - my ( $itemsref, $itemname ) = @_; - - installer::logger::include_header_into_logfile("Selecting RegistryItems for Help Packs"); - - my @itemsarray = (); - - for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) - { - my $oneitem = ${$itemsref}[$i]; - - # Items with style "HELPPACK" have to be included into the patch - my $styles = ""; - if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } - if (( $styles =~ /\bHELPPACK\b/ ) || ( $styles =~ /\bFORCEHELPPACK\b/ )) { push(@itemsarray, $oneitem); } - } - - return \@itemsarray; -} - -########################################################### -# Searching if LICENSE and README, which are not removed -# in select_patch_items are really needed for the patch. -# If not, they are removed now. -########################################################### - -sub analyze_patch_files -{ - my ( $filesref ) = @_; - - installer::logger::include_header_into_logfile("Analyzing patch files"); - - my @filesarray = (); - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - if ( !( $styles =~ /\bPATCH\b/) ) { next; } # removing all files without flag PATCH (LICENSE, README, ...) - - if ( $installer::globals::iswindowsbuild ) - { - # all files of the Windows patch belong to the root module - $onefile->{'modules'} = $installer::globals::rootmodulegid; - } - - push(@filesarray, $onefile); - } - - return \@filesarray; -} - -########################################################### -# Sorting an array -########################################################### - -sub sort_array -{ - my ( $arrayref ) = @_; - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - my $under = ${$arrayref}[$i]; - - for ( my $j = $i + 1; $j <= $#{$arrayref}; $j++ ) - { - my $over = ${$arrayref}[$j]; - - if ( $under gt $over) - { - ${$arrayref}[$i] = $over; - ${$arrayref}[$j] = $under; - $under = $over; - } - } - } -} - -########################################################### -# Renaming linux files with flag LINUXLINK -########################################################### - -sub prepare_linuxlinkfiles -{ - my ( $filesref ) = @_; - - @installer::globals::linuxlinks = (); # empty this array, because it could be already used - @installer::globals::linuxpatchfiles = (); # empty this array, because it could be already used - @installer::globals::allfilessav = (); # empty this array, because it could be already used. Required for forced links - - my @filesarray = (); - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - my %linkfilehash = (); - my $linkfile = \%linkfilehash; - installer::converter::copy_item_object($onefile, $linkfile); - - my $ispatchfile = 0; - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - if ( $styles =~ /\bPATCH\b/ ) { $ispatchfile = 1; } - - # Collecting all files for the mechanism with forced links - # Saving a copy - my %copyfilehash = (); - my $copyfile = \%copyfilehash; - installer::converter::copy_item_object($onefile, $copyfile); - push( @installer::globals::allfilessav, $copyfile); - - my $original_destination = $onefile->{'destination'}; - # $onefile->{'destination'} is used in the epm list file. This value can be changed now! - - if ( $ispatchfile ) { $onefile->{'destination'} = $onefile->{'destination'} . "\.$installer::globals::linuxlibrarypatchlevel"; } - else { $onefile->{'destination'} = $onefile->{'destination'} . "\.$installer::globals::linuxlibrarybaselevel"; } - - my $infoline = "LINUXLINK: Changing file destination from $original_destination to $onefile->{'destination'} !\n"; - push( @installer::globals::logfileinfo, $infoline); - - # all files without PATCH flag are included into the RPM - if ( ! $ispatchfile ) { push( @filesarray, $onefile); } - else { push( @installer::globals::linuxpatchfiles, $onefile); } - - # Preparing the collector for the links - # Setting the new file name as destination of the link - my $linkdestination = $linkfile->{'Name'}; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$linkdestination); - if ( $ispatchfile ) { $linkfile->{'destinationfile'} = $linkdestination . "\.$installer::globals::linuxlibrarypatchlevel"; } - else { $linkfile->{'destinationfile'} = $linkdestination . "\.$installer::globals::linuxlibrarybaselevel"; } - push( @installer::globals::linuxlinks, $linkfile ); - - $infoline = "LINUXLINK: Created link: $linkfile->{'destination'} pointing to $linkfile->{'destinationfile'} !\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return \@filesarray; -} - -########################################################### -# Adding links into "u-RPMs", that have the flag -# FORCE_INTO_UPDATE_PACKAGE -# This is only relevant for Linux -########################################################### - -sub prepare_forced_linuxlinkfiles -{ - my ( $linksref ) = @_; - - my @linksarray = (); - - for ( my $i = 0; $i <= $#{$linksref}; $i++ ) - { - my $onelink = ${$linksref}[$i]; - - my $isforcedlink = 0; - my $styles = ""; - if ( $onelink->{'Styles'} ) { $styles = $onelink->{'Styles'}; } - if ( $styles =~ /\bFORCE_INTO_UPDATE_PACKAGE\b/ ) { $isforcedlink = 1; } - - if ( $isforcedlink ) - { - my $fileid = ""; - - if ( $onelink->{'ShortcutID'} ) - { - $fileid = $onelink->{'ShortcutID'}; - - my $searchedlinkfile = find_file_by_id($linksref, $fileid); - - # making a copy! - my %linkfilehash = (); - my $linkfile = \%linkfilehash; - installer::converter::copy_item_object($searchedlinkfile, $linkfile); - - $linkfile->{'Name'} = $onelink->{'Name'}; - $linkfile->{'destinationfile'} = $linkfile->{'destination'}; - my $linkdestination = $linkfile->{'destinationfile'}; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$linkdestination); - $linkfile->{'destinationfile'} = $linkdestination; - - my $localdestination = $linkfile->{'destination'}; - # Getting the path - installer::pathanalyzer::get_path_from_fullqualifiedname(\$localdestination); - $localdestination =~ s/\Q$installer::globals::separator\E\s*$//; - $linkfile->{'destination'} = $localdestination . $installer::globals::separator . $onelink->{'Name'}; - - $infoline = "Forced link into update file: $linkfile->{'destination'} pointing to $linkfile->{'destinationfile'} !\n"; - push( @installer::globals::logfileinfo, $infoline); - - # The file, defined by the link, has to be included into the - # link array @installer::globals::linuxlinks - push( @installer::globals::linuxlinks, $linkfile ); - } - - if ( $onelink->{'FileID'} ) - { - $fileid = $onelink->{'FileID'}; - - my $searchedlinkfile = find_file_by_id(\@installer::globals::allfilessav, $fileid); - - # making a copy! - my %linkfilehash = (); - my $linkfile = \%linkfilehash; - installer::converter::copy_item_object($searchedlinkfile, $linkfile); - - $linkfile->{'Name'} = $onelink->{'Name'}; - $linkfile->{'destinationfile'} = $linkfile->{'destination'}; - my $linkdestination = $linkfile->{'destinationfile'}; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$linkdestination); - $linkfile->{'destinationfile'} = $linkdestination; - - my $localdestination = $linkfile->{'destination'}; - # Getting the path - installer::pathanalyzer::get_path_from_fullqualifiedname(\$localdestination); - $localdestination =~ s/\Q$installer::globals::separator\E\s*$//; - $linkfile->{'destination'} = $localdestination . $installer::globals::separator . $onelink->{'Name'}; - - $infoline = "Forced link into update file: $linkfile->{'destination'} pointing to $linkfile->{'destinationfile'} !\n"; - push( @installer::globals::logfileinfo, $infoline); - - # The file, defined by the link, has to be included into the - # link array @installer::globals::linuxlinks - push( @installer::globals::linuxlinks, $linkfile ); - } - - if ( $fileid eq "" ) { installer::exiter::exit_program("ERROR: No FileID assigned to forced link $onelink->{'gid'} !", "prepare_forced_linuxlinkfiles"); } - - } - else - { - # Links with flag FORCE_INTO_UPDATE_PACKAGE are forced into "u"-RPM. All other - # links are included into the non-"u"-package. - push( @linksarray, $onelink ); - } - } - - return \@linksarray; -} - -########################################################### -# reorganizing the patchfile content, -# sorting for directory to decrease the file size -########################################################### - -sub reorg_patchfile -{ - my ($patchfiles, $patchfiledirectories) = @_; - - my @patchfilesarray = (); - my $line = ""; - my $directory = ""; - - # iterating over all directories, writing content into new patchfiles list - - for ( my $i = 0; $i <= $#{$patchfiledirectories}; $i++ ) - { - $directory = ${$patchfiledirectories}[$i]; - $line = "[" . $directory . "]" . "\n"; - push(@patchfilesarray, $line); - - for ( my $j = 0; $j <= $#{$patchfiles}; $j++ ) - { - if ( ${$patchfiles}[$j] =~ /^\s*(.*?)\s*\tXXXXX\t\Q$directory\E\s*$/ ) - { - $line = $1 . "\n"; - push(@patchfilesarray, $line); - } - } - } - - return \@patchfilesarray; -} - -########################################################### -# One special file has to be the last in patchfile.txt. -# Controlling this file, guarantees, that all files were -# patch correctly. Using version.ini makes it easy to -# control this by looking into the about box -# -> shifting one section to the end -########################################################### - -sub shift_section_to_end -{ - my ($patchfilelist) = @_; - - my @patchfile = (); - my @lastsection = (); - my $lastsection = "program"; - my $notlastsection = "Basis\\program"; - my $record = 0; - - for ( my $i = 0; $i <= $#{$patchfilelist}; $i++ ) - { - my $line = ${$patchfilelist}[$i]; - - if (( $record ) && ( $line =~ /^\s*\[/ )) { $record = 0; } - - if (( $line =~ /^\s*\[\Q$lastsection\E\\\]\s*$/ ) && ( ! ( $line =~ /\Q$notlastsection\E\\\]\s*$/ ))) { $record = 1; } - - if ( $record ) { push(@lastsection, $line); } - else { push(@patchfile, $line); } - } - - if ( $#lastsection > -1 ) - { - for ( my $i = 0; $i <= $#lastsection; $i++ ) - { - push(@patchfile, $lastsection[$i]); - } - } - - return \@patchfile; -} - -########################################################### -# One special file has to be the last in patchfile.txt. -# Controlling this file, guarantees, that all files were -# patch correctly. Using version.ini makes it easy to -# control this by looking into the about box -# -> shifting one file of the last section to the end -########################################################### - -sub shift_file_to_end -{ - my ($patchfilelist) = @_; - - my @patchfile = (); - my $lastfilename = "version.ini"; - my $lastfileline = ""; - my $foundfile = 0; - - # Only searching this file in the last section - my $lastsectionname = ""; - - for ( my $i = 0; $i <= $#{$patchfilelist}; $i++ ) - { - my $line = ${$patchfilelist}[$i]; - if ( $line =~ /^\s*\[(.*?)\]\s*$/ ) { $lastsectionname = $1; } - } - - my $record = 0; - for ( my $i = 0; $i <= $#{$patchfilelist}; $i++ ) - { - my $line = ${$patchfilelist}[$i]; - - if ( $line =~ /^\s*\[\Q$lastsectionname\E\]\s*$/ ) { $record = 1; } - - if (( $line =~ /^\s*\"\Q$lastfilename\E\"\=/ ) && ( $record )) - { - $lastfileline = $line; - $foundfile = 1; - $record = 0; - next; - } - - push(@patchfile, $line); - } - - if ( $foundfile ) { push(@patchfile, $lastfileline); } - - return \@patchfile; -} - -########################################################### -# Putting hash content into array and sorting it -########################################################### - -sub sort_hash -{ - my ( $hashref ) = @_; - - my $item = ""; - my @sortedarray = (); - - foreach $item (keys %{$hashref}) { push(@sortedarray, $item); } - installer::sorter::sorting_array_of_strings(\@sortedarray); - - return \@sortedarray; -} - -########################################################### -# Renaming Windows files in Patch and creating file -# patchfiles.txt -########################################################### - -sub prepare_windows_patchfiles -{ - my ( $filesref, $languagestringref, $allvariableshashref ) = @_; - - my @patchfiles = (); - my %patchfiledirectories = (); - my $patchfilename = "patchlist.txt"; - my $patchfilename2 = "patchmsi.dll"; - - if ( ! $allvariableshashref->{'WINDOWSPATCHLEVEL'} ) { installer::exiter::exit_program("ERROR: No Windows patch level defined in list file (WINDOWSPATCHLEVEL) !", "prepare_windows_patchfiles"); } - my $windowspatchlevel = $installer::globals::buildid; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $onefile = ${$filesref}[$i]; - - my $filename = $onefile->{'Name'}; - if (( $filename eq $patchfilename ) || ( $filename eq $patchfilename2 )) { next; } - - my $styles = ""; - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - if ( $styles =~ /\bDONTRENAMEINPATCH\b/ ) { next; } - - # special handling for files with flag DONTSHOW. This files get the extension ".dontshow" to be filtered by dialogs. - my $localwindowspatchlevel = $windowspatchlevel; - if ( $styles =~ /\bDONTSHOW\b/ ) { $localwindowspatchlevel = $localwindowspatchlevel . "\.dontshow"; } - - my $olddestination = $onefile->{'destination'}; - my $newdestination = $olddestination . "." . $localwindowspatchlevel; - my $localfilename = $olddestination; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$localfilename); # file name part - my $line = "\"" . $localfilename . "\"" . "=" . "\"" . "\." . $localwindowspatchlevel . "\""; - $onefile->{'destination'} = $newdestination; - - my $newfilename = $onefile->{'Name'} . "." . $localwindowspatchlevel; - $onefile->{'Name'} = $newfilename; - - # adding section information (section is the directory) - my $origolddestination = $olddestination; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$olddestination); # directory part - if ( ! $olddestination ) { $olddestination = "_root"; } - if ( ! exists($patchfiledirectories{$olddestination}) ) { $patchfiledirectories{$olddestination} = 1; } - $line = $line . "\tXXXXX\t" . $olddestination . "\n"; - - push(@patchfiles, $line); - - # also collecting all files from patch in @installer::globals::patchfilecollector - my $patchfileline = $origolddestination . "\n"; - push(@installer::globals::patchfilecollector, $patchfileline); - } - - my $winpatchdirname = "winpatch"; - my $winpatchdir = installer::systemactions::create_directories($winpatchdirname, $languagestringref); - - my $patchlistfile = installer::existence::get_specified_file_by_name($filesref, $patchfilename); - - # reorganizing the patchfile content, sorting for directory to decrease the file size - my $sorteddirectorylist = sort_hash(\%patchfiledirectories); - my $patchfilelist = reorg_patchfile(\@patchfiles, $sorteddirectorylist); - - # shifting version.ini to the end of the list, to guarantee, that all files are patched - # if the correct version is shown in the about box - $patchfilelist = shift_section_to_end($patchfilelist); - $patchfilelist = shift_file_to_end($patchfilelist); - - # saving the file - $patchfilename = $winpatchdir . $installer::globals::separator . $patchfilename; - installer::files::save_file($patchfilename, $patchfilelist); - - my $infoline = "\nCreated list of patch files: $patchfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - # and assigning the new source - $patchlistfile->{'sourcepath'} = $patchfilename; - - # and finally checking the file size - if ( -f $patchfilename ) # test of existence - { - my $filesize = ( -s $patchfilename ); - $infoline = "Size of patch file list: $filesize\n\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::logger::print_message( "... size of patch list file: $filesize Byte ... \n" ); - } - -} - -########################################################### -# Replacing %-variables with the content -# of $allvariableshashref -########################################################### - -sub replace_variables_in_string -{ - my ( $string, $variableshashref ) = @_; - - if ( $string =~ /^.*\%\w+.*$/ ) - { - my $key; - - # we want to substitute FOO_BR before FOO to avoid floating _BR suffixes - foreach $key (sort { length ($b) <=> length ($a) } keys %{$variableshashref}) - { - my $value = $variableshashref->{$key}; - $key = "\%" . $key; - $string =~ s/\Q$key\E/$value/g; - } - } - - return $string; -} - -########################################################### -# Replacing %-variables with the content -# of $allvariableshashref -########################################################### - -sub replace_dollar_variables_in_string -{ - my ( $string, $variableshashref ) = @_; - - if ( $string =~ /^.*\$\{\w+\}.*$/ ) - { - my $key; - - foreach $key (keys %{$variableshashref}) - { - my $value = $variableshashref->{$key}; - $key = "\$\{" . $key . "\}"; - $string =~ s/\Q$key\E/$value/g; - } - } - - return $string; -} - -########################################################### -# The list file contains the list of packages/RPMs that -# have to be copied. -########################################################### - -sub get_all_files_from_filelist -{ - my ( $listfile, $section ) = @_; - - my @allpackages = (); - - for (@{$listfile}) { - next unless /^\s*([^#].*?)\s*$/; - push @allpackages, $1; - } - - return \@allpackages; -} - -########################################################### -# Getting one section from a file. Section begins with -# [xyz] and ends with file end or next [abc]. -########################################################### - -sub get_section_from_file -{ - my ($file, $sectionname) = @_; - - my @section = (); - my $record = 0; - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - my $line = ${$file}[$i]; - - if (( $record ) && ( $line =~ /^\s*\[/ )) - { - $record = 0; - last; - } - - if ( $line =~ /^\s*\[\Q$sectionname\E\]\s*$/ ) { $record = 1; } - - if ( $line =~ /^\s*\[/ ) { next; } # this is a section line - if ( $line =~ /^\s*\#/ ) { next; } # this is a comment line - if ( $line =~ /^\s*$/ ) { next; } # empty line - $line =~ s/^\s*//; - $line =~ s/\s*$//; - if ( $record ) { push(@section, $line); } - } - - return \@section; - -} - -####################################################### -# Substituting one variable in the xml file -####################################################### - -sub replace_one_dollar_variable -{ - my ($file, $variable, $searchstring) = @_; - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - ${$file}[$i] =~ s/\$\{$searchstring\}/$variable/g; - } -} - -####################################################### -# Substituting the variables in the xml file -####################################################### - -sub substitute_dollar_variables -{ - my ($file, $variableshashref) = @_; - - my $key; - - foreach $key (keys %{$variableshashref}) - { - my $value = $variableshashref->{$key}; - replace_one_dollar_variable($file, $value, $key); - } -} - -############################################################################# -# Collecting all packages or rpms located in the installation directory -############################################################################# - -sub get_all_packages_in_installdir -{ - my ($directory) = @_; - - my $infoline = ""; - - my @allpackages = (); - my $allpackages = \@allpackages; - - if ( $installer::globals::isrpmbuild ) - { - $allpackages = installer::systemactions::find_file_with_file_extension("rpm", $directory); - } - - if ( $installer::globals::issolarisbuild ) - { - $allpackages = installer::systemactions::get_all_directories($directory); - } - - return $allpackages; -} - -############################################################### -# The list of exclude packages can contain the -# beginning of the package name, not the complete name. -############################################################### - -sub is_matching -{ - my ($onepackage, $allexcludepackages ) = @_; - - my $matches = 0; - - for ( my $i = 0; $i <= $#{$allexcludepackages}; $i++ ) - { - my $oneexcludepackage = ${$allexcludepackages}[$i]; - - if ( $onepackage =~ /^\s*$oneexcludepackage/ ) - { - $matches = 1; - last; - } - } - - return $matches; -} - -############################################################### -# Copying all Solaris packages or RPMs from installation set -############################################################### - -sub copy_all_packages -{ - my ($allexcludepackages, $sourcedir, $destdir) = @_; - - my $infoline = ""; - - $sourcedir =~ s/\/\s*$//; - $destdir =~ s/\/\s*$//; - - # $allexcludepackages is a list of RPMs and packages, that shall NOT be included into jds product - my $allpackages = get_all_packages_in_installdir($sourcedir); - - for ( my $i = 0; $i <= $#{$allpackages}; $i++ ) - { - my $onepackage = ${$allpackages}[$i]; - - my $packagename = $onepackage; - - if ( $installer::globals::issolarispkgbuild ) # on Solaris $onepackage contains the complete path - { - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$packagename); - } - - if ( ! installer::existence::exists_in_array($packagename, $allexcludepackages)) - { - if ( ! is_matching($packagename, $allexcludepackages ) ) - { - - if ( $installer::globals::isrpmbuild ) - { - my $sourcepackage = $sourcedir . $installer::globals::separator . $packagename; - my $destfile = $destdir . $installer::globals::separator . $packagename; - if ( ! -f $sourcepackage ) { installer::exiter::exit_program("ERROR: Could not find RPM $sourcepackage!", "copy_all_packages"); } - installer::systemactions::hardlink_one_file($sourcepackage, $destfile); - } - - if ( $installer::globals::issolarispkgbuild ) - { - my $destinationdir = $destdir . $installer::globals::separator . $packagename; - if ( ! -d $onepackage ) { installer::exiter::exit_program("ERROR: Could not find Solaris package $onepackage!", "copy_all_packages"); } - - my $systemcall = "cp -p -R $onepackage $destinationdir"; - make_systemcall($systemcall); - } - } - else - { - $infoline = "Excluding package (matching): $onepackage\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - else - { - $infoline = "Excluding package (precise name): $onepackage\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } -} - -###################################################### -# Making systemcall -###################################################### - -sub make_systemcall -{ - my ($systemcall) = @_; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -########################################################### -# Copying all Solaris packages or RPMs from solver -########################################################### - -sub copy_additional_packages -{ - my ($allcopypackages, $destdir, $includepatharrayref) = @_; - - my $infoline = "Copy additional packages into installation set.\n"; - push( @installer::globals::logfileinfo, $infoline); - - $destdir =~ s/\/\s*$//; - - for ( my $i = 0; $i <= $#{$allcopypackages}; $i++ ) - { - my $onepackage = ${$allcopypackages}[$i]; - $infoline = "Copy package: $onepackage\n"; - push( @installer::globals::logfileinfo, $infoline); - - # this package must be delivered into the solver - - my $packagesourceref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$onepackage, $includepatharrayref, 0); - if ($$packagesourceref eq "") { installer::exiter::exit_program("ERROR: Could not find jds file $onepackage!", "copy_additional_packages"); } - - if ( $onepackage =~ /\.tar\.gz\s*$/ ) - { - my $systemcall = "cd $destdir; cat $$packagesourceref | gunzip | tar -xf -"; - make_systemcall($systemcall); - } - else - { - my $destfile = $destdir . $installer::globals::separator . $onepackage; - installer::systemactions::copy_one_file($$packagesourceref, $destfile); - } - } -} - -########################################################### -# Creating jds installation sets -########################################################### - -sub create_jds_sets -{ - my ($installationdir, $allvariableshashref, $languagestringref, $languagesarrayref, $includepatharrayref) = @_; - - installer::logger::print_message( "\n******************************************\n" ); - installer::logger::print_message( "... creating jds installation set ...\n" ); - installer::logger::print_message( "******************************************\n" ); - - installer::logger::include_header_into_logfile("Creating jds installation sets:"); - - my $firstdir = $installationdir; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$firstdir); - - my $lastdir = $installationdir; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$lastdir); - - if ( $lastdir =~ /\./ ) { $lastdir =~ s/\./_jds_inprogress\./ } - else { $lastdir = $lastdir . "_jds_inprogress"; } - - # removing existing directory "_native_packed_inprogress" and "_native_packed_witherror" and "_native_packed" - - my $jdsdir = $firstdir . $lastdir; - if ( -d $jdsdir ) { installer::systemactions::remove_complete_directory($jdsdir); } - - my $olddir = $jdsdir; - $olddir =~ s/_inprogress/_witherror/; - if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); } - - $olddir = $jdsdir; - $olddir =~ s/_inprogress//; - if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); } - - # creating the new directory - - installer::systemactions::create_directory($jdsdir); - - $installer::globals::saveinstalldir = $jdsdir; - - # find and read jds files list - my $filelistname = $installer::globals::jdsexcludefilename; - - my $filelistnameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$filelistname, "", 0); - if ($$filelistnameref eq "") { installer::exiter::exit_program("ERROR: Could not find jds list file $filelistname!", "create_jds_sets"); } - - my $listfile = installer::files::read_file($$filelistnameref); - - my $infoline = "Found jds list file: $$filelistnameref\n"; - push( @installer::globals::logfileinfo, $infoline); - - # substituting the variables - substitute_dollar_variables($listfile, $allvariableshashref); - - # determining the packages/RPMs to copy - my $allexcludepackages = get_section_from_file($listfile, "excludefiles"); - my $allcopypackages = get_section_from_file($listfile, "copyfiles"); - - # determining the source directory - my $alldirs = installer::systemactions::get_all_directories($installationdir); - my $sourcedir = ${$alldirs}[0]; # there is only one directory - - if ( $installer::globals::issolarisbuild ) { $sourcedir = $installer::globals::saved_packages_path; } - - # copy all packages/RPMs - copy_all_packages($allexcludepackages, $sourcedir, $jdsdir); - copy_additional_packages($allcopypackages, $jdsdir, $includepatharrayref); - - return $jdsdir; -} - -############################################################################# -# Checking, whether this installation set contains the correct languages -############################################################################# - -sub check_jds_language -{ - my ($allvariableshashref, $languagestringref) = @_; - - my $infoline = ""; - - if ( ! $allvariableshashref->{'JDSLANG'} ) { installer::exiter::exit_program("ERROR: For building JDS installation sets \"JDSLANG\" must be defined!", "check_jds_language"); } - my $languagestring = $allvariableshashref->{'JDSLANG'}; - - my $sortedarray1 = installer::converter::convert_stringlist_into_array(\$languagestring, ","); - - installer::sorter::sorting_array_of_strings($sortedarray1); - - my $sortedarray2 = installer::converter::convert_stringlist_into_array($languagestringref, "_"); - installer::sorter::sorting_array_of_strings($sortedarray2); - - my $string1 = installer::converter::convert_array_to_comma_separated_string($sortedarray1); - my $string2 = installer::converter::convert_array_to_comma_separated_string($sortedarray2); - - my $arrays_are_equal = compare_arrays($sortedarray1, $sortedarray2); - - return $arrays_are_equal; -} - -################################################################################### -# Comparing two arrays. The arrays are equal, if the complete content is equal. -################################################################################### - -sub compare_arrays -{ - my ($array1, $array2) = @_; - - my $arrays_are_equal = 1; - - # checking the size - - if ( ! ( $#{$array1} == $#{$array2} )) { $arrays_are_equal = 0; } # different size - - if ( $arrays_are_equal ) # only make further investigations if size is equal - { - for ( my $i = 0; $i <= $#{$array1}; $i++ ) - { - # ingnoring whitespaces at end and beginning - ${$array1}[$i] =~ s/^\s*//; - ${$array2}[$i] =~ s/^\s*//; - ${$array1}[$i] =~ s/\s*$//; - ${$array2}[$i] =~ s/\s*$//; - - if ( ! ( ${$array1}[$i] eq ${$array2}[$i] )) - { - $arrays_are_equal = 0; - last; - } - } - } - - return $arrays_are_equal; -} - -################################################################# -# Copying the files defined as ScpActions into the -# installation set. -################################################################# - -sub put_scpactions_into_installset -{ - my ($installdir) = @_; - - installer::logger::include_header_into_logfile("Start: Copying scp action files into installation set"); - - for ( my $i = 0; $i <= $#installer::globals::allscpactions; $i++ ) - { - my $onescpaction = $installer::globals::allscpactions[$i]; - - my $subdir = ""; - if ( $onescpaction->{'Subdir'} ) { $subdir = $onescpaction->{'Subdir'}; } - - if ( $onescpaction->{'Name'} eq "loader.exe" ) { next; } # do not copy this ScpAction loader - - my $destdir = $installdir; - $destdir =~ s/\Q$installer::globals::separator\E\s*$//; - if ( $subdir ) { $destdir = $destdir . $installer::globals::separator . $subdir; } - - my $sourcefile = $onescpaction->{'sourcepath'}; - my $destfile = $destdir . $installer::globals::separator . $onescpaction->{'DestinationName'}; - - my $styles = ""; - if ( $onescpaction->{'Styles'} ) { $styles = $onescpaction->{'Styles'}; } - if (( $styles =~ /\bFILE_CAN_MISS\b/ ) && ( $sourcefile eq "" )) { next; } - - if (( $subdir =~ /\// ) || ( $subdir =~ /\\/ )) - { - installer::systemactions::create_directory_structure($destdir); - } - else - { - installer::systemactions::create_directory($destdir); - } - - installer::systemactions::copy_one_file($sourcefile, $destfile); - - if ( $onescpaction->{'UnixRights'} ) - { - chmod oct($onescpaction->{'UnixRights'}), $destfile; - } - - } - - installer::logger::include_header_into_logfile("End: Copying scp action files into installation set"); - -} - -################################################################# -# Collecting scp actions for all languages -################################################################# - -sub collect_scpactions -{ - my ($allscpactions) = @_; - - for ( my $i = 0; $i <= $#{$allscpactions}; $i++ ) - { - push(@installer::globals::allscpactions, ${$allscpactions}[$i]); - } -} - -################################################################# -# Setting the platform name for download -################################################################# - -sub get_platform_name -{ - my $platformname = ""; - - if (( $installer::globals::islinuxintelrpmbuild ) || ( $installer::globals::islinuxinteldebbuild )) - { - $platformname = "LinuxIntel"; - } - elsif (( $installer::globals::islinuxppcrpmbuild ) || ( $installer::globals::islinuxppcdebbuild )) - { - $platformname = "LinuxPowerPC"; - } - elsif (( $installer::globals::islinuxx86_64rpmbuild ) || ( $installer::globals::islinuxx86_64debbuild )) - { - $platformname = "LinuxX86-64"; - } - elsif ( $installer::globals::issolarissparcbuild ) - { - $platformname = "SolarisSparc"; - } - elsif ( $installer::globals::issolarisx86build ) - { - $platformname = "Solarisx86"; - } - elsif ( $installer::globals::iswindowsbuild ) - { - $platformname = "Win32Intel"; - } - elsif ( $installer::globals::compiler =~ /^unxmacxi/ ) - { - $platformname = "MacOSXIntel"; - } - elsif ( $installer::globals::compiler =~ /^unxmacxp/ ) - { - $platformname = "MacOSXPowerPC"; - } - else - { - $platformname = $installer::globals::compiler; - } - - return $platformname; -} - -########################################################### -# Adding additional variables into the variableshashref, -# that are defined in include files in the solver. The -# names of the include files are stored in -# ADD_INCLUDE_FILES (comma separated list). -########################################################### - -sub add_variables_from_inc_to_hashref -{ - my ($allvariables, $includepatharrayref) = @_; - - my $infoline = ""; - my $includefilelist = ""; - if ( $allvariables->{'ADD_INCLUDE_FILES'} ) { $includefilelist = $allvariables->{'ADD_INCLUDE_FILES'}; } - - my $includefiles = installer::converter::convert_stringlist_into_array_without_newline(\$includefilelist, ","); - - for ( my $i = 0; $i <= $#{$includefiles}; $i++ ) - { - my $includefilename = ${$includefiles}[$i]; - $includefilename =~ s/^\s*//; - $includefilename =~ s/\s*$//; - $includefilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$includefilename, $includepatharrayref, 1); - if ( $$includefilenameref eq "" ) { installer::exiter::exit_program("Include file $includefilename not found!\nADD_INCLUDE_FILES = $allvariables->{'ADD_INCLUDE_FILES'}", "add_variables_from_inc_to_hashref"); } - - $infoline = "Including inc file: $$includefilenameref \n"; - push( @installer::globals::globallogfileinfo, $infoline); - - my $includefile = installer::files::read_file($$includefilenameref); - - for ( my $j = 0; $j <= $#{$includefile}; $j++ ) - { - # Analyzing all "key=value" lines - my $oneline = ${$includefile}[$j]; - - if ( $oneline =~ /^\s*(\S+)\s*\=\s*(.*?)\s*$/ ) # no white space allowed in key - { - my $key = $1; - my $value = $2; - $allvariables->{$key} = $value; - $infoline = "Setting of variable: $key = $value\n"; - push( @installer::globals::globallogfileinfo, $infoline); - } - } - } - - # Allowing different Java versions for Windows and Unix. Instead of "JAVAVERSION" - # the property "WINDOWSJAVAVERSION" has to be used, if it is set. - - if ( $installer::globals::iswindowsbuild ) - { - if (( exists($allvariables->{'WINDOWSJAVAVERSION'})) && ( $allvariables->{'WINDOWSJAVAVERSION'} ne "" )) - { - $allvariables->{'JAVAVERSION'} = $allvariables->{'WINDOWSJAVAVERSION'}; - $infoline = "Changing value of property \"JAVAVERSION\" to $allvariables->{'JAVAVERSION'} (property \"WINDOWSJAVAVERSION\").\n"; - push( @installer::globals::globallogfileinfo, $infoline); - } - } -} - -############################################## -# Collecting all files from include paths -############################################## - -sub collect_all_files_from_includepathes -{ - my ($patharrayref) = @_; - - installer::logger::globallog("Reading all directories: Start"); - installer::logger::print_message( "... reading include paths ...\n" ); - # empty the global - - @installer::globals::allincludepathes =(); - my $infoline; - - for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) - { - $includepath = ${$patharrayref}[$i]; - installer::remover::remove_leading_and_ending_whitespaces(\$includepath); - - if ( ! -d $includepath ) - { - $infoline = "$includepath does not exist. (Can be removed from include path list?)\n"; - push( @installer::globals::globallogfileinfo, $infoline); - next; - } - - my @sourcefiles = (); - my $pathstring = ""; - installer::systemactions::read_full_directory($includepath, $pathstring, \@sourcefiles); - - if ( ! ( $#sourcefiles > -1 )) - { - $infoline = "$includepath is empty. (Can be removed from include path list?)\n"; - push( @installer::globals::globallogfileinfo, $infoline); - } - else - { - my $number = $#sourcefiles + 1; - $infoline = "Directory $includepath contains $number files (including subdirs)\n"; - push( @installer::globals::globallogfileinfo, $infoline); - - my %allfileshash = (); - $allfileshash{'includepath'} = $includepath; - - for ( my $j = 0; $j <= $#sourcefiles; $j++ ) - { - $allfileshash{$sourcefiles[$j]} = 1; - } - - push(@installer::globals::allincludepathes, \%allfileshash); - } - } - - $installer::globals::include_pathes_read = 1; - - installer::logger::globallog("Reading all directories: End"); - push( @installer::globals::globallogfileinfo, "\n"); -} - -############################################## -# Searching for a file with the gid -############################################## - -sub find_file_by_id -{ - my ( $filesref, $gid ) = @_; - - my $foundfile = 0; - my $onefile; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - $onefile = ${$filesref}[$i]; - my $filegid = $onefile->{'gid'}; - - if ( $filegid eq $gid ) - { - $foundfile = 1; - last; - } - } - - if (! $foundfile ) { $onefile = ""; } - - return $onefile; -} - -############################################## -# Searching for an item with the gid -############################################## - -sub find_item_by_gid -{ - my ( $itemsref, $gid ) = @_; - - my $founditem = 0; - my $oneitem = ""; - - for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) - { - my $localitem = ${$itemsref}[$i]; - my $itemgid = $localitem->{'gid'}; - - if ( $itemgid eq $gid ) - { - $oneitem = $localitem; - $founditem = 1; - last; - } - } - - return $oneitem; -} - -######################################################### -# Calling sum -######################################################### - -sub call_sum -{ - my ($filename) = @_; - - $sumfile = "/usr/bin/sum"; - - if ( ! -f $sumfile ) { installer::exiter::exit_program("ERROR: No file /usr/bin/sum", "call_sum"); } - - my $systemcall = "$sumfile $filename |"; - - my $sumoutput = ""; - - open (SUM, "$systemcall"); - $sumoutput = <SUM>; - close (SUM); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return $sumoutput; -} - -######################################################### -# Calling wc -# wc -c pkginfo | cut -f6 -d' ' -######################################################### - -sub call_wc -{ - my ($filename) = @_; - - $wcfile = "/usr/bin/wc"; - - if ( ! -f $wcfile ) { installer::exiter::exit_program("ERROR: No file /usr/bin/wc", "call_wc"); } - - my $systemcall = "$wcfile -c $filename |"; - - my $wcoutput = ""; - - open (WC, "$systemcall"); - $wcoutput = <WC>; - close (WC); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return $wcoutput; -} - -############################################## -# Setting architecture ARCH=i86pc -# instead of ARCH=i386. -############################################## - -sub set_old_architecture_string -{ - my ($pkginfofile) = @_; - - for ( my $i = 0; $i <= $#{$pkginfofile}; $i++ ) - { - if ( ${$pkginfofile}[$i] =~ /^\s*ARCH=i386\s*$/ ) - { - ${$pkginfofile}[$i] =~ s/i386/i86pc/; - last; - } - } -} - -############################################## -# For the new copied package, it is necessary -# that a value for the key SUNW_REQUIRES -# is set. Otherwise this copied package -# with ARCH=i86pc would be useless. -############################################## - -sub check_requires_setting -{ - my ($pkginfofile) = @_; - - my $found = 0; - my $patchid = ""; - - for ( my $i = 0; $i <= $#{$pkginfofile}; $i++ ) - { - if ( ${$pkginfofile}[$i] =~ /^\s*SUNW_REQUIRES=(\S*?)\s*$/ ) - { - $patchid = $1; - $found = 1; - last; - } - } - - if (( ! $found ) || ( $patchid eq "" )) { installer::exiter::exit_program("ERROR: No patch id defined for SUNW_REQUIRES in patch pkginfo file!", "check_requires_setting"); } -} - -############################################## -# Setting checksum and wordcount for changed -# pkginfo file into pkgmap. -############################################## - -sub set_pkginfo_line -{ - my ($pkgmapfile, $pkginfofilename) = @_; - - # 1 i pkginfo 442 34577 1166716297 - # -> - # 1 i pkginfo 443 34737 1166716297 - # - # wc -c pkginfo | cut -f6 -d' ' -> 442 (variable) - # sum pkginfo | cut -f1 -d' ' -> 34577 (variable) - # grep 'pkginfo' pkgmap | cut -f6 -d' ' -> 1166716297 (fix) - - my $checksum = call_sum($pkginfofilename); - if ( $checksum =~ /^\s*(\d+)\s+.*$/ ) { $checksum = $1; } - - my $wordcount = call_wc($pkginfofilename); - if ( $wordcount =~ /^\s*(\d+)\s+.*$/ ) { $wordcount = $1; } - - for ( my $i = 0; $i <= $#{$pkgmapfile}; $i++ ) - { - if ( ${$pkgmapfile}[$i] =~ /(^.*\bpkginfo\b\s+)(\d+)(\s+)(\d+)(\s+)(\d+)(\s*$)/ ) - { - my $newline = $1 . $wordcount . $3 . $checksum . $5 . $6 . $7; - ${$pkgmapfile}[$i] = $newline; - last; - } - } -} - -############################################## -# Setting time stamp of copied files to avoid -# errors from pkgchk. -############################################## - -sub set_time_stamp -{ - my ($olddir, $newdir, $copyfiles) = @_; - - for ( my $i = 0; $i <= $#{$copyfiles}; $i++ ) - { - my $sourcefile = $olddir . $installer::globals::separator . ${$copyfiles}[$i]; - my $destfile = $newdir . $installer::globals::separator . ${$copyfiles}[$i]; - - my $systemcall = "touch -r $sourcefile $destfile"; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: \"$systemcall\" failed!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: \"$systemcall\" !\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } -} - -############################################################ -# Generating pathes for cygwin (first version) -# This function has problems with cygwin, if $tmpfilename -# contains many thousand files (OpenOffice SDK). -############################################################ - -sub generate_cygwin_pathes_old -{ - my ($filesref) = @_; - - my ($tmpfilehandle, $tmpfilename) = tmpnam(); - open SOURCEPATHLIST, ">$tmpfilename" or die "oops...\n"; - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - print SOURCEPATHLIST "${$filesref}[$i]->{'sourcepath'}\n"; - } - close SOURCEPATHLIST; - my @cyg_sourcepathlist = qx{cygpath -w -f "$tmpfilename"}; - chomp @cyg_sourcepathlist; - unlink "$tmpfilename" or die "oops\n"; - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - ${$filesref}[$i]->{'cyg_sourcepath'} = $cyg_sourcepathlist[$i]; - } - -} - -################################################# -# Generating pathes for cygwin (second version) -# This function generates smaller files for -################################################# - -sub generate_cygwin_pathes -{ - my ($filesref) = @_; - - installer::logger::include_timestamp_into_logfile("Starting generating cygwin pathes"); - - my $infoline = "Generating cygwin pathes (generate_cygwin_pathes)\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $max = 5000; # number of pathes in one file - - my @pathcollector = (); - my $startnumber = 0; - my $counter = 0; - - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - my $line = ${$filesref}[$i]->{'sourcepath'} . "\n"; - push(@pathcollector, $line); - $counter++; - - if (( $i == $#{$filesref} ) || ((( $counter % $max ) == 0 ) && ( $i > 0 ))) - { - my $tmpfilename = "cygwinhelper_" . $i . ".txt"; - my $temppath = $installer::globals::temppath; - $temppath =~ s/\Q$installer::globals::separator\E\s*$//; - $tmpfilename = $temppath . $installer::globals::separator . $tmpfilename; - $infoline = "Creating temporary file for cygwin conversion: $tmpfilename (contains $counter pathes)\n"; - push( @installer::globals::logfileinfo, $infoline); - if ( -f $tmpfilename ) { unlink $tmpfilename; } - - installer::files::save_file($tmpfilename, \@pathcollector); - - my $success = 0; - my @cyg_sourcepathlist = qx{cygpath -w -f "$tmpfilename"}; - chomp @cyg_sourcepathlist; - - # Validating the array, it has to contain the correct number of values - my $new_pathes = $#cyg_sourcepathlist + 1; - if ( $new_pathes == $counter ) { $success = 1; } - - if ($success) - { - $infoline = "Success: Successfully converted to cygwin pathes!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "ERROR: Failed to convert to cygwin pathes!\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: Failed to convert to cygwin pathes!", "generate_cygwin_pathes"); - } - - for ( my $j = 0; $j <= $#cyg_sourcepathlist; $j++ ) - { - my $number = $startnumber + $j; - ${$filesref}[$number]->{'cyg_sourcepath'} = $cyg_sourcepathlist[$j]; - } - - if ( -f $tmpfilename ) { unlink $tmpfilename; } - - @pathcollector = (); - $startnumber = $startnumber + $max; - $counter = 0; - } - } - - # Checking existence fo cyg_sourcepath for every file - for ( my $i = 0; $i <= $#{$filesref}; $i++ ) - { - if (( ! exists(${$filesref}[$i]->{'cyg_sourcepath'}) ) || ( ${$filesref}[$i]->{'cyg_sourcepath'} eq "" )) - { - $infoline = "ERROR: No cygwin sourcepath defined for file ${$filesref}[$i]->{'sourcepath'}\n"; - push( @installer::globals::logfileinfo, $infoline); - installer::exiter::exit_program("ERROR: No cygwin sourcepath defined for file ${$filesref}[$i]->{'sourcepath'}!", "generate_cygwin_pathes"); - } - } - - installer::logger::include_timestamp_into_logfile("Ending generating cygwin pathes"); -} - -############################################## -# Include only files from install directory -# in pkgmap file. -############################################## - -sub filter_pkgmapfile -{ - my ($pkgmapfile) = @_; - - my @pkgmap = (); - - my $line = ": 1 10\n"; - push(@pkgmap, $line); - - for ( my $i = 0; $i <= $#{$pkgmapfile}; $i++ ) - { - $line = ${$pkgmapfile}[$i]; - if ( $line =~ /^\s*1\si\s/ ) { push(@pkgmap, $line); } - } - - return \@pkgmap; -} - -############################################## -# Creating double packages for Solaris x86. -# One package with ARCH=i386 and one with -# ARCH=i86pc. -############################################## - -sub fix_solaris_x86_patch -{ - my ($packagename, $subdir) = @_; - - # changing into directory of packages, important for soft linking - my $startdir = cwd(); - chdir($subdir); - - # $packagename is: "SUNWstaroffice-core01" - # Current working directory is: "<path>/install/en-US_inprogress" - - # create new folder in "packages": $packagename . ".i" - my $newpackagename = $packagename . "\.i"; - my $newdir = $newpackagename; - installer::systemactions::create_directory($newdir); - - # collecting all directories in the package - my $olddir = $packagename; - my $allsubdirs = installer::systemactions::get_all_directories_without_path($olddir); - - # link all directories from $packagename to $packagename . ".i" - for ( my $i = 0; $i <= $#{$allsubdirs}; $i++ ) - { - my $sourcedir = $olddir . $installer::globals::separator . ${$allsubdirs}[$i]; - my $destdir = $newdir . $installer::globals::separator . ${$allsubdirs}[$i]; - my $directory_depth = 2; # important for soft links, two directories already exist - installer::systemactions::softlink_complete_directory($sourcedir, $destdir, $directory_depth); - } - - # copy "pkginfo" and "pkgmap" from $packagename to $packagename . ".i" - my @allcopyfiles = ("pkginfo", "pkgmap"); - for ( my $i = 0; $i <= $#allcopyfiles; $i++ ) - { - my $sourcefile = $olddir . $installer::globals::separator . $allcopyfiles[$i]; - my $destfile = $newdir . $installer::globals::separator . $allcopyfiles[$i]; - installer::systemactions::copy_one_file($sourcefile, $destfile); - } - - # change in pkginfo in $packagename . ".i" the value for ARCH from i386 to i86pc - my $pkginfofilename = "pkginfo"; - $pkginfofilename = $newdir . $installer::globals::separator . $pkginfofilename; - - my $pkginfofile = installer::files::read_file($pkginfofilename); - set_old_architecture_string($pkginfofile); - installer::files::save_file($pkginfofilename, $pkginfofile); - - # adapt the values in pkgmap for pkginfo file, because this file was edited - my $pkgmapfilename = "pkgmap"; - $pkgmapfilename = $newdir . $installer::globals::separator . $pkgmapfilename; - - my $pkgmapfile = installer::files::read_file($pkgmapfilename); - set_pkginfo_line($pkgmapfile, $pkginfofilename); - installer::files::save_file($pkgmapfilename, $pkgmapfile); - - # changing back to startdir - chdir($startdir); -} - -################################################### -# Creating double core01 package for Solaris x86. -# One package with ARCH=i386 and one with -# ARCH=i86pc. This is necessary, to inform the -# user about the missing "small patch", if -# packages with ARCH=i86pc are installed. -################################################### - -sub fix2_solaris_x86_patch -{ - my ($packagename, $subdir) = @_; - - if ( $packagename =~ /-core01\s*$/ ) # only this one package needs to be duplicated - { - my $startdir = cwd(); - chdir($subdir); - - # $packagename is: "SUNWstaroffice-core01" - # Current working directory is: "<path>/install/en-US_inprogress" - - # create new package in "packages": $packagename . ".i" - my $olddir = $packagename; - my $newpackagename = $packagename . "\.i"; - my $newdir = $newpackagename; - - installer::systemactions::create_directory($newdir); - - my $oldinstalldir = $olddir . $installer::globals::separator . "install"; - my $newinstalldir = $newdir . $installer::globals::separator . "install"; - - installer::systemactions::copy_complete_directory($oldinstalldir, $newinstalldir); - - # setting time stamp of all copied files to avoid errors from pkgchk - my $allinstallfiles = installer::systemactions::get_all_files_from_one_directory_without_path($newinstalldir); - set_time_stamp($oldinstalldir, $newinstalldir, $allinstallfiles); - - # copy "pkginfo" and "pkgmap" from $packagename to $packagename . ".i" - my @allcopyfiles = ("pkginfo", "pkgmap"); - for ( my $i = 0; $i <= $#allcopyfiles; $i++ ) - { - my $sourcefile = $olddir . $installer::globals::separator . $allcopyfiles[$i]; - my $destfile = $newdir . $installer::globals::separator . $allcopyfiles[$i]; - installer::systemactions::copy_one_file($sourcefile, $destfile); - } - - # change in pkginfo in $packagename . ".i" the value for ARCH from i386 to i86pc - my $pkginfofilename = "pkginfo"; - $pkginfofilename = $newdir . $installer::globals::separator . $pkginfofilename; - - my $pkginfofile = installer::files::read_file($pkginfofilename); - set_old_architecture_string($pkginfofile); - check_requires_setting($pkginfofile); - installer::files::save_file($pkginfofilename, $pkginfofile); - - # adapt the values in pkgmap for pkginfo file, because this file was edited - my $pkgmapfilename = "pkgmap"; - $pkgmapfilename = $newdir . $installer::globals::separator . $pkgmapfilename; - - my $pkgmapfile = installer::files::read_file($pkgmapfilename); - set_pkginfo_line($pkgmapfile, $pkginfofilename); - $pkgmapfile = filter_pkgmapfile($pkgmapfile); - installer::files::save_file($pkgmapfilename, $pkgmapfile); - - # setting time stamp of all copied files to avoid errors from pkgchk - set_time_stamp($olddir, $newdir, \@allcopyfiles); - - # changing back to startdir - chdir($startdir); - } -} - -################################################ -# Files with flag HIDDEN get a dot at the -# beginning of the file name. This cannot be -# defined in scp2 project, because tooling -# cannot handle files with beginning dot -# correctly. -################################################ - -sub resolving_hidden_flag -{ - my ($filesarrayref, $variableshashref, $item, $languagestringref) = @_; - - my $diritem = lc($item); - my $infoline = ""; - - my $hiddendirbase = installer::systemactions::create_directories("hidden_$diritem", $languagestringref); - - installer::logger::include_header_into_logfile("$item with flag HIDDEN:"); - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - my $onefile = ${$filesarrayref}[$i]; - my $styles = ""; - - if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } - - if ( $styles =~ /\bHIDDEN\b/ ) - { - # Language specific subdirectory - - my $onelanguage = $onefile->{'specificlanguage'}; - - if ($onelanguage eq "") - { - $onelanguage = "00"; # files without language into directory "00" - } - - my $hiddendir = $hiddendirbase . $installer::globals::separator . $onelanguage . $installer::globals::separator; - installer::systemactions::create_directory($hiddendir); # creating language specific directories - - # copy files and edit them with the variables defined in the zip.lst - - my $onefilename = $onefile->{'Name'}; - my $newfilename = "\." . $onefilename; - my $sourcefile = $onefile->{'sourcepath'}; - my $destfile = $hiddendir . $newfilename; - - my $copysuccess = installer::systemactions::copy_one_file($sourcefile, $destfile); - - if ( $copysuccess ) - { - $onefile->{'sourcepath'} = $destfile; - $destination = $onefile->{'destination'}; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$destination); - if ( $destination eq "" ) { $onefile->{'destination'} = $newfilename; } - else { $onefile->{'destination'} = $destination . $installer::globals::separator . $newfilename; } - - $infoline = "Success: Using file with flag HIDDEN from \"$onefile->{'sourcepath'}\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Error: Failed to copy HIDDEN file from \"$sourcefile\" to \"$destfile\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - } - - $infoline = "\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -################################################ -# Controlling that all keys in hash A are -# also key in hash B. -################################################ - -sub key_in_a_is_also_key_in_b -{ - my ( $hashref_a, $hashref_b) = @_; - - my $returnvalue = 1; - - my $key; - foreach $key ( keys %{$hashref_a} ) - { - if ( ! exists($hashref_b->{$key}) ) - { - print "*****\n"; - foreach $keyb ( keys %{$hashref_b} ) { print "$keyb : $hashref_b->{$keyb}\n"; } - print "*****\n"; - $returnvalue = 0; - } - } - - return $returnvalue; -} - -###################################################### -# Getting the first entry from a list of languages -###################################################### - -sub get_first_from_list -{ - my ( $list ) = @_; - - my $first = $list; - - if ( $list =~ /^\s*(.+?),(.+)\s*$/) # "?" for minimal matching - { - $first = $1; - } - - return $first; -} - -################################################ -# Setting all spellchecker languages -################################################ - -sub set_spellcheckerlanguages -{ - my ( $productlanguagesarrayref, $allvariables ) = @_; - - my %productlanguages = (); - for ( my $i = 0; $i <= $#{$productlanguagesarrayref}; $i++ ) { $productlanguages{${$productlanguagesarrayref}[$i]} = 1; } - - my $spellcheckfilename = $allvariables->{'SPELLCHECKERFILE'}; - - my $spellcheckfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$spellcheckfilename, "", 1); - - if ($$spellcheckfileref eq "") { installer::exiter::exit_program("ERROR: Could not find $spellcheckfilename!", "set_spellcheckerlanguages"); } - - my $infoline = "Using spellchecker file: $$spellcheckfileref \n"; - push( @installer::globals::globallogfileinfo, $infoline); - - my $spellcheckfile = installer::files::read_file($$spellcheckfileref); - my %spellcheckhash = (); - - for ( my $j = 0; $j <= $#{$spellcheckfile}; $j++ ) - { - # Analyzing all "key=value" lines - my $oneline = ${$spellcheckfile}[$j]; - - if ( $oneline =~ /^\s*(\S+)\s*\=\s*\"(.*?)\"\s*$/ ) # no white space allowed in key - { - my $onelang = $1; - my $languagelist = $2; - - # Special handling for language packs. Only include the first language of the language list. - # If no spellchecker shall be included, the keyword "EMPTY" can be used. - - if ( $installer::globals::languagepack ) - { - my $first = get_first_from_list($languagelist); - - if ( $first eq "EMPTY" ) # no spellchecker into language pack - { - $languagelist = ""; - } - else - { - $languagelist = $first; - } - } - else # no language pack, so EMPTY is not required - { - $languagelist =~ s/^\s*EMPTY\s*,//; # removing the entry EMPTY - } - - $spellcheckhash{$onelang} = $languagelist; - } - } - - # Collecting all required languages in %installer::globals::spellcheckerlanguagehash - - foreach my $lang (keys %productlanguages) - { - my $languagelist = ""; - if ( exists($spellcheckhash{$lang}) ) { $languagelist = $spellcheckhash{$lang}; } - else { $languagelist = $spellcheckhash{'en-US'}; } # defaulting to English - - my $langlisthash = installer::converter::convert_stringlist_into_hash(\$languagelist, ","); - foreach my $onelang ( keys %{$langlisthash} ) { $installer::globals::spellcheckerlanguagehash{$onelang} = 1; } - } - - $installer::globals::analyze_spellcheckerlanguage = 1; - - # Logging - - my $langstring = ""; - foreach my $lang (sort keys %installer::globals::spellcheckerlanguagehash) { $langstring = $langstring . "," . $lang } - $langstring =~ s/^\s*,//; - - $infoline = "Collected spellchecker languages for spellchecker: $langstring \n"; - push( @installer::globals::globallogfileinfo, $infoline); -} - -################################################ -# Including a license text into setup script -################################################ - -sub put_license_into_setup -{ - my ($installdir, $includepatharrayref) = @_; - - # find and read english license file - my $licenselanguage = "en-US"; # always english ! - # my $licensefilename = "LICENSE"; # _" . $licenselanguage; - my $licensefilename = "license"; # . $licenselanguage . ".txt"; - my $licenseincludepatharrayref = get_language_specific_include_pathes($includepatharrayref, $licenselanguage); - - my $licenseref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $licenseincludepatharrayref, 0); - if ($$licenseref eq "") { installer::exiter::exit_program("ERROR: Could not find License file $licensefilename!", "put_license_into_setup"); } - my $licensefile = installer::files::read_file($$licenseref); - - # Read setup - my $setupfilename = $installdir . $installer::globals::separator . "setup"; - my $setupfile = installer::files::read_file($setupfilename); - - # Replacement - my $infoline = "Adding licensefile into setup script\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $includestring = ""; - for ( my $i = 0; $i <= $#{$licensefile}; $i++ ) { $includestring = $includestring . ${$licensefile}[$i]; } - for ( my $i = 0; $i <= $#{$setupfile}; $i++ ) { ${$setupfile}[$i] =~ s/LICENSEFILEPLACEHOLDER/$includestring/; } - - # Write setup - installer::files::save_file($setupfilename, $setupfile); -} - -################################################ -# Setting global path to getuid.so library -################################################ - -sub set_getuid_path -{ - my ($includepatharrayref) = @_; - - my $getuidlibraryname = "getuid.so"; - my $getuidlibraryref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$getuidlibraryname, $includepatharrayref, 0); - if ($$getuidlibraryref eq "") { installer::exiter::exit_program("ERROR: Could not find $getuidlibraryname!", "set_getuid_path"); } - - $installer::globals::getuidpath = $$getuidlibraryref; - $installer::globals::getuidpathset = 1; -} - -######################################################### -# Create a tar file from the binary package -######################################################### - -sub tar_package -{ - my ( $installdir, $packagename, $tarfilename, $getuidlibrary) = @_; - - my $ldpreloadstring = ""; - if ( $getuidlibrary ne "" ) { $ldpreloadstring = "LD_PRELOAD=" . $getuidlibrary; } - - my $systemcall = "cd $installdir; $ldpreloadstring tar -cf - $packagename > $tarfilename"; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - chmod 0775, $tarfilename; - - my $fulltarfile = $installdir . $installer::globals::separator . $tarfilename; - my $filesize = ( -s $fulltarfile ); - - return $filesize; -} - -######################################################### -# Create a tar file from the binary package -######################################################### - -sub untar_package -{ - my ( $installdir, $tarfilename, $getuidlibrary) = @_; - - my $ldpreloadstring = ""; - if ( $getuidlibrary ne "" ) { $ldpreloadstring = "LD_PRELOAD=" . $getuidlibrary; } - - my $systemcall = "cd $installdir; $ldpreloadstring tar -xf $tarfilename"; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: Executed \"$systemcall\" successfully!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - chmod 0775, $tarfilename; -} - -######################################################### -# Shuffle an array (Fisher Yates shuffle) -######################################################### - -sub shuffle_array -{ - my ( $arrayref ) = @_; - - my $i = @$arrayref; - while (--$i) - { - my $j = int rand ($i+1); - @$arrayref[$i,$j] = @$arrayref[$j,$i]; - } -} - -################################################ -# Defining the English license text to add -# it into Solaris packages. -################################################ - -sub set_english_license -{ - my $additional_license_name = $installer::globals::englishsolarislicensename; # always the English file - my $licensefileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$additional_license_name, "" , 0); - if ( $$licensefileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find license file $additional_license_name!", "set_english_license"); } - $installer::globals::englishlicenseset = 1; - $installer::globals::englishlicense = installer::files::read_file($$licensefileref); - installer::scpzipfiles::replace_all_ziplistvariables_in_file($installer::globals::englishlicense, $variableshashref); -} - -############################################## -# Setting time stamp of copied files to avoid -# errors from pkgchk. -############################################## - -sub set_time_stamp_for_file -{ - my ($sourcefile, $destfile) = @_; - - my $systemcall = "touch -r $sourcefile $destfile"; - - my $returnvalue = system($systemcall); - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ($returnvalue) - { - $infoline = "ERROR: \"$systemcall\" failed!\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Success: \"$systemcall\" !\n"; - push( @installer::globals::logfileinfo, $infoline); - } -} - -############################################## -# Setting checksum and wordcount for changed -# pkginfo file into pkgmap. -############################################## - -sub change_onefile_in_pkgmap -{ - my ($pkgmapfile, $fullfilename, $shortfilename) = @_; - - # 1 i pkginfo 442 34577 1166716297 - # -> - # 1 i pkginfo 443 34737 1166716297 - # - # wc -c pkginfo | cut -f6 -d' ' -> 442 (variable) - # sum pkginfo | cut -f1 -d' ' -> 34577 (variable) - # grep 'pkginfo' pkgmap | cut -f6 -d' ' -> 1166716297 (fix) - - my $checksum = call_sum($fullfilename); - if ( $checksum =~ /^\s*(\d+)\s+.*$/ ) { $checksum = $1; } - - my $wordcount = call_wc($fullfilename); - if ( $wordcount =~ /^\s*(\d+)\s+.*$/ ) { $wordcount = $1; } - - for ( my $i = 0; $i <= $#{$pkgmapfile}; $i++ ) - { - if ( ${$pkgmapfile}[$i] =~ /(^.*\b\Q$shortfilename\E\b\s+)(\d+)(\s+)(\d+)(\s+)(\d+)(\s*$)/ ) - { - my $newline = $1 . $wordcount . $3 . $checksum . $5 . $6 . $7; - ${$pkgmapfile}[$i] = $newline; - last; - } - } -} - -################################################ -# Adding the content of the English license -# file into the system integration packages. -################################################ - -sub add_license_into_systemintegrationpackages -{ - my ($destdir, $packages) = @_; - - for ( my $i = 0; $i <= $#{$packages}; $i++ ) - { - my $copyrightfilename = ${$packages}[$i] . $installer::globals::separator . "install" . $installer::globals::separator . "copyright"; - if ( ! -f $copyrightfilename ) { installer::exiter::exit_program("ERROR: Could not find license file in system integration package: $copyrightfilename!", "add_license_into_systemintegrationpackages"); } - my $copyrightfile = installer::files::read_file($copyrightfilename); - - # Saving time stamp of old copyrightfile - my $savcopyrightfilename = $copyrightfilename . ".sav"; - installer::systemactions::copy_one_file($copyrightfilename, $savcopyrightfilename); - set_time_stamp_for_file($copyrightfilename, $savcopyrightfilename); # now $savcopyrightfile has the time stamp of $copyrightfile - - # Adding license content to copyright file - push(@{$copyrightfile}, "\n"); - for ( my $i = 0; $i <= $#{$installer::globals::englishlicense}; $i++ ) { push(@{$copyrightfile}, ${$installer::globals::englishlicense}[$i]); } - installer::files::save_file($copyrightfilename, $copyrightfile); - - # Setting the old time stamp saved with $savcopyrightfilename - set_time_stamp_for_file($savcopyrightfilename, $copyrightfilename); # now $copyrightfile has the time stamp of $savcopyrightfile - unlink($savcopyrightfilename); - - # Changing content of copyright file in pkgmap - my $pkgmapfilename = ${$packages}[$i] . $installer::globals::separator . "pkgmap"; - if ( ! -f $pkgmapfilename ) { installer::exiter::exit_program("ERROR: Could not find pkgmap in system integration package: $pkgmapfilename!", "add_license_into_systemintegrationpackages"); } - my $pkgmap = installer::files::read_file($pkgmapfilename); - change_onefile_in_pkgmap($pkgmap, $copyrightfilename, "copyright"); - installer::files::save_file($pkgmapfilename, $pkgmap); - } -} - -######################################################### -# Collecting all pkgmap files from an installation set -######################################################### - -sub collectpackagemaps -{ - my ( $installdir, $languagestringref, $allvariables ) = @_; - - installer::logger::include_header_into_logfile("Collecing all packagemaps (pkgmap):"); - - my $pkgmapdir = installer::systemactions::create_directories("pkgmap", $languagestringref); - my $subdirname = $allvariables->{'UNIXPRODUCTNAME'} . "_pkgmaps"; - my $pkgmapsubdir = $pkgmapdir . $installer::globals::separator . $subdirname; - if ( -d $pkgmapsubdir ) { installer::systemactions::remove_complete_directory($pkgmapsubdir); } - if ( ! -d $pkgmapsubdir ) { installer::systemactions::create_directory($pkgmapsubdir); } - - $installdir =~ s/\/\s*$//; - # Collecting all packages in $installdir and its sub package ("packages") - my $searchdir = $installdir . $installer::globals::separator . $installer::globals::epmoutpath; - - my $allpackages = installer::systemactions::get_all_directories_without_path($searchdir); - - for ( my $i = 0; $i <= $#{$allpackages}; $i++ ) - { - my $pkgmapfile = $searchdir . $installer::globals::separator . ${$allpackages}[$i] . $installer::globals::separator . "pkgmap"; - my $destfilename = $pkgmapsubdir . $installer::globals::separator . ${$allpackages}[$i] . "_pkgmap"; - installer::systemactions::copy_one_file($pkgmapfile, $destfilename); - } - - # Create a tar gz file with all package maps - my $tarfilename = $subdirname . ".tar"; - my $targzname = $tarfilename . ".gz"; - $systemcall = "cd $pkgmapdir; tar -cf - $subdirname | gzip > $targzname"; - make_systemcall($systemcall); - installer::systemactions::remove_complete_directory($pkgmapsubdir, 1); -} - -1; diff --git a/solenv/bin/modules/installer/xpdinstaller.pm b/solenv/bin/modules/installer/xpdinstaller.pm deleted file mode 100644 index fe3998845..000000000 --- a/solenv/bin/modules/installer/xpdinstaller.pm +++ /dev/null @@ -1,1820 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* -package installer::xpdinstaller; - -use Cwd; -use installer::converter; -use installer::exiter; -use installer::globals; -use installer::languages; -use installer::logger; -use installer::pathanalyzer; -use installer::remover; -use installer::systemactions; - - -####################################################### -# Searching for the module name and description in the -# modules collector -####################################################### - -sub get_module_name_description -{ - my ($modulesarrayref, $onelanguage, $gid, $type) = @_; - - my $found = 0; - - my $newstring = ""; - - for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ ) - { - my $onemodule = ${$modulesarrayref}[$i]; - - if ( $onemodule->{'gid'} eq $gid ) - { - my $typestring = $type . " " . "(" . $onelanguage . ")"; - if ( $onemodule->{$typestring} ) { $newstring = $onemodule->{$typestring}; } - $found = 1; - } - - if ( $found ) { last; } - } - - # defaulting to english - - if ( ! $found ) - { - my $defaultlanguage = "en-US"; - - for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ ) - { - my $onemodule = ${$modulesarrayref}[$i]; - - if ( $onemodule->{'gid'} eq $gid ) - { - my $typestring = $type . " " . "(" . $defaultlanguage . ")"; - if ( $onemodule->{$typestring} ) { $newstring = $onemodule->{$typestring}; } - $found = 1; - } - - if ( $found ) { last; } - } - } - - return $newstring; -} - -################################################### -# Finding module, specified by the gid -################################################### - -sub get_module -{ - my ($modulegid, $modulesarrayref) = @_; - - my $found = 0; - my $searchmodule = ""; - - for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ ) - { - my $onemodule = ${$modulesarrayref}[$i]; - - if ( $onemodule->{'gid'} eq $modulegid ) - { - $searchmodule = $onemodule; - $found = 1; - last; - } - } - - return $searchmodule; -} - -################################################### -# Creating package start tag -################################################### - -sub get_package_tag -{ - my ( $module, $indent, $linkpackage ) = @_; - - my $modulegid = $module->{'gid'}; - if ( $linkpackage ) { $modulegid = $modulegid . "u"; } - my $parentgid = ""; - if ( $module->{'ParentID'} ) { $parentgid = $module->{'ParentID'}; } - if ( $parentgid eq "" ) { $parentgid = "root"; } - if ( $module->{'XPDParentID'} ) { $parentgid = $module->{'XPDParentID'}; } # changing parent of "Prg" and "Opt" to "root" - - my $tag = $indent . "<package " . "name=" . "\"" . $modulegid . "\" " . "parent=" . "\"" . $parentgid . "\">" . "\n"; - - return ( $tag, $parentgid ); -} - -################################################### -# Creating display start tag -################################################### - -sub get_display_tag -{ - my ( $module, $indent ) = @_; - - # Styles=(HIDDEN_ROOT) - my $styles = ""; - my $type = ""; - if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; } - if ( $styles =~ /\bHIDDEN_ROOT\b/ ) { $type = "hidden"; } - else { $type = "show"; } - - # special handling for language modules. Only visible in multilingual installation set. - if (( $styles =~ /\bSHOW_MULTILINGUAL_ONLY\b/ ) && ( ! $installer::globals::ismultilingual )) { $type = "hidden"; } - - # special handling for the root module, which has no parent - my $parentgid = ""; - if ( $module->{'ParentID'} ) { $parentgid = $module->{'ParentID'}; } - if ( $parentgid eq "" ) { $type = "hidden"; } - - my $tag = $indent . "<display " . "type=" . "\"" . $type . "\"" . ">" . "\n"; - - return $tag; -} - -################################################### -# Creating installunit start tag -################################################### - -sub get_installunit_tag -{ - my ( $indent ) = @_; - - my $type = $installer::globals::packageformat; - - my $tag = $indent . "<installunit " . "type=" . "\"" . $type . "\"" . ">" . "\n"; - - return $tag; -} - -################################################### -# Creating simple start tags -################################################### - -sub get_start_tag -{ - my ( $tag, $indent ) = @_; - - my $starttag = $indent . "<" . $tag . ">" . "\n"; - return $starttag; -} - -################################################### -# Creating end tags -################################################### - -sub get_end_tag -{ - my ( $tag, $indent ) = @_; - - my $endtag = $indent . "</" . $tag . ">" . "\n"; - return $endtag; -} - -################################################### -# Creating simple complete tag -################################################### - -sub get_tag_line -{ - my ( $indent, $name, $value ) = @_; - $value = '' unless defined $value; - - my $line = $indent . "<" . $name . ">" . $value . "</" . $name . ">" . "\n"; - -} - -################################################### -# Asking module for sortkey entry -################################################### - -sub get_sortkey_value -{ - my ( $module ) = @_; - - my $value = "9999"; - - if ( $module->{'Sortkey'} ) { $value = $module->{'Sortkey'}; } - - return $value; -} - -################################################### -# Asking module for default entry -################################################### - -sub get_default_value -{ - my ( $module ) = @_; - - my $value = ""; - - if ( $module->{'Default'} ) { $value = $module->{'Default'}; } # is YES or NO - - if ( $value =~ /\bNO\b/i ) { $value = "false"; } - else { $value = "true"; } - - return $value; -} - -################################################### -# Asking module for showinuserinstall entry -# scp style: DONTSHOWINUSERINSTALL -################################################### - -sub get_showinuserinstall_value -{ - my ( $module ) = @_; - - my $value = "true"; - - my $styles = ""; - if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; } - if ( $styles =~ /\bDONTSHOWINUSERINSTALL\b/ ) { $value = "false"; } - - return $value; -} - -################################################### -# Asking module for showinuserinstall entry -# scp style: USERINSTALLONLY -################################################### - -sub get_userinstallonly_value -{ - my ( $module ) = @_; - - my $value = "false"; - - my $styles = ""; - if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; } - if ( $styles =~ /\bUSERINSTALLONLY\b/ ) { $value = "true"; } - - return $value; -} - -################################################### -# Asking module for dontuninstall entry -# scp style: DONTUNINSTALL -################################################### - -sub get_dontuninstall_value -{ - my ( $module ) = @_; - - my $value = "false"; - - my $styles = ""; - if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; } - if ( $styles =~ /\bDONTUNINSTALL\b/ ) { $value = "true"; } - - return $value; -} - -################################################### -# Asking module for XpdCheckSolaris entry -# (belongs to scp module) -################################################### - -sub get_checksolaris_value -{ - my ( $module ) = @_; - - my $value = ""; - if ( $module->{'XpdCheckSolaris'} ) { $value = $module->{'XpdCheckSolaris'}; } - - return $value; -} - -################################################### -# Asking module for isupdatepackage entry -# scp style: ISUPDATEPACKAGE -################################################### - -sub get_isupdatepackage_value -{ - my ( $module ) = @_; - - my $value = "false"; - - my $styles = ""; - if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; } - if ( $styles =~ /\bISUPDATEPACKAGE\b/ ) { $value = "true"; } - - return $value; -} - -################################################### -# Asking module for showmultilingualonly entry -# scp style: SHOW_MULTILINGUAL_ONLY -################################################### - -sub get_showmultilingualonly_value -{ - my ( $module ) = @_; - - my $value = "false"; - - my $styles = ""; - if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; } - if ( $styles =~ /\bSHOW_MULTILINGUAL_ONLY\b/ ) { $value = "true"; } - - return $value; -} - -################################################### -# Asking module for showmultilingualonly entry -# scp style: SHOW_MULTILINGUAL_ONLY -################################################### - -sub get_applicationmodule_value -{ - my ( $module ) = @_; - - my $value = "false"; - - my $styles = ""; - if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; } - if ( $styles =~ /\bAPPLICATIONMODULE\b/ ) { $value = "true"; } - - return $value; -} - -################################################### -# Asking module for java module entry -# scp style: JAVAMODULE -################################################### - -sub get_isjavamodule_value -{ - my ( $module ) = @_; - - my $value = "false"; - - my $styles = ""; - if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; } - if ( $styles =~ /\bJAVAMODULE\b/ ) { $value = "true"; } - - return $value; -} - -##################################################################### -# Asking module, if installation shall use --force -# scp style: USEFORCE (Linux only) -##################################################################### - -sub get_useforce_value -{ - my ( $module ) = @_; - - my $value = "false"; - - my $styles = ""; - if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; } - if ( $styles =~ /\bUSEFORCE\b/ ) { $value = "true"; } - - return $value; -} - -################################################### -# Asking module, if installation can fail -# scp style: INSTALLCANFAIL -################################################### - -sub get_installcanfail_value -{ - my ( $module ) = @_; - - my $value = "false"; - - my $styles = ""; - if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; } - if ( $styles =~ /\bINSTALLCANFAIL\b/ ) { $value = "true"; } - - return $value; -} - -################################################### -# Asking module, if installation can fail -# scp style: INSTALLCANFAIL -################################################### - -sub get_forceintoupdate_value -{ - my ( $module ) = @_; - - my $value = "false"; - - my $styles = ""; - if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; } - if ( $styles =~ /\bFORCEINTOUPDATE\b/ ) { $value = "true"; } - - return $value; -} - -################################################### -# Substituting all occurrences of "<" by "<" -# and all occurrences of ">" by ">" -################################################### - -sub replace_brackets_in_string -{ - my ( $string ) = @_; - - if ( $string =~ /\</ ) { $string =~ s/\</\<\;/g; } - if ( $string =~ /\>/ ) { $string =~ s/\>/\>\;/g; } - - return $string; -} - -################################################### -# Substituting all occurrences of "\uUXYZ" by -# "&#xUXYZ;", because the use xml saxparser does -# not know anything about this encoding. Therfore -# the xml file can keep standard encoding "UTF-8" -# and all strings with "\uUXYZ" do not need to -# be converted from the Java installer. -################################################### - -sub replace_javaencoding_in_string -{ - my ( $string ) = @_; - - while ( $string =~ /(\\u\w\w\w\w)/ ) - { - my $oldvalue = $1; - my $newvalue = ""; - if ( $oldvalue =~ /\\u(\w\w\w\w)/ ) - { - my $number = $1; - $newvalue = "&#x" . $number . ";"; - } - - $string =~ s/\Q$oldvalue\E/$newvalue/; - } - - return $string; -} - -################################################### -# Collecting language dependent entries from scp -# (Name and Description) -################################################### - -sub collect_lang_values -{ - my ($indent, $module, $xpdfile, $searchentry, $saveentry) = @_; - - foreach $key (keys %{$module}) - { - my $write_line = 0; - my $javalanguage = ""; - - if ( $key =~ /^\s*\Q$searchentry\E\s+\((\S+)\)\s*$/ ) # this are the language dependent keys - { - $language = $1; - $javalanguage = installer::languages::get_java_language($language); - $write_line = 1; - } - elsif ( $key =~ /^\s*\Q$searchentry\E\s*$/ ) # this are the language independent keys - { - $javalanguage = "en_US"; - $write_line = 1; - } - - if ( $write_line ) - { - my $value = $module->{$key}; - $value = replace_brackets_in_string($value); - $value = replace_javaencoding_in_string($value); - my $line = $indent . "<" . $saveentry . " lang=" . "\"" . $javalanguage . "\"" . ">" . $value . "<\/" . $saveentry . ">" . "\n"; - push(@{$xpdfile}, $line); - } - } -} - -################################################### -# Removing language dependent entries from -# module hash (Name and Description) -################################################### - -sub remove_lang_values -{ - my ($module, $searchentry) = @_; - - my $key = ""; - - foreach $key (keys %{$module}) - { - if ( $key =~ /^\s*\Q$searchentry\E\s+\((\S+)\)\s*$/ ) # this are the language dependent keys - { - delete($module->{$key}); - } - } -} - -################################################### -# Setting package install order -################################################### - -sub get_order_value -{ - my ( $module ) = @_; - - my $value = "1000"; # Setting the default value - - if ( $module->{'InstallOrder'} ) { $value = $module->{'InstallOrder'}; } - - return $value; -} - -################################################### -# Checking size of package -################################################### - -sub get_size_value -{ - my ( $packagename, $xpdinfo ) = @_; - - my $value = ""; - - if ( $xpdinfo->{'FileSize'} ) - { - $value = $xpdinfo->{'FileSize'}; - return $value; - } - - my $isrpmfile = 0; - if ( $packagename =~ /\.rpm\s*$/ ) { $isrpmfile = 1; } - - if (( $installer::globals::isrpmbuild ) && ( $isrpmfile )) - { - if ( ! $installer::globals::rpmquerycommand ) { $installer::globals::rpmquerycommand = "rpm"; } - - my $systemcall = "$installer::globals::rpmquerycommand -qp --queryformat \"\[\%\{FILESIZES\}\\n\]\" $packagename 2\>\&1 |"; - my $ld_library_backup = $ENV{LD_LIBRARY_PATH}; - if ( defined $ENV{SYSBASE}) { - my $sysbase = $ENV{SYSBASE}; - if ( !defined ($ld_library_backup) or ("$ld_library_backup" eq "") ) { - $ld_library_backup = "" if ! defined $ld_library_backup; - $ENV{LD_LIBRARY_PATH} = "$sysbase/usr/lib"; - } else { - $ENV{LD_LIBRARY_PATH} = "$ld_library_backup:$sysbase/lib"; - } - } - my ($rpmout, $error) = make_systemcall_allowing_error($systemcall, 0, 1); - $ENV{LD_LIBRARY_PATH} = $ld_library_backup; - # Evaluating an error, because of rpm problems with removed LD_LIBRARY_PATH - if ( $error ) - { - installer::logger::print_message( "... trying /usr/bin/rpm ...\n" ); - my $systemcall = "/usr/bin/rpm -qp --queryformat \"\[\%\{FILESIZES\}\\n\]\" $packagename 2\>\&1 |"; - ($rpmout, $error) = make_systemcall_allowing_error($systemcall, 0, 0); - if ( $error ) { installer::exiter::exit_program("ERROR: rpm failed to query package!", "get_size_value"); } - } - $value = do_sum($rpmout); # adding all filesizes in bytes - $value = $value/1000; - - my $ganzzahl = int $value; - if ($ganzzahl < $value) { $value = $ganzzahl + 1; } - else { $value = $ganzzahl; } - - my $rpmname = $packagename; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$rpmname); - $infoline = "Filesize $rpmname : $value\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - if ( $installer::globals::issolarispkgbuild ) - { - my $filename = "pkgmap"; - $filename = $packagename . $installer::globals::separator . $filename; - $file = installer::files::read_file($filename); - - for ( my $i = 0; $i <= $#{$file}; $i++ ) - { - my $line = ${$file}[$i]; - if ( $line =~ /^\s*\:\s+\d+\s+(\d+?)\s+/ ) - { - $value = $1; - if ( ! ( $value%2 == 0 )) { $value = $value + 1; } - $value = $value/2; # not blocks, but kB - last; - } - } - } - - if ( $value eq "" ) { $value = "0"; } - - return $value; -} - -################################################### -# Checking md5 of package -################################################### - -sub get_md5_value -{ - my ( $packagename, $xpdinfo ) = @_; - - my $value = ""; - - if ( $xpdinfo->{'md5sum'} ) - { - $value = $xpdinfo->{'md5sum'}; - return $value; - } - - if ( $installer::globals::isrpmbuild ) - { - my $md5file = "/usr/bin/md5sum"; - - if ( -x $md5file ) - { - my $systemcall = "$md5file $packagename 2\>\&1 |"; - my $md5out = make_systemcall($systemcall, 1); - $value = ${$md5out}[0]; - if ( $value =~ /^\s*(\S+?)\s+.*$/ ) - { - $value = $1; - } - - my $rpmname = $packagename; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$rpmname); - $infoline = "md5sum of $rpmname : $value\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - - return $value; -} - -################################################### -# Checking name of package -################################################### - -sub get_name_value -{ - my ( $packagename ) = @_; - - my $value = $packagename; - - # $packagename contains the complete path to the package - # Only the name of file or directory is required - - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$value); - - return $value; -} - -################################################### -# Checking full package name (Linux only) -################################################### - -sub get_fullpkgname_value -{ - my ( $packagename, $xpdinfo ) = @_; - - my $value = ""; - my $isrpmfile = 0; - if ( $packagename =~ /\.rpm\s*$/ ) { $isrpmfile = 1; } - - if (( $installer::globals::isrpmbuild ) && ( $isrpmfile )) - { - if ( $xpdinfo->{'FullPackageName'} ) - { - $value = $xpdinfo->{'FullPackageName'}; - return $value; - } - - if ( ! $installer::globals::rpmquerycommand ) { $installer::globals::rpmquerycommand = "rpm"; } - my $systemcall = "$installer::globals::rpmquerycommand -qp $packagename |"; - my $ld_library_backup = $ENV{LD_LIBRARY_PATH}; - if ( defined $ENV{SYSBASE}) { - my $sysbase = $ENV{SYSBASE}; - if ( !defined ($ld_library_backup) or ("$ld_library_backup" eq "") ) { - $ld_library_backup = "" if ! defined $ld_library_backup; - $ENV{LD_LIBRARY_PATH} = "$sysbase/usr/lib"; - } else { - $ENV{LD_LIBRARY_PATH} = "$ld_library_backup:$sysbase/lib"; - } - } - my ($returnarray, $error) = make_systemcall_allowing_error($systemcall, 0, 1); - $ENV{LD_LIBRARY_PATH} = $ld_library_backup; - # Evaluating an error, because of rpm problems with removed LD_LIBRARY_PATH - if ( $error ) - { - installer::logger::print_message( "... trying /usr/bin/rpm ...\n" ); - my $systemcall = "/usr/bin/rpm -qp $packagename |"; - ($returnarray, $error) = make_systemcall_allowing_error($systemcall, 0, 0); - if ( $error ) { installer::exiter::exit_program("ERROR: rpm failed to query package!", "get_fullpkgname_value"); } - } - $value = ${$returnarray}[0]; - installer::remover::remove_leading_and_ending_whitespaces(\$value); - - my $rpmname = $packagename; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$rpmname); - - $infoline = "Full package name from $rpmname: $value\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return $value; -} - -################################################### -# Checking package version (Solaris only) -################################################### - -sub get_pkgversion_value -{ - my ( $completepackagename, $xpdinfo ) = @_; - - my $value = ""; - - if ( $xpdinfo->{'PkgVersion'} ) - { - $value = $xpdinfo->{'PkgVersion'}; - return $value; - } - - if ( $installer::globals::issolarispkgbuild ) - { - my $pkgfile = "pkgparam"; - my $packagepath = $completepackagename; - installer::pathanalyzer::get_path_from_fullqualifiedname(\$packagepath); - - my $packagename = $completepackagename; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$packagename); - - my $systemcall = "$pkgfile -d $packagepath $packagename param VERSION 2\>\&1 |"; - my $returnarray = make_systemcall($systemcall, 0); - - $value = ${$returnarray}[0]; - installer::remover::remove_leading_and_ending_whitespaces(\$value); - } - - return $value; -} - -################################################### -# Writing subdirectory into xpd file -################################################### - -sub get_subdir_value -{ - my ( $packagename, $subdir, $module ) = @_; - - my $value = ""; - - if ( $subdir ) { $value = $subdir; } - - if ( $module->{'Subdir'} ) { $value = $module->{'Subdir'}; } - - return $value; -} - -################################################### -# Checking if package is relocatable -################################################### - -sub get_relocatable_value -{ - my ( $module ) = @_; - - my $value = "true"; - - my $styles = ""; - if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; } - if ( $styles =~ /\bNOTRELOCATABLE\b/ ) { $value = "false"; } - - return $value; -} - -################################################### -# Checking if package is relocatable -################################################### - -sub get_languagespecific_value -{ - my ( $islanguagemodule ) = @_; - - my $value = "false"; - - if ( defined $islanguagemodule && $islanguagemodule == 1 ) { $value = "true"; } - - return $value; -} - -####################################################### -# Adding the values of the array -####################################################### - -sub do_sum -{ - my ( $allnumbers ) = @_; - - my $sum = 0; - - for ( my $i = 0; $i <= $#{$allnumbers}; $i++ ) - { - $sum = $sum + ${$allnumbers}[$i]; - } - - return $sum; -} - -####################################################### -# Executing one system call -####################################################### - -sub make_systemcall -{ - my ( $systemcall, $logreturn ) = @_; - - my @returns = (); - - installer::logger::print_message( "... $systemcall ...\n" ); - - open (REG, "$systemcall"); - while (<REG>) {push(@returns, $_); } - close (REG); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( $logreturn ) - { - for ( my $j = 0; $j <= $#returns; $j++ ) { push( @installer::globals::logfileinfo, "$returns[$j]"); } - } - - if ($returnvalue) - { - $infoline = "ERROR: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - $error_occurred = 1; - } - else - { - $infoline = "SUCCESS: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return \@returns; -} - -####################################################### -# Executing one system call -####################################################### - -sub make_systemcall_allowing_error -{ - my ( $systemcall, $logreturn, $can_fail ) = @_; - - my @returns = (); - - installer::logger::print_message( "... $systemcall ...\n" ); - - open (REG, "$systemcall"); - while (<REG>) {push(@returns, $_); } - close (REG); - - my $returnvalue = $?; # $? contains the return value of the systemcall - - my $infoline = "Systemcall: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( $logreturn ) - { - for ( my $j = 0; $j <= $#returns; $j++ ) { push( @installer::globals::logfileinfo, "$returns[$j]"); } - } - - if ($returnvalue) - { - if ( $can_fail ) - { - $infoline = "WARNING: Failed system call: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - $error_occurred = 1; - } - else - { - $infoline = "ERROR: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - $error_occurred = 1; - } - } - else - { - $infoline = "SUCCESS: $systemcall\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - return (\@returns, $returnvalue); -} - -################################################### -# Setting product name tag -################################################### - -sub get_product_tag -{ - my ($allvariables, $indent) = @_; - - my $productname = $allvariables->{'LCONEWORDPRODUCTNAME'}; - my $tag = $indent . "<product " . "name=" . "\"" . $productname . "\">" . "\n"; - - return $tag; -} - -################################################### -# Macro tags -################################################### - -sub set_macro_tag -{ - my ($allvariables, $indent, $key) = @_; - - my $property = ""; - my $value = ""; - - if ( $key eq "product_name" ) { $property = "PRODUCTNAME"; } - elsif ( $key eq "product_version" ) { $property = "PRODUCTVERSION"; } - elsif ( $key eq "product_suffix" ) { $property = "PRODUCTEXTENSION"; } - elsif ( $key eq "product_fullname" ) { $property = "FULLPRODUCTNAME"; } - - if (( $property eq "PRODUCTNAME" ) || ( $property eq "PRODUCTVERSION" ) || ( $property eq "PRODUCTEXTENSION" )) - { - $value = $allvariables->{$property}; - } - - if ( $property eq "FULLPRODUCTNAME" ) - { - $value = $allvariables->{"PRODUCTNAME"} . " " . $allvariables->{"PRODUCTVERSION"}; - if ( $allvariables->{"PRODUCTEXTENSION"} ) { $value = $value . " " . $allvariables->{"PRODUCTEXTENSION"}; } - } - - my $tag = $indent . "<macro " . "key=" . "\"" . $key . "\">" . $value . "\<\/macro\>" . "\n"; - - return $tag; - -} - -################################################### -# Setting the minor of the product version -# Required to check for Major Upgrades. -################################################### - -sub set_minor_tag -{ - my ($allvariables, $indent) = @_; - - my $productminor = 0; - if ( $allvariables->{"PACKAGEVERSION"} ) - { - if ( $allvariables->{"PACKAGEVERSION"} =~ /^\s*\d+\.(\d+)/ ) { $productminor = $1; } - } - my $tag = $indent . "<productminor>" . $productminor . "</productminor>" . "\n"; - - return $tag; -} - -################################################### -# Setting the update behaviour -################################################### - -sub set_update_tag -{ - my ($allvariables, $indent) = @_; - - my $updateflag = "false"; - if ( $allvariables->{"DONTUPDATE"} ) { $updateflag = "true"; } - my $tag = $indent . "<dontupdate>" . $updateflag . "</dontupdate>" . "\n"; - - return $tag; -} - -################################################### -# Setting the license dialog behaviour -################################################### - -sub set_hideeula_tag -{ - my ($allvariables, $indent) = @_; - - my $hidelicenseflag = "false"; - if ( $allvariables->{"HIDELICENSEDIALOG"} ) { $hidelicenseflag = "true"; } - my $tag = $indent . "<hideeula>" . $hidelicenseflag . "</hideeula>" . "\n"; - - return $tag; -} - -################################################### -# Setting default directory -################################################### - -sub set_defaultdir_tag -{ - my ($allvariables, $indent) = @_; - - my $defaultdir = ""; - if ( $allvariables->{"DEFAULTDESTPATH"} ) { $defaultdir = $allvariables->{"DEFAULTDESTPATH"}; } - my $tag = $indent . "<defaultdir>" . $defaultdir . "</defaultdir>" . "\n"; - - return $tag; -} - -################################################### -# Setting product directory -################################################### - -sub set_productdir_tag -{ - my ($allvariables, $indent) = @_; - - my $productdir = ""; - if ( $allvariables->{"UNIXPRODUCTNAME"} ) - { - $productdir = $allvariables->{"UNIXPRODUCTNAME"}; - - if ( $allvariables->{"BRANDPACKAGEVERSION"} ) - { - $productdir = $productdir . $allvariables->{"BRANDPACKAGEVERSION"}; - } - else - { - if ( $allvariables->{"PRODUCTVERSION"} ) - { - $productdir = $productdir . $allvariables->{"PRODUCTVERSION"}; - } - } - } - my $tag = $indent . "<productdir>" . $productdir . "</productdir>" . "\n"; - - return $tag; -} - -##################################################### -# Setting the package directory in installation set -##################################################### - -sub set_packagedir_tag -{ - my ($indent) = @_; - - my $tag = $indent . "<packagedirectory>" . $installer::globals::epmoutpath . "</packagedirectory>" . "\n"; - - return $tag; -} - -################################################### -# Setting the packagetype of installation set -################################################### - -sub set_packagetype_tag -{ - my ($indent) = @_; - - my $tag = $indent . "<packageformat>" . $installer::globals::packageformat . "</packageformat>" . "\n"; - - return $tag; -} - -################################################### -# Setting the architecture of installation set -################################################### - -sub set_architecture_tag -{ - my ($indent) = @_; - - my $architecture = ""; - if ( $installer::globals::issolarissparcbuild ) { $architecture = "sparc"; } - if ( $installer::globals::issolarisx86build ) { $architecture = "i386"; } - - my $tag = $indent . "<architecture>" . $architecture . "</architecture>" . "\n"; - - return $tag; -} - -################################################### -# Setting the multi language tag -################################################### - -sub set_multilanguage_tag -{ - my ($indent) = @_; - - my $value = "false"; - if ( $installer::globals::ismultilingual == 1 ) { $value = "true"; } - - my $tag = $indent . "<multilingual>" . $value . "</multilingual>" . "\n"; - - return $tag; -} - -################################################### -# Setting the language tag -################################################### - -sub set_language_tag -{ - my ($languagestringref, $indent) = @_; - - my $tag = $indent . "<languages>" . $$languagestringref . "</languages>" . "\n"; - - return $tag; -} - -################################################### -# Collecting content for product xpd file -################################################### - -# <?xml version='1.0' encoding='utf-8'?> -# -# <!-- General application description --> -# -# <product name="openoffice"> -# <macro key="product_name">Sun OpenOffice.org</macro> -# <macro key="product_version">1.0</macro> -# <macro key="product_suffix">Mephisto</macro> -# <macro key="product_fullname">Sun OpenOffice.org 1.0 Mephisto</macro> -# <defaultdir>/opt/Sun/OpenOffice.org-Mephisto</defaultdir> -# </product> - -sub get_setup_file_content -{ - my ($allvariables, $languagestringref) = @_; - - my @xpdfile = (); - my $noindent = ""; - my $singleindent = " "; - - my $line = "<?xml version='1.0' encoding='utf-8'?>\n\n"; - push(@xpdfile, $line); - $line = "<!-- General application description -->\n\n"; - push(@xpdfile, $line); - - my $tag = get_product_tag($allvariables, $noindent); - push(@xpdfile, $tag); - - $tag = set_macro_tag($allvariables, $singleindent, "product_name"); - push(@xpdfile, $tag); - $tag = set_macro_tag($allvariables, $singleindent, "product_version"); - push(@xpdfile, $tag); - $tag = set_macro_tag($allvariables, $singleindent, "product_suffix"); - push(@xpdfile, $tag); - $tag = set_macro_tag($allvariables, $singleindent, "product_fullname"); - push(@xpdfile, $tag); - - $tag = set_defaultdir_tag($allvariables, $singleindent); - push(@xpdfile, $tag); - - $tag = set_productdir_tag($allvariables, $singleindent); - push(@xpdfile, $tag); - - $tag = set_minor_tag($allvariables, $singleindent); - push(@xpdfile, $tag); - - $tag = set_update_tag($allvariables, $singleindent); - push(@xpdfile, $tag); - - $tag = set_packagedir_tag($singleindent); - push(@xpdfile, $tag); - - $tag = set_packagetype_tag($singleindent); - push(@xpdfile, $tag); - - $tag = set_architecture_tag($singleindent); - push(@xpdfile, $tag); - - $tag = set_multilanguage_tag($singleindent); - push(@xpdfile, $tag); - - $tag = set_language_tag($languagestringref, $singleindent); - push(@xpdfile, $tag); - - $tag = set_hideeula_tag($allvariables, $singleindent); - push(@xpdfile, $tag); - - $tag = get_end_tag("product", $noindent); - push(@xpdfile, $tag); - - return \@xpdfile; -} - -################################################### -# Collecting content for xpd file -################################################### - -sub get_file_content -{ - my ( $module, $packagename, $solslanguage, $linkpackage, $isemptyparent, $subdir, $islanguagemodule, $onelanguage, $xpdinfo ) = @_; - - my @xpdfile = (); - my $value = ""; - my $line = ""; - my $noindent = ""; - my $singleindent = " "; - my $doubleindent = $singleindent . $singleindent; - - my ( $tag, $parentgid ) = get_package_tag($module, $noindent, $linkpackage); - push(@xpdfile, $tag); - - # start of installunit tag -> using info from scp module - - $tag = get_display_tag($module, $singleindent); - push(@xpdfile, $tag); - - $value = get_sortkey_value($module); - $line = get_tag_line($doubleindent, "sortkey", $value); - push(@xpdfile, $line); - - $value = get_default_value($module); - $line = get_tag_line($doubleindent, "default", $value); - push(@xpdfile, $line); - - $value = get_showinuserinstall_value($module); - $line = get_tag_line($doubleindent, "showinuserinstall", $value); - push(@xpdfile, $line); - - $value = get_userinstallonly_value($module); - $line = get_tag_line($doubleindent, "showinuserinstallonly", $value); - push(@xpdfile, $line); - - $value = get_dontuninstall_value($module); - $line = get_tag_line($doubleindent, "dontuninstall", $value); - push(@xpdfile, $line); - - $value = get_checksolaris_value($module); - $line = get_tag_line($doubleindent, "checksolaris", $value); - push(@xpdfile, $line); - - $value = get_isupdatepackage_value($module); - $line = get_tag_line($doubleindent, "isupdatepackage", $value); - push(@xpdfile, $line); - - $value = get_showmultilingualonly_value($module); - $line = get_tag_line($doubleindent, "showmultilingualonly", $value); - push(@xpdfile, $line); - - $value = get_applicationmodule_value($module); - $line = get_tag_line($doubleindent, "applicationmodule", $value); - push(@xpdfile, $line); - - $value = get_isjavamodule_value($module); - $line = get_tag_line($doubleindent, "isjavapackage", $value); - push(@xpdfile, $line); - - $value = get_installcanfail_value($module); - $line = get_tag_line($doubleindent, "installcanfail", $value); - push(@xpdfile, $line); - - $value = get_forceintoupdate_value($module); - $line = get_tag_line($doubleindent, "forceintoupdate", $value); - push(@xpdfile, $line); - - $value = get_useforce_value($module); - $line = get_tag_line($doubleindent, "useforce", $value); - push(@xpdfile, $line); - - # iterating over all languages to get names and descriptions - collect_lang_values($doubleindent, $module, \@xpdfile, "Name", "name"); - collect_lang_values($doubleindent, $module, \@xpdfile, "Description", "description"); - - $tag = get_end_tag("display", $singleindent); - push(@xpdfile, $tag); - - # end of display tag - - if ( ! $isemptyparent ) - { - # start of installunit tag -> using info from package defined in packagelist - - $tag = get_installunit_tag($singleindent); - push(@xpdfile, $tag); - - $value = get_size_value($packagename, $xpdinfo); - $line = get_tag_line($doubleindent, "size", $value); - push(@xpdfile, $line); - - $value = get_order_value($module); - $line = get_tag_line($doubleindent, "installorder", $value); - push(@xpdfile, $line); - - $value = get_md5_value($packagename, $xpdinfo); - $line = get_tag_line($doubleindent, "md5", $value); - push(@xpdfile, $line); - - $value = get_name_value($packagename); - $line = get_tag_line($doubleindent, "name", $value); - push(@xpdfile, $line); - - $value = get_fullpkgname_value($packagename, $xpdinfo); - $line = get_tag_line($doubleindent, "fullpkgname", $value); - push(@xpdfile, $line); - - $value = get_pkgversion_value($packagename, $xpdinfo); - $line = get_tag_line($doubleindent, "pkgversion", $value); - push(@xpdfile, $line); - - $value = get_subdir_value($packagename, $subdir, $module); - $line = get_tag_line($doubleindent, "subdir", $value); - push(@xpdfile, $line); - - $value = get_relocatable_value($module); - $line = get_tag_line($doubleindent, "relocatable", $value); - push(@xpdfile, $line); - - $value = get_languagespecific_value($islanguagemodule); - $line = get_tag_line($doubleindent, "languagespecific", $value); - push(@xpdfile, $line); - - $value = $onelanguage; - $line = get_tag_line($doubleindent, "language", $value); - push(@xpdfile, $line); - - $line = get_tag_line($doubleindent, "solarislanguage", $solslanguage); - push(@xpdfile, $line); - - $tag = get_end_tag("installunit", $singleindent); - push(@xpdfile, $tag); - - # end of installunit tag - } - - $tag = get_end_tag("package", $noindent); - push(@xpdfile, $tag); - - return ( \@xpdfile, $parentgid ); -} - -################################################### -# Setting xpd file name -################################################### - -sub get_xpd_filename -{ - my ($modulegid, $linkpackage) = @_; - - if ( $linkpackage ) { $modulegid = $modulegid . "u"; } - - my $filename = $modulegid . ".xpd"; - - return $filename; -} - -################################################### -# Determine, which package was created newly -################################################### - -sub determine_new_packagename -{ - my ( $installdir, $subdir, $xpdinfo ) = @_; - - my $newpackage = ""; - $installdir =~ s/\Q$installer::globals::separator\E\s*$//; - my $directory = $installdir . $installer::globals::separator . $subdir; - $directory =~ s/\Q$installer::globals::separator\E\s*$//; - - if ( $xpdinfo->{'RealPackageName'} ) - { - $newpackage = $directory . $installer::globals::separator . $xpdinfo->{'RealPackageName'}; - push(@installer::globals::currentcontent, $newpackage); - return $newpackage; - } - - my ($newcontent, $allcontent) = installer::systemactions::find_new_content_in_directory($directory, \@installer::globals::currentcontent); - @installer::globals::currentcontent = (); - foreach my $element ( @{$allcontent} ) { push(@installer::globals::currentcontent, $element); } - - my $newentriesnumber = $#{$newcontent} + 1; - if ( $newentriesnumber > 1 ) { installer::exiter::exit_program("ERROR: More than one new package in directory $directory", "determine_new_packagename (xpdinstaller)"); } - elsif ( $newentriesnumber < 1 ) { installer::exiter::exit_program("ERROR: No new package in directory $directory", "determine_new_packagename (xpdinstaller)"); } - $newpackage = ${$newcontent}[0]; - - return $newpackage; -} - -################################################### -# Checking, if the parentgid is defined in -# another package -################################################### - -sub is_empty_parent -{ - my ($gid, $packages) = @_; - - my $is_empty_parent = 1; - - for ( my $k = 0; $k <= $#{$packages}; $k++ ) - { - my $onepackage = ${$packages}[$k]; - my $packagegid = $onepackage->{'module'}; - - if ( $packagegid eq $gid ) - { - $is_empty_parent = 0; - last; - } - } - - return $is_empty_parent; -} - -################################################### -# Creating additional xpd files for empty parents -################################################### - -sub create_emptyparents_xpd_file -{ - my ($parentgid, $modulesarrayref, $xpddir) = @_; - - my $module = get_module($parentgid, $modulesarrayref); - my $grandpagid = ""; - - if ( $module ne "" ) - { - my $packagename = ""; - # all content saved in scp is now available and can be used to create the xpd file - my ( $xpdfile, $newparentgid ) = get_file_content($module, $packagename, "", 0, 1, "", 0, "", ""); - - $grandpagid = $newparentgid; - - my $xpdfilename = get_xpd_filename($parentgid, 0); - $xpdfilename = $xpddir . $installer::globals::separator . $xpdfilename; - - installer::files::save_file($xpdfilename, $xpdfile); - push(@installer::globals::allxpdfiles, $xpdfilename); - my $infoline = "Saving xpd file: $xpdfilename\n"; - push(@installer::globals::logfileinfo, $infoline); - } - - push( @installer::globals::createdxpdfiles, $parentgid); - - return $grandpagid; -} - -################################################### -# Creating additional xpd files for empty parents -################################################### - -sub filter_content_from_xpdfile -{ - my ($xpdfile) = @_; - - my @newxpdfile = (); - - my $include = 1; - - for ( my $i = 0; $i <= $#{$xpdfile}; $i++ ) - { - my $line = ${$xpdfile}[$i]; - - if (( $line =~ /^\s*\<installunit/ ) && ( $include )) { $include = 0; } - if ( $include ) { push(@newxpdfile, $line); } - if (( $line =~ /^\s*\<\/installunit/ ) && ( ! $include )) { $include = 1; } - } - - return \@newxpdfile; -} - -########################################################################## -# Changing the parent inside the xpd file -# Old: <package name="gid_Module_Root" parent="root"> -# New: <package name="gid_Module_Root_Files_1" parent="gid_Module_Root"> -########################################################################## - -sub change_parent_in_xpdfile -{ - my ($xpdfile, $modulename) = @_; - - for ( my $i = 0; $i <= $#{$xpdfile}; $i++ ) - { - if ( ${$xpdfile}[$i] =~ /^\s*\<package name\s*=\s*\"(\S+?)\"\s+parent\s*=\s*\"(\S+?)\"\s*\>\s*$/ ) - { - my $oldname = $1; - my $oldparent = $2; - - my $newname = $modulename; - my $newparent = $oldname; - - ${$xpdfile}[$i] =~ s/\"\Q$oldname\E\"/\"$newname\"/; - ${$xpdfile}[$i] =~ s/\"\Q$oldparent\E\"/\"$newparent\"/; - - last; - } - } -} - -################################################### -# Creating one xpd file for each package -################################################### - -sub create_xpd_file -{ - my ($onepackage, $allpackages, $languagestringref, $allvariables, $modulesarrayref, $installdir, $subdir, $linkpackage, $xpdinfo) = @_; - - my $infoline = ""; - # creating the directory - my $xpddir = installer::systemactions::create_directories("xpdinstaller", $languagestringref); - $xpddir =~ s/\/\s*$//; - $installer::globals::xpddir = $xpddir; - - my $modulegid = $onepackage->{'module'}; - - my $onelanguage = ""; # - my $solslanguage = ""; # - my $islanguagemodule = 0; # - if ( $onepackage->{'islanguagemodule'} ) { $islanguagemodule = $onepackage->{'islanguagemodule'}; } # - if ( $islanguagemodule ) # - { - $onelanguage = $onepackage->{'language'}; # - if ( $installer::globals::issolarispkgbuild ) { $solslanguage = installer::epmfile::get_solaris_language_for_langpack($onelanguage); } # - } - - installer::logger::include_header_into_logfile("Creating xpd file ($modulegid):"); - - my $module = get_module($modulegid, $modulesarrayref); - - if ( $module ne "" ) - { - my $packagename = determine_new_packagename($installdir, $subdir, $xpdinfo); - - # all content saved in scp is now available and can be used to create the xpd file - my ( $xpdfile, $parentgid ) = get_file_content($module, $packagename, $solslanguage, $linkpackage, 0, "", $islanguagemodule, $onelanguage, $xpdinfo); - - my $xpdfilename = get_xpd_filename($modulegid, $linkpackage); - $xpdfilename = $xpddir . $installer::globals::separator . $xpdfilename; - - # Very special handling for Root module: - # Because packages should only be assigned to leaves and not to knods, - # the root module is divided into a knod without package and a new - # leave with package. The name of the leave is defined at $module->{'XpdPackageName'}. - if ( $module->{'XpdPackageName'} ) - { - my $newxpdfilename = get_xpd_filename($module->{'XpdPackageName'}, 0); - $newxpdfilename = $xpddir . $installer::globals::separator . $newxpdfilename; - my $emptyfilecontent = filter_content_from_xpdfile($xpdfile); - - installer::files::save_file($xpdfilename, $emptyfilecontent); - push(@installer::globals::allxpdfiles, $xpdfilename); - $infoline = "Saving xpd file: $xpdfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - $xpdfilename = $newxpdfilename; - change_parent_in_xpdfile($xpdfile, $module->{'XpdPackageName'}); - } - - installer::files::save_file($xpdfilename, $xpdfile); - push( @installer::globals::createdxpdfiles, $modulegid); - push(@installer::globals::allxpdfiles, $xpdfilename); - $infoline = "Saving xpd file: $xpdfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $grandpagid = "root"; - if ( $parentgid ne "root" ) - { - my $create_missing_parent = is_empty_parent($parentgid, $allpackages); - - if (( $create_missing_parent ) && ( ! installer::existence::exists_in_array($parentgid, \@installer::globals::createdxpdfiles) )) - { - $grandpagid = create_emptyparents_xpd_file($parentgid, $modulesarrayref, $xpddir); - } - } - - if ( $grandpagid ne "root" ) - { - my $create_missing_parent = is_empty_parent($grandpagid, $allpackages); - - if (( $create_missing_parent ) && ( ! installer::existence::exists_in_array($grandpagid, \@installer::globals::createdxpdfiles) )) - { - create_emptyparents_xpd_file($grandpagid, $modulesarrayref, $xpddir); - } - } - } - else - { - installer::exiter::exit_program("ERROR: No module definition found for gid: $modulegid", "create_xpd_file (xpdinstaller)"); - } - -} - -################################################### -# Creating a xpd file for a copied package -################################################### - -sub create_xpd_file_for_childproject -{ - my ($module, $destdir, $packagename, $allvariableshashref, $modulesarrayref) = @_; - - my $modulegid = $module->{'gid'}; - - my $currentdir = cwd(); - $destdir =~ s/\/\s*$//; - $currentdir =~ s/\/\s*$//; - - my $completepackage = $currentdir . $installer::globals::separator . $destdir . $installer::globals::separator . $packagename; - - # all content saved in scp is now available and can be used to create the xpd file - my ( $xpdfile, $parentgid ) = get_file_content($module, $completepackage, "", 0, 0, "", 0, "", ""); - - my $xpdfilename = get_xpd_filename($modulegid, 0); - $xpdfilename = $installer::globals::xpddir . $installer::globals::separator . $xpdfilename; - - installer::files::save_file($xpdfilename, $xpdfile); - push( @installer::globals::createdxpdfiles, $modulegid); - push(@installer::globals::allxpdfiles, $xpdfilename); - my $infoline = "Saving xpd file: $xpdfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - - if ( $parentgid ne "root" ) - { - my $create_missing_parent = 1; # -> Always missing parent by child projects! - # Parent is now created, if it was not created before. Attention: Parent module must not come later. - if (( $create_missing_parent ) && ( ! installer::existence::exists_in_array($parentgid, \@installer::globals::createdxpdfiles) )) - { - create_emptyparents_xpd_file($parentgid, $modulesarrayref, $installer::globals::xpddir); - } - } -} - -############################################################## -# Creating a xpd file for copied system integration package -############################################################## - -sub create_xpd_file_for_systemintegration -{ - my ($module, $newcontent, $modulesarrayref, $subdir) = @_; - - my $parentgid = $module->{'gid'}; - - # Create new visible module from scp info and create - # new hidden module for each package inside in tar file - - for ( my $i = 0; $i <= $#{$newcontent}; $i++ ) - { - my $newpackagename = ${$newcontent}[$i]; - - my $infoline = "Creating xpd file for package: $newpackagename\n"; - push( @installer::globals::logfileinfo, $infoline); - - my $childmodule = {%{$module}}; - $childmodule->{'ParentID'} = $module->{'gid'}; # the module gid is the new parent - $childmodule->{'InstallOrder'} = $installer::globals::defaultsystemintinstallorder; - my $number = $i + 1; - my $modulegid = $module->{'gid'} . "_child_" . $number; # setting a dynamic new gid - $childmodule->{'gid'} = $modulegid; - $childmodule->{'Styles'} =~ s/\)/\,HIDDEN_ROOT\)/; - # iterating over all languages to get names and descriptions - remove_lang_values($childmodule, "Name"); - remove_lang_values($childmodule, "Description"); - - my $shortpackagename = $newpackagename; - installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$shortpackagename); - $childmodule->{'PackageName'} = $shortpackagename; - $childmodule->{'Name'} = $modulegid; - $childmodule->{'Description'} = $modulegid; - - # Checking, if installorder can be set: - # scp syntax: InstallOrder = "desktop:1050, suse:1060"; - # The string before the number can be compared with $shortpackagename - if ( $module->{'InstallOrder'} ) - { - my $installorder = $module->{'InstallOrder'}; - $installorder =~ s/^\s*\"//g; - $installorder =~ s/\"\s*$//g; - # $installorder is comma separated list - my $allorders = installer::converter::convert_stringlist_into_array(\$installorder, ","); - for ( my $j = 0; $j <= $#{$allorders}; $j++ ) - { - my $oneitem = ${$allorders}[$j]; - if ( $oneitem =~ /^\s*(\S+?)\s*:\s*(\S+?)\s*$/ ) - { - my $name = $1; - my $order = $2; - - if ( $shortpackagename =~ /\Q$name\E/ ) { $childmodule->{'InstallOrder'} = $order; } - } - } - } - - # all content saved in scp is now available and can be used to create the xpd file - my ( $xpdfile, $parentgid_ ) = get_file_content($childmodule, $newpackagename, "", 0, 0, $subdir, 0, "", ""); - - my $xpdfilename = get_xpd_filename($modulegid, 0); - $xpdfilename = $installer::globals::xpddir . $installer::globals::separator . $xpdfilename; - - installer::files::save_file($xpdfilename, $xpdfile); - push(@installer::globals::allxpdfiles, $xpdfilename); - $infoline = "Saving xpd file: $xpdfilename\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - # Creating the top level visible xpd file - create_emptyparents_xpd_file($parentgid, $modulesarrayref, $installer::globals::xpddir); -} - -############################################################## -# Copying xpd files into installation set -############################################################## - -sub copy_xpd_files -{ - my ( $destdir ) = @_; - - for ( my $i = 0; $i <= $#installer::globals::allxpdfiles; $i++ ) - { - if ( ! -f $installer::globals::allxpdfiles[$i] ) { installer::exiter::exit_program("ERROR: Could not find xpd file: $installer::globals::allxpdfiles[$i]!", "copy_xpd_files"); } - installer::systemactions::copy_one_file($installer::globals::allxpdfiles[$i], $destdir); - } -} - -############################################################## -# Copying all xpd files into the installation set -############################################################## - -sub copy_xpd_files_into_installset -{ - my ($installdir) = @_; - - $installdir =~ s/\Q$installer::globals::separator\E\s*$//; - - my $instdir = $installdir . $installer::globals::separator . "installdata"; - installer::systemactions::create_directory($instdir); - - my $xpddir = $instdir . $installer::globals::separator . "xpd"; - installer::systemactions::create_directory($xpddir); - copy_xpd_files($xpddir); -} - -############################################################## -# Creating base xpd file with product information -############################################################## - -sub create_setup_xpd -{ - my ($allvariables, $languagestringref) = @_; - - my ( $xpdfile ) = get_setup_file_content($allvariables, $languagestringref); - - my $xpdfilename = $installer::globals::productxpdfile; - $xpdfilename = $installer::globals::xpddir . $installer::globals::separator . $xpdfilename; - - installer::files::save_file($xpdfilename, $xpdfile); - push(@installer::globals::allxpdfiles, $xpdfilename); - my $infoline = "Saving xpd file: $xpdfilename\n"; - push( @installer::globals::logfileinfo, $infoline); -} - -################################################### -# Copying the files needed by the xpd installer -# into the installation directory -################################################### - -sub create_xpd_installer -{ - my ( $installdir, $allvariables, $languagestringref) = @_; - - installer::logger::include_header_into_logfile("Creating xpd installer:"); - - # create setup.xpd file - create_setup_xpd($allvariables, $languagestringref); - - # copy xpd files into installation set - copy_xpd_files_into_installset($installdir); -} - -1; diff --git a/solenv/bin/modules/installer/ziplist.pm b/solenv/bin/modules/installer/ziplist.pm deleted file mode 100644 index 78172ffa2..000000000 --- a/solenv/bin/modules/installer/ziplist.pm +++ /dev/null @@ -1,800 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -package installer::ziplist; - -use installer::existence; -use installer::exiter; -use installer::globals; -use installer::logger; -use installer::parameter; -use installer::remover; -use installer::systemactions; - -################################################# -# Getting data from path file and zip list file -################################################# - -sub getproductblock -{ - my ($fileref, $search, $inheritance) = @_; - - my @searchblock = (); - my $searchexists = 0; - my $record = 0; - my $count = 0; - my $line; - my $inh = $inheritance ? '(?::\s*(\S+)\s*)?' : ""; - my $parent; - - for ( my $i = 0; $i <= $#{$fileref}; $i++ ) - { - $line = ${$fileref}[$i]; - - if ( $line =~ /^\s*\Q$search\E\s*$inh$/i ) # case insensitive - { - $record = 1; - $searchexists = 1; - $parent = $1 if $inheritance; - } - - if ($record) - { - push(@searchblock, $line); - } - - if ( ($record) && ($line =~ /\{/) ) - { - $count++; - } - - if ( ($record) && ($line =~ /\}/) ) - { - $count--; - } - - if ( ($record) && ($line =~ /\}/) && ( $count == 0 ) ) - { - $record = 0; - } - } - - if (( ! $searchexists ) && ( $search ne $installer::globals::globalblock )) - { - if ($search eq $installer::globals::product ) - { - installer::exiter::exit_program("ERROR: Product $installer::globals::product not defined in $installer::globals::ziplistname", "getproductblock"); - } - elsif ($search eq $installer::globals::compiler ) - { - installer::exiter::exit_program("ERROR: Compiler $installer::globals::compiler not defined in $installer::globals::pathfilename", "getproductblock"); - } - else # this is not possible - { - installer::exiter::exit_program("ERROR: Unknown value for $search in getproductblock()", "getproductblock"); - } - } - - return (\@searchblock, $parent); -} - -############################################### -# Analyzing the settings in the zip list file -############################################### - -sub analyze_settings_block -{ - my ($blockref) = @_; - - my @newsettingsblock = (); - my $compilerstring = ""; - my $record = 1; - my $counter = 0; - - # Allowed values in settings block: - # "Settings", "Variables", "unix" (for destination path and logfile) - # Furthermore allowed values are $installer::globals::build (srx645) and $installer::globals::compiler (pro and nonpro (unxsols4.pro)) - - # Comment line in settings block begin with "#" or ";" - - if ( $installer::globals::pro ) - { - $compilerstring = $installer::globals::compiler . ".pro"; - } - else - { - $compilerstring = $installer::globals::compiler; - } - - for ( my $i = 0; $i <= $#{$blockref}; $i++ ) - { - my $line = ${$blockref}[$i]; - my $nextline = ""; - - if ( ${$blockref}[$i+1] ) { $nextline = ${$blockref}[$i+1]; } - - # removing comment lines - - if (($line =~ /^\s*\#/) || ($line =~ /^\s*\;/)) - { - next; - } - - # complete blocks of unknows strings are not recorded - - if ((!($line =~ /^\s*\Q$compilerstring\E\s*$/i)) && - (!($line =~ /^\s*\Q$installer::globals::build\E\s*$/i)) && - (!($line =~ /^\s*\bSettings\b\s*$/i)) && - (!($line =~ /^\s*\bVariables\b\s*$/i)) && - (!($line =~ /^\s*\bunix\b\s*$/i)) && - ($nextline =~ /^\s*\{\s*$/i)) - { - $record = 0; - next; # continue with next $i - } - - if (!( $record )) - { - if ($line =~ /^\s*\{\s*$/i) - { - $counter++; - } - - if ($line =~ /^\s*\}\s*$/i) - { - $counter--; - } - - if ($counter == 0) - { - $record = 1; - next; # continue with next $i - } - } - - if ($record) - { - push(@newsettingsblock, $line); - } - } - - return \@newsettingsblock; -} - -######################################## -# Settings in zip list file -######################################## - -sub get_settings_from_ziplist -{ - my ($blockref) = @_; - - my @allsettings = (); - my $isvariables = 0; - my $counter = 0; - my $variablescounter = 0; - - # Take all settings from the settings block - # Do not take the variables from the settings block - # If a setting is defined more than once, take the - # setting with the largest counter (open brackets) - - for ( my $i = 0; $i <= $#{$blockref}; $i++ ) - { - my $line = ${$blockref}[$i]; - my $nextline = ""; - - if ( ${$blockref}[$i+1] ) { $nextline = ${$blockref}[$i+1]; } - - if (($line =~ /^\s*\S+\s*$/i) && - ($nextline =~ /^\s*\{\s*$/i) && - (!($line =~ /^\s*Variables\s*$/i))) - { - next; - } - - if ($line =~ /^\s*Variables\s*$/i) - { - # This is a block of variables - - $isvariables = 1; - next; - } - - if ($line =~ /^\s*\{\s*$/i) - { - if ($isvariables) - { - $variablescounter++; - } - else - { - $counter++; - } - - next; - } - - if ($line =~ /^\s*\}\s*$/i) - { - if ($isvariables) - { - $variablescounter--; - - if ($variablescounter == 0) - { - $isvariables = 0; - } - } - else - { - $counter--; - } - - next; - } - - if ($isvariables) - { - next; - } - - installer::remover::remove_leading_and_ending_whitespaces(\$line); - - $line .= "\t##$counter##\n"; - - push(@allsettings, $line); - } - - return \@allsettings; -} - -####################################### -# Variables from zip list file -####################################### - -sub get_variables_from_ziplist -{ - my ($blockref) = @_; - - my @allvariables = (); - my $isvariables = 0; - my $counter = 0; - my $variablescounter = 0; - my $countersum = 0; - - # Take all variables from the settings block - # Do not take the other settings from the settings block - # If a variable is defined more than once, take the - # variable with the largest counter (open brackets) - - for ( my $i = 0; $i <= $#{$blockref}; $i++ ) - { - my $line = ${$blockref}[$i]; - my $nextline = ${$blockref}[$i+1]; - - if ($line =~ /^\s*Variables\s*$/i) - { - # This is a block of variables - - $isvariables = 1; - next; - } - - if ($line =~ /^\s*\{\s*$/i) - { - if ($isvariables) - { - $variablescounter++; - } - else - { - $counter++; - } - - next; - } - - if ($line =~ /^\s*\}\s*$/i) - { - if ($isvariables) - { - $variablescounter--; - - if ($variablescounter == 0) - { - $isvariables = 0; - } - } - else - { - $counter--; - } - - next; - } - - if (!($isvariables)) - { - next; - } - - $countersum = $counter + $variablescounter; - - installer::remover::remove_leading_and_ending_whitespaces(\$line); - - $line .= "\t##$countersum##\n"; - - push(@allvariables, $line); - } - - return \@allvariables; -} - -####################################################################### -# Removing multiple variables and settings, defined in zip list file -####################################################################### - -sub remove_multiples_from_ziplist -{ - my ($blockref) = @_; - - # remove all definitions of settings and variables - # that occur more than once in the zip list file. - # Take the one with the most open brackets. This - # number is stored at the end of the string. - - my @newarray = (); - my @itemarray = (); - my ($line, $itemname, $itemnumber); - - # first collecting all variables and settings names - - for ( my $i = 0; $i <= $#{$blockref}; $i++ ) - { - $line = ${$blockref}[$i]; - - if ($line =~ /^\s*\b(\S*)\b\s+.*\#\#\d+\#\#\s*$/i) - { - $itemname = $1; - } - - if (! installer::existence::exists_in_array($itemname, \@itemarray)) - { - push(@itemarray, $itemname); - } - } - - # and now all $items can be selected with the highest number - - for ( my $i = 0; $i <= $#itemarray; $i++ ) - { - $itemname = $itemarray[$i]; - - my $itemnumbermax = 0; - my $printline = ""; - - for ( my $j = 0; $j <= $#{$blockref}; $j++ ) - { - $line = ${$blockref}[$j]; - - if ($line =~ /^\s*\Q$itemname\E\s+.*\#\#(\d+)\#\#\s*$/) - { - $itemnumber = $1; - - if ($itemnumber >= $itemnumbermax) - { - $printline = $line; - $itemnumbermax = $itemnumber; - } - } - } - - # removing the ending number from the printline - # and putting it into the array - - $printline =~ s/\#\#\d+\#\#//; - installer::remover::remove_leading_and_ending_whitespaces(\$line); - push(@newarray, $printline); - } - - return \@newarray; -} - -######################################################### -# Reading one variable defined in the zip list file -######################################################### - -sub getinfofromziplist -{ - my ($blockref, $variable) = @_; - - my $searchstring = ""; - my $line; - - for ( my $i = 0; $i <= $#{$blockref}; $i++ ) - { - $line = ${$blockref}[$i]; - - if ( $line =~ /^\s*\Q$variable\E\s+(.+?)\s*$/ ) # "?" for minimal matching - { - $searchstring = $1; - last; - } - } - - return \$searchstring; -} - -#################################################### -# Replacing variables in include path -#################################################### - -sub replace_all_variables_in_pathes -{ - my ( $patharrayref, $variableshashref ) = @_; - - for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) - { - my $line = ${$patharrayref}[$i]; - - my $key; - - foreach $key (sort { length ($b) <=> length ($a) } keys %{$variableshashref}) - { - my $value = $variableshashref->{$key}; - - if (( $line =~ /\{$key\}/ ) && ( $value eq "" )) { $line = ".\n"; } - - $line =~ s/\{\Q$key\E\}/$value/g; - } - - ${$patharrayref}[$i] = $line; - } -} - -#################################################### -# Replacing minor in include path -#################################################### - -sub replace_minor_in_pathes -{ - my ( $patharrayref ) = @_; - - for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) - { - my $line = ${$patharrayref}[$i]; - - $line =~ s/\.\{minor\}//g; - $line =~ s/\.\{minornonpre\}//g; - - ${$patharrayref}[$i] = $line; - } -} - -#################################################### -# Replacing packagetype in include path -#################################################### - -sub replace_packagetype_in_pathes -{ - my ( $patharrayref ) = @_; - - for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) - { - my $line = ${$patharrayref}[$i]; - - if (( $installer::globals::installertypedir ) && ( $line =~ /\{pkgtype\}/ )) - { - $line =~ s/\{pkgtype\}/$installer::globals::installertypedir/g; - } - - ${$patharrayref}[$i] = $line; - } -} - -#################################################### -# Removing ending separators in pathes -#################################################### - -sub remove_ending_separator -{ - my ( $patharrayref ) = @_; - - for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) - { - my $line = ${$patharrayref}[$i]; - - installer::remover::remove_ending_pathseparator(\$line); - - $line =~ s/\s*$//; - $line = $line . "\n"; - - ${$patharrayref}[$i] = $line; - } -} - -#################################################### -# Replacing languages in include path -#################################################### - -sub replace_languages_in_pathes -{ - my ( $patharrayref, $languagesref ) = @_; - - installer::logger::include_header_into_logfile("Replacing languages in include pathes:"); - - my @patharray = (); - my $infoline = ""; - - for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) - { - my $line = ${$patharrayref}[$i]; - - if ( $line =~ /\$\(LANG\)/ ) - { - my $originalline = $line; - my $newline = ""; - - for ( my $j = 0; $j <= $#{$languagesref}; $j++ ) - { - my $language = ${$languagesref}[$j]; - $line =~ s/\$\(LANG\)/$language/g; - push(@patharray ,$line); - $newdir = $line; - $line = $originalline; - - installer::remover::remove_leading_and_ending_whitespaces(\$newline); - - # Is it necessary to refresh the global array, containing all files of all include pathes? - if ( -d $newdir ) - { - # Checking if $newdir is empty - if ( ! installer::systemactions::is_empty_dir($newdir) ) - { - $installer::globals::refresh_includepathes = 1; - $infoline = "Directory $newdir exists and is not empty. Refreshing global file array is required.\n"; - push( @installer::globals::logfileinfo, $infoline); - } - else - { - $infoline = "Directory $newdir is empty. No refresh of global file array required.\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - else - { - $infoline = "Directory $newdir does not exist. No refresh of global file array required.\n"; - push( @installer::globals::logfileinfo, $infoline); - } - } - } - else # not language dependent include path - { - push(@patharray ,$line); - } - } - - return \@patharray; -} - -##################################################### -# Collecting all files from all include paths -##################################################### - -sub list_all_files_from_include_path -{ - my ( $patharrayref) = @_; - - installer::logger::include_header_into_logfile("Include pathes:"); - - for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) - { - my $path = ${$patharrayref}[$i]; - installer::remover::remove_leading_and_ending_whitespaces(\$path); - my $infoline = "$path\n"; - push( @installer::globals::logfileinfo, $infoline); - } - - push( @installer::globals::logfileinfo, "\n"); - - return \@filesarray; -} - -##################################################### -# Collecting all files from all include paths -##################################################### - -sub set_manufacturer -{ - my ($allvariables) = @_; - - my $openofficeproductname = "LibreOffice"; - my $sunname = ""; - - - if ( $allvariables->{'OPENSOURCE'} && $allvariables->{'OPENSOURCE'} == 1 ) - { - $installer::globals::isopensourceproduct = 1; - $installer::globals::manufacturer = $openofficeproductname; - $installer::globals::longmanufacturer = $openofficeproductname; - } - else - { - $installer::globals::isopensourceproduct = 0; - if (( $allvariables->{'DEFINEDMANUFACTURER'} ) && ( $allvariables->{'DEFINEDMANUFACTURER'} ne "" )) { $sunname = $allvariables->{'DEFINEDMANUFACTURER'}; } - else { installer::exiter::exit_program("ERROR: Property DEFINEDMANUFACTURER has to be set for this product!", "set_manufacturer"); } - $installer::globals::manufacturer = $sunname; - $installer::globals::longmanufacturer = $sunname; - } - - $allvariables->{'MANUFACTURER'} = $installer::globals::manufacturer; -} - -############################################################## -# A ProductVersion has to be defined. If it is not set in -# zip.lst, it is set now to "1" -############################################################## - -sub set_default_productversion_if_required -{ - my ($allvariables) = @_; - - if (!($allvariables->{'PRODUCTVERSION'})) - { - $allvariables->{'PRODUCTVERSION'} = 1; # FAKE - } - - # Creating differentiators for BUILD_SPECIAL in layering - if ( ! $ENV{'BUILD_SPECIAL'} ) - { - if ( $allvariables->{'REGISTRYLAYERNAME'} ) { $allvariables->{'REGISTRYLAYERNAME'} = $allvariables->{'REGISTRYLAYERNAME'} . "_"; } - if (( $installer::globals::iswindowsbuild ) && ( $allvariables->{'BASISROOTNAME'} )) { $allvariables->{'BASISROOTNAME'} = $allvariables->{'BASISROOTNAME'} . "_"; } - } -} - -#################################################### -# Removing .. in pathes -#################################################### - -sub simplify_path -{ - my ( $pathref ) = @_; - - my $oldpath = $$pathref; - - my $change = 0; - - while ( $oldpath =~ /(^.*)(\Q$installer::globals::separator\E.*\w+?)(\Q$installer::globals::separator\E\.\.)(\Q$installer::globals::separator\E.*$)/ ) - { - my $part1 = $1; - my $part2 = $4; - $oldpath = $part1 . $part2; - $change = 1; - } - - if ( $change ) { $$pathref = $oldpath . "\n"; } -} - -#################################################### -# Removing ending separators in pathes -#################################################### - -sub resolve_relative_pathes -{ - my ( $patharrayref ) = @_; - - for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) - { - installer::parameter::make_path_absolute(\${$patharrayref}[$i]); - simplify_path(\${$patharrayref}[$i]); - } -} - -#################################################### -# Replacing variables inside zip list variables -# Example: {milestone} to be replaced by -# $installer::globals::lastminor -#################################################### - -sub replace_variables_in_ziplist_variables -{ - my ($blockref) = @_; - - my $milestonevariable = $installer::globals::lastminor; - $milestonevariable =~ s/m//; - $milestonevariable =~ s/s/\./; - - my $localminor = $installer::globals::lastminor; - if ( $installer::globals::minor ) { $localminor = $installer::globals::minor; } - - my $buildidstringcws = $installer::globals::build . $localminor . "(Build:" . $installer::globals::buildid . ")"; - - for ( my $i = 0; $i <= $#{$blockref}; $i++ ) - { - if ($installer::globals::lastminor) { ${$blockref}[$i] =~ s/\{milestone\}/$milestonevariable/; } - else { ${$blockref}[$i] =~ s/\{milestone\}//; } - if ( $localminor ) { ${$blockref}[$i] =~ s/\{minor\}/$localminor/; } - else { ${$blockref}[$i] =~ s/\{minor\}//; } - if ( $installer::globals::buildid ) { ${$blockref}[$i] =~ s/\{buildid\}/$installer::globals::buildid/; } - else { ${$blockref}[$i] =~ s/\{buildid\}//; } - if ( $installer::globals::build ) { ${$blockref}[$i] =~ s/\{buildsource\}/$installer::globals::build/; } - else { ${$blockref}[$i] =~ s/\{build\}//; } - ${$blockref}[$i] =~ s/\{buildidcws\}/$buildidstringcws/; - } -} - -########################################################### -# Overwrite the vendor string in openoffice.lst that is defined in configure -########################################################### - -sub overwrite_ooovendor -{ - my ($variableshashref) = @_; - $variableshashref->{'OOOVENDOR'} = $ENV{'OOO_VENDOR'} , if( defined $ENV{'OOO_VENDOR'} && $ENV{'OOO_VENDOR'} ne "" ); -} - -########################################################### -# Adding the lowercase variables into the variableshashref -########################################################### - -sub add_variables_to_allvariableshashref -{ - my ($variableshashref) = @_; - - my $lcvariable = lc($variableshashref->{'PRODUCTNAME'}); - $variableshashref->{'LCPRODUCTNAME'} = $lcvariable; - - if ($variableshashref->{'SHORT_PRODUCTEXTENSION'}) - { - $variableshashref->{'LCPRODUCTEXTENSION'} = "\-" . lc($variableshashref->{'SHORT_PRODUCTEXTENSION'}); # including the "-" ! - } - else - { - $variableshashref->{'LCPRODUCTEXTENSION'} = ""; - } - - if ( $installer::globals::patch ) { $variableshashref->{'PRODUCTADDON'} = $installer::globals::patchaddon; } - elsif ( $installer::globals::languagepack ) { $variableshashref->{'PRODUCTADDON'} = $installer::globals::languagepackaddon; } - elsif ( $installer::globals::helppack ) { $variableshashref->{'PRODUCTADDON'} = $installer::globals::helppackpackaddon; } - else { $variableshashref->{'PRODUCTADDON'} = ""; } - - my $localbuild = $installer::globals::build; - if ( $localbuild =~ /^\s*(\w+?)(\d+)\s*$/ ) { $localbuild = $2; } # using "680" instead of "src680" - $variableshashref->{'PRODUCTMAJOR'} = $localbuild; - - my $localminor = ""; - if ( $installer::globals::minor ne "" ) { $localminor = $installer::globals::minor; } - else { $localminor = $installer::globals::lastminor; } - if ( $localminor =~ /^\s*\w(\d+)\w*\s*$/ ) { $localminor = $1; } - $variableshashref->{'PRODUCTMINOR'} = $localminor; - - $variableshashref->{'PRODUCTBUILDID'} = $installer::globals::buildid; - $variableshashref->{'SYSTEM_LIBTEXTCAT_DATA'} = $ENV{'SYSTEM_LIBTEXTCAT_DATA'} , if( defined $ENV{'SYSTEM_LIBTEXTCAT_DATA'} && $ENV{'SYSTEM_LIBTEXTCAT_DATA'} ne "" ); -} - -1; diff --git a/solenv/bin/modules/macosxotoolhelper.pm b/solenv/bin/modules/macosxotoolhelper.pm deleted file mode 100644 index 19f59e5bf..000000000 --- a/solenv/bin/modules/macosxotoolhelper.pm +++ /dev/null @@ -1,44 +0,0 @@ -#************************************************************************* -# -# 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 macosxotoolhelper; -require Exporter; -our @ISA = Exporter; -our @EXPORT = otoolD; - -sub otoolD($) { - my ($file) = @_; - my $call = "otool -D $file"; - open(IN, "-|", $call) or die "cannot $call"; - my $line = <IN>; - $line =~ /^$file:\n$/ or - die "unexpected otool -D output (\"$line\", expecting \"$file:\")"; - $line = <IN>; - <IN> == undef or die "unexpected otool -D output"; - close(IN); - return $line; -} diff --git a/solenv/bin/modules/packager/check.pm b/solenv/bin/modules/packager/check.pm deleted file mode 100644 index 9c0b65021..000000000 --- a/solenv/bin/modules/packager/check.pm +++ /dev/null @@ -1,88 +0,0 @@ -#************************************************************************* -# -# 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 packager::check; - -use packager::exiter; -use packager::globals; - -############################################## -# Check 1: The package list has to exist -############################################## - -sub check_packlist -{ - my $projectdir = $ENV{'PRJ'}; - $projectdir =~ s/$packager::globals::separator\s*$//; - $packager::globals::packlistname = $projectdir . $packager::globals::separator . "util" . $packager::globals::separator . $packager::globals::packlistname; - - if ( ! -f $packager::globals::packlistname ) - { - packager::exiter::exit_program("ERROR: Package list not found: $packager::globals::packlistname", "check_packlist"); - } -} - -############################################################# -# Check 2: The environment variable OUTPATH has to be set -############################################################# - -sub check_environment -{ - if ( ! $ENV{'OUTPATH'} ) - { - packager::exiter::exit_program("ERROR: Environment variable OUTPATH not set!", "check_environment"); - } - - if ( ! $ENV{'PRJ'} ) - { - packager::exiter::exit_program("ERROR: Environment variable PRJ not set!", "check_environment"); - } -} - -############################################################# -# Check 3: Checking the parameter. Only "-i" is valid -############################################################# - -sub check_parameter -{ - while ( $#ARGV >= 0 ) - { - my $param = shift(@ARGV); - - if ($param eq "-i") { $packager::globals::ignoreerrors = 1; } - else - { - print("\n*************************************\n"); - print("Sorry, unknown parameter: $param"); - print("\n*************************************\n"); - usage(); - exit(-1); - } - } -} - -1; diff --git a/solenv/bin/modules/packager/existence.pm b/solenv/bin/modules/packager/existence.pm deleted file mode 100644 index a7a8d3f57..000000000 --- a/solenv/bin/modules/packager/existence.pm +++ /dev/null @@ -1,52 +0,0 @@ -#************************************************************************* -# -# 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 packager::existence; - -############################# -# Test of existence -############################# - -sub exists_in_array -{ - my ($searchstring, $arrayref) = @_; - - my $alreadyexists = 0; - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - if ( ${$arrayref}[$i] eq $searchstring) - { - $alreadyexists = 1; - last; - } - } - - return $alreadyexists; -} - -1; diff --git a/solenv/bin/modules/packager/exiter.pm b/solenv/bin/modules/packager/exiter.pm deleted file mode 100644 index 3ba099ec9..000000000 --- a/solenv/bin/modules/packager/exiter.pm +++ /dev/null @@ -1,71 +0,0 @@ -#************************************************************************* -# -# 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 packager::exiter; - -use packager::files; -use packager::globals; - -############################################ -# Exiting the program with an error -# This function is used instead of "die" -############################################ - -sub exit_program -{ - my ($message, $function) = @_; - - my $infoline; - - $infoline = "\n***************************************************************\n"; - push(@packager::globals::logfileinfo, $infoline); - print("$infoline"); - - $infoline = "$message\n"; - push(@packager::globals::logfileinfo, $infoline); - print("$infoline"); - - $infoline = "in function: $function\n"; - push(@packager::globals::logfileinfo, $infoline); - print("$infoline"); - - $infoline = "***************************************************************\n"; - push(@packager::globals::logfileinfo, $infoline); - - if ( $packager::globals::logging ) - { - packager::files::save_file($packager::globals::logfilename ,\@packager::globals::logfileinfo); - print("Saved logfile: $packager::globals::logfilename\n"); - } - - print("$infoline"); - - exit(-1); -} - -1; diff --git a/solenv/bin/modules/packager/files.pm b/solenv/bin/modules/packager/files.pm deleted file mode 100644 index dd7130099..000000000 --- a/solenv/bin/modules/packager/files.pm +++ /dev/null @@ -1,184 +0,0 @@ -#************************************************************************* -# -# 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 packager::files; - -use packager::exiter; - -############################################ -# File Operations -############################################ - -sub check_file -{ - my ($arg) = @_; - - if(!( -f $arg )) - { - packager::exiter::exit_program("ERROR: Cannot find file $arg", "check_file"); - } -} - -sub read_file -{ - my ($localfile) = @_; - - if ( ! open( IN, $localfile ) ) { - # try again - sometimes we get errors caused by race conditions in parallel builds - sleep 5; - open( IN, $localfile ) or packager::exiter::exit_program("ERROR: Cannot open file: $localfile", "read_file"); - } - my @localfile = <IN>; - close( IN ); - - return \@localfile; -} - -########################################### -# Saving files -########################################### - -sub save_file -{ - my ($savefile, $savecontent) = @_; - open( OUT, ">$savefile" ); - print OUT @{$savecontent}; - close( OUT); - if (! -f $savefile) { packager::exiter::exit_program("ERROR: Cannot write file: $savefile", "save_file"); } -} - -###################################################### -# Creating a new direcotory -###################################################### - -sub create_directory -{ - my ($directory) = @_; - - my $returnvalue = 1; - - if (!(-d $directory)) - { - $returnvalue = mkdir($directory, 0775); - - if ($returnvalue) - { - $infoline = "\nCreated directory: $directory\n"; - push(@packager::globals::logfileinfo, $infoline); - - if ($packager::globals::isunix) - { - my $localcall = "chmod 775 $directory \>\/dev\/null 2\>\&1"; - system($localcall); - } - } - else - { - packager::exiter::exit_program("ERROR: Could not create directory: $directory", "create_directory"); - } - } -} - -###################################################### -# Creating a unique directory with number extension -###################################################### - -sub create_unique_directory -{ - my ($directory) = @_; - - $directory =~ s/\Q$packager::globals::separator\E\s*$//; - $directory = $directory . "_INCREASINGNUMBER"; - - my $counter = 1; - my $created = 0; - my $localdirectory = ""; - - do - { - $localdirectory = $directory; - $localdirectory =~ s/INCREASINGNUMBER/$counter/; - $counter++; - - if ( ! -d $localdirectory ) - { - create_directory($localdirectory); - $created = 1; - } - } - while ( ! $created ); - - return $localdirectory; -} - -###################################################### -# Removing a complete directory with subdirectories -###################################################### - -sub remove_complete_directory -{ - my ($directory) = @_; - - my @content = (); - - $directory =~ s/\Q$packager::globals::separator\E\s*$//; - - if ( -d $directory ) - { - opendir(DIR, $directory); - @content = readdir(DIR); - closedir(DIR); - - my $oneitem; - - foreach $oneitem (@content) - { - if ((!($oneitem eq ".")) && (!($oneitem eq ".."))) - { - my $item = $directory . $packager::globals::separator . $oneitem; - - if ( -f $item ) # deleting files - { - unlink($item); - } - - if ( -d $item ) # recursive - { - remove_complete_directory($item, 0); - } - } - } - - # try to remove empty directory - - rmdir $directory; - - } -} - -1; diff --git a/solenv/bin/modules/packager/globals.pm b/solenv/bin/modules/packager/globals.pm deleted file mode 100644 index f001ba19b..000000000 --- a/solenv/bin/modules/packager/globals.pm +++ /dev/null @@ -1,54 +0,0 @@ -#************************************************************************* -# -# 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 packager::globals; - -############################################ -# Global settings -############################################ - -BEGIN -{ - $prog="packager"; - - $packlistname = "pack.lst"; - $compiler = ""; - $ignoreerrors = 0; - - $logging = 0; - $logfilename = "packager_logfile.log"; # the default logfile name for global errors - @logfileinfo = (); - - $plat = $^O; - - $separator = "/"; - $iswin = 0; - $isunix = 1; - -} - -1; diff --git a/solenv/bin/modules/packager/work.pm b/solenv/bin/modules/packager/work.pm deleted file mode 100644 index 283810a09..000000000 --- a/solenv/bin/modules/packager/work.pm +++ /dev/null @@ -1,320 +0,0 @@ -#************************************************************************* -# -# 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 packager::work; - -use packager::exiter; -use packager::existence; -use packager::files; -use packager::globals; - -########################################### -# Setting global variables -########################################### - -sub set_global_variable -{ - my $compiler = $ENV{'OUTPATH'}; - - if ( $ENV{'PROEXT'} ) { $compiler = $compiler . $ENV{'PROEXT'}; } - - $packager::globals::compiler = $compiler; -} - -############################################################################# -# Converting a string list with separator $listseparator -# into an array -############################################################################# - -sub convert_stringlist_into_array -{ - my ( $includestringref, $listseparator ) = @_; - - my @newarray = (); - my $first; - my $last = ${$includestringref}; - - while ( $last =~ /^\s*(.+?)\Q$listseparator\E(.+)\s*$/) # "$" for minimal matching - { - $first = $1; - $last = $2; - push(@newarray, "$first"); - } - - push(@newarray, "$last"); - - return \@newarray; -} - -########################################### -# Generating a list of package calls -# corresponding to the package list -########################################### - -sub create_package_todos -{ - my ( $packagelist ) = @_; - - my @targets = (); # only used, if the build server is not used - - for ( my $i = 0; $i <= $#{$packagelist}; $i++ ) - { - my $line = ${$packagelist}[$i]; - - if ( $line =~ /^\s*\#/ ) { next; } # comment line - - if ( $line =~ /^\s*(\w+?)\s+(\S+?)\s+(\S+?)\s+(\w+?)\s*$/ ) - { - my $product = $1; - my $compilerlist = $2; - my $languagelist = $3; - my $target = $4; - - $product =~ s/\s//g; - $compilerlist =~ s/\s//g; - $languagelist =~ s/\s//g; - $target =~ s/\s//g; - - my $compilers = convert_stringlist_into_array(\$compilerlist, ","); - - # is the compiler of this "build" part of the compiler list in pack.lst ? - - if ( packager::existence::exists_in_array($packager::globals::compiler, $compilers) ) - { - # products are separated in pack.lst by "|" - - my $languagesets = convert_stringlist_into_array(\$languagelist, "\|"); - - # now all information is available to create the targets for the systemcalls - - for ( my $j = 0; $j <= $#{$languagesets}; $j++ ) - { - my $languagestring = ${$languagesets}[$j]; - $languagestring =~ s/\,/\_/g; # comma in pack.lst becomes "_" in dmake command - - my $target = $target . "_" . $languagestring; - push(@targets, $target); - - my $insertline = $target . "\n"; - push( @packager::globals::logfileinfo, $insertline); - } - } - } - } - - return \@targets; -} - -########################################### -# Executing the generated system calls -########################################### - -sub execute_system_calls -{ - my ( $targets ) = @_; - - for ( my $i = 0; $i <= $#{$targets}; $i++ ) - { - my $systemcall = "dmake " . ${$targets}[$i]; - - my $infoline = "Packager: $systemcall\n"; - print $infoline; - push( @packager::globals::logfileinfo, $infoline); - - my $returnvalue = system($systemcall); - - $infoline = "Packager finished: $systemcall\n"; - print $infoline; - push( @packager::globals::logfileinfo, $infoline); - - if ( $returnvalue ) - { - $infoline = "\nERROR: Packager $systemcall\n"; - print $infoline; - push( @packager::globals::logfileinfo, $infoline); - if (!($packager::globals::ignoreerrors)) { packager::exiter::exit_program("ERROR: Packing not successful : $systemcall", "execute_system_calls"); } - } - } -} - -############################################################## -# Starting the build server with the generated system calls -############################################################## - -sub start_build_server -{ - my ( $targets ) = @_; - - # preparing the directory structure - - my $prj = $ENV{PRJ}; # for example ".."; - my $platform = $ENV{INPATH}; # wntmsci10.pro, unxsols4.pro - my $platformpath = $prj . $packager::globals::separator . $platform; - if ( ! -d $platformpath ) { packager::files::create_directory($miscpath); } - my $miscpath = $platformpath . $packager::globals::separator . "misc"; - if ( ! -d $miscpath ) { packager::files::create_directory($miscpath); } - $miscpath = $miscpath . $packager::globals::separator . "temp"; - if ( -d $miscpath ) { packager::files::remove_complete_directory($miscpath); } # removing old files ! - if ( ! -d $miscpath ) { packager::files::create_directory($miscpath); } - - my $prjroot = ".." . $packager::globals::separator . ".." . $packager::globals::separator . ".." . $packager::globals::separator . ".."; # platform/misc/temp/uniquetempdir - - my $makefilepath = $prj . $packager::globals::separator . "util" . $packager::globals::separator . "makefile.mk"; - - if ( ! $ENV{'PRJNAME'} ) { packager::exiter::exit_program("ERROR: Environment variable PRJNAME not set!", "do_broadcast"); } - my $prjname = $ENV{PRJNAME}; - - my $pkgformat = $ENV{PKGFORMAT}; - - my $prjdep = $prjname . "\\" . "util"; # always windows like path - my @targetdirs; - my @targetlines = (); - # iterating over all targets - for ( my $i = 0; $i <= $#{$targets}; $i++ ) - { - my $target = ${$targets}[$i]; - my $tempdir = $miscpath . $packager::globals::separator . $target; - $tempdir = packager::files::create_unique_directory ($tempdir); - @targetlines=(); - push( @targetlines, "\ngenerated_target : $target\n\n"); # to be included into the makefile.mk - - if ( defined $pkgformat ) { - push( @targetlines, "\n$target : ".'$$@{$(PKGFORMAT:^".")}'."\n\n"); # to be included into the makefile.mk - } - - generate_makefile($tempdir, $makefilepath, $prjroot, $target, \@targetlines); - - do_broadcast($tempdir, $prjname, $prj, $platform, $prjdep); - push @targetdirs, $tempdir; - } -} - -############################################################## -# Generating the makefile in the temporary directory -############################################################## - -sub generate_makefile -{ - my ( $tempdir, $makefilepath, $prjroot, $target, $targetlines_ref ) = @_; - - my $makefile = packager::files::read_file($makefilepath); - - my @targetlines = (); - push( @targetlines, @{$targetlines_ref}); # to be included into the makefile.mk - - $prjroot = $prjroot . "\n"; - - my $uniquename = $tempdir; - get_filename_from_path(\$uniquename); - $uniquename = $uniquename . "\n"; - - my $counter = 0; - my $increase = 1; - - for ( my $i = 0; $i <= $#{$makefile}; $i++ ) - { - if ( ${$makefile}[$i] =~ /^\s*TARGET\s*=.*/ ) { ${$makefile}[$i] = "TARGET=" . $uniquename; } # setting the new project root - - if ( ${$makefile}[$i] =~ /^\s*PRJ\s*=.*/ ) { ${$makefile}[$i] = "PRJ=" . $prjroot; } # setting the new project root - - if ( ${$makefile}[$i] =~ /^\s*\.INCLUDE[\t ]*:[\t ]*target.mk[\t ]*$/ ) { $increase = 0; } # no more increase of the counter - - if ( $increase ) { $counter++; } - } - - splice(@{$makefile}, $counter, 0, @targetlines); # including the new target lines at position $counter - - my $newmakefilepath = $tempdir . $packager::globals::separator . "makefile.mk"; - packager::files::save_file($newmakefilepath, $makefile); -} - -############################################################## -# Generating the broadcasts for the build server -############################################################## - -sub do_broadcast -{ - use File::Temp; - - my ( $tempdir, $prjname, $prj, $platform, $prjdep ) = @_; - - # Syntax: cmd_bcst -s 18 "Version;Environment;Project;Verzeichnis;Restriction[;Abhaengigkeit1][;Abhaengigkeit n]..." - # Example: cmd_bcst -s 18 "SRC680;wntmsci10.pro;instsetoo_native;;instsetoo_native\bla1;instsetoo_native\util" - - if ( ! $ENV{'WORK_STAMP'} ) { packager::exiter::exit_program("ERROR: Environment variable WORK_STAMP not set!", "do_broadcast"); } - my $workstamp = $ENV{WORK_STAMP}; - - my $prjdir = $tempdir; - $prjdir =~ s/$prj/$prjname/; - $prjdir =~ s/\//\\/g; # convert to windows path syntax - - my $tempfiledir = $ENV{TMP}; - $tempfiledir = $tempdir if ( ! defined $tempfiledir ); - my ( $tmpfile_handle, $tmpfile_name ) = mkstemp( $tempfiledir . $packager::globals::separator . "packagerXXXXX"); - if ( ! $tmpfile_handle ) { - packager::exiter::exit_program("ERROR: Couldn't open temporary file \"$tmpfile_name\"!", "do_broadcast"); - } - print $tmpfile_handle "\"$workstamp;$platform;$prjname;$prjdir;nobase;$prjdep\""; - print "to tmpfile: \"$workstamp;$platform;$prjname;$prjdir;nobase;$prjdep\"\n"; - close $tmpfile_handle; - my $returnvalue = system("cmd_bcst -s 18 \@$tmpfile_name"); - print "cmd_bcst -s 18 \@$tmpfile_name\n"; - unlink "$tmpfile_name"; - - if ( $returnvalue ) # an error occurred - { - if (!($packager::globals::ignoreerrors)) { packager::exiter::exit_program("ERROR: Packing not successful!", "do_broadcast"); } - } -} - -############################################################## -# Returning the name of file or directory from complete path -############################################################## - -sub get_filename_from_path -{ - my ($longfilenameref) = @_; - - if ( $packager::globals::isunix ) - { - if ( $$longfilenameref =~ /^.*\/(\S.+\S?)/ ) - { - $$longfilenameref = $1; - } - } - - if ( $packager::globals::iswin ) - { - if ( $$longfilenameref =~ /^.*\\(\S.+\S?)/ ) - { - $$longfilenameref = $1; - } - } -} - -1; diff --git a/solenv/bin/modules/par2script/check.pm b/solenv/bin/modules/par2script/check.pm deleted file mode 100644 index bd84c147e..000000000 --- a/solenv/bin/modules/par2script/check.pm +++ /dev/null @@ -1,347 +0,0 @@ -#************************************************************************* -# -# 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::check; - -use par2script::globals; - -################################ -# Checks of the setup script -################################ - -######################################################## -# Checking if all defined directories are needed -######################################################## - -sub check_needed_directories -{ - my $allfiles = $par2script::globals::definitions{'File'}; - my $alldirs = $par2script::globals::definitions{'Directory'}; - - # checking if all defined directories are needed - - my $dir; - foreach $dir ( keys %{$alldirs} ) - { - # I. directory has create flag - if (( exists($alldirs->{$dir}->{'Styles'}) ) && ( $alldirs->{$dir}->{'Styles'} =~ /\bCREATE\b/ )) { next; } - - # II. there is at least one file in the directory - my $fileinside = 0; - my $file; - foreach $file ( keys %{$allfiles} ) - { - if (( $allfiles->{$file}->{'Dir'} eq $dir ) || ( $allfiles->{$file}->{'NetDir'} eq $dir )) - { - $fileinside = 1; - last; - } - } - if ( $fileinside ) { next; } - - # III. the directory is parent for another directory - my $isparent = 0; - my $onedir; - foreach $onedir ( keys %{$alldirs} ) - { - if ( $alldirs->{$onedir}->{'ParentID'} eq $dir ) - { - $isparent = 1; - last; - } - } - if ( $isparent ) { next; } - - # no condition is true -> directory definition is superfluous - my $infoline = "\tINFO: Directory definition $dir is superfluous\n"; - # print $infoline; - push(@par2script::globals::logfileinfo, $infoline); - } -} - -################################################## -# Checking if the directories in the item -# definitions are defined. -################################################## - -sub check_directories_in_item_definitions -{ - my $item; - foreach $item ( @par2script::globals::items_with_directories ) - { - my $allitems = $par2script::globals::definitions{$item}; - - my $onegid; - foreach $onegid ( keys %{$allitems} ) - { - if ( ! exists($allitems->{$onegid}->{'Dir'}) ) { die "\nERROR: No directory defined for item: $onegid!\n\n"; } - my $dir = $allitems->{$onegid}->{'Dir'}; - if (( $dir eq "PD_PROGDIR" ) || ( $dir =~ /PREDEFINED_/ )) { next; } - - # checking if this directoryid is defined - if ( ! exists($par2script::globals::definitions{'Directory'}->{$dir}) ) - { - die "\nERROR: Directory $dir in item $onegid not defined!\n\n"; - } - } - } -} - -######################################################## -# Checking for all Items, that know their modules, -# whether these modules exist. -######################################################## - -sub check_module_existence -{ - my $item; - foreach $item ( @par2script::globals::items_with_moduleid ) - { - my $allitems = $par2script::globals::definitions{$item}; - - my $onegid; - foreach $onegid ( keys %{$allitems} ) - { - if ( ! exists($allitems->{$onegid}->{'ModuleID'}) ) { die "\nERROR: No ModuleID defined for item: $onegid!\n\n"; } - my $moduleid = $allitems->{$onegid}->{'ModuleID'}; - - # checking if this directoryid is defined - if ( ! exists($par2script::globals::definitions{'Module'}->{$moduleid}) ) - { - die "\nERROR: ModuleID $moduleid in item $onegid not defined!\n\n"; - } - } - } -} - -######################################################## -# Every script has to contain exactly one root module. -# This module has no ParentID or an empty ParentID. -######################################################## - -sub check_rootmodule -{ - my $rootgid = ""; - my $foundroot = 0; - - my $allmodules = $par2script::globals::definitions{'Module'}; - - my $modulegid = ""; - foreach $modulegid (keys %{$allmodules} ) - { - if (( ! exists($allmodules->{$modulegid}->{'ParentID'}) ) || ( $allmodules->{$modulegid}->{'ParentID'} eq "" )) - { - if ( $foundroot ) - { - die "\nERROR: More than one Root module. Only one module without ParentID or with empty ParentID allowed ($rootgid and $modulegid).\n"; - } - $rootgid = $modulegid; - $foundroot = 1; - } - } - - if ( ! $foundroot ) - { - die "\nERROR: Could not find Root module. Did not find module without ParentID or with empty ParentID.\n"; - } - - print " $rootgid\n"; - -} - -######################################################## -# File, Shortcut, Directory, Unixlink must not -# contain a ModuleID -######################################################## - -sub check_moduleid_at_items -{ - my $item; - foreach $item ( @par2script::globals::items_without_moduleid ) - { - my $allitems = $par2script::globals::definitions{$item}; - - my $onegid; - foreach $onegid ( keys %{$allitems} ) - { - if ( exists($allitems->{$onegid}->{'ModuleID'}) ) - { - die "\nERROR: ModuleID assigned to $onegid! No module assignment to $item!\n\n"; - } - } - } -} - -######################################################## -# Controlling existence of multi assignments -######################################################## - -sub check_multiple_assignments -{ - my @multiassignments = (); - my $error; - - my $topitem; - foreach $topitem ( keys %par2script::globals::assignedgids ) - { - my $item; - foreach $item ( keys %{$par2script::globals::assignedgids{$topitem}} ) - { - if ( $par2script::globals::assignedgids{$topitem}->{$item} > 1 ) - { - $error = 1; - my $string = "\tGID: $item Assignments: $par2script::globals::assignedgids{$topitem}->{$item}"; - push(@multiassignments, $string); - } - } - } - - if ( $error ) { par2script::exiter::multiassignmenterror(\@multiassignments); } -} - -######################################################## -# Check, if a defined directory has a flag CREATE -######################################################## - -sub contains_create_flag -{ - my ($gid) = @_; - - my $createflag = 0; - - if (( exists($par2script::globals::definitions{'Directory'}->{$gid}->{'Styles'}) ) && - ( $par2script::globals::definitions{'Directory'}->{$gid}->{'Styles'} =~ /\bCREATE\b/ )) - { - $createflag = 1; - } - - return $createflag; -} - -######################################################## -# Controlling existence of definitions without -# any assignment -######################################################## - -sub check_missing_assignments -{ - # If defined gids for "File", "Directory" or "Unixlink" are not assigned, - # this causes an error. - # Directories only have to be assigned, if they have the flag "CREATE". - - my @missingassignments = (); - $error = 0; - - my $item; - foreach $item ( @par2script::globals::items_assigned_at_modules ) - { - my $assignedgids = $par2script::globals::assignedgids{$item}; - my $definedgids = $par2script::globals::definitions{$item}; - - my $gid; - foreach $gid ( keys %{$definedgids} ) - { - if ( $item eq "Directory" ) { if ( ! contains_create_flag($gid) ) { next; } } - - if ( ! exists( $assignedgids->{$gid} )) - { - $error = 1; - push(@missingassignments, $gid); - } - } - } - - if ( $error ) { par2script::exiter::missingassignmenterror(\@missingassignments); } -} - -############################################################# -# Controlling if for all shortcuts with file assignment -# the file is defined. And for all shortcuts with -# shortcut assignment the shortcut has to be defined. -############################################################# - -sub check_shortcut_assignments -{ - my $allshortcuts = $par2script::globals::definitions{'Shortcut'}; - my $allfiles = $par2script::globals::definitions{'File'}; - - my $shortcut; - foreach $shortcut ( keys %{$allshortcuts} ) - { - if (( exists($allshortcuts->{$shortcut}->{'FileID'}) ) && - ( ! exists($allfiles->{$allshortcuts->{$shortcut}->{'FileID'}}) )) - { - # die "\nERROR: FileID $allshortcuts->{$shortcut}->{'FileID'} has no definition at shortcut $shortcut !\n"; - print "\n\tWARNING: FileID $allshortcuts->{$shortcut}->{'FileID'} has no definition at shortcut $shortcut !\n"; - } - - if (( exists($allshortcuts->{$shortcut}->{'ShortcutID'}) ) && - ( ! exists($allshortcuts->{$allshortcuts->{$shortcut}->{'ShortcutID'}}) )) - { - die "\nERROR: ShortcutID $allshortcuts->{$shortcut}->{'ShortcutID'} has no definition at shortcut $shortcut !\n"; - } - - if (( ! exists($allshortcuts->{$shortcut}->{'ShortcutID'}) ) && - ( ! exists($allshortcuts->{$shortcut}->{'FileID'}) )) - { - die "\nERROR: Shortcut requires assignment to \"ShortcutID\" or \"FileID\". Missing at shortcut $shortcut !\n"; - } - } -} - -############################################################# -# Controlling if for Modules and Directories, the parents -# are defined. If not, this can lead to a problem during -# script creation, because only recursively added -# Modules or Directories are added to the script. -############################################################# - -sub check_missing_parents -{ - my @parentitems = ("Module", "Directory"); - my %rootparents = ("PREDEFINED_PROGDIR" => "1"); - - my $oneitem; - foreach $oneitem ( @parentitems ) - { - my $alldefinitions = $par2script::globals::definitions{$oneitem}; - - my $onegid; - foreach $onegid ( keys %{$alldefinitions} ) - { - # If there is a ParentID used, it must be defined - if (( exists($alldefinitions->{$onegid}->{'ParentID'}) ) && - ( ! exists($alldefinitions->{$alldefinitions->{$onegid}->{'ParentID'}}) ) && - ( ! exists($rootparents{$alldefinitions->{$onegid}->{'ParentID'}}) )) - { - die "\nERROR: Parent \"$alldefinitions->{$onegid}->{'ParentID'}\" at $oneitem \"$onegid\" is not defined!\n"; - } - } - } -} - -1; diff --git a/solenv/bin/modules/par2script/converter.pm b/solenv/bin/modules/par2script/converter.pm deleted file mode 100644 index d51f176e6..000000000 --- a/solenv/bin/modules/par2script/converter.pm +++ /dev/null @@ -1,142 +0,0 @@ -#************************************************************************* -# -# 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::converter; - -use par2script::remover; - -############################# -# Converter -############################# - -sub convert_array_to_hash -{ - my ($arrayref) = @_; - - my ($line, $key, $value); - - my %newhash = (); - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - $line = ${$arrayref}[$i]; - - if ( $line =~ /^\s*(\w+?)\s+(.*?)\s*$/ ) - { - $key = $1; - $value = $2; - $newhash{$key} = $value; - } - } - - return \%newhash; -} - -sub convert_hash_into_array -{ - my ($hashref) = @_; - - my @array = (); - my ($key, $value, $input); - - foreach $key (keys %{$hashref}) - { - $value = $hashref->{$key}; - $input = "$key = $value\n"; - push(@array ,$input); - } - - return \@array -} - -sub convert_stringlist_into_array_2 -{ - my ( $input, $separator ) = @_; - - my @newarray = (); - my $first = ""; - my $last = ""; - - $last = $input; - - while ( $last =~ /^\s*(.+?)\s*\Q$separator\E\s*(.+)\s*$/) # "$" for minimal matching - { - $first = $1; - $last = $2; - par2script::remover::remove_leading_and_ending_whitespaces(\$first); - if ( $first ) { push(@newarray, $first); } - } - - par2script::remover::remove_leading_and_ending_whitespaces(\$last); - if ( $last ) { push(@newarray, $last); } - - return \@newarray; -} - -sub convert_stringlist_into_array -{ - my ( $includestringref, $separator ) = @_; - - my @newarray = (); - my ($first, $last); - - $last = ${$includestringref}; - - while ( $last =~ /^\s*(.+?)\s*\Q$separator\E\s*(.+)\s*$/) # "$" for minimal matching - { - $first = $1; - $last = $2; - par2script::remover::remove_leading_and_ending_whitespaces(\$first); - push(@newarray, $first); - } - - par2script::remover::remove_leading_and_ending_whitespaces(\$last); - push(@newarray, $last); - - return \@newarray; -} - -############################################################################# -# The file name contains for some files "/". If this programs runs on -# a windows platform, this has to be converted to "\". -############################################################################# - -sub convert_slash_to_backslash -{ - my ($filesarrayref) = @_; - - my ($onefile, $filename); - - for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) - { - $onefile = ${$filesarrayref}[$i]; - $onefile->{'Name'} =~ s/\//\\/g; - } -} - -1; diff --git a/solenv/bin/modules/par2script/existence.pm b/solenv/bin/modules/par2script/existence.pm deleted file mode 100644 index 87b441d16..000000000 --- a/solenv/bin/modules/par2script/existence.pm +++ /dev/null @@ -1,74 +0,0 @@ -#************************************************************************* -# -# 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::existence; - -############################# -# Test of existence -############################# - -sub exists_in_array -{ - my ($searchstring, $arrayref) = @_; - - my $alreadyexists = 0; - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - if ( ${$arrayref}[$i] eq $searchstring) - { - $alreadyexists = 1; - last; - } - } - - return $alreadyexists; -} - -sub exists_in_array_of_hashes -{ - my ($searchkey, $searchvalue, $arrayref) = @_; - - my $hashref; - my $valueexists = 0; - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - $hashref = ${$arrayref}[$i]; - - if ( $hashref->{$searchkey} eq $searchvalue ) - { - $valueexists = 1; - last; - } - } - - return $valueexists; -} - -1; diff --git a/solenv/bin/modules/par2script/exiter.pm b/solenv/bin/modules/par2script/exiter.pm deleted file mode 100644 index 6f9b144fa..000000000 --- a/solenv/bin/modules/par2script/exiter.pm +++ /dev/null @@ -1,122 +0,0 @@ -#************************************************************************* -# -# 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::exiter; - -use par2script::files; -use par2script::globals; - -############################################ -# Exiting the program with an error -# This function is used instead of "die" -############################################ - -sub exit_program -{ - my ($message, $function) = @_; - - my $infoline; - - $infoline = "\n***************************************************************\n"; - push(@par2script::globals::logfileinfo, $infoline); - print("$infoline"); - - $infoline = "$message\n"; - push(@par2script::globals::logfileinfo, $infoline); - print("$infoline"); - - $infoline = "in function: $function\n"; - push(@par2script::globals::logfileinfo, $infoline); - print("$infoline"); - - $infoline = "***************************************************************\n"; - push(@par2script::globals::logfileinfo, $infoline); - - if ($par2script::globals::logging) - { - par2script::files::save_file($par2script::globals::logfilename, \@par2script::globals::logfileinfo); - print("Saved logfile: $par2script::globals::logfilename\n"); - } - - print("$infoline"); - - exit(-1); -} - -##################################### -# Error, because a gid is defined -# more than once -##################################### - -sub multidefinitionerror -{ - my ( $multidefinitiongids ) = @_; - print "************************************************\n"; - print "ERROR: multiple definition of gids:\n"; - print "************************************************\n"; - - my $gid; - foreach $gid ( @{$multidefinitiongids} ) { print "\t$gid\n"; } - exit(-1); -} - -##################################### -# Error, because a gid is assigned -# more than once -##################################### - -sub multiassignmenterror -{ - my ( $multiassignmentgids ) = @_; - #print "************************************************\n"; - #print "ERROR: multiple assignments of gids:\n"; - #print "************************************************\n"; - - my $line; - foreach $line ( @{$multiassignmentgids} ) { print "\t$line\n"; } - # exit(-1); -} - -##################################### -# Error, because a defined gid -# is not assigned -##################################### - -sub missingassignmenterror -{ - my ( $missingassignmentgids ) = @_; - print "********************************************************\n"; - print "ERROR: Missing assignments for the following GIDs:\n"; - print "********************************************************\n"; - - my $gid; - foreach $gid ( @{$missingassignmentgids} ) { print "\t$gid\n"; } - exit(-1); -} - -1; diff --git a/solenv/bin/modules/par2script/files.pm b/solenv/bin/modules/par2script/files.pm deleted file mode 100644 index 340bc3fef..000000000 --- a/solenv/bin/modules/par2script/files.pm +++ /dev/null @@ -1,124 +0,0 @@ -#************************************************************************* -# -# 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::files; - -use par2script::exiter; - -############################################ -# File Operations -############################################ - -sub check_file -{ - my ($arg) = @_; - - if(!( -f $arg )) - { - par2script::exiter::exit_program("ERROR: Cannot find file $arg", "check_file"); - } -} - -sub read_file -{ - my ($localfile) = @_; - - my @localfile = (); - - open( IN, "<$localfile" ) || par2script::exiter::exit_program("ERROR: Cannot open file: $localfile", "read_file"); - while ( <IN> ) { push(@localfile, $_); } - close( IN ); - - return \@localfile; -} - -########################################### -# Saving files, arrays and hashes -########################################### - -sub save_file -{ - my ($savefile, $savecontent) = @_; - open( OUT, ">$savefile" ); - print OUT @{$savecontent}; - close( OUT); - if (! -f $savefile) { pre2par::exiter::exit_program("ERROR: Cannot write file: $savefile", "save_file"); } -} - -sub save_hash -{ - my ($savefile, $hashref) = @_; - - my @printcontent = (); - - my ($itemkey, $itemvalue, $line); - - foreach $itemkey ( keys %{$hashref} ) - { - $line = ""; - $itemvalue = $hashref->{$itemkey}; - $line = $itemkey . "=" . $itemvalue . "\n"; - push(@printcontent, $line); - } - - open( OUT, ">$savefile" ); - print OUT @printcontent; - close( OUT); -} - -sub save_array_of_hashes -{ - my ($savefile, $arrayref) = @_; - - my @printcontent = (); - - my ($itemkey, $itemvalue, $line, $hashref); - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - $line = ""; - $hashref = ${$arrayref}[$i]; - - foreach $itemkey ( keys %{$hashref} ) - { - $itemvalue = $hashref->{$itemkey}; - - $line = $line . $itemkey . "=" . $itemvalue . "\t"; - } - - $line = $line . "\n"; - - push(@printcontent, $line); - } - - open( OUT, ">$savefile" ); - print OUT @printcontent; - close( OUT); -} - -1; diff --git a/solenv/bin/modules/par2script/globals.pm b/solenv/bin/modules/par2script/globals.pm deleted file mode 100644 index b06827047..000000000 --- a/solenv/bin/modules/par2script/globals.pm +++ /dev/null @@ -1,81 +0,0 @@ -#************************************************************************* -# -# 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::globals; - -############################################ -# Global settings -############################################ - -BEGIN -{ - $prog="par2script"; - - $includepathlist = ""; - $scriptname = ""; - $parfilelistorig = ""; - $parfilelist = ""; - - @allitems = ("Installation", "ScpAction", "Directory", "File", - "Shortcut", "Unixlink", "Module", "Profile", "ProfileItem", - "Folder", "FolderItem", "RegistryItem", "WindowsCustomAction", - "MergeModule"); - - @items_assigned_at_modules = ("File", "Directory", "Unixlink"); - @items_with_directories = ("File", "Profile", "Shortcut", "Unixlink"); - @items_with_moduleid = ("Profile", "ProfileItem", "FolderItem", "RegistryItem"); - @items_without_moduleid = ("File", "Directory", "Shortcut", "Unixlink"); - - %searchkeys = ("File" => "Files", "Directory" => "Dirs", "Unixlink" => "Unixlinks"); - - $logging = 0; - $logfilename = "logfile.log"; # the default logfile name for global errors - @logfileinfo = (); - - $multidefinitionerror = 0; - $multiassignmenterror = 0; - - %definitions; - %assignedgids; - - $plat = $^O; - - $separator = "/"; - $pathseparator = "\:"; - $isunix = 1; - $iswin = 0; - - $islinux = 0; - $issolaris = 0; - - if ( $plat =~ /linux/i ) { $islinux = 1; } - if ( $plat =~ /solaris/i ) { $issolaris = 1; } - -} - -1; diff --git a/solenv/bin/modules/par2script/module.pm b/solenv/bin/modules/par2script/module.pm deleted file mode 100644 index d1da979bc..000000000 --- a/solenv/bin/modules/par2script/module.pm +++ /dev/null @@ -1,264 +0,0 @@ -#************************************************************************* -# -# 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::module; - -use par2script::converter; -use par2script::exiter; - -########################################### -# Removing undefined gids -# from modules -########################################### - -sub remove_from_modules -{ - my ($gid, $item) = @_; - - my $counter = 0; - - if ( ! exists($par2script::globals::searchkeys{$item}) ) { par2script::exiter::exit_program("ERROR: Unknown type \"$item\" at modules.", "remove_from_modules"); } - my $searchkey = $par2script::globals::searchkeys{$item}; - - my $allmodules = $par2script::globals::definitions{'Module'}; - - my $onemodule; - foreach $onemodule (keys %{$allmodules}) - { - if (( exists($allmodules->{$onemodule}->{$searchkey}) ) && ( $allmodules->{$onemodule}->{$searchkey} =~ /\b$gid\b/ )) - { - my $infoline = "WARNING: Removing $gid because of missing definition\n"; - # print $infoline; - push(@par2script::globals::logfileinfo, $infoline); - - $allmodules->{$onemodule}->{$searchkey} =~ s/\b$gid\b//; - $allmodules->{$onemodule}->{$searchkey} =~ s/\,\s*\,/\,/; - $allmodules->{$onemodule}->{$searchkey} =~ s/\(\s*\,\s*/\(/; - $allmodules->{$onemodule}->{$searchkey} =~ s/\s*\,\s*\)/\)/; - - if (( $allmodules->{$onemodule}->{$searchkey} =~ /\(\s*\,\s*\)/ ) || - ( $allmodules->{$onemodule}->{$searchkey} =~ /\(\s*\)/ )) - { - delete($allmodules->{$onemodule}->{$searchkey}); - } - - $counter++; - } - } - - return $counter; -} - -########################################### -# Removing undefined gids automatically -# from modules -########################################### - -sub remove_undefined_gids_from_modules -{ - # If assigned gids for "File", "Directory" or "Unixlink" are not defined, - # they are automatically removed from the module - - foreach $item ( @par2script::globals::items_assigned_at_modules ) - { - my $assignedgids = $par2script::globals::assignedgids{$item}; - my $definedgids = $par2script::globals::definitions{$item}; - - my $gid; - foreach $gid ( keys %{$assignedgids} ) - { - if ( ! exists( $definedgids->{$gid} )) - { - # deleting entry in module definition - my $number_of_removals = remove_from_modules($gid, $item); - # decreasing counter in assignments - if ( $assignedgids->{$gid} > $number_of_removals ) { $assignedgids->{$gid} = $assignedgids->{$gid} - $number_of_removals; } - else { delete($assignedgids->{$gid}); } - } - } - } -} - -############################################ -# Getting the gid of the root module. The -# root module has no ParentID or an empty -# ParentID. -############################################ - -sub get_rootmodule_gid -{ - my $rootgid = ""; - my $foundroot = 0; - - my $allmodules = $par2script::globals::definitions{'Module'}; - - 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}->{'ParentID'})) || ( $allmodules->{$modulegid}->{'ParentID'} eq "" )) - { - if ( $foundroot ) { par2script::exiter::exit_program("ERROR: More than one Root module. Only one module without ParentID or with empty ParentID allowed ($rootgid and $modulegid).", "get_rootmodule_gid"); } - $rootgid = $modulegid; - $foundroot = 1; - } - } - - if ( ! $foundroot ) { par2script::exiter::exit_program("ERROR: Could not find Root module. Did not find module without ParentID or with empty ParentID.", "get_rootmodule_gid"); } - - return $rootgid; -} - -#################################### -# Adding defined items without -# assignment to the root module. -#################################### - -sub add_to_root_module -{ - # If defined gids for "File", "Directory" or "Unixlink" are not assigned, - # they are automatically assigned to the root module - - my $rootmodulegid = get_rootmodule_gid(); - - my $item; - foreach $item ( @par2script::globals::items_assigned_at_modules ) - { - my $assignedgids = $par2script::globals::assignedgids{$item}; - my $definedgids = $par2script::globals::definitions{$item}; - - my $gidstring = ""; - - # Perhaps there are already items assigned to the root - if ( ! exists($par2script::globals::searchkeys{$item}) ) { par2script::exiter::exit_program("ERROR: Unknown type \"$item\" at modules.", "remove_from_modules"); } - my $modulekey = $par2script::globals::searchkeys{$item}; - if ( exists($par2script::globals::definitions{'Module'}->{$rootmodulegid}->{$modulekey}) ) - { - $gidstring = $par2script::globals::definitions{'Module'}->{$rootmodulegid}->{$modulekey}; - $gidstring =~ s/\(//; - $gidstring =~ s/\)//; - } - - my $gid; - foreach $gid ( keys %{$definedgids} ) - { - if ( ! exists( $assignedgids->{$gid} )) - { - if ( $gidstring eq "" ) - { - $gidstring = $gid; - } - else - { - $gidstring = "$gidstring,$gid"; - } - - $assignedgids->{$gid} = 1; - } - } - - if ( $gidstring ne "" ) - { - $gidstring = "\($gidstring\)"; - $par2script::globals::definitions{'Module'}->{$rootmodulegid}->{$modulekey} = $gidstring; - } - } -} - -################################################### -# Including \n in a very long string -################################################### - -sub include_linebreaks -{ - my ($allgidstring) = @_; - - my $newline = ""; - my $newlength = 0; - - $allgidstring =~ s/\(//; - $allgidstring =~ s/\)//; - - my $allgids = par2script::converter::convert_stringlist_into_array_2($allgidstring, ","); - - if ( $#{$allgids} > -1 ) - { - my $onegid; - foreach $onegid ( @{$allgids} ) - { - $newline = "$newline$onegid,"; - $newlength = $newlength + length($onegid) + 1; # +1 for the comma - - if ( $newlength > 80 ) - { - $newline = $newline . "\n\t\t\t\t"; - $newlength = 0; - } - } - } - - $newline =~ s/,\s*$//; - $newline = "($newline)"; - - return $newline; -} - -################################################### -# Shorten the lines that belong to modules, if -# the length of the line is greater 100 -################################################### - -sub shorten_lines_at_modules -{ - 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.", "shorten_lines_at_modules"); } - my $searchkey = $par2script::globals::searchkeys{$item}; - - my $allmodules = $par2script::globals::definitions{'Module'}; - - my $onemodule; - foreach $onemodule (keys %{$allmodules}) - { - if (( exists($allmodules->{$onemodule}->{$searchkey}) ) && - ( length($allmodules->{$onemodule}->{$searchkey}) > 100 )) - { - # including "\n\t\t\t\t" - my $newstring = include_linebreaks($allmodules->{$onemodule}->{$searchkey}); - $allmodules->{$onemodule}->{$searchkey} = $newstring; - } - } - } -} - -1; diff --git a/solenv/bin/modules/par2script/parameter.pm b/solenv/bin/modules/par2script/parameter.pm deleted file mode 100644 index 4ca1354d9..000000000 --- a/solenv/bin/modules/par2script/parameter.pm +++ /dev/null @@ -1,154 +0,0 @@ -#************************************************************************* -# -# 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::parameter; - -use Cwd; -use par2script::files; -use par2script::globals; -use par2script::systemactions; - -############################################ -# Parameter Operations -############################################ - -############################################################################### -# Usage: -# perl par2script.pl -i ..\wntmsci8.pro\par,o:\SRX645\wntmsci8.pro\par.m24 -# @@C:\DOCUMEN~1\is\LOCALS~1\Temp\mk6pd -# -o ..\wntmsci8.pro\bin\osl\setup_osl.inf -############################################################################### - -sub usage -{ - print <<Ende; - --------------------------------------------------------------- -$par2script::globals::prog -The following parameter are needed: --i: include pathes, comma separated list --o: setup script file name --v: writing logfile.txt (optional) -\@\@list: list of all par files - -Example: - perl par2script.pl -i ..\\wntmsci8\\par\,o\:\\SRX645\\wntmsci8\\par.m24 - \@\@C\:\\DOCUMEN\~1\\is\\LOCALS\~1\\Temp\\mk6pd - -o ..\\wntmsci8.pro\\bin\\osl\\setup_osl.inf \[-v\] - --------------------------------------------------------------- -Ende - exit(-1); -} - -##################################### -# Reading parameter -##################################### - -sub getparameter -{ - while ( $#ARGV >= 0 ) - { - my $param = shift(@ARGV); - - if ($param eq "-o") { $par2script::globals::scriptname = shift(@ARGV); } - elsif ($param eq "-v") { $par2script::globals::logging = 1; } - elsif ($param =~ /\@\@/) { $par2script::globals::parfilelistorig = $param; } - elsif ($param eq "-i") { $par2script::globals::includepathlist = shift(@ARGV); } - elsif (($param =~ /\//) || ($param =~ /\\/)) # another include parameter! - { - $par2script::globals::includepathlist = $par2script::globals::includepathlist . "," . $param; - } - else - { - print("\n*************************************\n"); - print("Sorry, unknown parameter: $param"); - print("\n*************************************\n"); - usage(); - exit(-1); - } - } -} - -############################################ -# Controlling the fundamental parameter -# (required for every process) -############################################ - -sub control_parameter -{ - if ($par2script::globals::includepathlist eq "") - { - print "\n************************************************\n"; - print "Error: Include pathes not set not set (-i)!"; - print "\n************************************************\n"; - usage(); - exit(-1); - } - - if ($par2script::globals::scriptname eq "") - { - print "\n************************************************\n"; - print "Error: Name of the setup script not set (-o)!"; - print "\n************************************************\n"; - usage(); - exit(-1); - } - - if ($par2script::globals::parfilelistorig eq "") - { - print "\n************************************************\n"; - print "Error: List of par files not set!"; - print "\n************************************************\n"; - usage(); - exit(-1); - } - - # The par file list has to exist - - $par2script::globals::parfilelist = $par2script::globals::parfilelistorig; - $par2script::globals::parfilelist =~ s/\@\@//; - par2script::files::check_file($par2script::globals::parfilelist); -} - -##################################### -# Writing parameter to shell -##################################### - -sub outputparameter -{ - my $outputline = "\n$par2script::globals::prog -i $par2script::globals::includepathlist $par2script::globals::parfilelistorig -o $par2script::globals::scriptname"; - - if ($par2script::globals::logging) { $outputline .= " -v"; } - - $outputline .= "\n"; - - print $outputline; -} - -1; diff --git a/solenv/bin/modules/par2script/remover.pm b/solenv/bin/modules/par2script/remover.pm deleted file mode 100644 index 0a41bf6c4..000000000 --- a/solenv/bin/modules/par2script/remover.pm +++ /dev/null @@ -1,75 +0,0 @@ -#************************************************************************* -# -# 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::remover; - -############################################ -# Remover -############################################ - -sub remove_leading_and_ending_whitespaces -{ - my ( $stringref ) = @_; - - $$stringref =~ s/^\s*//g; - $$stringref =~ s/\s*$//g; -} - -sub remove_leading_and_ending_comma -{ - my ( $stringref ) = @_; - - $$stringref =~ s/^\s*\,//g; - $$stringref =~ s/\,\s*$//g; -} - -sub remove_leading_and_ending_quotationmarks -{ - my ( $stringref ) = @_; - - $$stringref =~ s/^\s*\"//g; - $$stringref =~ s/\"\s*$//g; -} - -sub remove_leading_and_ending_slashes -{ - my ( $stringref ) = @_; - - $$stringref =~ s/^\s*\///g; - $$stringref =~ s/\/\s*$//g; -} - -sub remove_leading_and_ending_backslashes -{ - my ( $stringref ) = @_; - - $$stringref =~ s/^\s*\\//g; - $$stringref =~ s/\\\s*$//g; -} - -1; diff --git a/solenv/bin/modules/par2script/shortcut.pm b/solenv/bin/modules/par2script/shortcut.pm deleted file mode 100644 index d78ad795b..000000000 --- a/solenv/bin/modules/par2script/shortcut.pm +++ /dev/null @@ -1,75 +0,0 @@ -#************************************************************************* -# -# 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::shortcut; - -use par2script::work; - -############################################################ -# Writing shortcuts to files behind the correct files and -# then shortcuts to shortcuts behind these shortcuts. -############################################################ - -sub shift_shortcut_positions -{ - my ($script) = @_; - - my $allshortcutgids = par2script::work::get_all_gids_from_script($script, "Shortcut"); - - # first all shortcuts that are assigned to files - - for ( my $i = 0; $i <= $#{$allshortcutgids}; $i++ ) - { - my $codeblock = par2script::work::get_definitionblock_from_script($script, ${$allshortcutgids}[$i]); - - my $filegid = par2script::work::get_value_from_definitionblock($codeblock, "FileID"); - - if (!($filegid eq "")) - { - par2script::work::remove_definitionblock_from_script($script, ${$allshortcutgids}[$i]); - par2script::work::add_definitionblock_into_script($script, $codeblock, $filegid); - } - } - - # secondly all shortcuts that are assigned to other shortcuts - - for ( my $i = 0; $i <= $#{$allshortcutgids}; $i++ ) - { - my $codeblock = par2script::work::get_definitionblock_from_script($script, ${$allshortcutgids}[$i]); - my $shortcutgid = par2script::work::get_value_from_definitionblock($codeblock, "ShortcutID"); - - if (!($shortcutgid eq "")) - { - par2script::work::remove_definitionblock_from_script($script, ${$allshortcutgids}[$i]); - par2script::work::add_definitionblock_into_script($script, $codeblock, $shortcutgid); - } - } -} - - -1; diff --git a/solenv/bin/modules/par2script/systemactions.pm b/solenv/bin/modules/par2script/systemactions.pm deleted file mode 100644 index 5f5d62bcd..000000000 --- a/solenv/bin/modules/par2script/systemactions.pm +++ /dev/null @@ -1,184 +0,0 @@ -#************************************************************************* -# -# 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::systemactions; - -use File::Copy; -use par2script::exiter; -use par2script::globals; - -###################################################### -# Creating a new direcotory -###################################################### - -sub create_directory -{ - my ($directory) = @_; - - my $returnvalue = 1; - - if (!(-d $directory)) - { - $returnvalue = mkdir($directory, 0775); - - if ($returnvalue) - { - $infoline = "Created directory: $directory\n"; - push(@par2script::globals::logfileinfo, $infoline); - - if ($par2script::globals::isunix) - { - my $localcall = "chmod 775 $directory \>\/dev\/null 2\>\&1"; - system($localcall); - } - } - else - { - par2script::exiter::exit_program("Error: Could not create directory: $directory", "create_directory"); - } - } -} - -####################################################################### -# Creating the directories, in which files are generated or unzipped -####################################################################### - -sub create_directories -{ - my ($directory, $languagesref) =@_; - - $par2script::globals::unpackpath =~ s/\Q$par2script::globals::separator\E\s*$//; # removing ending slashes and backslashes - - my $path = $par2script::globals::unpackpath; # this path already exists - - $path = $path . $par2script::globals::separator . $par2script::globals::build . $par2script::globals::separator; - create_directory($path); - - $path = $path . $par2script::globals::minor . $par2script::globals::separator; - create_directory($path); - - if ($directory eq "unzip" ) - { - $path = $path . "common" . $par2script::globals::productextension . $par2script::globals::separator; - create_directory($path); - - $path = $path . $directory . $par2script::globals::separator; - create_directory($path); - } - else - { - $path = $path . $par2script::globals::compiler . $par2script::globals::productextension . $par2script::globals::separator; - create_directory($path); - - $path = $path . $par2script::globals::product . $par2script::globals::separator; - create_directory($path); - - $path = $path . $directory . $par2script::globals::separator; - create_directory($path); - - if (!($$languagesref eq "" )) # this will be a path like "01_49", for Profiles and ConfigurationFiles, idt-Files - { - $path = $path . $$languagesref . $par2script::globals::separator; - create_directory($path); - } - } - - $path =~ s/\Q$par2script::globals::separator\E\s*$//; - - return $path; -} - -######################## -# Copying one file -######################## - -sub copy_one_file -{ - my ($source, $dest) = @_; - - my ($copyreturn, $returnvalue); - my $infoline; - - $copyreturn = copy($source, $dest); - - if ($copyreturn) - { - $infoline = "Copy: $source to $dest\n"; - $returnvalue = 1; - } - else - { - $infoline = "Error: Could not copy $source to $dest $!\n"; - $returnvalue = 0; - } - - push(@par2script::globals::logfileinfo, $infoline); - - return $returnvalue; -} - -########################################## -# Copying all files from one directory -# to another directory -########################################## - -sub copy_directory -{ - my ($sourcedir, $destdir) = @_; - - my ($onefile, $sourcefile, $destfile); - my @sourcefiles = (); - - $sourcedir =~ s/\Q$par2script::globals::separator\E\s*$//; - $destdir =~ s/\Q$par2script::globals::separator\E\s*$//; - - $infoline = "\n"; - push(@par2script::globals::logfileinfo, $infoline); - $infoline = "Copying files from directory $sourcedir to directory $destdir\n"; - push(@par2script::globals::logfileinfo, $infoline); - - opendir(DIR, $sourcedir); - @sourcefiles = readdir(DIR); - closedir(DIR); - - foreach $onefile (@sourcefiles) - { - if ((!($onefile eq ".")) && (!($onefile eq ".."))) - { - $sourcefile = $sourcedir . $par2script::globals::separator . $onefile; - $destfile = $destdir . $par2script::globals::separator . $onefile; - if ( -f $sourcefile ) # only files, no directories - { - copy_one_file($sourcefile, $destfile); - } - } - } -} - - -1; diff --git a/solenv/bin/modules/par2script/undefine.pm b/solenv/bin/modules/par2script/undefine.pm deleted file mode 100644 index 3ffc76709..000000000 --- a/solenv/bin/modules/par2script/undefine.pm +++ /dev/null @@ -1,144 +0,0 @@ -#************************************************************************* -# -# 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::undefine; - -use par2script::globals; - -########################################################## -# Removing in the script all the gids, that are listed -# in undefine scp files -########################################################## - -sub undefine_gids -{ - my ($parfilecontent) = @_; - - my $item; - foreach $item ( @par2script::globals::allitems ) - { - my $unitem = "Un$item"; - - for ( my $i = 0; $i <= $#{$parfilecontent}; $i++ ) - { - if ( ${$parfilecontent}[$i] =~ /^\s*$unitem\s*(\w+?)\s*$/ ) - { - my $gid = $1; - delete($par2script::globals::definitions{$item}->{$gid}); - } - } - } -} - -########################################################## -# Collecting all subdirectories of a specified directory -########################################################## - -sub collect_children_dirs -{ - my ($gid, $collector) = @_; - - my $diritem = "Directory"; - my $parentkey = "ParentID"; - - if ( exists($par2script::globals::definitions{$diritem}) ) - { - my $onedefinition; - - foreach $onedefinition (keys %{$par2script::globals::definitions{$diritem}}) - { - if ( $par2script::globals::definitions{$diritem}->{$onedefinition}->{$parentkey} eq $gid ) - { - push(@{$collector}, $onedefinition); - collect_children_dirs($onedefinition, $collector); - } - } - } -} - -########################################################## -# Removing in the script complete profiles. -# This includes the Profile and its ProfileItems. -########################################################## - -sub remove_complete_item -{ - my ($item, $parfilecontent) = @_; - - my $removeitem = "Remove$item"; - my $dependentkey = ""; - my $collect_children = 0; - my @gidcollector = (); - my @dependentitems = (); - - if ( $item eq "Profile" ) - { - @dependentitems = ("ProfileItem"); - $dependentkey = "ProfileID"; - } - elsif ( $item eq "Directory" ) - { - @dependentitems = ("File", "Shortcut", "Unixlink"); - $dependentkey = "Dir"; - $collect_children = 1; - } - - for ( my $i = 0; $i <= $#{$parfilecontent}; $i++ ) - { - if ( ${$parfilecontent}[$i] =~ /^\s*$removeitem\s*(\w+?)\s*$/ ) - { - my $onegid = $1; - push(@gidcollector, $onegid); - if ( $collect_children ) { collect_children_dirs($onegid, \@gidcollector); } - - my $gid; - foreach $gid (@gidcollector) - { - delete($par2script::globals::definitions{$item}->{$gid}); - - # also deleting all dependent items, for example "ProfileItems" whose "ProfileID" is this "Profile" - my $depitem; - foreach $depitem ( @dependentitems ) - { - if ( exists($par2script::globals::definitions{$depitem}) ) - { - my $onedefinition; - foreach $onedefinition (keys %{$par2script::globals::definitions{$depitem}}) - { - if ( $par2script::globals::definitions{$depitem}->{$onedefinition}->{$dependentkey} eq $gid ) - { - delete($par2script::globals::definitions{$depitem}->{$onedefinition}); - } - } - } - } - } - } - } -} - -1; diff --git a/solenv/bin/modules/par2script/work.pm b/solenv/bin/modules/par2script/work.pm deleted file mode 100644 index f8b97087f..000000000 --- a/solenv/bin/modules/par2script/work.pm +++ /dev/null @@ -1,423 +0,0 @@ -#************************************************************************* -# -# 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 = (); - - my %itemhash; - - # create empty item hashes - foreach $oneitem ( @par2script::globals::allitems ) { - my %items; - $par2script::globals::definitions{$oneitem} = \%items; - } - - for ( my $i = 0; $i <= $#{$parfilecontent}; $i++ ) - { - my $line = ${$parfilecontent}[$i]; - my $oneitem, $gid; - - $line =~ /^\s*$/ && next; # skip blank lines - - # lines should be well formed: - if ($line =~ m/^\s*(\w+)\s+(\w+)\s*$/) - { - $oneitem = $1; - $gid = $2; - } else { - chomp ($line); - my $invalid = $line; - $invalid =~ s/[\s\w]*//g; - par2script::exiter::exit_program("ERROR: malformed par file, invalid character '$invalid', expecting <token> <gid> but saw '$line'", "test_par_syntax"); - } -# print STDERR "line '$line' -> '$oneitem' '$gid'\n"; - - # hunt badness variously - if ( ! defined $par2script::globals::definitions{$oneitem} ) - { - par2script::exiter::exit_program("ERROR: invalid scp2 fragment item type '$oneitem' in line: '$line'", "test_par_syntax"); - } - - # 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"); } - - my %oneitemhash; - - while (! ( ${$parfilecontent}[$i] =~ /^\s*End\s*$/i ) ) - { - if ( ${$parfilecontent}[$i] =~ /^\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; - } - $i++; - } - - my $allitemhash = \$par2script::globals::definitions{$oneitem}; - - # test of uniqueness - if ( defined ($par2script::globals::definitions{$oneitem}->{$gid}) ) - { - $multidefinitionerror = 1; - push(@multidefinitiongids, $gid); - } - - $par2script::globals::definitions{$oneitem}->{$gid} = \%oneitemhash; - } - - 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; diff --git a/solenv/bin/modules/pre2par/directory.pm b/solenv/bin/modules/pre2par/directory.pm deleted file mode 100644 index 2637843ad..000000000 --- a/solenv/bin/modules/pre2par/directory.pm +++ /dev/null @@ -1,54 +0,0 @@ -#************************************************************************* -# -# 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 pre2par::directory; - -use pre2par::pathanalyzer; -use pre2par::systemactions; - -############################################ -# Checking, whether the output directories -# exist. If not, they are created. -############################################ - -sub check_directory -{ - my ($parfilename) = @_; - - my $productdirectory = $parfilename; - pre2par::pathanalyzer::get_path_from_fullqualifiedname(\$productdirectory); - $productdirectory =~ s/\Q$pre2par::globals::separator\E\s*$//; - - my $pardirectory = $productdirectory; - pre2par::pathanalyzer::get_path_from_fullqualifiedname(\$pardirectory); - $pardirectory =~ s/\Q$pre2par::globals::separator\E\s*$//; - - if ( ! -d $pardirectory ) { pre2par::systemactions::create_directory($pardirectory); } - if ( ! -d $productdirectory ) { pre2par::systemactions::create_directory($productdirectory); } -} - -1;
\ No newline at end of file diff --git a/solenv/bin/modules/pre2par/existence.pm b/solenv/bin/modules/pre2par/existence.pm deleted file mode 100644 index 3bbdd64b6..000000000 --- a/solenv/bin/modules/pre2par/existence.pm +++ /dev/null @@ -1,74 +0,0 @@ -#************************************************************************* -# -# 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 pre2par::existence; - -############################# -# Test of existence -############################# - -sub exists_in_array -{ - my ($searchstring, $arrayref) = @_; - - my $alreadyexists = 0; - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - if ( ${$arrayref}[$i] eq $searchstring) - { - $alreadyexists = 1; - last; - } - } - - return $alreadyexists; -} - -sub exists_in_array_of_hashes -{ - my ($searchkey, $searchvalue, $arrayref) = @_; - - my $hashref; - my $valueexists = 0; - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - $hashref = ${$arrayref}[$i]; - - if ( $hashref->{$searchkey} eq $searchvalue ) - { - $valueexists = 1; - last; - } - } - - return $valueexists; -} - -1; diff --git a/solenv/bin/modules/pre2par/exiter.pm b/solenv/bin/modules/pre2par/exiter.pm deleted file mode 100644 index 72909e89a..000000000 --- a/solenv/bin/modules/pre2par/exiter.pm +++ /dev/null @@ -1,70 +0,0 @@ -#************************************************************************* -# -# 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 pre2par::exiter; - -use pre2par::files; -use pre2par::globals; - -############################################ -# Exiting the program with an error -# This function is used instead of "die" -############################################ - -sub exit_program -{ - my ($message, $function) = @_; - - my $infoline; - - $infoline = "\n***************************************************************\n"; - push(@pre2par::globals::logfileinfo, $infoline); - print("$infoline"); - - $infoline = "$message\n"; - push(@pre2par::globals::logfileinfo, $infoline); - print("$infoline"); - - $infoline = "in function: $function\n"; - push(@pre2par::globals::logfileinfo, $infoline); - print("$infoline"); - - $infoline = "***************************************************************\n"; - push(@pre2par::globals::logfileinfo, $infoline); - - if ($pre2par::globals::logging) - { - pre2par::files::save_file($pre2par::globals::logfilename ,\@pre2par::globals::logfileinfo); - print("Saved logfile: $pre2par::globals::logfilename\n"); - } - - print("$infoline"); - - exit(-1); -} - -1; diff --git a/solenv/bin/modules/pre2par/files.pm b/solenv/bin/modules/pre2par/files.pm deleted file mode 100644 index 212c7433b..000000000 --- a/solenv/bin/modules/pre2par/files.pm +++ /dev/null @@ -1,125 +0,0 @@ -#************************************************************************* -# -# 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 pre2par::files; - -use pre2par::exiter; - -############################################ -# File Operations -############################################ - -sub check_file -{ - my ($arg) = @_; - - if(!( -f $arg )) - { - pre2par::exiter::exit_program("ERROR: Cannot find file $arg", "check_file"); - } -} - -sub read_file -{ - my ($localfile) = @_; - - my @localfile = (); - - open( IN, "<$localfile" ) || pre2par::exiter::exit_program("ERROR: Cannot open file: $localfile", "read_file"); - while ( <IN> ) { push(@localfile, $_); } - close( IN ); - - return \@localfile; -} - -########################################### -# Saving files, arrays and hashes -########################################### - -sub save_file -{ - my ($savefile, $savecontent) = @_; - if (-f $savefile) { unlink $savefile }; - if (-f $savefile) { pre2par::exiter::exit_program("ERROR: Cannot delete existing file: $savefile", "save_file"); }; - open( OUT, ">$savefile" ); - print OUT @{$savecontent}; - close( OUT); - if (! -f $savefile) { pre2par::exiter::exit_program("ERROR: Cannot write file: $savefile", "save_file"); } -} - -sub save_hash -{ - my ($savefile, $hashref) = @_; - - my @printcontent = (); - - my ($itemkey, $itemvalue, $line); - - foreach $itemkey ( keys %{$hashref} ) - { - $line = ""; - $itemvalue = $hashref->{$itemkey}; - $line = $itemkey . "=" . $itemvalue . "\n"; - push(@printcontent, $line); - } - - open( OUT, ">$savefile" ); - print OUT @printcontent; - close( OUT); -} - -sub save_array_of_hashes -{ - my ($savefile, $arrayref) = @_; - - my @printcontent = (); - - my ($itemkey, $itemvalue, $line, $hashref); - - for ( my $i = 0; $i <= $#{$arrayref}; $i++ ) - { - $line = ""; - $hashref = ${$arrayref}[$i]; - - foreach $itemkey ( keys %{$hashref} ) - { - $itemvalue = $hashref->{$itemkey}; - - $line = $line . $itemkey . "=" . $itemvalue . "\t"; - } - - $line = $line . "\n"; - - push(@printcontent, $line); - } - - open( OUT, ">$savefile" ); - print OUT @printcontent; - close( OUT); -} - -1; diff --git a/solenv/bin/modules/pre2par/globals.pm b/solenv/bin/modules/pre2par/globals.pm deleted file mode 100644 index 4ad568a2c..000000000 --- a/solenv/bin/modules/pre2par/globals.pm +++ /dev/null @@ -1,68 +0,0 @@ -#************************************************************************* -# -# 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 pre2par::globals; - -############################################ -# Global settings -############################################ - -BEGIN -{ - $prog="pre2par"; - - $prefilename = ""; - $parfilename = ""; - $langfilename = ""; - - @allitems = ("Installation", "ScpAction", "HelpText", "Directory", "DataCarrier", "StarRegistry", "File", - "Shortcut", "Custom", "Unixlink", "Procedure", "Module", "Profile", "ProfileItem", - "Folder", "FolderItem", "RegistryItem", "StarRegistryItem", "WindowsCustomAction", - "MergeModule"); - - $logging = 0; - $logfilename = "logfile.log"; # the default logfile name for global errors - @logfileinfo = (); - - $plat = $^O; - - $separator = "/"; - $pathseparator = "\:"; - $isunix = 1; - $iswin = 0; - - $islinux = 0; - $issolaris = 0; - - if ( $plat =~ /linux/i ) { $islinux = 1; } - if ( $plat =~ /kfreebsd/i ) { $islinux = 1; } - if ( $plat =~ /solaris/i ) { $issolaris = 1; } - -} - -1; diff --git a/solenv/bin/modules/pre2par/language.pm b/solenv/bin/modules/pre2par/language.pm deleted file mode 100644 index 9d8c9e820..000000000 --- a/solenv/bin/modules/pre2par/language.pm +++ /dev/null @@ -1,147 +0,0 @@ -#************************************************************************* -# -# 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 pre2par::language; - -use strict; -use pre2par::existence; - -############################################################## -# Returning a specific language string from the block -# of all translations -############################################################## - -sub get_language_string_from_language_block -{ - my ($language_block, $language) = @_; - - my $newstring = ""; - - for ( my $i = 0; $i <= $#{$language_block}; $i++ ) - { - - if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) - { - $newstring = $1; - $newstring =~ s/\"/\\\"/g; # masquerading all '"' in the string - $newstring = "\"" . $newstring . "\""; - last; - } - } - - # defaulting to english! - - if ( $newstring eq "" ) - { - $language = "en-US"; # defaulting to english - - for ( my $i = 0; $i <= $#{$language_block}; $i++ ) - { - if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*(\".*\")\s*$/ ) - { - $newstring = $1; - last; - } - } - } - - return $newstring; -} - -############################################ -# collecting all replace variables -# in a language file -############################################ - -sub get_all_replace_variables -{ - my ($langfile) = @_; - - my %allvars = (); - - for ( my $i = 0; $i <= $#{$langfile}; $i++ ) - { - if ( ${$langfile}[$i] =~ /^\s*\[\s*(.*?)\s*\]\s*$/ ) - { - my $variable = $1; -# print "lang block '$variable'\n"; - my @lang_block = (); - my $counter; - - # Store the complete block in all languages for a specified variable - for ( $counter = $i + 1; $counter <= $#{$langfile}; $counter++ ) { - my $line = ${$langfile}[$counter]; - last if ($line =~ /^s*\[/); # next decl. - push @lang_block, $line; - } -# print "$variable = '@lang_block'\n"; - $allvars{$variable} = \@lang_block; - $i = $counter - 1; - } - } - - return \%allvars; -} - -############################################ -# localizing the par file with the -# corresponding language file -############################################ - -sub localize -{ - my ($parfile, $langfile) = @_; - - my $replace_hash = get_all_replace_variables($langfile); - - # parse lines of the form Name (st) = STR_NAME_MODULE_HELPPACK_OC; - # for variable substitution - my $langlinere = qr/^\s*\w+\s*\(([\w-]+)\)\s*\=\s*([\w-]+)\s*;/; - for ( my $i = 0; $i <= $#{$parfile}; $i++ ) - { - my $oneline = ${$parfile}[$i]; - - if ( $oneline =~ $langlinere) { - my $language = $1; # can be "01" or "en" or "en-US" or ... - my $variable = $2; - -# print "line '$oneline' split to '$language' '$variable'\n"; - - if (defined $replace_hash->{$variable}) { - my $languageblock = $replace_hash->{$variable}; - my $newstring = get_language_string_from_language_block($replace_hash->{$variable}, $language); - if ( $newstring eq "" ) { $newstring = "\"" . $variable . "\""; } - - $oneline =~ s/$variable/$newstring/g; - - ${$parfile}[$i] = $oneline; - } - } - } -} - -1; diff --git a/solenv/bin/modules/pre2par/parameter.pm b/solenv/bin/modules/pre2par/parameter.pm deleted file mode 100644 index 5dfd87975..000000000 --- a/solenv/bin/modules/pre2par/parameter.pm +++ /dev/null @@ -1,178 +0,0 @@ -#************************************************************************* -# -# 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 pre2par::parameter; - -use Cwd; -use pre2par::files; -use pre2par::globals; -use pre2par::systemactions; - -############################################ -# Parameter Operations -############################################ - -sub usage -{ - print <<Ende; ---------------------------------------------------------- -$pre2par::globals::prog -The following parameter are needed: --s: path to the pre file --o: path to the par file --l: path to the ulf file (mlf or jlf file) --v: log process (optional) - -Example: - -perl pre2par.pl -l test.mlf -s readme.pre -o readme.par -v - ---------------------------------------------------------- -Ende - exit(-1); -} - -##################################### -# Reading parameter -##################################### - -sub getparameter -{ - while ( $#ARGV >= 0 ) - { - my $param = shift(@ARGV); - - if ($param eq "-s") { $pre2par::globals::prefilename = shift(@ARGV); } - elsif ($param eq "-o") { $pre2par::globals::parfilename = shift(@ARGV); } - elsif ($param eq "-l") { $pre2par::globals::langfilename = shift(@ARGV); } - elsif ($param eq "-v") { $pre2par::globals::logging = 1; } - else - { - print("\n*************************************\n"); - print("Sorry, unknown parameter: $param"); - print("\n*************************************\n"); - usage(); - exit(-1); - } - } -} - -############################################ -# Controlling the fundamental parameter -# (required for every process) -############################################ - -sub control_parameter -{ - if ($pre2par::globals::prefilename eq "") - { - print "\n************************************************\n"; - print "Error: Name of the input file not set (-s)!"; - print "\n************************************************\n"; - usage(); - exit(-1); - } - - if ($pre2par::globals::parfilename eq "") - { - print "\n************************************************\n"; - print "Error: Name of the output file not set (-o)!"; - print "\n************************************************\n"; - usage(); - exit(-1); - } - - if (!($pre2par::globals::prefilename =~ /\.pre\s*$/)) - { - print "\n************************************************\n"; - print "Error: Input file is no .pre file!"; - print "\n************************************************\n"; - usage(); - exit(-1); - } - - if (!($pre2par::globals::parfilename =~ /\.par\s*$/)) - { - print "\n************************************************\n"; - print "Error: Output file is no .par file!"; - print "\n************************************************\n"; - usage(); - exit(-1); - } - - # The input file has to exist - - pre2par::files::check_file($pre2par::globals::prefilename); -} - -########################################################## -# The path parameters can be relative or absolute. -# This function creates absolute pathes. -########################################################## - -sub make_path_absolute -{ - my ($pathref) = @_; - - if ( $pre2par::globals::isunix ) - { - if (!($$pathref =~ /^\s*\//)) # this is a relative unix path - { - $$pathref = cwd() . $pre2par::globals::separator . $$pathref; - } - } - - if ( $pre2par::globals::iswin ) - { - if (!($$pathref =~ /^\s*\w\:/)) # this is a relative windows path - { - $$pathref = cwd() . $pre2par::globals::separator . $$pathref; - $$pathref =~ s/\//\\/g; - } - } - - $$pathref =~ s/\Q$pre2par::globals::separator\E\s*$//; # removing ending slashes -} - -##################################### -# Writing parameter to shell -##################################### - -sub outputparameter -{ - $pre2par::globals::logging ? ($logoption = " -v") : ($logoption = ""); - print "\n$pre2par::globals::prog -l $pre2par::globals::langfilename -s $pre2par::globals::prefilename -o $pre2par::globals::parfilename$logoption\n"; - -# print "\n********************************************************\n"; -# print "This is $pre2par::globals::prog, version 1.0\n"; -# print "Input file: $pre2par::globals::prefilename\n"; -# print "Output file: $pre2par::globals::parfilename\n"; -# print "********************************************************\n"; -} - -1; diff --git a/solenv/bin/modules/pre2par/pathanalyzer.pm b/solenv/bin/modules/pre2par/pathanalyzer.pm deleted file mode 100644 index b766a8c77..000000000 --- a/solenv/bin/modules/pre2par/pathanalyzer.pm +++ /dev/null @@ -1,75 +0,0 @@ -#************************************************************************* -# -# 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 pre2par::pathanalyzer; - -use pre2par::globals; - -########################################### -# Path analyzer -########################################### - -sub get_path_from_fullqualifiedname -{ - my ($longfilenameref) = @_; - - if ( $$longfilenameref =~ /\Q$pre2par::globals::separator\E/ ) # Is there a separator in the path? Otherwise the path is empty. - { - if ( $$longfilenameref =~ /^\s*(\S.*\S\Q$pre2par::globals::separator\E)(\S.+?\S)/ ) - { - $$longfilenameref = $1; - } - } - else - { - $$longfilenameref = ""; # there is no path - } -} - -sub make_absolute_filename_to_relative_filename -{ - my ($longfilenameref) = @_; - - if ( $pre2par::globals::isunix ) - { - if ( $$longfilenameref =~ /^.*\/(\S.+\S?)/ ) - { - $$longfilenameref = $1; - } - } - - if ( $pre2par::globals::iswin ) - { - if ( $$longfilenameref =~ /^.*\\(\S.+\S?)/ ) - { - $$longfilenameref = $1; - } - } -} - -1; diff --git a/solenv/bin/modules/pre2par/remover.pm b/solenv/bin/modules/pre2par/remover.pm deleted file mode 100644 index adae116bf..000000000 --- a/solenv/bin/modules/pre2par/remover.pm +++ /dev/null @@ -1,67 +0,0 @@ -#************************************************************************* -# -# 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 pre2par::remover; - -############################################ -# Remover -############################################ - -sub remove_leading_and_ending_whitespaces -{ - my ( $stringref ) = @_; - - $$stringref =~ s/^\s*//g; - $$stringref =~ s/\s*$//g; -} - -sub remove_leading_and_ending_quotationmarks -{ - my ( $stringref ) = @_; - - $$stringref =~ s/^\s*\"//g; - $$stringref =~ s/\"\s*$//g; -} - -sub remove_leading_and_ending_slashes -{ - my ( $stringref ) = @_; - - $$stringref =~ s/^\s*\///g; - $$stringref =~ s/\/\s*$//g; -} - -sub remove_leading_and_ending_backslashes -{ - my ( $stringref ) = @_; - - $$stringref =~ s/^\s*\\//g; - $$stringref =~ s/\\\s*$//g; -} - -1; diff --git a/solenv/bin/modules/pre2par/systemactions.pm b/solenv/bin/modules/pre2par/systemactions.pm deleted file mode 100644 index 1634a2d46..000000000 --- a/solenv/bin/modules/pre2par/systemactions.pm +++ /dev/null @@ -1,206 +0,0 @@ -#************************************************************************* -# -# 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 pre2par::systemactions; - -use File::Copy; -use pre2par::exiter; -use pre2par::globals; - -###################################################### -# Creating a new direcotory -###################################################### - -sub create_directory -{ - my ($directory) = @_; - - my $returnvalue = 1; - my $infoline = ""; - - if ($directory eq "" ) - { - return 0; - } - - if (!(-d $directory)) - { - $returnvalue = mkdir($directory, 0775); - - if ($returnvalue) - { - $infoline = "Created directory: $directory\n"; - push(@pre2par::globals::logfileinfo, $infoline); - - if ($pre2par::globals::isunix) - { - my $localcall = "chmod 775 $directory \>\/dev\/null 2\>\&1"; - system($localcall); - } - } - else - { - # New solution in parallel packing: It is possible, that the directory now exists, although it - # was not created in this process. There is only an important error, if the directory does not - # exist now. - - if (!(-d $directory)) - { - pre2par::exiter::exit_program("Error: Could not create directory: $directory", "create_directory"); - } - else - { - $infoline = "\nAnother process created this directory in exactly this moment :-) : $directory\n"; - push(@pre2par::globals::logfileinfo, $infoline); - } - } - } - else - { - $infoline = "\nAlready existing directory, did not create: $directory\n"; - push(@pre2par::globals::logfileinfo, $infoline); - } -} - -####################################################################### -# Creating the directories, in which files are generated or unzipped -####################################################################### - -sub create_directories -{ - my ($directory, $languagesref) =@_; - - $pre2par::globals::unpackpath =~ s/\Q$pre2par::globals::separator\E\s*$//; # removing ending slashes and backslashes - - my $path = $pre2par::globals::unpackpath; # this path already exists - - $path = $path . $pre2par::globals::separator . $pre2par::globals::build . $pre2par::globals::separator; - create_directory($path); - - $path = $path . $pre2par::globals::minor . $pre2par::globals::separator; - create_directory($path); - - if ($directory eq "unzip" ) - { - $path = $path . "common" . $pre2par::globals::productextension . $pre2par::globals::separator; - create_directory($path); - - $path = $path . $directory . $pre2par::globals::separator; - create_directory($path); - } - else - { - $path = $path . $pre2par::globals::compiler . $pre2par::globals::productextension . $pre2par::globals::separator; - create_directory($path); - - $path = $path . $pre2par::globals::product . $pre2par::globals::separator; - create_directory($path); - - $path = $path . $directory . $pre2par::globals::separator; - create_directory($path); - - if (!($$languagesref eq "" )) # this will be a path like "01_49", for Profiles and ConfigurationFiles, idt-Files - { - $path = $path . $$languagesref . $pre2par::globals::separator; - create_directory($path); - } - } - - $path =~ s/\Q$pre2par::globals::separator\E\s*$//; - - return $path; -} - -######################## -# Copying one file -######################## - -sub copy_one_file -{ - my ($source, $dest) = @_; - - my ($copyreturn, $returnvalue, $infoline); - - $copyreturn = copy($source, $dest); - - if ($copyreturn) - { - $infoline = "Copy: $source to $dest\n"; - $returnvalue = 1; - } - else - { - $infoline = "Error: Could not copy $source to $dest $!\n"; - $returnvalue = 0; - } - - push(@pre2par::globals::logfileinfo, $infoline); - - return $returnvalue; -} - -########################################## -# Copying all files from one directory -# to another directory -########################################## - -sub copy_directory -{ - my ($sourcedir, $destdir) = @_; - - my ($onefile, $sourcefile, $destfile); - my @sourcefiles = (); - - $sourcedir =~ s/\Q$pre2par::globals::separator\E\s*$//; - $destdir =~ s/\Q$pre2par::globals::separator\E\s*$//; - - $infoline = "\n"; - push(@pre2par::globals::logfileinfo, $infoline); - $infoline = "Copying files from directory $sourcedir to directory $destdir\n"; - push(@pre2par::globals::logfileinfo, $infoline); - - opendir(DIR, $sourcedir); - @sourcefiles = readdir(DIR); - closedir(DIR); - - foreach $onefile (@sourcefiles) - { - if ((!($onefile eq ".")) && (!($onefile eq ".."))) - { - $sourcefile = $sourcedir . $pre2par::globals::separator . $onefile; - $destfile = $destdir . $pre2par::globals::separator . $onefile; - if ( -f $sourcefile ) # only files, no directories - { - copy_one_file($sourcefile, $destfile); - } - } - } -} - - -1; diff --git a/solenv/bin/modules/pre2par/work.pm b/solenv/bin/modules/pre2par/work.pm deleted file mode 100644 index 5651d060e..000000000 --- a/solenv/bin/modules/pre2par/work.pm +++ /dev/null @@ -1,363 +0,0 @@ -#************************************************************************* -# -# 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 pre2par::work; - -use pre2par::exiter; -use pre2par::remover; -use pre2par::pathanalyzer; - -############################################ -# pre2par working module -############################################ - -############################################ -# procedure to split a line, that contains -# more than one par file lines -############################################ - -sub split_line -{ - my ($line, $parfile) = @_; - - while ( $line =~ /^((?:[^"]|\"(?:[^"\\]|\\.)*\")*?\;\s+)\s*(.*)$/ ) - { - my $oneline = $1; - $line = $2; - pre2par::remover::remove_leading_and_ending_whitespaces(\$oneline); - $oneline = $oneline . "\n"; - push(@{$parfile}, $oneline); - - if ( $line =~ /^\s*End\s+(\w+.*$)/i ) - { - $line = $1; - push(@{$parfile}, "End\n\n"); - } - } - - # the last line - - pre2par::remover::remove_leading_and_ending_whitespaces(\$line); - $line = $line . "\n"; - push(@{$parfile}, $line); - - if ( $line =~ /^\s*End\s*$/i ) { push(@{$parfile}, "\n"); } -} - -################################################################### -# Preprocessing the pre file to split all lines with semicolon -################################################################### - -sub preprocess_macros -{ - my ($prefile) = @_; - - my @newprefile = (); - - for ( my $i = 0; $i <= $#{$prefile}; $i++ ) - { - my $oneline = ${$prefile}[$i]; - if ( $oneline =~ /\;\s*\w+/ ) - { - split_line($oneline, \@newprefile); - } - else - { - push(@newprefile, $oneline); - } - } - - return \@newprefile; -} - -############################################ -# main working procedure -############################################ - -sub convert -{ - my ($prefile) = @_; - - my @parfile = (); - - my $iscodesection = 0; - my $ismultiliner = 0; - my $globalline = ""; - - # Preprocessing the pre file to split all lines with semicolon - $prefile = preprocess_macros($prefile); - - for ( my $i = 0; $i <= $#{$prefile}; $i++ ) - { - my $oneline = ${$prefile}[$i]; - - if ($iscodesection) - { - if ( $oneline =~ /^\s*\}\;\s*$/ ) - { - $iscodesection = 0; - } - else # nothing to do for code inside a code section - { - push(@parfile, $oneline); - next; - } - } - - if ( $oneline =~ /^\s*$/ ) { next; } - - if ( $oneline =~ /^\s*Code\s+\=\s+\{/ ) - { - $iscodesection = 1; - } - - pre2par::remover::remove_leading_and_ending_whitespaces(\$oneline); - - my $insertemptyline = 0; - - if ( $oneline =~ /^\s*End\s*$/i ) { $insertemptyline = 1; } - - # Sometimes the complete file is in one line, then the gid line has to be separated - - if ( $oneline =~ /^\s*(\w+\s+\w+)\s+(\w+\s+\=.*$)/ ) # three words before the equal sign - { - my $gidline = $1; - $oneline = $2; - $gidline = $gidline . "\n"; - - push(@parfile, $gidline); - } - - if ( $oneline =~ /\;\s*\w+/ ) - { - split_line($oneline, \@parfile); - next; - } - - # searching for lines with brackets, like Customs = { ..., which can be parted above several lines - - if ( $oneline =~ /^\s*\w+\s+\=\s*\(.*\)\s*\;\s*$/ ) # only one line - { - if (( ! ( $oneline =~ /^\s*Assignment\d+\s*\=/ )) && ( ! ( $oneline =~ /^\s*PatchAssignment\d+\s*\=/ ))) - { - $oneline =~ s/\s//g; # removing whitespaces in lists - $oneline =~ s/\=/\ \=\ /; # adding whitespace around equals sign - } - } - - if ( $oneline =~ /^\s*\w+\s+\=\s*$/ ) - { - $oneline =~ s/\s*$//; - pre2par::exiter::exit_program("Error: Illegal syntax, no line break after eqals sign allowed. Line: \"$oneline\"", "convert"); - } - - if (( $oneline =~ /^\s*\w+\s+\=\s*\(/ ) && (!( $oneline =~ /\)\s*\;\s*$/ ))) # several lines - { - $ismultiliner = 1; - $oneline =~ s/\s//g; - $globalline .= $oneline; - next; # not including yet - } - - if ( $ismultiliner ) - { - $oneline =~ s/\s//g; - $globalline .= $oneline; - - if ( $oneline =~ /\)\s*\;\s*$/ ) { $ismultiliner = 0; } - - if (! ( $ismultiliner )) - { - $globalline =~ s/\=/\ \=\ /; # adding whitespace around equals sign - $globalline .= "\n"; - push(@parfile, $globalline); - $globalline = ""; - } - - next; - } - - $oneline = $oneline . "\n"; - - $oneline =~ s/\s*\=\s*/ \= /; # nice, to have only one whitespace around equal signs - - # Concatenate adjacent string literals: - while ($oneline =~ - s/^((?:[^"]* - \"(?:[^\\"]|\\.)*\" - (?:[^"]*[^[:blank:]"][^"]*\"(?:[^\\"]|\\.)*\")*)* - [^"]* - \"(?:[^\\"]|\\.)*) - \"[[:blank:]]*\" - ((?:[^\\"]|\\.)*\") - /\1\2/x) - {} - - push(@parfile, $oneline); - - if ($insertemptyline) { push(@parfile, "\n"); } - - } - - return \@parfile; -} - -############################################ -# formatting the par file -############################################ - -sub formatter -{ - my ($parfile) = @_; - - my $iscodesection = 0; - - my $tabcounter = 0; - my $isinsideitem = 0; - my $currentitem; - - for ( my $i = 0; $i <= $#{$parfile}; $i++ ) - { - my $oneline = ${$parfile}[$i]; - my $isitemline = 0; - - if (! $isinsideitem ) - { - for ( my $j = 0; $j <= $#pre2par::globals::allitems; $j++ ) - { - if ( $oneline =~ /^\s*$pre2par::globals::allitems[$j]\s+\w+\s*$/ ) - { - $currentitem = $pre2par::globals::allitems[$j]; - $isitemline = 1; - $isinsideitem = 1; - $tabcounter = 0; - last; - } - } - } - - if ( $isitemline ) - { - next; # nothing to do - } - - if ( $oneline =~ /^\s*end\s*$/i ) - { - $isinsideitem = 0; - $tabcounter--; - } - - if ( $isinsideitem ) - { - $oneline = "\t" . $oneline; - ${$parfile}[$i] = $oneline; - } - } -} - -################################################### -# Returning the language file name -################################################### - -sub getlangfilename -{ - return $pre2par::globals::langfilename; -} - -################################################### -# Creating the ulf file name from the -# corresponding pre file name -################################################### - -sub getulffilename -{ - my ($prefilename) = @_; - - my $ulffilename = $prefilename; - $ulffilename =~ s/\.pre\s*$/\.ulf/; - pre2par::pathanalyzer::make_absolute_filename_to_relative_filename(\$ulffilename); - - return $ulffilename; -} - -############################################ -# Checking if a file exists -############################################ - -sub fileexists -{ - my ($langfilename) = @_; - - my $fileexists = 0; - - if( -f $langfilename ) { $fileexists = 1; } - - return $fileexists; -} - -############################################ -# Checking the existence of ulf and -# jlf/mlf files -############################################ - -sub check_existence_of_langfiles -{ - my ($langfilename, $ulffilename) = @_; - - my $do_localize = 0; - - if (( fileexists($ulffilename) ) && ( ! fileexists($langfilename) )) { pre2par::exiter::exit_program("Error: Did not find language file $langfilename", "check_existence_of_langfiles"); } - if (( fileexists($ulffilename) ) && ( fileexists($langfilename) )) { $do_localize = 1; } - - return $do_localize; -} - -############################################ -# Checking that the pre file has content -############################################ - -sub check_content -{ - my ($filecontent, $filename) = @_; - - if ( $#{$filecontent} < 0 ) { pre2par::exiter::exit_program("Error: $filename has no content!", "check_content"); } -} - -############################################ -# Checking content of par files. -# Currently only size. -############################################ - -sub diff_content -{ - my ($content1, $content2, $filename) = @_; - - if ( $#{$content1} != $#{$content2} ) { pre2par::exiter::exit_program("Error: $filename was not saved correctly!", "diff_content"); } -} - -1; diff --git a/solenv/bin/msg_filter b/solenv/bin/msg_filter deleted file mode 100755 index a7149c35a..000000000 --- a/solenv/bin/msg_filter +++ /dev/null @@ -1,61 +0,0 @@ -: # -*- perl -*- -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -# This is a script to get rid of bogus error messages that are spit out -# by the compiler - sub 30/11/1999 - -# Lines that contain `xxxx' where xxxx belongs to the list knownMessages -# and is surrounded by a backtick (`) and a forward tick (') -# will not be seen in the compiler output - - -@knownMessages = ( -"__pure_virtual", -"__vt_9bad_alloc", -"__vt_9exception", -"_._9bad_alloc", -"__cp_push_exception", -"__uncatch_exception", -"__rtti_user", -"__rtti_si", -"__throw", -"terminate__Fv", -"__cp_pop_exception", -"__builtin_vec_new", -"__cmpdi2", -"__builtin_vec_delete", -"__cp_eh_info", -"__builtin_delete", -"__builtin_new", -"__eh_alloc", -"__check_eh_spec", -"_type_match_rtti", -"__rtti_class", -"set_new_handler_FPFv_v", -"__throw_type_match_rtti", -"__check_eh_spec", -"exception_type_info", -"exception type_info function", -"exception type_info node", -"exception virtual table", -"terminate(void)" -); - -# Create a hash %msgHash from list @knownMessages -foreach $msg (@knownMessages) { - $msgHash {$msg}++; -} -while ( <STDIN> ) { - - if (/\`([\s\w]+)\'/) { - $entry = $1; - if (defined($entry)) { - if (!exists $msgHash{$entry}) { - print $_; - } - } - } - else { - print $_; - } -} diff --git a/solenv/bin/newfolderforce b/solenv/bin/newfolderforce deleted file mode 100644 index 8f77f3990..000000000 --- a/solenv/bin/newfolderforce +++ /dev/null @@ -1 +0,0 @@ -#rg 16.6.98
if {#} != 1
echo emuliert "mkdir -p"
echo d.h. des gesamte Directory-Baum wird angelegt
exit
end
set wo "{1}"
set regex ""
set exit 0
for i in in 1 2 3 4 5 6 7 8 9 10
set regex "{regex}[Â:]+:"
(evaluate "{wo}" =~ /([:]+{regex})¨1Å/) > Dev:null
if not `exists -d "{¨1}"`
newfolder "{¨1}"
end
end
set exit 1
\ No newline at end of file diff --git a/solenv/bin/oochkpatch b/solenv/bin/oochkpatch deleted file mode 100755 index 719f0765b..000000000 --- a/solenv/bin/oochkpatch +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -if [ x${SOLARENV}x = xx ]; then - echo No environment found, please use 'configure' or 'setsolar' - exit 1 -fi -exec perl -w $SOLARENV/bin/oochkpatch.pl "$@" diff --git a/solenv/bin/oochkpatch.btm b/solenv/bin/oochkpatch.btm deleted file mode 100755 index 9d17c2f76..000000000 --- a/solenv/bin/oochkpatch.btm +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -call perl5 %SOLARENV\bin\oochkpatch.pl %1& diff --git a/solenv/bin/oochkpatch.pl b/solenv/bin/oochkpatch.pl deleted file mode 100644 index 4b2e08ad2..000000000 --- a/solenv/bin/oochkpatch.pl +++ /dev/null @@ -1,301 +0,0 @@ -: - eval 'exec perl -S $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* -# -# oochkpatch - check patch flags against CWS modules -# - -require File::Temp; -require File::Find; -require Getopt::Long; -require Pod::Usage; -use Pod::Usage; -use Getopt::Long; -use File::Temp qw/ tempfile tempdir /; -use File::Find; - - -# configuration goes here -########################################################## - -# uncomment this, if in pure OOo environment -#my $toplevel_module = "instsetoo_native"; -#my $scp_module = "scp2"; -#my $setup_file = "setup_osl"; - -# uncomment this, if within the StarOffice environment -my $toplevel_module = "instset_native"; -my $scp_module = "scp2so"; -my $setup_file = "setup"; - -my $deliver = "solenv/bin/deliver.pl"; -my $build = "solenv/bin/build.pl"; - -# list of hardcoded exceptions (files that are _never_ considered -# missing from the patch) -my %hardcoded_exceptions = ('build.lst' => 1); - - -# no configuration below this point, please! -########################################################## - -# defaults -my $from_module = ""; -my $verbose = ''; -my $help = ''; -my $man = ''; -my $modules = ''; -my $from = ''; -my $perl = ''; - -GetOptions('help|?' => \$help, - 'man' => \$man, - 'verbose' => \$verbose, - 'from=s' => \$from_module ) or pod2usage(2); -pod2usage(1) if $help; -pod2usage(-exitstatus => 0, -verbose => 2) if $man; - -# process remaining args -print "Processing args...\n" if $verbose; -foreach my $argument (@ARGV) -{ - print " Checking module ", $argument, "\n" if $verbose; - push @modules, $argument; -} - -# platform-dependent stuff -if( $^O eq 'MSWin32' ) -{ - $perl = "$ENV{COMSPEC} -c $ENV{PERL}"; - $setup_file = $setup_file . ".inf"; -} -else -{ - $perl = 'perl'; - $setup_file = $setup_file . ".ins"; -}; - -# read some SOLAR stuff from env -my $SRC_ROOT = $ENV{"SRC_ROOT"}; -my $INPATH = $ENV{"INPATH"}; - -# process --from modules -if( $from_module ) -{ - print "Checking all modules upwards and including ", $from_module, "\n" if $verbose; - - # append build.pl-generated list of modules - chdir "$SRC_ROOT/$toplevel_module" or - chdir "$SRC_ROOT/$toplevel_module.lnk" or die "ERROR: cannot cd to $SRC_ROOT/$toplevel_module!"; - open(ALLMODULES, - "$perl $SRC_ROOT/$build --all:$from_module --show 2>&1 |") or die "ERROR: cannot build --show!\n"; - while(<ALLMODULES>) - { - if( /Building project/ ) - { - my @module = split( /\s+/, $_ ); - print " which is ", $module[2], "\n" if $verbose; - push(@modules,$module[2]); - } - } -} - -die "ERROR: no modules to check!\n" if !@modules; - -$tempdir = tempdir( TMPDIR => 1, CLEANUP => 1); - -# generate list of files with PATCH flag -print "Generating list of files which have the PATCH flag...\n" if $verbose; - -my $path_to_setup_file = $SRC_ROOT."/".$scp_module."/".$INPATH."/bin/osl/".$setup_file; -my $alternate_path_to_setup_file = $SRC_ROOT."/".$scp_module.".lnk/".$INPATH."/bin/osl/".$setup_file; -my $in_file_block=0; -my $patch_flag=0; -my $file_name=''; -my $base; -my $ext; -my %pack_files; -open(SETUP, "<".$path_to_setup_file) or - open(SETUP, "<".$alternate_path_to_setup_file) or die "ERROR: cannot open $path_to_setup_file!\n"; -while(<SETUP>) -{ - if( /^File\s+/ && !$in_file_block ) - { - $in_file_block = 1; - $patch_flag=0; - $file_name=''; - } - elsif( /^End/ && $file_name ne '' && $in_file_block ) - { - $file_name =~ s/["']//g; - $pack_files{$file_name} = $patch_flag; - - if( $patch_flag ) - { - print( " File $file_name included in patch\n") if $verbose; - } - else - { - print( " File $file_name NOT included in patch\n") if $verbose; - } - - $in_file_block = 0; - } - elsif( /^\s+Styles\s*=\s*.*PATCH/ && $in_file_block ) - { - $patch_flag = 1; - } - elsif( ($res) = /^\s+Name\s*=\s*(.*);/ ) - { - $file_name = $res; - } -} - -# generate list of delivered files -print "Generating list of delivered libs...\n" if $verbose; - -# first, deliver all modules to tempdir -foreach my $module (@modules) -{ - print " dummy-delivering $module...\n" if $verbose; - chdir "$SRC_ROOT/$module" or - chdir "$SRC_ROOT/$module.lnk" or die "ERROR: cannot cd to $SRC_ROOT/$module!"; - `$perl $SRC_ROOT/$deliver $tempdir`; -} - -# now, check all files in delivered dirs for containedness in PATCH -# set -print "Checking against delivered files...\n" if $verbose; -find(\&wanted, $tempdir ); - -sub wanted -{ - my $fname; - - if( -f ) - { - $fname = $_; - if( !exists $pack_files{$fname} ) - { - print " File $fname is not packed.\n" if $verbose; - } - elsif( $pack_files{$fname} == 0 ) - { - if( !$hardcoded_exceptions{ $fname } ) - { - # file not in patch set, and not in exception list - print " File $fname is packed, but NOT included in patch set and part of delivered output\n" if $verbose; - print "$fname\n" if !$verbose; - } - else - { - print " File $fname is NOT included in patch set, but member of hardcoded exception list\n" if $verbose; - } - } - elsif( $pack_files{$fname} == 1 ) - { - print " File $fname packed and patched.\n" if $verbose; - } - } -} - - -__END__ - -=head1 NAME - -oochkpatch.pl - Verify patch flags against module libraries - -=head1 SYNOPSIS - -oochkpatch.pl [options] [module-name ...] - - Options: - --help|-h brief help message - --man|-m full documentation - --verbose|-v tell what's happening - --from=module check all modules from - given one upwards - -=head1 OPTIONS - -=over 8 - -=item B<--help> - -Print a brief help message and exits. - -=item B<--man> - -Prints the manual page and exits. - -=item B<--verbose> - -Verbosely tell what's currently happening - -=item B<--from=module> - -Assumes OOo was built incompatibly from given module -upwards, and check against all libs from all upwards modules. -Further modules can be given at the command line, which are merged -with the ones generated from this option - -=back - -=head1 DESCRIPTION - -B<This program> will compare all libs delivered from the specified modules -against the set of files marked with the B<patch> flag in scp2. Useful to check -if the patch set is complete. Please note that this program needs to be run in -a solar shell, i.e. the OOo build environment needs to be set up in the shell. - -There's kind of a heuristic involved, to determine exactly which files -to check against includedness in the patch set (since e.g. all headers -are delivered, but clearly need not be checked against patch -flags). It works by first collecting all files that are mentioned in -the pack master file, and then checking all files delivered from the -specified modules against that pack list: if the file is not packed, -or if it's packed and has the patch flag set, all is well. Otherwise, -the file in question potentially misses the patch flag (because one of -the modified modules contains it). - -=head1 EXAMPLE - -To determine the set of libs not yet carrying the patch flag for a CWS -containing sfx2, svx, and vcl, which is incompatible from sfx2 -upwards, use something like this: - -oochkpatch.pl --from=sfx2 `cwsquery modules` - -This puts every module upwards and including sfx2 in the check list, -plus vcl. Note that with this approach, you'll usually get a larger -set of files for the patch than necessary - but at least you get all -files that might have changed theoretically. - -=cut diff --git a/solenv/bin/ooinstall b/solenv/bin/ooinstall deleted file mode 100755 index 56825e18e..000000000 --- a/solenv/bin/ooinstall +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env perl - -# This script has three uses: -# 1. From the command line to install straight into a given directory: -# bin/ooinstall /opt/Foo -# 2. From the command line to link into a given directory: -# bin/ooinstall -l /opt/FooLinked -# 3. When packaging (called from package-ooo), to install to DESTDIR - -use File::Find; -use File::Path qw(mkpath); -use Cwd; - -$path = ''; -$do_link = 0; -$is_windows = 0; -my $tmp_dir; - -if ($ENV{GUI} eq 'WNT') { - $is_windows = 1; -} - -if( defined($ENV{TMPDIR}) ) { - $tmp_dir = $ENV{TMPDIR}; -} elsif( defined($ENV{TMP}) ) { - $tmp_dir = $ENV{TMP}; -} else { - $tmp_dir = '/tmp'; -} -if (!-d $tmp_dir) {die "Set TMP or TMPDIR!\n";} - -# Workaround for system Mozilla -if ( $ENV{'SYSTEM_MOZILLA'} eq 'YES' ) { - $ENV{'LD_LIBRARY_PATH'} = "$ENV{'MOZ_LIB'}:$ENV{'LD_LIBRARY_PATH'}"; -} - -# Workaround for the Python -$ENV{'PYTHONPATH'} = "$ENV{'SRC_ROOT'}/instsetoo_native/$ENV{'INPATH'}/bin:$ENV{'SOLARVERSION'}/$ENV{'INPATH'}/lib:$ENV{'SOLARVERSION'}/$ENV{'INPATH'}/lib/python:$ENV{'SOLARVERSION'}/$ENV{'INPATH'}/lib/python/lib-dynload"; - -for $arg (@ARGV) { - if ($arg eq '-l') { - $do_link = 1; - } elsif ($arg eq '-h' || $arg eq '--help') { - $help = 1; - } else { - # Cwd::realpath does not work if the path does not exist - mkpath($ENV{DESTDIR} . $arg) unless -d $ENV{DESTDIR} . $arg; - $path = Cwd::realpath( $ENV{DESTDIR} . $arg ); - if (!$do_link) { - my $destdir = Cwd::realpath( $ENV{DESTDIR} ); - $path =~ s|$destdir||; - } - } -} - -$help = 1 if $path eq ''; - -if ($help) { - print "ooinstall [-l] <prefix to install to>\n"; - print " -l - performs a linkoo on the installed source\n"; - exit 1; -} - -my $BUILD=undef; -my $LAST_MINOR=undef; -open MINORMK, "$ENV{'SOLARENV'}/inc/minor.mk"; -while (<MINORMK>) { - my $t = "\$" . $_; - if(/^BUILD/ || /^LAST_MINOR/) { - eval $t; - } -} -close MINORMK; -$ENV{LAST_MINOR} = $LAST_MINOR; -$ENV{OUT} = "../$ENV{'INPATH'}"; -$ENV{LOCAL_OUT} = $ENV{OUT}; -$ENV{LOCAL_COMMON_OUT} = $ENV{OUT}; -# FIXME: the following variable helps to install localizations even if some -# files are not localized (like Japanese, Chinese wordbook), it makes -# the installer to use the English localization of the file instead. -$ENV{DEFAULT_TO_ENGLISH_FOR_PACKING} = 1; - -my @larr; -$langs=$ENV{WITH_LANG}; -$langs='en-US' if $langs eq ''; -if ($langs eq 'ALL') { - opendir(DIR,$ENV{L10N_MODULE} . "/source"); - @larr = readdir(DIR); - @larr = grep { $_ ne '.' } @larr; - @larr = grep { $_ ne '..' } @larr; - @larr = (@larr,"en-US"); - closedir(DIR); -} -else { - @larr = grep { $_ ne '' } split(/ /, $langs); -} -$langs = join (",", @larr); - -$destdir=''; -if ( defined $ENV{DESTDIR} && - $ENV{DESTDIR} ne "" ) { - $destdir = "-destdir \"$ENV{DESTDIR}\""; -} - -$strip=''; -if ( defined $ENV{DISABLE_STRIP} && - $ENV{DISABLE_STRIP} eq "TRUE" ) { - $strip = "-dontstrip"; -} - -$msi=''; -if ($is_windows) { - $msi = "-msitemplate $ENV{SRC_ROOT}/instsetoo_native/$ENV{INPATH}/misc/openoffice/msi_templates " . - "-msilanguage $ENV{SRC_ROOT}/instsetoo_native/$ENV{INPATH}/misc/win_ulffiles"; -} - -print "Running LibreOffice installer\n"; -system ("cd $ENV{SRC_ROOT}/instsetoo_native/util ; " . - "perl -w $ENV{SOLARENV}/bin/make_installer.pl " . - "-f openoffice.lst -l $langs -p LibreOffice " . - "-u $tmp_dir " . - "-buildid $BUILD $destdir $strip $msi " . - "-simple $path") && die "Failed to install: $!"; - -if ($ENV{BUILD_TYPE} =~ m/ODK/) { - print "Running SDK installer\n"; - system ("cd $ENV{SRC_ROOT}/instsetoo_native/util ; " . - "perl -w $ENV{SOLARENV}/bin/make_installer.pl " . - "-f openoffice.lst -l en-US -p LibreOffice_SDK " . - "-u $tmp_dir " . - "-buildid $BUILD $destdir $strip $msi" . - "-simple $path") && die "Failed to install: $!"; -} -print "Installer finished\n"; - -if ($do_link && !$is_windows) { - `$ENV{SOLARENV}/bin/linkoo $path $ENV{SRC_ROOT}`; -} diff --git a/solenv/bin/packager.pl b/solenv/bin/packager.pl deleted file mode 100644 index 408caff8c..000000000 --- a/solenv/bin/packager.pl +++ /dev/null @@ -1,61 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -use lib ("$ENV{SOLARENV}/bin/modules"); - -use Cwd; -use packager::check; -use packager::files; -use packager::globals; -use packager::work; - -#################################### -# Main program -#################################### - -packager::check::check_environment(); -packager::check::check_packlist(); -packager::check::check_parameter(); - -packager::work::set_global_variable(); - -my $packagelist = packager::files::read_file($packager::globals::packlistname); - -my $targets = packager::work::create_package_todos($packagelist); - -if ( $ENV{'BSCLIENT'} ) { packager::work::start_build_server($targets); } -else { packager::work::execute_system_calls($targets); } - -if ( $packager::globals::logging ) -{ - packager::files::save_file($packager::globals::logfilename, \@packager::globals::logfileinfo); - print "Log file written: $packager::globals::logfilename\n"; -} - -#################################### -# End main program -#################################### diff --git a/solenv/bin/packcomponents.xslt b/solenv/bin/packcomponents.xslt deleted file mode 100644 index 6e037a677..000000000 --- a/solenv/bin/packcomponents.xslt +++ /dev/null @@ -1,52 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!--********************************************************************** -* -* 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. -* -**********************************************************************--> - -<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - xmlns:uc="http://openoffice.org/2010/uno-components"> - <xsl:param name="prefix"/> - <xsl:strip-space elements="*"/> - <xsl:template match="/"> - <xsl:element name="components" - namespace="http://openoffice.org/2010/uno-components"> - <xsl:for-each select="list/filename"> - <xsl:variable name="doc" select="document(concat($prefix, .))"/> - <xsl:choose> - <xsl:when test="count($doc/uc:component) = 1"> - <xsl:copy-of select="$doc/uc:component"/> - </xsl:when> - <xsl:otherwise> - <xsl:message terminate="yes"> - <xsl:text>cannot process </xsl:text> - <xsl:value-of select="."/> - </xsl:message> - </xsl:otherwise> - </xsl:choose> - </xsl:for-each> - </xsl:element> - </xsl:template> -</xsl:stylesheet> diff --git a/solenv/bin/packimages.pl b/solenv/bin/packimages.pl deleted file mode 100755 index 0c75993b6..000000000 --- a/solenv/bin/packimages.pl +++ /dev/null @@ -1,441 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - -# -# packimages.pl - pack images into archives -# - -use strict; -use Getopt::Long; -use File::Find; -use File::Basename; -use Archive::Zip qw(:ERROR_CODES :CONSTANTS); - -#### globals #### - -my $img_global = '%GLOBALRES%'; # 'global' image prefix -my $img_module = '%MODULE%'; # 'module' image prefix - -my $out_file; # path to output archive -my $tmp_out_file; # path to temporary output file -my $global_path; # path to global images directory -my $module_path; # path to module images directory -my $sort_file; # path to file containing sorting data -my @custom_path; # path to custom images directory -my @imagelist_path; # pathes to directories containing the image lists -my $verbose; # be verbose -my $extra_verbose; # be extra verbose -my $do_rebuild = 0; # is rebuilding zipfile required? - -my @custom_list; -#### script id ##### - -( my $script_name = $0 ) =~ s/^.*\b(\w+)\.pl$/$1/; - -my $script_rev; -my $id_str = ' $Revision: 1.17 $ '; -$id_str =~ /Revision:\s+(\S+)\s+\$/ - ? ($script_rev = $1) : ($script_rev = "-"); - -print "$script_name -- version: $script_rev\n"; - -#### main ##### - -parse_options(); -my $image_lists_ref = get_image_lists(); -my %image_lists_hash; -foreach ( @{$image_lists_ref} ) { - $image_lists_hash{$_}=""; -} -$do_rebuild = is_file_newer(\%image_lists_hash) if $do_rebuild == 0; -my ($global_hash_ref, $module_hash_ref, $custom_hash_ref) = iterate_image_lists($image_lists_ref); -# custom_hash filled from filesystem lookup -find_custom($custom_hash_ref); -my $zip_hash_ref = create_zip_list($global_hash_ref, $module_hash_ref, $custom_hash_ref); -$do_rebuild = is_file_newer($zip_hash_ref) if $do_rebuild == 0; -if ( $do_rebuild == 1 ) { - create_zip_archive($zip_hash_ref); - replace_file($tmp_out_file, $out_file); - print_message("packing $out_file finished."); -} else { - print_message("$out_file up to date. nothing to do."); -} - -exit(0); - -#### subroutines #### - -sub parse_options -{ - my $opt_help; - my $p = Getopt::Long::Parser->new(); - my @custom_path_list; - my $custom_path_extended; - my $success =$p->getoptions( - '-h' => \$opt_help, - '-o=s' => \$out_file, - '-g=s' => \$global_path, - '-s=s' => \$sort_file, - '-m=s' => \$module_path, - '-c=s' => \@custom_path_list, - '-e=s' => \$custom_path_extended, - '-l=s' => \@imagelist_path, - '-v' => \$verbose, - '-vv' => \$extra_verbose - ); - push @custom_path_list, $custom_path_extended if ($custom_path_extended); - if ( $opt_help || !$success || !$out_file || !$global_path - || !$module_path || !@custom_path_list || !@imagelist_path ) - { - usage(); - exit(1); - } - #define intermediate output file - $tmp_out_file="$out_file"."$$".$ENV{INPATH}; - # Sanity checks. - - # Check if out_file can be written. - my $out_dir = dirname($out_file); - - # Check paths. - foreach ($out_dir, $global_path, $module_path, @imagelist_path) { - print_error("no such directory: '$_'", 2) if ! -d $_; - print_error("can't search directory: '$_'", 2) if ! -x $_; - } - print_error("directory is not writable: '$out_dir'", 2) if ! -w $out_dir; - - # Use just the working paths - @custom_path = (); - foreach (@custom_path_list) { - if ( ! -d $_ ) { - print_warning("skipping non-existing directory: '$_'", 2); - } - elsif ( ! -x $_ ) { - print_error("can't search directory: '$_'", 2); - } - else { - push @custom_path, $_; - } - } -} - -sub get_image_lists -{ - my @image_lists; - my $glob_imagelist_path; - - foreach ( @imagelist_path ) { - $glob_imagelist_path = $_; - # cygwin perl - chomp( $glob_imagelist_path = qx{cygpath -u "$glob_imagelist_path"} ) if "$^O" eq "cygwin"; - push @image_lists, glob("$glob_imagelist_path/*.ilst"); - } - if ( !@image_lists ) { - print_error("can't find any image lists in '@imagelist_path'", 3); - } - - return wantarray ? @image_lists : \@image_lists; -} - -sub iterate_image_lists -{ - my $image_lists_ref = shift; - - my %global_hash; - my %module_hash; - my %custom_hash; - - foreach my $i ( @{$image_lists_ref} ) { - parse_image_list($i, \%global_hash, \%module_hash, \%custom_hash); - } - - return (\%global_hash, \%module_hash, \%custom_hash); -} - -sub parse_image_list -{ - my $image_list = shift; - my $global_hash_ref = shift; - my $module_hash_ref = shift; - my $custom_hash_ref = shift; - - print_message("parsing '$image_list' ...") if $verbose; - my $linecount = 0; - open(IMAGE_LIST, "< $image_list") or die "ERROR: can't open $image_list: $!"; - while ( <IMAGE_LIST> ) { - $linecount++; - next if /^\s*#/; - next if /^\s*$/; - # clean up trailing whitespace - tr/\r\n//d; - s/\s+$//; - # clean up backslashes and double slashes - tr{\\}{/}s; - tr{/}{}s; - # hack "res" back into globals - if ( /^\Q$img_global\E\/(.*)$/o ) { - $global_hash_ref->{"res/".$1}++; - next; - } - if ( /^\Q$img_module\E\/(.*)$/o ) { - $module_hash_ref->{$1}++; - next; - } - # parse failed if we reach this point, bail out - close(IMAGE_LIST); - print_error("can't parse line $linecount from file '$image_list'", 4); - } - close(IMAGE_LIST); - - return ($global_hash_ref, $module_hash_ref, $custom_hash_ref); -} - -sub find_custom -{ - my $custom_hash_ref = shift; - my $keep_back; - for my $path (@custom_path) { - find({ wanted => \&wanted, no_chdir => 0 }, $path); - foreach ( @custom_list ) { - if ( /^\Q$path\E\/(.*)$/ ) { - $keep_back=$1; - if (!defined $custom_hash_ref->{$keep_back}) { - $custom_hash_ref->{$keep_back} = $path; - } - } - } - } -} - -sub wanted -{ - my $file = $_; - - if ( $file =~ /.*\.png$/ && -f $file ) { - push @custom_list, $File::Find::name; - } -} - -sub create_zip_list -{ - my $global_hash_ref = shift; - my $module_hash_ref = shift; - my $custom_hash_ref = shift; - - my %zip_hash; - my @warn_list; - - print_message("assemble image list ...") if $verbose; - foreach ( keys %{$global_hash_ref} ) { - # check if in 'global' and in 'module' list and add to warn list - if ( exists $module_hash_ref->{$_} ) { - push(@warn_list, $_); - next; - } - if ( exists $custom_hash_ref->{$_} ) { - $zip_hash{$_} = $custom_hash_ref->{$_}; - next; - } - # it's neither in 'module' nor 'custom', record it in zip hash - $zip_hash{$_} = $global_path; - } - foreach ( keys %{$module_hash_ref} ) { - if ( exists $custom_hash_ref->{$_} ) { - $zip_hash{$_} = $custom_hash_ref->{$_}; - next; - } - # it's not in 'custom', record it in zip hash - $zip_hash{$_} = $module_path; - } - - if ( @warn_list ) { - foreach ( @warn_list ) { - print_warning("$_ is duplicated in 'global' and 'module' list"); - } - } - - return \%zip_hash -} - -sub is_file_newer -{ - my $test_hash_ref = shift; - my $reference_stamp = 0; - - print_message("checking timestamps ...") if $verbose; - if ( -e $out_file ) { - $reference_stamp = (stat($out_file))[9]; - print_message("found $out_file with $reference_stamp ...") if $verbose; - } - return 1 if $reference_stamp == 0; - - foreach ( sort keys %{$test_hash_ref} ) { - my $path = $test_hash_ref->{$_}; - $path .= "/" if "$path" ne ""; - $path .= "$_"; - print_message("checking '$path' ...") if $extra_verbose; - my $mtime = (stat($path))[9]; - return 1 if $reference_stamp < $mtime; - } - return 0; -} - -sub optimize_zip_layout($) -{ - my $zip_hash_ref = shift; - - if (!defined $sort_file) { - print_message("no sort file - sorting alphabetically ...") if $verbose; - return sort keys %{$zip_hash_ref}; - } - print_message("sorting from $sort_file ...") if $verbose; - - my $orderh; - my %included; - my @sorted; - open ($orderh, $sort_file) || die "Can't open $sort_file: $!"; - while (<$orderh>) { - /^\#.*/ && next; # comments - s/[\r\n]*$//; - /^\s*$/ && next; - my $file = $_; - if (!defined $zip_hash_ref->{$file}) { - print "unknown file '$file'\n" if ($extra_verbose); - } else { - push @sorted, $file; - $included{$file} = 1; - } - } - close ($orderh); - - for my $img (sort keys %{$zip_hash_ref}) { - push @sorted, $img if (!$included{$img}); - } - - print_message("done sort ...") if $verbose; - - return @sorted; -} - -sub create_zip_archive -{ - my $zip_hash_ref = shift; - - print_message("creating image archive ...") if $verbose; - my $zip = Archive::Zip->new(); - -# FIXME: test - $member = addfile ... $member->desiredCompressionMethod( COMPRESSION_STORED ); -# any measurable performance win/loss ? - foreach ( optimize_zip_layout($zip_hash_ref) ) { - my $path = $zip_hash_ref->{$_} . "/$_"; - print_message("zipping '$path' ...") if $extra_verbose; - if ( -e $path) { - my $member = $zip->addFile($path, $_, COMPRESSION_STORED); - if ( !$member ) { - print_error("can't add file '$path' to image zip archive: $!", 5); - } - } else { - print_message("file '$path' not found"); - } - } - my $status = $zip->writeToFileNamed($tmp_out_file); - if ( $status != AZ_OK ) { - print_error("write image zip archive '$tmp_out_file' failed. Reason: $status", 6); - } - return; -} - -sub replace_file -{ - my $source_file = shift; - my $dest_file = shift; - my $result = 0; - - $result = unlink($dest_file) if -f $dest_file; - if ( $result != 1 && -f $dest_file ) { - unlink $source_file; - print_error("couldn't remove '$dest_file'",1); - } else { - if ( !rename($source_file, $dest_file)) { - unlink $source_file; - print_error("couldn't rename '$source_file'",1); - } - } - return; -} - -sub usage -{ - print STDERR "Usage: packimages.pl [-h] -o out_file -g g_path -m m_path -c c_path -l imagelist_path\n"; - print STDERR "Creates archive of images\n"; - print STDERR "Options:\n"; - print STDERR " -h print this help\n"; - print STDERR " -o out_file path to output archive\n"; - print STDERR " -g g_path path to global images directory\n"; - print STDERR " -m m_path path to module images directory\n"; - print STDERR " -c c_path path to custom images directory\n"; - print STDERR " -s sort_file path to image sort order file\n"; - print STDERR " -l imagelist_path path to directory containing image lists (may appear mutiple times)\n"; - print STDERR " -v verbose\n"; - print STDERR " -vv very verbose\n"; -} - -sub print_message -{ - my $message = shift; - - print "$script_name: "; - print "$message\n"; - return; -} - -sub print_warning -{ - my $message = shift; - - print STDERR "$script_name: "; - print STDERR "WARNING $message\n"; - return; -} - -sub print_error -{ - my $message = shift; - my $error_code = shift; - - print STDERR "$script_name: "; - print STDERR "ERROR: $message\n"; - - if ( $error_code ) { - print STDERR "\nFAILURE: $script_name aborted.\n"; - exit($error_code); - } - return; -} diff --git a/solenv/bin/packmodule b/solenv/bin/packmodule deleted file mode 100755 index f2279cfed..000000000 --- a/solenv/bin/packmodule +++ /dev/null @@ -1,64 +0,0 @@ -#! /usr/bin/env python -#************************************************************************* -# -# 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. -# -#************************************************************************* -import os, os.path, sys, zipfile - -def paths_to_pack(loglines): - """Returns a generator iterating the outdir fields (with platform) of gb_deliver.log lines.""" - lines=[] - for line in loglines: - fields = line.split() - if len(fields) >= 3: - lines.append(fields[2]) - return lines - -def stripped_paths_to_pack(loglines): - """returns a generator iterating the outdir fields (stripped of the platform) of gb_deliver.log lines.""" - return (path.partition('/')[2] for path in paths_to_pack(loglines)) - -def main(args): - """creates/overwrites a file at OUTDIR/zip/MODULE.zip containing the contents of the gb_deliver.log.""" - if len(args) != 3: - print('usage: packmodule OUTDIR MODULE') - sys.exit(2) - (executable, outdir, module) = args - os.chdir(outdir) - zipdir = 'zip' - try: - os.makedirs(zipdir) - except OSError: - pass - deliverlog = open(os.path.join('inc', module, 'gb_deliver.log')) - packedmodule = zipfile.ZipFile(os.path.join(zipdir,module+'.zip'), 'w') - [packedmodule.write(path) for path in stripped_paths_to_pack(deliverlog)] - packedmodule.write(os.path.join('inc', module, 'gb_deliver.log')) - packedmodule.close() - -if __name__ == "__main__": - main(sys.argv) - -# vim:set et sw=4 ts=4 filetype=python: diff --git a/solenv/bin/packregistry.xslt b/solenv/bin/packregistry.xslt deleted file mode 100644 index 7c118f901..000000000 --- a/solenv/bin/packregistry.xslt +++ /dev/null @@ -1,90 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!--********************************************************************** -* -* 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. -* -**********************************************************************--> - -<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - xmlns:oor="http://openoffice.org/2001/registry"> - <xsl:param name="prefix"/> - <xsl:strip-space elements="*"/> - <xsl:preserve-space elements="value it"/> - <!-- TODO: strip space from "value" elements that have "it" children --> - <xsl:template match="/"> - <oor:data xmlns:xs="http://www.w3.org/2001/XMLSchema" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <xsl:copy-of select="list/dependency"/> -<!-- - <xsl:copy-of select="document(list/filename)/oor:component-schema"/> - <xsl:copy-of select="document(list/filename)/oor:component-data"/> - - instead of the below for-each would only issue warnings, not errors, for - non-existing or otherwise bad input files; it is important that the input - filename list is already sorted in an order suitable for the configmgr - (e.g., xcs files preceeding xcu files). ---> - <xsl:for-each select="list/filename"> - <xsl:variable name="doc" select="document(concat($prefix, .))"/> - <xsl:choose> - <xsl:when test="count($doc/oor:component-schema) = 1"> - <xsl:apply-templates select="$doc/oor:component-schema"/> - </xsl:when> - <xsl:when test="count($doc/oor:component-data) = 1"> - <xsl:apply-templates select="$doc/oor:component-data"/> - </xsl:when> - <xsl:otherwise> - <xsl:message terminate="yes"> - <xsl:text>cannot process </xsl:text> - <xsl:value-of select="."/> - </xsl:message> - </xsl:otherwise> - </xsl:choose> - </xsl:for-each> - </oor:data> - </xsl:template> - <xsl:template - match="oor:component-schema|oor:component-data|templates|component|group| - set|node-ref|prop|item|value|it|unicode|node"> - <xsl:copy copy-namespaces="no"> - <!-- prune oor:component-data xmlns:install="..." namespaces (would only - work in XSLT 2.0, however) --> - <xsl:apply-templates select="@*"/> - <xsl:apply-templates/> - </xsl:copy> - </xsl:template> - <xsl:template match="value[it]"> - <xsl:copy copy-namespaces="no"> - <xsl:apply-templates select="@*"/> - <xsl:apply-templates select="*"/> - <!-- ignore text elements (which must be whitespace only) --> - </xsl:copy> - </xsl:template> - <xsl:template match="info|import|uses|constraints"/> - <!-- TODO: no longer strip elements when they are eventually read by - configmgr implementation --> - <xsl:template match="@*"> - <xsl:copy/> - </xsl:template> -</xsl:stylesheet> diff --git a/solenv/bin/par2script.pl b/solenv/bin/par2script.pl deleted file mode 100644 index 8c60ab477..000000000 --- a/solenv/bin/par2script.pl +++ /dev/null @@ -1,115 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -use lib ("$ENV{SOLARENV}/bin/modules"); - -use Cwd; -use par2script::check; -use par2script::files; -use par2script::globals; -use par2script::parameter; -use par2script::module; -use par2script::undefine; -use par2script::work; - -#################################### -# Main program -#################################### - -par2script::parameter::getparameter(); -par2script::parameter::control_parameter(); -par2script::parameter::outputparameter(); - -my $includes = par2script::work::setincludes($par2script::globals::includepathlist); -my $parfiles = par2script::work::setparfiles($par2script::globals::parfilelist); - -par2script::work::make_complete_pathes_for_parfiles($parfiles, $includes); - -print "Reading par files\n"; -my $parfilecontent = par2script::work::read_all_parfiles($parfiles); - -print "Collecting items\n"; -par2script::work::collect_definitions($parfilecontent); - -print "Collecting assigned items\n"; -par2script::work::collect_assigned_gids(); - -# print "First control of multiple assignments\n"; -# par2script::check::check_multiple_assignments(); - -print "Searching for Undefinitions\n"; -par2script::undefine::undefine_gids($parfilecontent); -par2script::undefine::remove_complete_item("Directory", $parfilecontent); -par2script::undefine::remove_complete_item("Profile", $parfilecontent); - -print "Removing assigned GIDs without definitions\n"; -par2script::module::remove_undefined_gids_from_modules(); - -print "Adding definitions without assignment to the root\n"; -par2script::module::add_to_root_module(); - -print "Control of multiple assignments\n"; -par2script::check::check_multiple_assignments(); - -print "Control of definitions with missing assignments\n"; -par2script::check::check_missing_assignments(); - -# checking the setup script -print "Checking directory definitions ...\n"; -par2script::check::check_needed_directories(); -par2script::check::check_directories_in_item_definitions(); -print "Checking module definitions ...\n"; -par2script::check::check_module_existence(); -print "Checking module assignments ...\n"; -par2script::check::check_moduleid_at_items(); -print "Checking Root Module ..."; -par2script::check::check_rootmodule(); -print "Checking Shortcut assignments ...\n"; -par2script::check::check_shortcut_assignments(); -print "Checking missing parents ...\n"; -par2script::check::check_missing_parents(); - -print "Shorten lines at modules\n"; -par2script::module::shorten_lines_at_modules(); - -# Now the script can be created -print "Creating setup script\n"; -my $setupscript = par2script::work::create_script(); - -print "Saving script\n"; -par2script::files::save_file($par2script::globals::scriptname, $setupscript); - -# logging, if set -if ($par2script::globals::logging) -{ - par2script::files::save_file($par2script::globals::logfilename, \@par2script::globals::logfileinfo); - print "Log file written: $par2script::globals::logfilename\n"; -} - -#################################### -# End main program -#################################### diff --git a/solenv/bin/patch_sanitizer.pl b/solenv/bin/patch_sanitizer.pl deleted file mode 100755 index 12d6c34d2..000000000 --- a/solenv/bin/patch_sanitizer.pl +++ /dev/null @@ -1,126 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - -use utf8; -use warnings; -use strict; - -# command line arguments -my $oldpatchfile = shift; -my $newpatchfile = shift; -my $sortedfile = shift; - -show_help() unless defined $oldpatchfile and defined $newpatchfile and defined $sortedfile; - -my %oldpatchfile = parse_patch($oldpatchfile); -my %newpatchfile = parse_patch($newpatchfile); - -open SORTEDPATCH, "> $sortedfile"; - -foreach my $file (sort (keys %newpatchfile)) { - print SORTEDPATCH $file."\t"; - if (defined($oldpatchfile{$file})) { - if ( (join '', @{$oldpatchfile{$file}{'data'}}) eq (join '', @{$newpatchfile{$file}{'data'}}) ) { - # patch data for the file hasn't been modified, use the header from - # the old patch, to reduce noise (keep the old timestamps) - print SORTEDPATCH $oldpatchfile{$file}{'origtimestamp'}."\n"; - print SORTEDPATCH $oldpatchfile{$file}{'patchedfilename'}."\t"; - print SORTEDPATCH $oldpatchfile{$file}{'patchedtimestamp'}."\n"; - print SORTEDPATCH @{$oldpatchfile{$file}{'data'}}; - next; - } - } - # either file wasn't patched before, or the patchset changed, so use the new - # values for it.. - print SORTEDPATCH $newpatchfile{$file}{'origtimestamp'}."\n"; - print SORTEDPATCH $newpatchfile{$file}{'patchedfilename'}."\t"; - print SORTEDPATCH $newpatchfile{$file}{'patchedtimestamp'}."\n"; - print SORTEDPATCH @{$newpatchfile{$file}{'data'}}; -} -close SORTEDPATCH; - -############### -# Helper subs -############### -sub show_help { - print "Usage: $0 oldpatch newpatch outputfilename\n"; - print "oldpatch and newpatch can be the very same file\n"; - print "will output a sanitized form of newpatch to outputfilename\n"; - print "if outputfilename is '-', the patch will be printed to stdout\n"; - print "sanitized means: It will avoid all unnecessary changes\n"; - exit 1; -} -sub parse_patch { - my $patchfile = shift; - my $patchtype; - my $pfirst; - my $psecond; - - my %hunks = (); - my $origfilename; - open PATCHFILE, "< $patchfile" or die "Cannot open file $patchfile $!"; - my @patchfile = <PATCHFILE>; - close PATCHFILE; - return %hunks if ( $#patchfile == -1 ); - if ( $patchfile[0] =~ /^---/ ) { - $patchtype = "unified"; - $pfirst = '^--- [^\*]*$'; - $psecond = '^\+\+\+ [^\*]*$'; - } elsif ( $patchfile[0] =~ /^\*\*\*/ ) { - $patchtype = "content"; - $pfirst = '^\*\*\* [^\*]*$'; - $psecond = '^--- .*\t.*$'; - } else { - die "unknown patch format\n"; - } - - foreach (@patchfile) { - if ( /$pfirst/ ) { - my $timestamp; - # extract the filename, to be able to compare the old - # with the new file... - ($origfilename, $timestamp) = split(/\t/, $_, 2); - chomp $timestamp; - # ideally convert the timestamp to iso-format... - $hunks{$origfilename}{'origtimestamp'} = $timestamp; - next; - } elsif ( $_ =~ /$psecond/ ) { - my ($filename, $timestamp) = split(/\t/, $_, 2); - chomp $timestamp; - # ideally convert the timestamp to iso-format... - $hunks{$origfilename}{'patchedfilename'} = $filename; - $hunks{$origfilename}{'patchedtimestamp'} = $timestamp; - next; - } - push (@{$hunks{$origfilename}{'data'}}, $_); - - } - return %hunks; -} diff --git a/solenv/bin/pchdelta b/solenv/bin/pchdelta deleted file mode 100755 index e33db2f96..000000000 --- a/solenv/bin/pchdelta +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -# Wrapper around the pchdelta.py script -bash -c "unset PYTHONHOME PYTHONPATH; /usr/bin/python ../solenv/bin/pchdelta.py $*" diff --git a/solenv/bin/pchdelta.py b/solenv/bin/pchdelta.py deleted file mode 100755 index 52a0df4ec..000000000 --- a/solenv/bin/pchdelta.py +++ /dev/null @@ -1,149 +0,0 @@ -#!/usr/bin/python - -# ------------------------------------------------------------------------------ -# Hacky little delta debug tool to figure out the proper includes for a pch file -# -# Usage: -# -# pchdelta.py <pch_target> <dir1> [<dir2> <dir3> ...] -# -# <pch_target> File to perform delta debugging on. The section to test -# is delimeted by '//---MARKER---' lines. -# <dir1> .. <dirn> Sequence of directories to run dmake in to test if the -# modification works -# -# Examples: -# -# pchdelta.py inc/pch/precompiled_sfx2.hxx inc source/dialog -# -# Run pchdelta inside sfx2 first building the pch files and then files in -# source/dialog -# -# ------------------------------------------------------------------------------ - -import os -import os.path -import sys - -# C++ -MARKER="//---MARKER---\n" - -# dmake -#MARKER="#---MARKER---\n" - -# ------------------------------------------------------------------------------ -# Sequentially build all argument directories from scratch - -def testSequenceBuild(dirlist): - cwd = os.path.abspath(os.getcwd()) - for path in dirlist: - os.chdir(path) - buildcommand = "dmake -u" - buildcommand += " >>" + cwd + "/buildlog.txt 2>&1" - buildresult = os.system(buildcommand) - os.chdir(cwd) - if buildresult != 0: - return False - return True - -# ------------------------------------------------------------------------------ -# Dump out the delta file with corresponding markers - -def writePch(pchname, header, footer, acceptedlines, testlines): - outputfile = file(pchname, "w") - outputfile.write(header) - outputfile.write(MARKER) - outputfile.write("\n".join(acceptedlines)) - if len(testlines) > 0: - outputfile.write("\n\n//---Candidate marker---\n") - outputfile.write("\n".join(testlines) + "\n") - outputfile.write("//---Candidate marker end---\n") - outputfile.write(MARKER) - outputfile.write(footer) - outputfile.close() - - -# ------------------------------------------------------------------------------ -# Recursive tester routine. Test the segment given and if an error is -# encountered splits the segment into <fanout> subsegment and recurses. Failing -# one liners are rejected. The set of accepted lines are built sequentially from -# the beginning. - -def binaryTest(dirlist, lines, pchname, header, footer, acceptedlines, indent, startpoint): - linecount = len(lines) - if linecount == 0: - return - # Test if this slice passes the buildtest - writePch(pchname, header, footer, acceptedlines, lines) - if testSequenceBuild(dirlist): - return acceptedlines + lines - - # Reject one liners - if linecount == 1: - print indent + "Rejected: " + lines[0] - return acceptedlines - - # Recurse with multiline slices - fanout = 4 - splits = [] - for i in range(3): - splits.append(linecount * (i + 1) / fanout) - splits.append(linecount) - - splitstart = 0 - for splitend in splits: - # avoid splitting in case we have no resulting lines - if (splitend - splitstart) == 0: - continue - splitslice = lines[splitstart:splitend] - print indent + "[" + str(startpoint + splitstart) + ":" + str(startpoint + splitend) + "] (" + str(splitend - splitstart) + ")" - acceptedlines = binaryTest(dirlist, splitslice, pchname, header, footer, acceptedlines, indent + " ", startpoint + splitstart) - splitstart = splitend - - return acceptedlines - -# ------------------------------------------------------------------------------ -# Main entry point - -if len(sys.argv) < 3: - print "Usage: " + sys.argv[0] + " <pch_target> <dir1> [<dir2> <dir3> ...]" - sys.exit(1) - -pchname = os.path.abspath(sys.argv[1]) -dirlist = sys.argv[2:] - -# remove old build log file -if os.path.exists("buildlog.txt"): - os.remove("buildlog.txt") - -# test for corner case of everything working from the start -if testSequenceBuild(dirlist): - print "pch working, nothing to do." - sys.exit(0) - -# Open the header file for reading -inputfile = file(pchname, "r+") -inputdata = inputfile.read() -inputfile.close() - -segments = inputdata.split(MARKER) -header = segments[0] -footer = segments[2] -lines = segments[1].split("\n") - -writePch(pchname + "_backup", header, footer, lines, []) - -# test for corner case of no convergence possible -writePch(pchname, header, footer, [], []) -if not testSequenceBuild(dirlist): - writePch(pchname, header, footer, lines, []) - print "Building with no candidate lines failed. Convergence questionable, aborting." - sys.exit(0) - -# Starting pruning -print "Starting evaluation of " + str(len(lines)) + " lines" -acceptedlines = binaryTest(dirlist, lines, pchname, header, footer, [], "", 0) -writePch(pchname, header, footer, acceptedlines, []) - - - diff --git a/solenv/bin/pre2par.pl b/solenv/bin/pre2par.pl deleted file mode 100644 index 0a524ee06..000000000 --- a/solenv/bin/pre2par.pl +++ /dev/null @@ -1,74 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -use lib ("$ENV{SOLARENV}/bin/modules"); - -use Cwd; -use pre2par::directory; -use pre2par::files; -use pre2par::globals; -use pre2par::language; -use pre2par::parameter; -use pre2par::work; - -#################################### -# Main program -#################################### - -pre2par::parameter::getparameter(); -pre2par::parameter::control_parameter(); - -pre2par::directory::check_directory($pre2par::globals::parfilename); - -my $prefile = pre2par::files::read_file($pre2par::globals::prefilename); - -pre2par::work::check_content($prefile, $pre2par::globals::prefilename); - -my $parfile = pre2par::work::convert($prefile); - -pre2par::work::formatter($parfile); - -my $langfilename = pre2par::work::getlangfilename(); -my $ulffilename = pre2par::work::getulffilename($pre2par::globals::prefilename); - -my $dolocalization = pre2par::work::check_existence_of_langfiles($langfilename, $ulffilename); - -if ( $dolocalization ) -{ - my $langfile = pre2par::files::read_file($langfilename); - pre2par::language::localize($parfile, $langfile); -} - -pre2par::files::save_file($pre2par::globals::parfilename, $parfile); - -# checking of par file was written correctly -my $parfilecomp = pre2par::files::read_file($pre2par::globals::parfilename); -pre2par::work::diff_content($parfile, $parfilecomp, $pre2par::globals::parfilename); - -#################################### -# End main program -#################################### diff --git a/solenv/bin/receditor b/solenv/bin/receditor deleted file mode 100755 index d0549c6c7..000000000 --- a/solenv/bin/receditor +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -if [ x${SOLARENV}x = xx ]; then - echo No environment found, please use 'configure' or 'setsolar' - exit 1 -fi -exec java -DSOLARSRC=${SOLARSRC} -DWORK_STAMP=${WORK_STAMP} -jar ${SOLARVER}/${INPATH}/bin/receditor.jar diff --git a/solenv/bin/relocate b/solenv/bin/relocate deleted file mode 100755 index 6a5cfb992..000000000 --- a/solenv/bin/relocate +++ /dev/null @@ -1,302 +0,0 @@ -: - eval 'exec perl -S $0 ${1+"$@"}' - if 0; - -#************************************************************************* -# -# This tool makes it easy to cleanly re-locate a -# build, eg. after you have copied or moved it to a new -# path. It tries to re-write all the hard-coded path logic -# internally. -# -#************************************************************************* -# -# 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. -# -# written substantially, if not entirely by non-Sun volunteers -# -#************************************************************************* - -sub sniff_set($) -{ - my $build_dir = shift; - my ($dirhandle, $fname); - - opendir ($dirhandle, $build_dir) || die "Can't open $build_dir"; - while ($fname = readdir ($dirhandle)) { - $fname =~ /Set.sh$/ && last; - } - closedir ($dirhandle); - - return $fname; -} - -sub sed_file($$$) -{ - my ($old_fname, $function, $state) = @_; - my $tmp_fname = "$old_fname.new"; - my $old_file; - my $new_file; - - open ($old_file, $old_fname) || die "Can't open $old_fname: $!"; - open ($new_file, ">$tmp_fname") || die "Can't open $tmp_fname: $!"; - - while (<$old_file>) { - my $value = &$function($state, $_); - print $new_file $value; - } - - close ($new_file) || die "Failed to close $tmp_fname: $!"; - close ($old_file) || die "Failed to close $old_fname: $!"; - - rename $tmp_fname, $old_fname || die "Failed to replace $old_fname: $!"; -} - -sub rewrite_value($$) -{ - my ($state, $value) = @_; - - $value =~ s/$state->{'old_root'}/$state->{'new_root'}/g; - $value =~ s/$state->{'win32_old_root'}/$state->{'win32_new_root'}/g; - - return $value; -} - -sub rewrite_set($$$) -{ - my $new_root = shift; - my $old_root = shift; - my $set = shift; - my $tmp; - my %state; - - print " $set\n"; - -# unix style - $state{'old_root'} = $old_root; - $state{'new_root'} = $new_root; -# win32 style - $tmp = $old_root; - $tmp =~ s/\//\\\\\\\\\\\\\\\\/g; - $state{'win32_old_root'} = $tmp; - $tmp = $new_root; - $tmp =~ s/\//\\\\\\\\/g; - $state{'win32_new_root'} = $tmp; - - sed_file ("$new_root/$set", \&rewrite_value, \%state); -} - -sub read_set($$) -{ - my $new_root = shift; - my $set = shift; - my $fname = "$new_root/$set"; - my $file; - my %env_keys; - - open ($file, $fname) || die "Can't open $fname: $!"; - - while (<$file>) { - if (/\s*([^=]+)\s*=\s*\"([^\"]+)\"/) { - my ($name, $value) = ($1, $2); - - $env_keys{$name} = $value; - } - } - - close ($file) || die "Failed to close $fname: $!"; - - return \%env_keys; -} - -sub sed_file_no_touch($$$) -{ - my ($new_root, $old_root, $file) = @_; - my ($fin, $fout); - - ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, - $atime,$mtime,$ctime,$blksize,$blocks) = stat ($file); - - open ($fin, $file) || die "Can't open $fin: $!"; - open ($fout, ">$file.sed.bak") || die "Can't open $file.sed.bak: $!"; - while (<$fin>) { - s/$old_root/$new_root/g; - print $fout $_; - } - close ($fin); - close ($fout); - rename ("$file.sed.bak", $file); -# print "rename $file.sed.bak to $file\n"; - - utime $atime, $mtime, $file; -} - -sub sed_no_touch_recursive ($$$) -{ - my ($new_root, $old_root, $dir) = @_; - my $dh; - opendir ($dh, $dir) || die "Can't open dir: $dir: $!"; - while (my $entry = readdir ($dh)) { - $entry =~ /^\./ && next; - my $path = "$dir/$entry"; - sed_no_touch_recursive ($new_root, $old_root, $path) if (-d $path); - sed_file_no_touch ($new_root, $old_root, $path) if (-f $path); - } - closedir ($dh); -} - -sub rewrite_product_deps($$$) -{ - my $new_root = shift; - my $product_path = shift; - my $old_root = shift; - - my $path = "$new_root/$product_path/misc"; - my $misc_dir; - opendir ($misc_dir, $path) || return; - my $name; - while ($name = readdir ($misc_dir)) { -# Should try re-writing these - but perhaps this would -# screw with timestamps ? - if ($name =~ m/\.dpcc$/ || $name =~ m/\.dpslo$/ || $name =~ m/\.dpobj$/) { - sed_file_no_touch ($new_root, $old_root, "$path/$name"); - } - } - closedir ($misc_dir); -} - -sub rewrite_dpcc($$) -{ - my $new_root = shift; - my $old_root = shift; - - my $top_dir; - my $idx = 0; - opendir ($top_dir, $new_root) || die "Can't open $new_root: $!"; - my $name; - while ($name = readdir ($top_dir)) { - my $sub_dir; - opendir ($sub_dir, "$new_root/$name") || next; - my $sub_name; - while ($sub_name = readdir ($sub_dir)) { - if ($sub_name =~ /\.pro$/) { - $idx || print "\n "; - if ($idx++ == 6) { - $idx = 0; - } - print "$name "; - rewrite_product_deps ($new_root, "$name/$sub_name", $old_root); - } - } - closedir ($sub_dir); - } - closedir ($top_dir); - print "\n"; -} - -sub rewrite_symlinks($$) -{ - my $new_root = shift; - my $old_root = shift; - - my $dirh; - opendir ($dirh, $new_root); - while (my $ent = readdir ($dirh)) { - $ent =~ /^\./ && next; - my $link = "$new_root/$ent"; - -l $link || next; - my $target = readlink ($link); - my $newtarget = $target; - $newtarget =~ s/$old_root/$new_root/; - if ($target =~ m/$new_root/) { - print STDERR "skip correct link $target\n"; - } elsif ($newtarget eq $target) { - print STDERR "unusual - possibly stale link: $target\n"; - if ($target =~ m/\/clone\//) { die "failed to rename link"; } - } else { - print "Re-write link $target to $newtarget\n"; - unlink ($link); - symlink ($newtarget, $link); - } - } - closedir ($dirh); -} - -sub rewrite_bootstrap($$) -{ - my $new_root = shift; - my $old_root = shift; - - print " bootstrap\n"; - - my %state; - $state{'old_root'} = $old_root; - $state{'new_root'} = $new_root; - - my $rewrite = sub { my $state = shift; my $value = shift; - $value =~ s/$state->{'old_root'}/$state->{'new_root'}/g; - return $value; }; - sed_file ("$new_root/bootstrap", $rewrite, \%state); - `chmod +x $new_root/bootstrap`; -} - -for $a (@ARGV) { - if ($a eq '--help' || $a eq '-h') { - print "relocate: syntax\n"; - print " relocate /path/to/new/ooo/source_root\n"; - } -} - -$OOO_BUILD = shift (@ARGV) || die "Pass path to relocated source tree"; -substr ($OOO_BUILD, 0, 1) eq '/' || die "relocate requires absolute paths"; - -my $set; - -$set = sniff_set($OOO_BUILD) || die "Can't find env. set"; -my $env_keys = read_set ($OOO_BUILD, $set); -$OLD_ROOT = $env_keys->{'SRC_ROOT'}; -my $solver = $env_keys->{SOLARVER} . "/" . $env_keys->{INPATH}; - -print "Relocate: $OLD_ROOT -> $OOO_BUILD\n"; -if ($OLD_ROOT eq $OOO_BUILD) { - print "nothing to do\n"; - exit 0; -} - -print "re-writing symlinks\n"; -rewrite_symlinks($OOO_BUILD, $OLD_ROOT); - -print "re-writing dependencies:\n"; -rewrite_dpcc($OOO_BUILD, $OLD_ROOT); - -if (-d "$solver/workdir/Dep") { - print "re-writing new dependencies:\n"; - sed_no_touch_recursive ($OOO_BUILD, $OLD_ROOT, "$solver/workdir/Dep"); -} - -print "re-writing environment:\n"; -rewrite_set($OOO_BUILD, $OLD_ROOT, $set); -rewrite_bootstrap($OOO_BUILD, $OLD_ROOT); - -print "done.\n"; diff --git a/solenv/bin/remangle32to64.pl b/solenv/bin/remangle32to64.pl deleted file mode 100644 index 0ed98fbd4..000000000 --- a/solenv/bin/remangle32to64.pl +++ /dev/null @@ -1,327 +0,0 @@ -#!/usr/bin/perl -w /* -*- indent-tabs-mode: nil -*- */ - -# Version: MPL 1.1 / GPLv3+ / LGPLv3+ -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Initial Developer of the Original Code is -# Novell, Inc -# Portions created by the Initial Developer are Copyright (C) 2011 Novell, -# Inc. All Rights Reserved. -# -# Contributor(s): Tor Lillqvist <tml@iki.fi> -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 3 or later (the "GPLv3+"), or -# the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), -# in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable -# instead of those above. - -# Change MSVC mangled C++ names from 32-bit form to the corresponding -# 64-bit form. Each line of input can contain at most one mangled -# name. - -# Based on experimentation with MSVC2008 and the following web pages: - -# http://www.geoffchappell.com/viewer.htm?doc=studies/msvc/language/decoration/index.htm -# Thorough but incomplete. Still, describes details the below sources -# don't mention. - -# http://cvs.winehq.com/cvsweb/wine/dlls/msvcrt/undname.c -# Wine's __unDname function, presumably the most complete, although -# not really written to act as "documentation" - -# http://mearie.org/documents/mscmangle/ -# Relatively complete but a bit badly structured and terse. - -# http://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B_Name_Mangling -# seems to be mostly a ripoff on the mearie.org page - -# Example transformation: -# ??0ORealDynamicLoader@salhelper@@IAE@PAPAV01@ABVOUString@rtl@@1PAX2@Z => -# ??0ORealDynamicLoader@salhelper@@IEAA@PEAPEAV01@AEBVOUString@rtl@@1PEAX2@Z - -# It should be relatively easy to remove the modification parts of the -# below code and use the regex for some other task on MSVC mangled -# names. - -# The regular expression below accepts also nonsensical mangled names, -# so it should not be used to verify correctness of mangled names. - -use strict; - -my @opstack = (); - -sub parse_number($) -{ - my ($num) = @_; - - return $num + 1 if ($num eq '0' || ($num ge '1' && $num le '9')); - - $num =~ tr/ABCDEFGHIJKLMNOP@/0123456789ABCDEF /; - hex($num); -} - -sub format_number($) -{ - my ($num) = @_; - - return $num - 1 if ($num <= 10); - - $num = sprintf("%X", $num); - $num =~ tr/0123456789ABCDEF/ABCDEFGHIJKLMNOP/; - $num.'@'; -} - -sub double_thunk($$) -{ - my ($number, $position) = @_; - - my $bytes = parse_number($number); - $bytes *= 2; - push(@opstack, 'r '.($position - length($number)).' '.length($number).' '.format_number($bytes)); -} - -while (<>) - { - m/ - # Named subpattern definitions. I use names of the form - # __CamelCase__ for the named subpatters so that they are easier - # to see. - (?(DEFINE) - (?<__Number__> - \?? ([0-9] | [A-P]+@) - ) - (?<__32BitChecksum__> - [A-P]{8}@ - ) - (?<__CallingConvention__> - (?: - [AB] - | - [C-L] - (?{ push(@opstack, 'r '.(pos()-1).' 1 A cdecl'); }) - ) - ) - (?<__StringLiteralText__> - (?: - [_a-zA-Z0-9] - | - \?\$[A-P][A-P] - | - \?[0-9A-Za-z] - ){1,20} - ) - (?<__Identifier__> - [_a-zA-Z\$][_a-zA-Z0-9\$]*@ - ) - (?<__ArgsZTerminated__> - (?&__DataTypeInArgs__)+ @? Z - ) - (?<__ArgsNonZTerminated__> - (?&__DataTypeInArgs__)+ @? - ) - (?<__TemplateName__> - (?&__Identifier__) (?&__ArgsNonZTerminated__) - ) - (?<__Class__> - (?: - [0-9] - | - \?\$ (?&__TemplateName__) - | - (?&__Identifier__) - )+@ - ) - (?<__DataTypeCommon__> - (?: - # extended types like _int64, bool and wchar_t - _[D-NW] - | - # simple types - [C-KMNOXZ] - | - # class, struct, union, cointerface - [TUVY] (?&__Class__) - | - # references - [AB] - (?{ push(@opstack, 'i '.pos().' E reference'); }) - (?&__ModifiedType__) - | - # pointers - [QRS] - (?{ push(@opstack, 'i '.pos().' E pointer'); }) - (?&__ModifiedType__) - | - P - (?: - # function pointer - 6 (?&__CallingConvention__) (?&__DataTypeNotInArgs__) (?&__ArgsZTerminated__) - | - # other pointer - (?{ push(@opstack, 'i '.pos().' E pointer'); }) - (?&__ModifiedType__) - ) - | - W 4 (?&__Class__) - | - [0-9] - | - \$ (?: - [0DQ] (?&__Number__) - | - F (?&__Number__){2} - | - G (?&__Number__){3} - | - \$ [ABCD] (?&__DataTypeNotInArgs__) - ) - ) - ) - (?<__ModifiedType__> - [ABCD] - (?: - # multidimensional array - Y (?&__Number__)+ - )? - (?&__DataTypeNotInArgs__) - ) - (?<__DataTypeInArgs__> - (?: - (?&__DataTypeCommon__) - | - # template parameter - \? (?&__Number__) - ) - ) - (?<__DataTypeNotInArgs__> - (?: - (?&__DataTypeCommon__) - | - \? (?&__ModifiedType__) - ) - ) - ) - - # All mangled names start with a question mark - \? - (?: - # Ctors, dtors, operators etc have separate a priori defined - # special mangled names like the very simple ?0 for constructor - # and ?_R16789 for "RTTI Base Class Descriptor at (6,7,8,9)" - # whatever that might mean. - ( - \? - ([0-9A-Z] - | - _(?: - # C is for string literals, see below - # R is RTTI, see immediately below - [0-9ABD-QS-Z] - | - R0(?&__DataTypeNotInArgs__) - | - R1(?&__Number__){4} - | - R[234] - | - _(?: - E - ) - ) - ) - )? - (?&__Class__) - - (?: - # Static members and normal variables - [0-5] - (?&__DataTypeNotInArgs__) - [ABCD] - | - # Compiler-generated static - [67] - [ABCD] - (?: - @ - | - (?&__Class__) - ) - | - # Non-static Methods, implicit 'this' - [ABEFIJMNQRUV] - [AB] - (?{ push(@opstack, 'i '.(pos()-1).' E this'); }) - (?&__CallingConvention__) - (?: - @ - | - (?&__DataTypeNotInArgs__) - ) - (?&__ArgsZTerminated__) - | - # Static methods - [CDKLST] - (?&__CallingConvention__) - (?: - @ - | - (?&__DataTypeNotInArgs__) - ) - (?&__ArgsZTerminated__) - | - # Thunks - [GHOPWX] - ((?&__Number__)) - (?{ double_thunk($^N, pos()); }) - [AB] - (?{ push(@opstack, 'i '.(pos()-1).' E this'); }) - (?&__CallingConvention__) - (?: - @ - | - (?&__DataTypeNotInArgs__) - ) - (?&__ArgsZTerminated__) - | - # Functions - [YZ] - (?&__CallingConvention__) - (?: - @ - | - (?&__DataTypeNotInArgs__) - ) - (?&__ArgsZTerminated__) - | - # Template - \$ (?&__Identifier__) (?&__ArgsNonZTerminated__) - ) - | - # pooled string literals - \?_C\@_[01](?&__Number__)(?&__32BitChecksum__)(?&__StringLiteralText__)@ - ) - /x; - - while (my $op = pop(@opstack)) - { - # print STDERR "op=$op\n"; - my @a = split (' ', $op); - if ($a[0] eq 'i') { - substr($_,$a[1],0) = $a[2]; - } elsif ($a[0] eq 'r') { - substr($_,$a[1],$a[2]) = $a[3]; - } - } - - print; - } diff --git a/solenv/bin/rmdir.pl b/solenv/bin/rmdir.pl deleted file mode 100644 index 8b4789b0c..000000000 --- a/solenv/bin/rmdir.pl +++ /dev/null @@ -1,46 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - -my $r_code=0; -if ( ! defined $ARGV[0] || "$ARGV[0]" eq "" ) { - print STDERR "Nothing to delete\n"; - exit 1; -} -while ( defined $ARGV[0] ) { -if ( rmdir $ARGV[0] ) { -# exit 0; -} else { - print STDERR "ERROR removing $ARGV[0]: $!\n"; - $r_code = 1; -} -shift @ARGV; -} -exit $r_code; - diff --git a/solenv/bin/rpm-wrapper b/solenv/bin/rpm-wrapper deleted file mode 100755 index f4234a9c5..000000000 --- a/solenv/bin/rpm-wrapper +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -#************************************************************************* -# -# 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. -# -#***********************************************************************/ - -# At least on v20z-so3, when /so/env/bt_linux_libc2.11/DEV300/bin/rpm is called -# and internally looks for a ld-linux.so.2, it picks up -# /lib/tls/i686/cmov/ld-linux.so.2 and SIGSEGVs. This is prevented by -# adding /so/env/bt_linux_libc2.11/DEV300/lib to the LD_LIBRARY_PATH, thus -# picking up the ld-linux.so.2 from there: - -set -e -if [ "$OUTPATH" = "unxlngi6" ] -then -LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}${LIBRARY_PATH?} \ - ${BUILD_TOOLS?}/rpmbuild "$@" -else -if [ "$OUTPATH" = "unxlngx6" ] -then -LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}${LIBRARY_PATH?} \ - ${BUILD_TOOLS?}/rpmbuild "$@" -else -LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}${COMPATH?}/lib \ - ${BUILD_TOOLS?}/rpm "$@" -fi -fi diff --git a/solenv/bin/slfl.pl b/solenv/bin/slfl.pl deleted file mode 100755 index e139dddce..000000000 --- a/solenv/bin/slfl.pl +++ /dev/null @@ -1,176 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* -# Description: Wrapper script to change '/' to '\' in command-line -# arguments. - -#--------------------------------------------------------------------------- -# external modules -use Text::ParseWords; - -# global vars -@params = (); - -#--------------------------------------------------------------------------- -# procedures - - -#---------------------------------------------------------- -# Function name: WinFormat -# Description: Format variables to Windows Format. -# Arguments: 1. Variable (string) with one token -# Return value: Reformatted String -#---------------------------------------------------------- -sub WinFormat { - my $variable = shift @_; - - $variable =~ s!(.)/!$1\\!g; # Replace all but the leading slashes with backslashes - - if ( defined $debug ) { - print(STDERR "WinFormat:\nresult:$variable\n"); - } - - return $variable; -} - -#---------------------------------------------------------- -# Function name: replace_cyg -# Description: Process all arguments and change them to Windows Format. -# Arguments: Reference to array with arguments -# Return value: - -#---------------------------------------------------------- -sub replace_cyg { - my $args = shift; - my( @cmd_file, @cmd_temp ); - my $atchars; - foreach my $para ( @$args ) { - if ( $para =~ "^@" ) { - # it's a command file - if ( defined $debug ) { - print(STDERR "----------------------------\n"); - } - ; - # Workaround, iz28717, keep number of @'s. - $para =~ s/(^\@+)//; - $atchars = $1; - $filename = $para; - if ( defined $debug ) { - print(STDERR "filename = $filename \n"); - } - ; - # open this command file for reading - open(CMD, "$filename"); - while ( <CMD> ) { - # Remove DOS lineendings. Bug in Cygwin / Perl? - $_ =~ s/\r//g; - # Remove lineendings and trailing spaces. ( Needed by &parse_line ) - $_ =~ s/\n$//g; - $_ =~ s/\s+$//g; - # Fill all tokens into array - @cmd_temp = &parse_line('\s+', 1, $_ ); - if ( $#cmd_temp > -1 ) { - push( @cmd_file, @cmd_temp); - } - } - close(CMD); - # reformat all tokens - replace_cyg(\@cmd_file); - if ( defined $debug ) { - print(STDERR "Tokens processed:\n"); - } - ; - foreach $i (@cmd_file) { - if ( defined $debug ) { - print(STDERR "!".$i."!\n"); - } - ; - } - # open this filename for writing (truncate) Textmode? - open(CMD, '>', $filename); - # write all tokens back into this file - print(CMD join(' ', @cmd_file)); - close(CMD); - # convert '@filename' to dos style - $para = WinFormat( $para ); - if ( defined $debug ) { - print(STDERR "----------------------------\n"); - } - ; - if ( (defined $debug_light) or (defined $debug) ) { - print(STDERR "\nParameter in File:".join(' ', @cmd_file).":\n"); - } - $para = $atchars.$para; - } else { - # it's just a parameter - if ( defined $debug ) { - print(STDERR "\nParameter:---${para}---\n"); - } - ; - # If $tmp1 is empty then $para is a parameter. - my $is_no_para = 1; - # remove .exe and convert to lower case - $shortcommand = lc $command ; - $shortcommand =~ s/\.exe$//; - $shortcommand =~ /([^\/]+$)/; - $shortcommand = $1; - if ( $is_no_para ) { - $para = WinFormat($para); - } - if ( defined $debug ) { - print(STDERR "Converted line:${para}:\n" ); - } - } # else - } # foreach loop -} - - -#--------------------------------------------------------------------------- -# main -@params = @ARGV; - -$command = shift(@params); - -while ( $command =~ /^-/ ) -{ - if ( $command eq "-dbg" ) { - $debug="true"; - } - elsif ( $command eq "-ldbg" ) { - $debug_light="true"; - } - - $command = shift(@params); -} - -if ( (defined $debug_light) or (defined $debug) ) { print( STDERR "Command: $command\n" ); } - -replace_cyg(\@params); -if ( (defined $debug_light) or (defined $debug) ) { print(STDERR "\n---------------------\nExecute: $command @params\n----------------\n");}; -exec( "$command", @params) or die( "\nError: slfl.pl: executing $command failed!\n" ); - diff --git a/solenv/bin/soirpm.sh b/solenv/bin/soirpm.sh deleted file mode 100755 index f984bbec1..000000000 --- a/solenv/bin/soirpm.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -#************************************************************************* -# 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. -# -#***********************************************************************/ - -LIBRPMBUILD=$(find ${COMPATH} -name 'librpmbuild-4.1*' -print) -# echo $(dirname $LIBRPMBUILD) -LD_LIBRARY_PATH=$(dirname ${LIBRPMBUILD}) ${BUILD_TOOLS?}/rpm "$@" -# LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}${COMPATH?}/lib \ -# ${BUILD_TOOLS?}/rpm "$@" diff --git a/solenv/bin/sort.pl b/solenv/bin/sort.pl deleted file mode 100644 index 577ac4cf8..000000000 --- a/solenv/bin/sort.pl +++ /dev/null @@ -1,50 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - -# -# sort.pl - Simply sort the input from stdin and pipe it to stdout. -# The sort needs to be *independent* of the settings of -# LC_ALL resp. LC_COLLATE -# - -use strict; -# be explicit: we want the perl standard sorting regardless the locale -no locale; - - -my @buffer; - -while(<>) { - push(@buffer, $_); -} - -foreach (sort @buffer) { - print $_; -} diff --git a/solenv/bin/striplanguagetags.sh b/solenv/bin/striplanguagetags.sh deleted file mode 100755 index a8834795e..000000000 --- a/solenv/bin/striplanguagetags.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env bash -#take a .zip containing a flat hierarchy of odf files and strip out the -#language and country tags in each of them and repack it all up -#should convert templates so that documents based on them use -#the default-document-language rather than the hardcoded lang-tag - -#All a bit hacky, but it should work - -tempfoo=`basename $0` - -XSL=`mktemp /tmp/${tempfoo}.XXXXXX` -if [ $? -ne 0 ]; then - echo "$0: Can't create temp file, exiting..." - exit 1 -fi - -# On Windows, xsltproc is a non-Cygwin program, so we can't pass -# a Cygwin /tmp path to it -[ "$COM" == MSC ] && XSL=`cygpath -m -s $XSL` - -WRKDIR=`mktemp -d /tmp/${tempfoo}.XXXXXX` -if [ $? -ne 0 ]; then - echo "$0: Can't create temp dir, exiting..." - exit 1 -fi - -cat > $XSL << EOF -<?xml version="1.0" encoding="UTF-8"?> -<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0"> - -<xsl:template match="node()|@*"> - <xsl:copy> - <xsl:apply-templates select="@*|node()"/> - </xsl:copy> -</xsl:template> - -<xsl:template match="@fo:language"/> -<xsl:template match="@fo:country"/> - -</xsl:stylesheet> -EOF - -unzip -q $1 -d $WRKDIR -pushd $WRKDIR -for a in *; do - unzip -qc $a styles.xml > styles.tmp - eval "$CALLXSLTPROC -o styles.xml $XSL styles.tmp" - zip -qr $a styles.xml - rm styles.xml styles.tmp -done -popd -zip -qrj $1 $WRKDIR -rm -rf $WRKDIR -rm -f $XSL diff --git a/solenv/bin/subsequenttests b/solenv/bin/subsequenttests deleted file mode 100755 index 5052523cf..000000000 --- a/solenv/bin/subsequenttests +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# Version: MPL 1.1 / GPLv3+ / LGPLv3+ -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License or as specified alternatively below. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Initial Developer of the Original Code is -# Bjoern Michaelsen, Canonical Ltd. <bjoern.michaelsen@canonical.com> -# Portions created by the Initial Developer are Copyright (C) 2010 the -# Initial Developer. All Rights Reserved. -# -# Major Contributor(s): -# -# For minor contributions see the git repository. -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 3 or later (the "GPLv3+"), or -# the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), -# in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable -# instead of those above. -set -e -${GNUMAKE} -sf ${SOLARSRC}/GNUmakefile.mk subsequentcheck $* diff --git a/solenv/bin/touch.pl b/solenv/bin/touch.pl deleted file mode 100644 index d13903d41..000000000 --- a/solenv/bin/touch.pl +++ /dev/null @@ -1,42 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* -# -# workaround for broken 4nt -# internal touch command -# - -foreach my $filename (@ARGV) { - open KKK, ">>$filename" or die "ERROR: cannot open $filename!\n"; - $size=(stat($filename))[7]; - print KKK "x"; - truncate KKK, $size; - close KKK; -} - diff --git a/solenv/bin/transform_description.pl b/solenv/bin/transform_description.pl deleted file mode 100644 index da0d0556c..000000000 --- a/solenv/bin/transform_description.pl +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/perl -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2011 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. -# -#************************************************************************* - -parse_args(); -execute_args(); -exit(0); - -my $source = undef; -my $dest = undef; -my @languages = undef; - -sub parse_args -{ - # at most two arguments - explain(), exit(100) if ( $#ARGV > 1 ); - - # destination file is the second argument, if present - $dest = $ARGV[1] if ( $#ARGV > 0 ); - - # source file is the first argument if present - if ( $#ARGV > -1 ) - { - $source = $ARGV[0]; - if ( ! -f $source ) - { - print STDERR "$source is not a valid file, aborting"; - exit(101); - } - } - - # check which languages to use - my $languages = $ENV{WITH_LANG}; - if ( ( ! defined $languages ) || ( "$languages" eq "" ) ) - { - print STDERR "$0: WITH_LANG not set or empty, defaulting to 'en-US'\n"; - $languages = "en-US"; - } - @languages = split ( ' ', $languages ); -} - -sub execute_args -{ - my @description = (); - if ( defined $source ) - { - open SOURCE, "$source" || die "could not open $source: $?\n"; - @description = <SOURCE>; - close SOURCE; - } - else - { - @description = <STDIN>; - } - - if ( defined $dest ) - { - open DEST, ">$dest" || die "could not open $dest for writing: $?\n"; - } - - foreach (@description) - { - chomp; s/\r//; - - if ( /\#LANG\#/ ) - { - foreach $lang ( @languages ) - { - my $transformed = $_; - $transformed =~ s/\#LANG#/$lang/g; - if ( defined $dest ) - { - print DEST "$transformed\n"; - } - else - { - print STDOUT "$transformed\n"; - } - } - } - else - { - if ( defined $dest ) - { - print DEST "$_\n"; - } - else - { - print STDOUT "$_\n"; - } - } - } - - close DEST if ( defined $dest ); -} - -# explains the program's usage -sub explain -{ - print STDOUT "usage:\n"; - print STDOUT " $0 [<description_file> [<output_file>]]\n"; - print STDOUT " transforms the given extension description file\n"; - print STDOUT "\n"; - print STDOUT " If <output_file> is not given, STDOUT is used.\n"; - print STDOUT " If <description_file> is not given, STDIN is used.\n"; - print STDOUT "\n"; - print STDOUT " The following transformations are done at the moment:\n"; - print STDOUT " - duplicate all lines containing #LANG#, for ever token of \$WITH_LANG\n"; - print STDOUT " replacing every occurrence of \$LANG with a token\n"; - print STDOUT "\n"; - print STDOUT " And yes, the functionality of this script should be\n"; - print STDOUT " - moved to solenv/inc/tg_ext.mk\n"; - print STDOUT " - implemented as XSLT, to be much less error-prone\n"; -} diff --git a/solenv/bin/unxmap-to-macosx-explist.awk b/solenv/bin/unxmap-to-macosx-explist.awk deleted file mode 100644 index b791d46a2..000000000 --- a/solenv/bin/unxmap-to-macosx-explist.awk +++ /dev/null @@ -1,63 +0,0 @@ -#************************************************************************* -# -# 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. -# -#************************************************************************* - -# Generate an exported symbols list out of a map file (as use on Linux/Solaris) in order to -# build shared libraries on Mac OS X -# -# The below code fails may fail with 'perverted' mapfiles (using a strange line layout etc.) - -# Skip 'SECTION_NAME {' lines -/^[\t ]*.*[\t ]*\{/ { next } - -# Skip 'global:' or 'local:' lines -/global:/ || /local:/ { next } - -# Skip '*;' lines -/^[\t ]*\*;[\t ]*/ { next } - -# Skip section end '}?;' lines -/^[\t ]*\}[\t ]*.*[;]*/ { next } - -# Skip comment or empty lines -/^[\t ]*#.*/ || /^[\t ]*$/ || /^$/ { next } - -# Echo all lines containing symbol names and prefix them with '_' -# because symbols on Mac OS X start always with '__' -{ - # There may appear multiple symbols in one line - # e.g. "sym1; sym2; # and finally a comment" - # take this into account - for (i = 1; i <= NF ; i++) { - if ($i !~ /^[\t ]*#.*/) { # as long as the current field doesn't start with '#' - gsub(/[\t ;]/, "", $i) # Remove leading spaces and trailing ';' - printf("_%s\n",$i) - } - else { # ignore everything after a '#' (comment) sign - break - } - } -} diff --git a/solenv/bin/zipdep.pl b/solenv/bin/zipdep.pl deleted file mode 100755 index 42803310e..000000000 --- a/solenv/bin/zipdep.pl +++ /dev/null @@ -1,326 +0,0 @@ -: -eval 'exec perl -wS $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# 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. -# -#************************************************************************* - -# -# mapgen - generate a dependencies file for zip commando -# -use Cwd; - -######################### -# # -# Globale Variablen # -# # -######################### - -$zip_file = ''; -$R = ''; -$r = ''; -$exclude = ''; -$include = ''; -@given_patterns = (); # patterns(files) list from command line -%files_in_arch = (); -@exc_patterns = (); # array of all patterns for files to be excluded -@inc_patterns = (); # array of all patterns for files to be included -%exc_files_hash = (); # hash of files to be excluded (according to @exc_patterns) -%inc_files_hash = (); # hash of files to be included (according to @inc_patterns) -$prefix = ''; - -#### main #### - -&get_options; -&get_zip_content; -&write_zip_file; - -#### end of main procedure #### - -######################### -# # -# Procedures # -# # -######################### - -# -# procedure writes zipdep file -# -sub write_zip_file { - my @dependencies = keys %files_in_arch; - if ($#dependencies != -1) { - print "\n". &convert_slashes($zip_file) . ' :'; - foreach (@dependencies) { - next if (-d); - print " \\\n\t" . $prefix . &convert_slashes($_); - }; - print "\n\n"; - }; -}; - -# -# convert slashes -# -sub convert_slashes { - my $path = shift; - $path =~ s/\//\$\//g; - $path =~ s/\\/\$\//g; - return $path; -}; - -# -# convert slashes to internal perl representation -# -sub perled_slashes { - my $path = shift; - $path =~ s/\\/\//g; - $path =~ s/\/+/\//g; - return $path; -}; - -# -# Collect all files to zip in @patterns_array array -# -sub get_zip_content { - &get_zip_entries(\@given_patterns); - my $file_name = ''; - foreach $file_name (keys %files_in_arch) { - if (-d $file_name) { - &get_dir_content($file_name, \%files_in_arch) if ($r || $R); - undef $files_in_arch{$file_name}; - }; - }; - &remove_uncompliant(\@given_patterns) if ($R); - &get_patterns_files(\@exc_patterns, \%exc_files_hash) if ($exclude); - &get_patterns_files(\@inc_patterns, \%inc_files_hash) if ($include); - foreach my $file_name (keys %exc_files_hash) { - if (defined $files_in_arch{$file_name}) { - delete $files_in_arch{$file_name}; - #print STDERR "excluded $file_name\n"; - }; - }; - if ($include) { - foreach my $file_name (keys %files_in_arch) { - if (!(defined $inc_files_hash{$file_name})) { - delete $files_in_arch{$file_name}; - }; - }; - } -}; - -# -# Procedure removes from %files_in_arch all files which -# are not compliant to patterns in @given_patterns -# -sub remove_uncompliant { - my $given_patterns = shift; - my @reg_exps = (); - my $pattern = ''; - foreach $pattern (@$given_patterns) { - push(@reg_exps, &make_reg_exp($pattern)); - }; - # write file name as a value for the path(key) - foreach my $file (keys %files_in_arch) { - next if (-d $file); - #print "$file\n"; - if ($file =~ /[\\ | \/](.+)$/) { - $files_in_arch{$file} = $1; - } else { - $files_in_arch{$file} = $file; - }; - }; - foreach $pattern (@reg_exps) { - foreach my $file (keys %files_in_arch) { - if (!($files_in_arch{$file} =~ /$pattern/)) { - delete $files_in_arch{$file}; - #} else { - # print "Complient: $file\n"; - }; - }; - }; -}; - -# -# Procedure adds/removes to/from %files_in_arch all files, that are -# compliant to the patterns in array passed -# -sub get_zip_entries { - if ($R) { - opendir DIR, '.'; - my @dir_content = readdir(DIR); - close DIR; - foreach my $file_name(@dir_content) { - $file_name =~ /^\.$/ and next; - $file_name =~ /^\.\.$/ and next; - $files_in_arch{$file_name}++; - #print "included $file_name\n"; - }; - } else { - my $patterns_array = shift; - my $pattern = ''; - foreach $pattern (@$patterns_array) { - if ((-d $pattern) || (-f $pattern)) { - $files_in_arch{$pattern}++; - next; - } - my $file_name = ''; - foreach $file_name (glob $pattern) { - #next if (!(-d $file_name) || !(-f $file_name)); - $files_in_arch{$file_name}++; - }; - }; - } -}; - -# -# Procedure converts given parameter to a regular expression -# -sub make_reg_exp { - my $arg = shift; - $arg =~ s/\\/\\\\/g; - $arg =~ s/\//\\\//g; - $arg =~ s/\./\\\./g; - $arg =~ s/\+/\\\+/g; - $arg =~ s/\{/\\\{/g; - $arg =~ s/\}/\\\}/g; - $arg =~ s/\*/\.\*/g; - $arg =~ s/\?/\./g; - #$arg = '/'.$arg.'/'; - #print "Regular expression: $arg\n"; - return $arg; -}; - -# -# Procedure retrieves shell pattern and converts them into regular expressions -# -sub get_patterns { - my $patterns = shift; - my $arg = ''; - while ($arg = shift @ARGV) { - $arg =~ /^-/ and unshift(@ARGV, $arg) and return; - if (!$zip_file) { - $zip_file = $arg; - next; - }; - $arg = &make_reg_exp($arg); - push(@$patterns, $arg); - }; -}; - -# -# Get all options passed -# -sub get_options { - my ($arg); - &usage() && exit(0) if ($#ARGV == -1); - while ($arg = shift @ARGV) { - $arg = &perled_slashes($arg); - #print STDERR "$arg\n"; - $arg =~ /^-R$/ and $R = 1 and next; - $arg =~ /^-r$/ and $r = 1 and next; - $arg =~ /^-x$/ and $exclude = 1 and &get_patterns(\@exc_patterns) and next; - $arg =~ /^-i$/ and $include = 1 and &get_patterns(\@inc_patterns) and next; - $arg =~ /^-prefix$/ and $prefix = shift @ARGV and next; - $arg =~ /^-b$/ and shift @ARGV and next; - $arg =~ /^-n$/ and shift @ARGV and next; - $arg =~ /^-t$/ and shift @ARGV and next; - $arg =~ /^-tt$/ and shift @ARGV and next; - $arg =~ /^-h$/ and &usage and exit(0); - $arg =~ /^--help$/ and &usage and exit(0); - $arg =~ /^-?$/ and &usage and exit(0); - if ($arg =~ /^-(\w)(\w+)$/) { - unshift (@ARGV, '-'.$1); - unshift (@ARGV, '-'.$2); - next; - }; -# just ignore other switches... - $arg =~ /^-(\w+)$/ and next; - $arg =~ /^\/\?$/ and &usage and exit(0); - $zip_file = $arg and next if (!$zip_file); - push(@given_patterns, $arg); - }; - &print_error('error: Invalid command arguments (do not specify both -r and -R)') if ($r && $R); - if ($r && ($#given_patterns == -1)) { - &print_error('no list specified'); - }; -}; - -# -# Procedure fills out passed hash with files from passed dir -# compliant to the pattern from @$patterns -# -sub get_patterns_files { - my $patterns_array = shift; - my $files_hash = shift; - my @zip_files = keys %files_in_arch; - foreach my $pattern (@$patterns_array) { - my @fit_pattern = grep /$pattern/, @zip_files; - foreach my $entry (@fit_pattern) { - $$files_hash{$entry}++; - #print "$entry\n"; - }; - }; -}; - -# -# Get dir stuff to pack -# -sub get_dir_content { - my $dir = shift; - my $dir_hash_ref = shift; - my $entry = ''; - if (opendir(DIR, $dir)) { - my @prj_dir_list = readdir(DIR); - closedir (DIR); - foreach $entry (@prj_dir_list) { - $entry =~ /^\.$/ and next; - $entry =~ /^\.\.$/ and next; - - $entry = $dir . '/' . $entry; - # if $enry is a dir - read all its files, - # otherwise store $entry itself - if (-d $entry) { - &get_dir_content($entry, $dir_hash_ref); - } else { - $$dir_hash_ref{$entry}++; - }; - }; - }; - return '1'; -}; - -sub print_error { - my $message = shift; - print STDERR "\nERROR: $message\n"; - exit (1); -}; - -sub usage { - print STDERR " zipdep [-aABcdDeEfFghjklLmoqrRSTuvVwXyz] [-b path]\n"; - print STDERR " [-n suffixes] [-t mmddyyyy] [-tt mmddyyyy] [ zipfile [\n"; - print STDERR " file1 file2 ...]] [-xi list]\n"; -} - |