#**************************************************************
#
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#
#**************************************************************



use Cwd;
use File::Copy;

#################################################################################
# Global settings
#################################################################################

BEGIN
{
	$prog = "msi installer";
	$targetdir = "";
	$databasepath = "";
	$starttime = "";
	$globaltempdirname = "ooopackaging";
	$savetemppath = "";
	$msiinfo_available = 0;
	$path_displayed = 0;
	$localmsidbpath = "";

	$plat = $^O;

	if ( $plat =~ /cygwin/i )
	{
		$separator = "/";
		$pathseparator = "\:";
	}
	else
	{
		$separator = "\\";
		$pathseparator = "\;";
	}
}

#################################################################################
# Program information
#################################################################################

sub usage
{
	print <<Ende;
----------------------------------------------------------------------
This program installs a Windows Installer installation set
without using msiexec.exe. The installation is comparable
with an administrative installation using the Windows Installer
service.
Required parameter:
-d Path to installation set or msi database
-t Target directory
---------------------------------------------------------------------
Ende
	exit(-1);
}

#################################################################################
# Collecting parameter
#################################################################################

sub getparameter
{
	if (( $#ARGV < 3 ) || ( $#ARGV > 3 )) { usage(); }

	while ( $#ARGV >= 0 )
	{
		my $param = shift(@ARGV);

		if ($param eq "-t") { $targetdir = shift(@ARGV); }
		elsif ($param eq "-d") { $databasepath = shift(@ARGV); }
		else
		{
			print "\n**********************************************\n";
			print "Error: Unknown parameter: $param";
			print "\n**********************************************\n";
			usage();
			exit(-1);
		}
	}
}

#################################################################################
# Checking content of parameter
#################################################################################

sub controlparameter
{
	if ( $targetdir eq "" )
	{
		print "\n******************************************************\n";
		print "Error: Target directory not defined (parameter -t)!";
		print "\n******************************************************\n";
		usage();
		exit(-1);
	}

	if ( $databasepath eq "" )
	{
		print "\n******************************************************\n";
		print "Error: Path to msi database not defined (parameter -d)!";
		print "\n******************************************************\n";
		usage();
		exit(-1);
	}

	if ( -d $databasepath )
	{
		$databasepath =~ s/\\\s*$//;
		$databasepath =~ s/\/\s*$//;

		my $msifiles = find_file_with_file_extension("msi", $databasepath);

		if ( $#{$msifiles} < 0 ) { exit_program("ERROR: Did not find msi database in directory $installationdir"); }
		if ( $#{$msifiles} > 0 ) { exit_program("ERROR: Did find more than one msi database in directory $installationdir"); }

		$databasepath = $databasepath . $separator . ${$msifiles}[0];
	}

	if ( ! -f $databasepath ) { exit_program("ERROR: Did not find msi database in directory $databasepath."); }

	if ( ! -d $targetdir ) { create_directories($targetdir); }
}

#############################################################################
# The program msidb.exe can be located next to the Perl program. Then it is
# not necessary to find it in the PATH variable.
#############################################################################

sub check_local_msidb
{
	my $msidbname = "msidb.exe";
	my $perlprogramm = $0;
	my $path = $perlprogramm;

	get_path_from_fullqualifiedname(\$path);

	$path =~ s/\\\s*$//;
	$path =~ s/\/\s*$//;

	my $msidbpath = "";
	if ( $path =~ /^\s*$/ ) { $msidbpath = $msidbname; }
	else { $msidbpath = $path . $separator . $msidbname; }

	if ( -f $msidbpath )
	{
		$localmsidbpath = $msidbpath;
		print "Using $msidbpath (next to \"admin.pl\")\n";
	}
}

#############################################################################
# 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;
		# Problem with two directly following listseparators. For example a path with two ";;" directly behind each other
		$first =~ s/^$listseparator//;
		push(@newarray, "$first\n");
	}

	push(@newarray, "$last\n");

	return \@newarray;
}

#########################################################
# Checking the local system
# Checking existence of needed files in include path
#########################################################

sub check_system_path
{
	my $onefile;
	my $error = 0;
	my $pathvariable = $ENV{'PATH'};
	my $local_pathseparator = $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 = convert_stringlist_into_array(\$pathvariable, $local_pathseparator);

	my @needed_files_in_path = ("expand.exe");
	if ( $localmsidbpath eq "" ) { push(@needed_files_in_path, "msidb.exe"); } # not found locally -> search in path
	my @optional_files_in_path = ("msiinfo.exe");

	print("\nChecking required files:\n");

	foreach $onefile ( @needed_files_in_path )
	{
		print("...... searching $onefile ...");

		my $fileref = get_sourcepath_from_filename_and_includepath(\$onefile, $patharrayref);

		if ( $$fileref eq "" )
		{
			$error = 1;
			print( "$onefile not found\n" );
		}
		else
		{
			print( "\tFound: $$fileref\n" );
		}
	}

	if ( $error ) { exit_program("ERROR: Could not find all needed files in path (using setsolar should help)!"); }

	print("\nChecking optional files:\n");

	foreach $onefile ( @optional_files_in_path )
	{
		print("...... searching $onefile ...");

		my $fileref = get_sourcepath_from_filename_and_includepath(\$onefile, $patharrayref);

		if ( $$fileref eq "" )
		{
			print( "$onefile not found\n" );
			if ( $onefile eq "msiinfo.exe" ) { $msiinfo_available = 0; }
		}
		else
		{
			print( "\tFound: $$fileref\n" );
			if ( $onefile eq "msiinfo.exe" ) { $msiinfo_available = 1; }
		}
	}

}

##########################################################################
# Searching a file in a list of paths
##########################################################################

sub get_sourcepath_from_filename_and_includepath
{
	my ($searchfilenameref, $includepatharrayref) = @_;

	my $onefile = "";
	my $foundsourcefile = 0;

	for ( my $j = 0; $j <= $#{$includepatharrayref}; $j++ )
	{
		my $includepath = ${$includepatharrayref}[$j];
		$includepath =~ s/^\s*//;
		$includepath =~ s/\s*$//;

		$onefile = $includepath . $separator . $$searchfilenameref;

		if ( -f $onefile )
		{
			$foundsourcefile = 1;
			last;
		}
	}

	if (!($foundsourcefile)) { $onefile = ""; }

	return \$onefile;
}

##############################################################
# 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$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 . $separator . $oneitem;

				if ( -d $item ) # recursive
				{
					remove_empty_dirs_in_folder($item, 0);
				}
			}
		}

		# try to remove empty directory
		my $returnvalue = rmdir $dir;

		# if ( $returnvalue ) { print "Successfully removed empty dir $dir\n"; }
	}
}

####################################################
# Detecting the directory with extensions
####################################################

sub get_extensions_dir
{
	my ( $unopkgfile ) = @_;

	my $localbranddir = $unopkgfile;
	get_path_from_fullqualifiedname(\$localbranddir); # "program" dir in brand layer
	get_path_from_fullqualifiedname(\$localbranddir); # root dir in brand layer
	$localbranddir =~ s/\Q$separator\E\s*$//;
	my $extensiondir = $localbranddir . $separator . "share" . $separator . "extensions";
	my $preregdir = $localbranddir . $separator . "share" . $separator . "prereg" . $separator . "bundled";

	return ($extensiondir, $preregdir);
}

########################################################
# Finding all files with a specified file extension
# in a specified directory.
########################################################

sub find_file_with_file_extension
{
	my ($extension, $dir) = @_;

	my @allfiles = ();
	my @sourcefiles = ();

	$dir =~ s/\Q$separator\E\s*$//;

	opendir(DIR, $dir);
	@sourcefiles = 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 directory with all parent directories
##############################################################

sub create_directories
{
	my ($directory) = @_;

	if ( ! try_to_create_directory($directory) )
	{
		my $parentdir = $directory;
		get_path_from_fullqualifiedname(\$parentdir);
		create_directories($parentdir);   # recursive
	}

	create_directory($directory);	# now it has to succeed
}

##############################################################
# Creating one directory
##############################################################

sub create_directory
{
	my ($directory) = @_;

	if ( ! -d $directory ) { mkdir($directory, 0775); }
}

##############################################################
# 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;

			my $localcall = "chmod 775 $directory \>\/dev\/null 2\>\&1";
			system($localcall);
		}
		else
		{
			$created_directory = 0;
		}
	}
	else
	{
		$created_directory = 1;
	}

	return $created_directory;
}

###########################################
# Getting path from full file name
###########################################

sub get_path_from_fullqualifiedname
{
	my ($longfilenameref) = @_;

	if ( $$longfilenameref =~ /\Q$separator\E/ )	# Is there a separator in the path? Otherwise the path is empty.
	{
		if ( $$longfilenameref =~ /^\s*(\S.*\Q$separator\E)(\S.+\S?)/ )
		{
			$$longfilenameref = $1;
		}
	}
	else
	{
		$$longfilenameref = "";	# there is no path
	}
}

##############################################################
# Getting file name from full file name
##############################################################

sub make_absolute_filename_to_relative_filename
{
	my ($longfilenameref) = @_;

	# Either '/' or '\'.
	if ( $$longfilenameref =~ /^.*[\/\\](\S.+\S?)/ )
	{
		$$longfilenameref = $1;
	}
}

############################################
# Exiting the program with an error
# This function is used instead of "die"
############################################

sub exit_program
{
	my ($message) = @_;

	print "\n***************************************************************\n";
	print "$message\n";
	print "***************************************************************\n";
	remove_complete_directory($savetemppath, 1);
	print "\n" . get_time_string();
	exit(-1);
}

#################################################################################
# Unpacking cabinet files with expand
#################################################################################

sub unpack_cabinet_file
{
	my ($cabfilename, $unpackdir) = @_;

	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 = $ENV{'SYSTEMROOT'} . "/system32/expand.exe"; # Has to be located in the systemdirectory
		$expandfile =~ s/\\/\//;
		if ( ! -f $expandfile ) { exit_program("ERROR: Did not find file $expandfile in the Windows system folder!"); }
	}

	my $expandlogfile = $unpackdir . $separator . "expand.log";

	# exclude cabinet file
	# my $systemcall = $cabarc . " -o X " . $mergemodulehash->{'cabinetfile'};

	my $systemcall = "";
	if ( $^O =~ /cygwin/i ) {
		my $localunpackdir = qx{cygpath -w "$unpackdir"};
		$localunpackdir =~ s/\\/\\\\/g;

		my $localcabfilename = qx{cygpath -w "$cabfilename"};
		$localcabfilename =~ s/\\/\\\\/g;
		$localcabfilename =~ s/\s*$//g;

		$systemcall = $expandfile . " " . $localcabfilename . " -F:\* " . $localunpackdir . " \>\/dev\/null 2\>\&1";
	}
	else
	{
		$systemcall = $expandfile . " " . $cabfilename . " -F:\* " . $unpackdir . " \> " . $expandlogfile;
	}

	my $returnvalue = system($systemcall);

	if ($returnvalue) { exit_program("ERROR: Could not execute $systemcall !"); }
}

#################################################################################
# Extracting tables from msi database
#################################################################################

sub extract_tables_from_database
{
	my ($fullmsidatabasepath, $workdir, $tablelist) = @_;

	my $msidb = "msidb.exe";	# Has to be in the path
	if ( $localmsidbpath ) { $msidb = $localmsidbpath; }
	my $infoline = "";
	my $systemcall = "";
	my $returnvalue = "";

	if ( $^O =~ /cygwin/i ) {
		chomp( $fullmsidatabasepath = qx{cygpath -w "$fullmsidatabasepath"} );
		# msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
		$fullmsidatabasepath =~ s/\\/\\\\/g;
		$workdir =~ s/\\/\\\\/g;
		# and if there are still slashes, they also need to be double backslash
		$fullmsidatabasepath =~ s/\//\\\\/g;
		$workdir =~ s/\//\\\\/g;
	}

	# Export of all tables by using "*"

	$systemcall = $msidb . " -d " . $fullmsidatabasepath . " -f " . $workdir . " -e $tablelist";
	print "\nAnalyzing msi database\n";
	$returnvalue = system($systemcall);

	if ($returnvalue)
	{
		$infoline = "ERROR: Could not execute $systemcall !\n";
		exit_program($infoline);
	}
}

########################################################
# 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 );
}

#################################################################
# Exclude all cab files from the msi database.
#################################################################

sub extract_cabs_from_database
{
	my ($msidatabase, $allcabfiles) = @_;

	my $infoline = "";
	my $fullsuccess = 1;
	my $msidb = "msidb.exe";	# Has to be in the path
	if ( $localmsidbpath ) { $msidb = $localmsidbpath; }

	my @all_excluded_cabfiles = ();

	if( $^O =~ /cygwin/i )
	{
		$msidatabase = qx{cygpath -w "$msidatabase"};
		$msidatabase =~ s/\\/\\\\/g;
		$msidatabase =~ s/\s*$//g;
	}
	else
	{
		# 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;
 		system($systemcall);
 		push(@all_excluded_cabfiles, $onefile);
	}

	\@all_excluded_cabfiles;
}

################################################################################
# Collect all DiskIds to the corresponding cabinet files from Media.idt.
################################################################################

sub analyze_media_file
{
	my ($filecontent) = @_;

	my %diskidhash = ();

	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 $cabfile = $4;

			$diskidhash{$cabfile} = $diskid;
		}
	}

	return \%diskidhash;
}

sub analyze_customaction_file
{
	my ($filecontent) = @_;

	my $register_extensions_exists = 0;

	my %table = ();

	for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
	{
		if ( ${$filecontent}[$i] =~ /^\s*RegisterExtensions\s+/ )
		{
			$register_extensions_exists = 1;
			last;
		}
	}

	return $register_extensions_exists;
}

################################################################################
# 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 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 . $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) = @_;

	print "Creating directories\n";

	my %fullpathhash = ();

	my @startparents = ("TARGETDIR", "INSTALLLOCATION");

	foreach $dir (@startparents) { create_directory_tree($dir, \%fullpathhash, $targetdir, $dirhash); }

	# Also adding the paths of the startparents
	foreach $dir (@startparents)
	{
		if ( ! exists($fullpathhash{$dir}) ) { $fullpathhash{$dir} = $targetdir; }
	}

	return \%fullpathhash;
}

####################################################################################
# Cygwin: Setting privileges for files
####################################################################################

sub change_privileges
{
	my ($destfile, $privileges) = @_;

	my $localcall = "chmod $privileges " . "\"" . $destfile . "\"";
	system($localcall);
}

####################################################################################
# Cygwin: Setting privileges for files recursively
####################################################################################

sub change_privileges_full
{
	my ($target) = @_;

	print "Changing privileges\n";

	my $localcall = "chmod -R 755 " . "\"" . $target . "\"";
	system($localcall);
}

######################################################
# Creating a new directory with defined privileges
######################################################

sub create_directory_with_privileges
{
	my ($directory, $privileges) = @_;

	my $returnvalue = 1;
	my $infoline = "";

	if (!(-d $directory))
	{
		my $localprivileges = oct("0".$privileges); # changes "777" to 0777
		$returnvalue = mkdir($directory, $localprivileges);

		if ($returnvalue)
		{
			my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1";
			system($localcall);
		}
	}
	else
	{
		my $localcall = "chmod $privileges $directory \>\/dev\/null 2\>\&1";
		system($localcall);
	}
}

######################################################
# Creating a unique directory with pid extension
######################################################

sub create_pid_directory
{
	my ($directory) = @_;

	$directory =~ s/\Q$separator\E\s*$//;
	my $pid = $$;			# process id
	my $time = time();		# time

	$directory = $directory . "_" . $pid . $time;

	if ( ! -d $directory ) { create_directory($directory); }
	else { exit_program("ERROR: Directory $directory already exists!"); }

	return $directory;
}

####################################################################################
# Copying files into installation set
####################################################################################

sub copy_files_into_directory_structure
{
	my ($fileorder, $filehash, $componenthash, $fullpathhash, $maxsequence, $unpackdir, $installdir, $dirhash) = @_;

	print "Copying files\n";

	my $unopkgfile = "";

	for ( my $i = 1; $i <= $maxsequence; $i++ )
	{
		if ( exists($fileorder->{$i}) )
		{
			my $file = $fileorder->{$i};
			if ( ! exists($filehash->{$file}->{'Component'}) ) { exit_program("ERROR: Did not find component for file: \"$file\"."); }
			my $component = $filehash->{$file}->{'Component'};
			if ( ! exists($componenthash->{$component}) ) { exit_program("ERROR: Did not find directory for component: \"$component\"."); }
			my $dirname = $componenthash->{$component};
			if ( ! exists($fullpathhash->{$dirname}) ) { exit_program("ERROR: Did not find full directory path for dir: \"$dirname\"."); }
			my $destdir = $fullpathhash->{$dirname};
			if ( ! exists($filehash->{$file}->{'FileName'}) ) { exit_program("ERROR: Did not find \"FileName\" for file: \"$file\"."); }
			my $destfile = $filehash->{$file}->{'FileName'};

			$destfile = $destdir . $separator . $destfile;
			my $sourcefile = $unpackdir . $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'} . $separator; }
				my $realfilename = $filehash->{$file}->{'FileName'};
				my $localinstalldir = $installdir;

				$localinstalldir =~ s/\\\s*$//;
				$localinstalldir =~ s/\/\s*$//;

				$sourcefile = $localinstalldir . $separator . $subdir . $realfilename;

				if ( ! -f $sourcefile ) { exit_program("ERROR: File not found: \"$oldsourcefile\" (or \"$sourcefile\")."); }
			}

			my $copyreturn = copy($sourcefile, $destfile);

			if ( ! $copyreturn) { exit_program("ERROR: Could not copy $source to $dest\n"); }

			# Searching unopkg.exe
			if ( $destfile =~ /unopkg\.exe\s*$/ ) { $unopkgfile = $destfile; }
			# if (( $^O =~ /cygwin/i ) && ( $destfile =~ /\.exe\s*$/ )) { change_privileges($destfile, "775"); }
		}
		# else	# allowing missing sequence numbers ?
		# {
		# 	exit_program("ERROR: No file assigned to sequence $i");
		# }
	}

	return ($unopkgfile);
}

######################################################
# Removing a complete directory with subdirectories
######################################################

sub remove_complete_directory
{
	my ($directory, $start) = @_;

	my @content = ();
	my $infoline = "";

	$directory =~ s/\Q$separator\E\s*$//;

	if ( -d $directory )
	{
		if ( $start ) { print "Removing directory $directory\n"; }

		opendir(DIR, $directory);
		@content = readdir(DIR);
		closedir(DIR);

		my $oneitem;

		foreach $oneitem (@content)
		{
			if ((!($oneitem eq ".")) && (!($oneitem eq "..")))
			{
				my $item = $directory . $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 ) { print "Warning: Problem with removing empty dir $directory\n"; }
	}
}

####################################################################################
# Defining a temporary path
####################################################################################

sub get_temppath
{
	my $temppath = "";

	if (( $ENV{'TMP'} ) || ( $ENV{'TEMP'} ))
	{
		if ( $ENV{'TMP'} ) { $temppath = $ENV{'TMP'}; }
		elsif ( $ENV{'TEMP'} )  { $temppath = $ENV{'TEMP'}; }

		$temppath =~ s/\Q$separator\E\s*$//;	# removing ending slashes and backslashes
		$temppath = $temppath . $separator . $globaltempdirname;
		create_directory_with_privileges($temppath, "777");

		my $dirsave = $temppath;

		$temppath = $temppath . $separator . "a";
		$temppath = create_pid_directory($temppath);

		if ( ! -d $temppath ) { exit_program("ERROR: Failed to create directory $temppath ! Possible reason: Wrong privileges in directory $dirsave."); }

		if ( $^O =~ /cygwin/i )
		{
			$temppath =~ s/\\/\\\\/g;
			chomp( $temppath = qx{cygpath -w "$temppath"} );
		}

		$savetemppath = $temppath;
	}
	else
	{
		exit_program("ERROR: Could not set temporary directory (TMP and TEMP not set!).");
	}

	return $temppath;
}

####################################################################################
# Registering extensions
####################################################################################

sub register_extensions_sync
{
	my ($unopkgfile, $localtemppath, $preregdir) = @_;

	if ( $preregdir eq "" )
	{
		my $logtext = "ERROR: Failed to determine \"prereg\" folder for extension registration! Please check your installation set.";
		print $logtext . "\n";
		exit_program($logtext);
	}

	my $from = cwd();

	my $path = $unopkgfile;
	get_path_from_fullqualifiedname(\$path);
	$path =~ s/\\\s*$//;
	$path =~ s/\/\s*$//;

	my $executable = $unopkgfile;
	make_absolute_filename_to_relative_filename(\$executable);

	chdir($path);

	if ( ! $path_displayed )
	{
		print "... current dir: $path ...\n";
		$path_displayed = 1;
	}

	$localtemppath =~ s/\\/\//g;

	if ( $^O =~ /cygwin/i ) {
		$executable = "./" . $executable;
		$preregdir = qx{cygpath -m "$preregdir"};
		chomp($preregdir);
	}

	$preregdir =~ s/\/\s*$//g;

	my $systemcall = $executable . " sync --verbose 2\>\&1 |";

	print "... $systemcall\n";

	my @unopkgoutput = ();

	open (UNOPKG, $systemcall);
	while (<UNOPKG>) {push(@unopkgoutput, $_); }
	close (UNOPKG);

	my $returnvalue = $?;	# $? contains the return value of the systemcall

	if ($returnvalue)
	{
		print "ERROR: Could not execute \"$systemcall\"!\nExitcode: '$returnvalue'\n";
		for ( my $j = 0; $j <= $#unopkgoutput; $j++ ) { print "$unopkgoutput[$j]"; }
		exit_program("ERROR: $systemcall failed!");
	}

	chdir($from);
}

####################################################################################
# Registering all extensions located in /share/extension/install
####################################################################################

sub register_extensions
{
	my ($unopkgfile, $temppath, $preregdir) = @_;

	print "Registering extensions:\n";

	if (( ! -f $unopkgfile ) || ( $unopkgfile eq "" ))
	{
		print("WARNING: Could not find unopkg.exe (Language Pack?)!\n");
	}
	else
	{
		register_extensions_sync($unopkgfile, $temppath, $preregdir);
		remove_complete_directory($temppath, 1);
	}

}

####################################################################################
# Reading one file
####################################################################################

sub read_file
{
	my ($localfile) = @_;

	my @localfile = ();

	open( IN, "<$localfile" ) || exit_program("ERROR: Cannot open file $localfile for reading");

	#	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;
}

###############################################################
# 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++;

	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;
}

###############################################################
# 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) = @_;

	print "Setting SIS in msi database\n";

	if ( ! -f $msidatabase ) { exit_program("ERROR: Cannot find file $msidatabase"); }

	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";

	$returnvalue = system($systemcall);

	if ($returnvalue)
	{
		$infoline = "ERROR: Could not execute $systemcall !\n";
		exit_program($infoline);
	}
}

###############################################################
# 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 - $starttime;
	$currenttime = convert_timestring($currenttime);
	$currenttime = localtime() . " \(" . $currenttime . "\)\n";
	return $currenttime;
}

####################################################################################
# Simulating an administrative installation
####################################################################################

$starttime = time();

getparameter();
controlparameter();
check_local_msidb();
check_system_path();
my $temppath = get_temppath();

print("\nmsi database: $databasepath\n");
print("Destination directory: $targetdir\n" );

my $helperdir = $temppath . $separator . "installhelper";
create_directory($helperdir);

# Get File.idt, Component.idt and Directory.idt from database

my $tablelist = "File Directory Component Media CustomAction";
extract_tables_from_database($databasepath, $helperdir, $tablelist);

# Set unpackdir
my $unpackdir = $helperdir . $separator . "unpack";
create_directory($unpackdir);

# Reading media table to check for internal cabinet files
my $filename = $helperdir . $separator . "Media.idt";
if ( ! -f $filename ) { exit_program("ERROR: Could not find required file: $filename !"); }
my $filecontent = read_file($filename);
my $cabfilehash = analyze_media_file($filecontent);

# Check, if there are internal cab files
my ( $contains_internal_cabfiles, $all_internal_cab_files) = check_for_internal_cabfiles($cabfilehash);

if ( $contains_internal_cabfiles )
{
	# Set unpackdir
	my $cabdir = $helperdir . $separator . "internal_cabs";
	create_directory($cabdir);
	my $from = cwd();
	chdir($cabdir);
	# Exclude all cabinet files from database
	my $all_excluded_cabs = extract_cabs_from_database($databasepath, $all_internal_cab_files);
	print "Unpacking files from internal cabinet file(s)\n";
	foreach my $cabfile ( @{$all_excluded_cabs} ) { unpack_cabinet_file($cabfile, $unpackdir); }
	chdir($from);
}

# Unpack all cab files into $helperdir, cab files must be located next to msi database
my $installdir = $databasepath;

get_path_from_fullqualifiedname(\$installdir);

my $databasefilename = $databasepath;
make_absolute_filename_to_relative_filename(\$databasefilename);

my $cabfiles = find_file_with_file_extension("cab", $installdir);

if (( $#{$cabfiles} < 0 ) && ( ! $contains_internal_cabfiles )) { exit_program("ERROR: Did not find any cab file in directory $installdir"); }

print "Unpacking files from cabinet file(s)\n";
for ( my $i = 0; $i <= $#{$cabfiles}; $i++ )
{
	my $cabfile = $installdir . $separator . ${$cabfiles}[$i];
	unpack_cabinet_file($cabfile, $unpackdir);
}

# Reading tables
$filename = $helperdir . $separator . "Directory.idt";
$filecontent = read_file($filename);
my $dirhash = analyze_directory_file($filecontent);

$filename = $helperdir . $separator . "Component.idt";
$filecontent = read_file($filename);
my $componenthash = analyze_component_file($filecontent);

$filename = $helperdir . $separator . "File.idt";
$filecontent = 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);
if ( $^O =~ /cygwin/i ) { change_privileges_full($targetdir); }

my $msidatabase = $targetdir . $separator . $databasefilename;
my $copyreturn = copy($databasepath, $msidatabase);
if ( ! $copyreturn) { exit_program("ERROR: Could not copy $source to $dest\n"); }

# Reading tables
$filename = $helperdir . $separator . "CustomAction.idt";
$filecontent = read_file($filename);
my $register_extensions_exists = analyze_customaction_file($filecontent);

# Removing empty dirs in extension folder
my ( $extensionfolder, $preregdir ) = get_extensions_dir($unopkgfile);
if ( -d $extensionfolder ) { remove_empty_dirs_in_folder($extensionfolder, 1); }

if ( $register_extensions_exists )
{
	# Registering extensions
	register_extensions($unopkgfile, $temppath, $preregdir);
}

# Saving info in Summary Information Stream of msi database (required for following patches)
if ( $msiinfo_available ) { write_sis_info($msidatabase); }

# Removing the helper directory
remove_complete_directory($temppath, 1);

print "\nSuccessful installation: " . get_time_string();
