1#*************************************************************************
2#
3# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4#
5# Copyright 2000, 2010 Oracle and/or its affiliates.
6#
7# OpenOffice.org - a multi-platform office productivity suite
8#
9# This file is part of OpenOffice.org.
10#
11# OpenOffice.org is free software: you can redistribute it and/or modify
12# it under the terms of the GNU Lesser General Public License version 3
13# only, as published by the Free Software Foundation.
14#
15# OpenOffice.org is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18# GNU Lesser General Public License version 3 for more details
19# (a copy is included in the LICENSE file that accompanied this code).
20#
21# You should have received a copy of the GNU Lesser General Public License
22# version 3 along with OpenOffice.org.  If not, see
23# <http://www.openoffice.org/license.html>
24# for a copy of the LGPLv3 License.
25#
26#*************************************************************************
27
28package installer::download;
29
30use File::Spec;
31use installer::exiter;
32use installer::files;
33use installer::globals;
34use installer::logger;
35use installer::pathanalyzer;
36use installer::remover;
37use installer::systemactions;
38
39BEGIN { # This is needed so that cygwin's perl evaluates ACLs
40	# (needed for correctly evaluating the -x test.)
41	if( $^O =~ /cygwin/i ) {
42		require filetest; import filetest "access";
43	}
44}
45
46##################################################################
47# Including the lowercase product name into the script template
48##################################################################
49
50sub put_productname_into_script
51{
52	my ($scriptfile, $variableshashref) = @_;
53
54	my $productname = $variableshashref->{'PRODUCTNAME'};
55	$productname = lc($productname);
56	$productname =~ s/\.//g;	# openoffice.org -> openofficeorg
57	$productname =~ s/\s*//g;
58
59	my $infoline = "Adding productname $productname into download shell script\n";
60	push( @installer::globals::logfileinfo, $infoline);
61
62	for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
63	{
64		${$scriptfile}[$i] =~ s/PRODUCTNAMEPLACEHOLDER/$productname/;
65	}
66}
67
68#########################################################
69# Including the linenumber into the script template
70#########################################################
71
72sub put_linenumber_into_script
73{
74	my ( $scriptfile ) = @_;
75
76	my $linenumber =  $#{$scriptfile} + 2;
77
78	my $infoline = "Adding linenumber $linenumber into download shell script\n";
79	push( @installer::globals::logfileinfo, $infoline);
80
81	for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
82	{
83		${$scriptfile}[$i] =~ s/LINENUMBERPLACEHOLDER/$linenumber/;
84	}
85}
86
87#########################################################
88# Determining the name of the new scriptfile
89#########################################################
90
91sub determine_scriptfile_name
92{
93	my ( $filename ) = @_;
94
95	$installer::globals::downloadfileextension = ".sh";
96	$filename = $filename . $installer::globals::downloadfileextension;
97	$installer::globals::downloadfilename = $filename;
98
99	my $infoline = "Setting download shell script file name to $filename\n";
100	push( @installer::globals::logfileinfo, $infoline);
101
102	return $filename;
103}
104
105#########################################################
106# Saving the script file in the installation directory
107#########################################################
108
109sub save_script_file
110{
111	my ($directory, $newscriptfilename, $scriptfile) = @_;
112
113	$newscriptfilename = $directory . $installer::globals::separator . $newscriptfilename;
114	installer::files::save_file($newscriptfilename, $scriptfile);
115
116	my $infoline = "Saving script file $newscriptfilename\n";
117	push( @installer::globals::logfileinfo, $infoline);
118
119	if ( ! $installer::globals::iswindowsbuild )
120	{
121		my $localcall = "chmod 775 $newscriptfilename \>\/dev\/null 2\>\&1";
122		system($localcall);
123	}
124
125	return $newscriptfilename;
126}
127
128#########################################################
129# Including checksum and size into script file
130#########################################################
131
132sub put_checksum_and_size_into_script
133{
134	my ($scriptfile, $sumout) = @_;
135
136	my $checksum = "";
137	my $size = "";
138
139	if  ( $sumout =~ /^\s*(\d+)\s+(\d+)\s*$/ )
140	{
141		$checksum = $1;
142		$size = $2;
143	}
144	else
145	{
146		installer::exiter::exit_program("ERROR: Incorrect return value from /usr/bin/sum: $sumout", "put_checksum_and_size_into_script");
147	}
148
149	my $infoline = "Adding checksum $checksum and size $size into download shell script\n";
150	push( @installer::globals::logfileinfo, $infoline);
151
152	for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
153	{
154		${$scriptfile}[$i] =~ s/CHECKSUMPLACEHOLDER/$checksum/;
155		${$scriptfile}[$i] =~ s/DISCSPACEPLACEHOLDER/$size/;
156	}
157
158}
159
160#########################################################
161# Calling md5sum
162#########################################################
163
164sub call_md5sum
165{
166	my ($filename) = @_;
167
168	$md5sumfile = "/usr/bin/md5sum";
169
170	if ( ! -f $md5sumfile ) { installer::exiter::exit_program("ERROR: No file /usr/bin/md5sum", "call_md5sum"); }
171
172	my $systemcall = "$md5sumfile $filename |";
173
174	my $md5sumoutput = "";
175
176	open (SUM, "$systemcall");
177	$md5sumoutput = <SUM>;
178	close (SUM);
179
180	my $returnvalue = $?;	# $? contains the return value of the systemcall
181
182	my $infoline = "Systemcall: $systemcall\n";
183	push( @installer::globals::logfileinfo, $infoline);
184
185	if ($returnvalue)
186	{
187		$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
188		push( @installer::globals::logfileinfo, $infoline);
189	}
190	else
191	{
192		$infoline = "Success: Executed \"$systemcall\" successfully!\n";
193		push( @installer::globals::logfileinfo, $infoline);
194	}
195
196	return $md5sumoutput;
197}
198
199#########################################################
200# Calling md5sum
201#########################################################
202
203sub get_md5sum
204{
205	($md5sumoutput) = @_;
206
207	my $md5sum;
208
209	if  ( $md5sumoutput =~ /^\s*(\w+?)\s+/ )
210	{
211		$md5sum = $1;
212	}
213	else
214	{
215		installer::exiter::exit_program("ERROR: Incorrect return value from /usr/bin/md5sum: $md5sumoutput", "get_md5sum");
216	}
217
218	my $infoline = "Setting md5sum: $md5sum\n";
219	push( @installer::globals::logfileinfo, $infoline);
220
221	return $md5sum;
222}
223
224#########################################################
225# Determining checksum and size of tar file
226#########################################################
227
228sub call_sum
229{
230	my ($filename, $getuidlibrary) = @_;
231
232	my $systemcall = "/usr/bin/sum $filename |";
233
234	my $sumoutput = "";
235
236	open (SUM, "$systemcall");
237	$sumoutput = <SUM>;
238	close (SUM);
239
240	my $returnvalue = $?;	# $? contains the return value of the systemcall
241
242	my $infoline = "Systemcall: $systemcall\n";
243	push( @installer::globals::logfileinfo, $infoline);
244
245	if ($returnvalue)
246	{
247		$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
248		push( @installer::globals::logfileinfo, $infoline);
249	}
250	else
251	{
252		$infoline = "Success: Executed \"$systemcall\" successfully!\n";
253		push( @installer::globals::logfileinfo, $infoline);
254	}
255
256	$sumoutput =~ s/\s+$filename\s$//;
257	return $sumoutput;
258}
259
260#########################################################
261# Searching for the getuid.so in the solver
262#########################################################
263
264sub get_path_for_library
265{
266	my ($includepatharrayref) = @_;
267
268	my $getuidlibraryname = "getuid.so";
269
270	my $getuidlibraryref = "";
271
272	if ( $installer::globals::include_pathes_read )
273	{
274		$getuidlibraryref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$getuidlibraryname, $includepatharrayref, 0);
275	}
276	else
277	{
278		$getuidlibraryref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$getuidlibraryname, $includepatharrayref, 0);
279	}
280
281	if ($$getuidlibraryref eq "") { installer::exiter::exit_program("ERROR: Could not find $getuidlibraryname!", "get_path_for_library"); }
282
283	return $$getuidlibraryref;
284}
285
286#########################################################
287# Include the tar file into the script
288#########################################################
289
290sub include_tar_into_script
291{
292	my ($scriptfile, $temporary_tarfile) = @_;
293
294	my $systemcall = "cat $temporary_tarfile >> $scriptfile && rm $temporary_tarfile";
295	my $returnvalue = system($systemcall);
296
297	my $infoline = "Systemcall: $systemcall\n";
298	push( @installer::globals::logfileinfo, $infoline);
299
300	if ($returnvalue)
301	{
302		$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
303		push( @installer::globals::logfileinfo, $infoline);
304	}
305	else
306	{
307		$infoline = "Success: Executed \"$systemcall\" successfully!\n";
308		push( @installer::globals::logfileinfo, $infoline);
309	}
310	return $returnvalue;
311}
312
313#########################################################
314# Create a tar file from the binary package
315#########################################################
316
317sub tar_package
318{
319	my ( $installdir, $tarfilename, $getuidlibrary) = @_;
320
321	my $ldpreloadstring = "";
322	if ( $getuidlibrary ne "" ) { $ldpreloadstring = "LD_PRELOAD=" . $getuidlibrary; }
323
324	my $systemcall = "cd $installdir; $ldpreloadstring tar -cf - * > $tarfilename";
325
326	my $returnvalue = system($systemcall);
327
328	my $infoline = "Systemcall: $systemcall\n";
329	push( @installer::globals::logfileinfo, $infoline);
330
331	if ($returnvalue)
332	{
333		$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
334		push( @installer::globals::logfileinfo, $infoline);
335	}
336	else
337	{
338		$infoline = "Success: Executed \"$systemcall\" successfully!\n";
339		push( @installer::globals::logfileinfo, $infoline);
340	}
341
342	my $localcall = "chmod 775 $tarfilename \>\/dev\/null 2\>\&1";
343	$returnvalue = system($localcall);
344
345	return ( -s $tarfilename );
346}
347
348#########################################################
349# Creating a tar.gz file
350#########################################################
351
352sub create_tar_gz_file_from_package
353{
354	my ($installdir, $getuidlibrary) = @_;
355
356	my $infoline = "";
357	my $alldirs = installer::systemactions::get_all_directories($installdir);
358	my $onedir = ${$alldirs}[0];
359	$installdir = $onedir;
360
361	my $allfiles = installer::systemactions::get_all_files_from_one_directory($installdir);
362
363	for ( my $i = 0; $i <= $#{$allfiles}; $i++ )
364	{
365		my $onefile = ${$allfiles}[$i];
366		my $systemcall = "cd $installdir; rm $onefile";
367		my $returnvalue = system($systemcall);
368
369		$infoline = "Systemcall: $systemcall\n";
370		push( @installer::globals::logfileinfo, $infoline);
371
372		if ($returnvalue)
373		{
374			$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
375			push( @installer::globals::logfileinfo, $infoline);
376		}
377		else
378		{
379			$infoline = "Success: Executed \"$systemcall\" successfully!\n";
380			push( @installer::globals::logfileinfo, $infoline);
381		}
382	}
383
384	$alldirs = installer::systemactions::get_all_directories($installdir);
385	$packagename = ${$alldirs}[0]; # only taking the first Solaris package
386	if ( $packagename eq "" ) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); }
387
388	installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$packagename);
389
390	$installer::globals::downloadfileextension = ".tar.gz";
391	my $targzname = $packagename . $installer::globals::downloadfileextension;
392	$installer::globals::downloadfilename = $targzname;
393	my $ldpreloadstring = "";
394	if ( $getuidlibrary ne "" ) { $ldpreloadstring = "LD_PRELOAD=" . $getuidlibrary; }
395
396	$systemcall = "cd $installdir; $ldpreloadstring tar -cf - $packagename | gzip > $targzname";
397	print "... $systemcall ...\n";
398
399	my $returnvalue = system($systemcall);
400
401	$infoline = "Systemcall: $systemcall\n";
402	push( @installer::globals::logfileinfo, $infoline);
403
404	if ($returnvalue)
405	{
406		$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
407		push( @installer::globals::logfileinfo, $infoline);
408	}
409	else
410	{
411		$infoline = "Success: Executed \"$systemcall\" successfully!\n";
412		push( @installer::globals::logfileinfo, $infoline);
413	}
414}
415
416#########################################################
417# Setting type of installation
418#########################################################
419
420sub get_installation_type
421{
422	my $type = "";
423
424	if ( $installer::globals::languagepack ) { $type = "langpack"; }
425	else { $type = "install"; }
426
427	return $type;
428}
429
430#########################################################
431# Setting installation languages
432#########################################################
433
434sub get_downloadname_language
435{
436	my ($languagestringref) = @_;
437
438	my $languages = $$languagestringref;
439
440	if ( $installer::globals::added_english )
441	{
442		$languages =~ s/en-US_//;
443		$languages =~ s/_en-US//;
444	}
445
446	# en-US is default language and can be removed therefore
447	# for one-language installation sets
448
449	# if ( $languages =~ /^\s*en-US\s*$/ )
450	# {
451	#	$languages = "";
452	# }
453
454	if ( length ($languages) > $installer::globals::max_lang_length )
455	{
456		$languages = 'multi';
457	}
458
459	return $languages;
460}
461
462#########################################################
463# Setting download name
464#########################################################
465
466sub get_downloadname_productname
467{
468	my ($allvariables) = @_;
469
470	my $start = "OOo";
471
472	if ( $allvariables->{'PRODUCTNAME'} eq "OpenOffice.org" ) { $start = "OOo"; }
473
474	if ( $allvariables->{'PRODUCTNAME'} eq "OOo-dev" ) { $start = "OOo-Dev"; }
475
476	if (( $allvariables->{'PRODUCTNAME'} eq "OpenOffice.org" ) && ( $allvariables->{'POSTVERSIONEXTENSION'} eq "SDK" )) { $start = "OOo-SDK"; }
477
478	if (( $allvariables->{'PRODUCTNAME'} eq "OOo-dev" ) && ( $allvariables->{'POSTVERSIONEXTENSION'} eq "SDK" )) { $start = "OOo-Dev-SDK"; }
479
480	if ( $allvariables->{'PRODUCTNAME'} eq "URE" ) { $start = "OOo-URE"; }
481
482	return $start;
483}
484
485#########################################################
486# Setting download version
487#########################################################
488
489sub get_download_version
490{
491	my ($allvariables) = @_;
492
493	my $version = "";
494
495	my $devproduct = 0;
496	if (( $allvariables->{'DEVELOPMENTPRODUCT'} ) && ( $allvariables->{'DEVELOPMENTPRODUCT'} == 1 )) { $devproduct = 1; }
497
498	my $cwsproduct = 0;
499	# the environment variable CWS_WORK_STAMP is set only in CWS
500	if ( $ENV{'CWS_WORK_STAMP'} ) { $cwsproduct = 1; }
501
502	if (( $cwsproduct ) || ( $devproduct ))  # use "DEV300m75"
503	{
504		my $source = uc($installer::globals::build); # DEV300
505		my $localminor = "";
506		if ( $installer::globals::minor ne "" ) { $localminor = $installer::globals::minor; }
507		else { $localminor = $installer::globals::lastminor; }
508		$version = $source . $localminor;
509	}
510	else  # use 3.2.0rc1
511	{
512		$version = $allvariables->{'PRODUCTVERSION'};
513		if (( $allvariables->{'ABOUTBOXPRODUCTVERSION'} ) && ( $allvariables->{'ABOUTBOXPRODUCTVERSION'} ne "" )) { $version = $allvariables->{'ABOUTBOXPRODUCTVERSION'}; }
514		if (( $allvariables->{'SHORT_PRODUCTEXTENSION'} ) && ( $allvariables->{'SHORT_PRODUCTEXTENSION'} ne "" )) { $version = $version . $allvariables->{'SHORT_PRODUCTEXTENSION'}; }
515	}
516
517	return $version;
518}
519
520###############################################################
521# Set date string, format: yymmdd
522###############################################################
523
524sub set_date_string
525{
526	my ($allvariables) = @_;
527
528	my $datestring = "";
529
530	my $devproduct = 0;
531	if (( $allvariables->{'DEVELOPMENTPRODUCT'} ) && ( $allvariables->{'DEVELOPMENTPRODUCT'} == 1 )) { $devproduct = 1; }
532
533	my $cwsproduct = 0;
534	# the environment variable CWS_WORK_STAMP is set only in CWS
535	if ( $ENV{'CWS_WORK_STAMP'} ) { $cwsproduct = 1; }
536
537	my $releasebuild = 1;
538	if (( $allvariables->{'SHORT_PRODUCTEXTENSION'} ) && ( $allvariables->{'SHORT_PRODUCTEXTENSION'} ne "" )) { $releasebuild = 0; }
539
540	if (( ! $devproduct ) && ( ! $cwsproduct ) && ( ! $releasebuild ))
541	{
542		my @timearray = localtime(time);
543
544		my $day = $timearray[3];
545		my $month = $timearray[4] + 1;
546		my $year = $timearray[5] + 1900;
547
548		if ( $month < 10 ) { $month = "0" . $month; }
549		if ( $day < 10 ) { $day = "0" . $day; }
550
551		$datestring = $year . $month . $day;
552	}
553
554	return $datestring;
555}
556
557#################################################################
558# Setting the platform name for download
559#################################################################
560
561sub get_download_platformname
562{
563	my $platformname = "";
564
565	if ( $installer::globals::islinuxbuild )
566	{
567		$platformname = "Linux";
568	}
569	elsif ( $installer::globals::issolarisbuild )
570	{
571		$platformname = "Solaris";
572	}
573	elsif ( $installer::globals::iswindowsbuild )
574	{
575		$platformname = "Win";
576	}
577	elsif ( $installer::globals::isfreebsdbuild )
578	{
579		$platformname = "FreeBSD";
580	}
581	elsif ( $installer::globals::ismacbuild )
582	{
583		$platformname = "MacOS";
584	}
585	else
586	{
587		# $platformname = $installer::globals::packageformat;
588		$platformname = $installer::globals::compiler;
589	}
590
591	return $platformname;
592}
593
594#########################################################
595# Setting the architecture for the download name
596#########################################################
597
598sub get_download_architecture
599{
600	my $arch = "";
601
602	if ( $installer::globals::compiler =~ /unxlngi/ )
603	{
604		$arch = "x86";
605	}
606	elsif ( $installer::globals::compiler =~ /unxlngppc/ )
607	{
608		$arch = "PPC";
609	}
610	elsif ( $installer::globals::compiler =~ /unxlngx/ )
611	{
612		$arch = "x86-64";
613	}
614	elsif ( $installer::globals::issolarissparcbuild )
615	{
616		$arch = "Sparc";
617	}
618	elsif ( $installer::globals::issolarisx86build )
619	{
620		$arch = "x86";
621	}
622	elsif ( $installer::globals::iswindowsbuild )
623	{
624		$arch = "x86";
625	}
626	elsif ( $installer::globals::compiler =~ /^unxmacxi/ )
627	{
628		$arch = "x86";
629	}
630	elsif ( $installer::globals::compiler =~ /^unxmacxp/ )
631	{
632		$arch = "PPC";
633	}
634
635	return $arch;
636}
637
638#########################################################
639# Setting the installation type for the download name
640#########################################################
641
642sub get_install_type
643{
644	my ($allvariables) = @_;
645
646	my $type = "";
647
648	if ( $installer::globals::languagepack )
649	{
650		$type = "langpack";
651
652		if ( $installer::globals::islinuxrpmbuild )
653		{
654			$type = $type . "-rpm";
655		}
656
657		if ( $installer::globals::islinuxdebbuild )
658		{
659			$type = $type . "-deb";
660		}
661
662		if ( $installer::globals::packageformat eq "archive" )
663		{
664			$type = $type . "-arc";
665		}
666	}
667	else
668	{
669		$type = "install";
670
671		if ( $installer::globals::islinuxrpmbuild )
672		{
673			$type = $type . "-rpm";
674		}
675
676		if ( $installer::globals::islinuxdebbuild )
677		{
678			$type = $type . "-deb";
679		}
680
681		if ( $installer::globals::packageformat eq "archive" )
682		{
683			$type = $type . "-arc";
684		}
685
686		if (( $allvariables->{'WITHJREPRODUCT'} ) && ( $allvariables->{'WITHJREPRODUCT'} == 1 ))
687		{
688			$type = $type . "-wJRE";
689		}
690
691	}
692
693	return $type;
694}
695
696#########################################################
697# Setting installation addons
698#########################################################
699
700sub get_downloadname_addon
701{
702	my $addon = "";
703
704	if ( $installer::globals::islinuxdebbuild ) { $addon = $addon . "_deb"; }
705
706	if ( $installer::globals::product =~ /_wJRE\s*$/ ) { $addon = "_wJRE"; }
707
708	return $addon;
709}
710
711#########################################################
712# Looking for versionstring in version.info
713# This has to be the only content of this file.
714#########################################################
715
716sub get_versionstring
717{
718	my ( $versionfile ) = @_;
719
720	my $versionstring = "";
721
722	for ( my $i = 0; $i <= $#{$versionfile}; $i++ )
723	{
724		my $oneline = ${$versionfile}[$i];
725
726		if ( $oneline =~ /^\s*\#/ ) { next; } # comment line
727		if ( $oneline =~ /^\s*\"\s*(.*?)\s*\"\s*$/ )
728		{
729			$versionstring = $1;
730			last;
731		}
732	}
733
734	return $versionstring;
735}
736
737#########################################################
738# Returning the current product version
739# This has to be defined in file "version.info"
740# in directory $installer::globals::ooouploaddir
741#########################################################
742
743sub get_current_version
744{
745	my $infoline = "";
746	my $versionstring = "";
747	my $filename = "version.info";
748	# $filename = $installer::globals::ooouploaddir . $installer::globals::separator . $filename;
749
750	if ( -f $filename )
751	{
752		$infoline = "File $filename exists. Trying to find current version.\n";
753		push( @installer::globals::logfileinfo, $infoline);
754		my $versionfile = installer::files::read_file($filename);
755		$versionstring = get_versionstring($versionfile);
756		$infoline = "Setting version string: $versionstring\n";
757		push( @installer::globals::logfileinfo, $infoline);
758	}
759	else
760	{
761		$infoline = "File $filename does not exist. No version setting in download file name.\n";
762		push( @installer::globals::logfileinfo, $infoline);
763	}
764
765	$installer::globals::oooversionstring = $versionstring;
766
767	return $versionstring;
768}
769
770###############################################################################################
771# Setting the download file name
772# Syntax:
773# (PRODUCTNAME)_(VERSION)_(TIMESTAMP)_(OS)_(ARCH)_(INSTALLTYPE)_(LANGUAGE).(FILEEXTENSION)
774# Rules:
775# Timestamp only for Beta and Release Candidate
776###############################################################################################
777
778sub set_download_filename
779{
780	my ($languagestringref, $allvariables) = @_;
781
782	my $start = get_downloadname_productname($allvariables);
783	my $versionstring = get_download_version($allvariables);
784	my $date = set_date_string($allvariables);
785	my $platform = get_download_platformname();
786	my $architecture = get_download_architecture();
787	my $type = get_install_type($allvariables);
788	my $language = get_downloadname_language($languagestringref);
789
790	# Setting the extension happens automatically
791
792	my $filename = $start . "_" . $versionstring . "_" . $date . "_" . $platform . "_" . $architecture . "_" . $type . "_" . $language;
793
794	$filename =~ s/\_\_/\_/g;	# necessary, if $versionstring or $platform or $language are empty
795	$filename =~ s/\_\s*$//;	# necessary, if $language and $addon are empty
796
797	$installer::globals::ooodownloadfilename = $filename;
798
799	return $filename;
800}
801
802#########################################################
803# Creating a tar.gz file
804#########################################################
805
806sub create_tar_gz_file_from_directory
807{
808	my ($installdir, $getuidlibrary, $downloaddir, $downloadfilename) = @_;
809
810	my $infoline = "";
811
812	my $packdir = $installdir;
813	installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$packdir);
814	my $changedir = $installdir;
815	installer::pathanalyzer::get_path_from_fullqualifiedname(\$changedir);
816
817	my $ldpreloadstring = "";
818	if ( $getuidlibrary ne "" ) { $ldpreloadstring = "LD_PRELOAD=" . $getuidlibrary; }
819
820	$installer::globals::downloadfileextension = ".tar.gz";
821	$installer::globals::downloadfilename = $downloadfilename . $installer::globals::downloadfileextension;
822	my $targzname = $downloaddir . $installer::globals::separator . $installer::globals::downloadfilename;
823
824	$systemcall = "cd $changedir; $ldpreloadstring tar -cf - $packdir | gzip > $targzname";
825
826	my $returnvalue = system($systemcall);
827
828	$infoline = "Systemcall: $systemcall\n";
829	push( @installer::globals::logfileinfo, $infoline);
830
831	if ($returnvalue)
832	{
833		$infoline = "ERROR: Could not execute \"$systemcall\"!\n";
834		push( @installer::globals::logfileinfo, $infoline);
835	}
836	else
837	{
838		$infoline = "Success: Executed \"$systemcall\" successfully!\n";
839		push( @installer::globals::logfileinfo, $infoline);
840	}
841
842	return $targzname;
843}
844
845#########################################################
846# Setting the variables in the download name
847#########################################################
848
849sub resolve_variables_in_downloadname
850{
851	my ($allvariables, $downloadname, $languagestringref) = @_;
852
853	# Typical name: soa-{productversion}-{extension}-bin-{os}-{languages}
854
855	my $productversion = "";
856	if ( $allvariables->{'PRODUCTVERSION'} ) { $productversion = $allvariables->{'PRODUCTVERSION'}; }
857	$downloadname =~ s/\{productversion\}/$productversion/;
858
859	my $ppackageversion = "";
860	if ( $allvariables->{'PACKAGEVERSION'} ) { $packageversion = $allvariables->{'PACKAGEVERSION'}; }
861	$downloadname =~ s/\{packageversion\}/$packageversion/;
862
863	my $extension = "";
864	if ( $allvariables->{'SHORT_PRODUCTEXTENSION'} ) { $extension = $allvariables->{'SHORT_PRODUCTEXTENSION'}; }
865	$extension = lc($extension);
866	$downloadname =~ s/\{extension\}/$extension/;
867
868	my $os = "";
869	if ( $installer::globals::iswindowsbuild ) { $os = "windows"; }
870	elsif ( $installer::globals::issolarissparcbuild ) { $os = "solsparc"; }
871	elsif ( $installer::globals::issolarisx86build ) { $os = "solia"; }
872	elsif ( $installer::globals::islinuxbuild ) { $os = "linux"; }
873	elsif ( $installer::globals::compiler =~ /unxmacxi/ ) { $os = "macosxi"; }
874	elsif ( $installer::globals::compiler =~ /unxmacxp/ ) { $os = "macosxp"; }
875	else { $os = ""; }
876	$downloadname =~ s/\{os\}/$os/;
877
878	my $languages = $$languagestringref;
879	$downloadname =~ s/\{languages\}/$languages/;
880
881	$downloadname =~ s/\-\-\-/\-/g;
882	$downloadname =~ s/\-\-/\-/g;
883	$downloadname =~ s/\-\s*$//;
884
885	return $downloadname;
886}
887
888##################################################################
889# Windows: Replacing one placeholder with the specified value
890##################################################################
891
892sub replace_one_variable
893{
894	my ($templatefile, $placeholder, $value) = @_;
895
896	my $infoline = "Replacing $placeholder by $value in nsi file\n";
897	push( @installer::globals::logfileinfo, $infoline);
898
899	for ( my $i = 0; $i <= $#{$templatefile}; $i++ )
900	{
901		${$templatefile}[$i] =~ s/$placeholder/$value/g;
902	}
903
904}
905
906########################################################################################
907# Converting a string to a unicode string
908########################################################################################
909
910sub convert_to_unicode
911{
912	my ($string) = @_;
913
914	my $unicodestring = "";
915
916	my $stringlength = length($string);
917
918	for ( my $i = 0; $i < $stringlength; $i++ )
919	{
920		$unicodestring = $unicodestring . substr($string, $i, 1);
921		$unicodestring = $unicodestring . chr(0);
922	}
923
924	return $unicodestring;
925}
926
927##################################################################
928# Windows: Setting nsis version is necessary because of small
929# changes in nsis from version 2.0.4 to 2.3.1
930##################################################################
931
932sub set_nsis_version
933{
934	my ($nshfile) = @_;
935
936	my $searchstring = "\$\{LangFileString\}"; # occurs only in nsis 2.3.1 or similar
937
938	for ( my $i = 0; $i <= $#{$nshfile}; $i++ )
939	{
940		if ( ${$nshfile}[$i] =~ /\Q$searchstring\E/ )
941		{
942			# this is nsis 2.3.1 or similar
943			$installer::globals::nsis231 = 1;
944			$installer::globals::unicodensis = 0;
945			last;
946		}
947	}
948
949	# checking unicode version
950	$searchstring = convert_to_unicode($searchstring);
951
952	for ( my $i = 0; $i <= $#{$nshfile}; $i++ )
953	{
954		if ( ${$nshfile}[$i] =~ /\Q$searchstring\E/ )
955		{
956			# this is nsis 2.3.1 or similar
957			$installer::globals::nsis231 = 1;
958			$installer::globals::unicodensis = 1;
959			last;
960		}
961	}
962
963	if ( ! $installer::globals::nsis231 ) { $installer::globals::nsis204 = 1; }
964}
965
966##################################################################
967# Windows: Including the product name into nsi template
968##################################################################
969
970sub put_windows_productname_into_template
971{
972	my ($templatefile, $variableshashref) = @_;
973
974	my $productname = $variableshashref->{'PRODUCTNAME'};
975	$productname =~ s/\.//g;	# OpenOffice.org -> OpenOfficeorg
976
977	replace_one_variable($templatefile, "PRODUCTNAMEPLACEHOLDER", $productname);
978}
979
980##################################################################
981# Windows: Including the path to the banner.bmp into nsi template
982##################################################################
983
984sub put_banner_bmp_into_template
985{
986	my ($templatefile, $includepatharrayref, $allvariables) = @_;
987
988	# my $filename = "downloadbanner.bmp";
989	if ( ! $allvariables->{'DOWNLOADBANNER'} ) { installer::exiter::exit_program("ERROR: DOWNLOADBANNER not defined in product definition!", "put_banner_bmp_into_template"); }
990	my $filename = $allvariables->{'DOWNLOADBANNER'};
991
992	my $completefilenameref = "";
993
994	if ( $installer::globals::include_pathes_read )
995	{
996		$completefilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$filename, $includepatharrayref, 0);
997	}
998	else
999	{
1000		$completefilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$filename, $includepatharrayref, 0);
1001	}
1002
1003	if ($$completefilenameref eq "") { installer::exiter::exit_program("ERROR: Could not find download file $filename!", "put_banner_bmp_into_template"); }
1004
1005	if ( $^O =~ /cygwin/i ) { $$completefilenameref =~ s/\//\\/g; }
1006
1007	replace_one_variable($templatefile, "BANNERBMPPLACEHOLDER", $$completefilenameref);
1008}
1009
1010##################################################################
1011# Windows: Including the path to the welcome.bmp into nsi template
1012##################################################################
1013
1014sub put_welcome_bmp_into_template
1015{
1016	my ($templatefile, $includepatharrayref, $allvariables) = @_;
1017
1018	# my $filename = "downloadbitmap.bmp";
1019	if ( ! $allvariables->{'DOWNLOADBITMAP'} ) { installer::exiter::exit_program("ERROR: DOWNLOADBITMAP not defined in product definition!", "put_welcome_bmp_into_template"); }
1020	my $filename = $allvariables->{'DOWNLOADBITMAP'};
1021
1022	my $completefilenameref = "";
1023
1024	if ( $installer::globals::include_pathes_read )
1025	{
1026		$completefilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$filename, $includepatharrayref, 0);
1027	}
1028	else
1029	{
1030		$completefilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$filename, $includepatharrayref, 0);
1031	}
1032
1033	if ($$completefilenameref eq "") { installer::exiter::exit_program("ERROR: Could not find download file $filename!", "put_welcome_bmp_into_template"); }
1034
1035	if ( $^O =~ /cygwin/i ) { $$completefilenameref =~ s/\//\\/g; }
1036
1037	replace_one_variable($templatefile, "WELCOMEBMPPLACEHOLDER", $$completefilenameref);
1038}
1039
1040##################################################################
1041# Windows: Including the path to the setup.ico into nsi template
1042##################################################################
1043
1044sub put_setup_ico_into_template
1045{
1046	my ($templatefile, $includepatharrayref, $allvariables) = @_;
1047
1048	# my $filename = "downloadsetup.ico";
1049	if ( ! $allvariables->{'DOWNLOADSETUPICO'} ) { installer::exiter::exit_program("ERROR: DOWNLOADSETUPICO not defined in product definition!", "put_setup_ico_into_template"); }
1050	my $filename = $allvariables->{'DOWNLOADSETUPICO'};
1051
1052	my $completefilenameref = "";
1053
1054	if ( $installer::globals::include_pathes_read )
1055	{
1056		$completefilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$filename, $includepatharrayref, 0);
1057	}
1058	else
1059	{
1060		$completefilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$filename, $includepatharrayref, 0);
1061	}
1062
1063	if ($$completefilenameref eq "") { installer::exiter::exit_program("ERROR: Could not find download file $filename!", "put_setup_ico_into_template"); }
1064
1065	if ( $^O =~ /cygwin/i ) { $$completefilenameref =~ s/\//\\/g; }
1066
1067	replace_one_variable($templatefile, "SETUPICOPLACEHOLDER", $$completefilenameref);
1068}
1069
1070##################################################################
1071# Windows: Including the publisher into nsi template
1072##################################################################
1073
1074sub put_publisher_into_template
1075{
1076	my ($templatefile) = @_;
1077
1078	my $publisher = "Sun Microsystems, Inc.";
1079
1080	replace_one_variable($templatefile, "PUBLISHERPLACEHOLDER", $publisher);
1081}
1082
1083##################################################################
1084# Windows: Including the web site into nsi template
1085##################################################################
1086
1087sub put_website_into_template
1088{
1089	my ($templatefile) = @_;
1090
1091	my $website = "http\:\/\/www\.sun\.com\/staroffice";
1092
1093	replace_one_variable($templatefile, "WEBSITEPLACEHOLDER", $website);
1094}
1095
1096##################################################################
1097# Windows: Including the Java file name into nsi template
1098##################################################################
1099
1100sub put_javafilename_into_template
1101{
1102	my ($templatefile, $variableshashref) = @_;
1103
1104	my $javaversion = "";
1105
1106	if ( $variableshashref->{'WINDOWSJAVAFILENAME'} ) { $javaversion = $variableshashref->{'WINDOWSJAVAFILENAME'}; }
1107
1108	replace_one_variable($templatefile, "WINDOWSJAVAFILENAMEPLACEHOLDER", $javaversion);
1109}
1110
1111##################################################################
1112# Windows: Including the product version into nsi template
1113##################################################################
1114
1115sub put_windows_productversion_into_template
1116{
1117	my ($templatefile, $variableshashref) = @_;
1118
1119	my $productversion = $variableshashref->{'PRODUCTVERSION'};
1120
1121	replace_one_variable($templatefile, "PRODUCTVERSIONPLACEHOLDER", $productversion);
1122}
1123
1124##################################################################
1125# Windows: Including the product version into nsi template
1126##################################################################
1127
1128sub put_windows_productpath_into_template
1129{
1130	my ($templatefile, $variableshashref, $languagestringref, $localnsisdir) = @_;
1131
1132	my $productpath = $variableshashref->{'PROPERTYTABLEPRODUCTNAME'};
1133
1134	my $locallangs = $$languagestringref;
1135	$locallangs =~ s/_/ /g;
1136	if (length($locallangs) > $installer::globals::max_lang_length) { $locallangs = "multi lingual"; }
1137
1138	if ( ! $installer::globals::languagepack ) { $productpath = $productpath . " (" . $locallangs . ")"; }
1139
1140	# if (( $installer::globals::languagepack ) && ( $installer::globals::unicodensis )) { $productpath = convert_textstring_to_utf16($productpath, $localnsisdir, "stringhelper.txt"); }
1141
1142	replace_one_variable($templatefile, "PRODUCTPATHPLACEHOLDER", $productpath);
1143}
1144
1145##################################################################
1146# Windows: Including download file name into nsi template
1147##################################################################
1148
1149sub put_outputfilename_into_template
1150{
1151	my ($templatefile, $downloadname) = @_;
1152
1153	$installer::globals::downloadfileextension = ".exe";
1154	$downloadname = $downloadname . $installer::globals::downloadfileextension;
1155	$installer::globals::downloadfilename = $downloadname;
1156
1157	replace_one_variable($templatefile, "DOWNLOADNAMEPLACEHOLDER", $downloadname);
1158}
1159
1160##################################################################
1161# Windows: Generating the file list in nsi file format
1162##################################################################
1163
1164sub get_file_list
1165{
1166	my ( $basedir ) = @_;
1167
1168	my @filelist = ();
1169
1170	my $alldirs = installer::systemactions::get_all_directories($basedir);
1171	unshift(@{$alldirs}, $basedir);	# $basedir is the first directory in $alldirs
1172
1173	for ( my $i = 0; $i <= $#{$alldirs}; $i++ )
1174	{
1175		my $onedir = ${$alldirs}[$i];
1176
1177		# Syntax:
1178		# SetOutPath "$INSTDIR"
1179
1180		my $relativedir = $onedir;
1181		$relativedir =~ s/\Q$basedir\E//;
1182
1183		my $oneline = " " . "SetOutPath" . " " . "\"\$INSTDIR" . $relativedir . "\"" . "\n";
1184
1185		if ( $^O =~ /cygwin/i ) {
1186			$oneline =~ s/\//\\/g;
1187		}
1188		push(@filelist, $oneline);
1189
1190		# Collecting all files in the specific directory
1191
1192		my $files = installer::systemactions::get_all_files_from_one_directory($onedir);
1193
1194		for ( my $j = 0; $j <= $#{$files}; $j++ )
1195		{
1196			my $onefile = ${$files}[$j];
1197
1198			my $fileline = "  " . "File" . " " . "\"" . $onefile . "\"" . "\n";
1199
1200			if ( $^O =~ /cygwin/i ) {
1201				$fileline =~ s/\//\\/g;
1202			}
1203			push(@filelist, $fileline);
1204		}
1205	}
1206
1207	return \@filelist;
1208}
1209
1210##################################################################
1211# Windows: Including list of all files into nsi template
1212##################################################################
1213
1214sub put_filelist_into_template
1215{
1216	my ($templatefile, $installationdir) = @_;
1217
1218	my $filelist = get_file_list($installationdir);
1219
1220	my $filestring = "";
1221
1222	for ( my $i = 0; $i <= $#{$filelist}; $i++ )
1223	{
1224		$filestring = $filestring . ${$filelist}[$i];
1225	}
1226
1227	$filestring =~ s/\s*$//;
1228
1229	replace_one_variable($templatefile, "ALLFILESPLACEHOLDER", $filestring);
1230}
1231
1232##################################################################
1233# Windows: NSIS uses specific language names
1234##################################################################
1235
1236sub nsis_language_converter
1237{
1238	my ($language) = @_;
1239
1240	my $nsislanguage = "";
1241
1242	# Assign language used by NSIS.
1243	# The files "$nsislanguage.nsh" and "$nsislanguage.nlf"
1244	# are needed in the NSIS environment.
1245	# Directory: <NSIS-Dir>/Contrib/Language files
1246	if ( $language eq "en-US" ) { $nsislanguage = "English"; }
1247	elsif ( $language eq "sq" ) { $nsislanguage = "Albanian"; }
1248	elsif ( $language eq "ar" ) { $nsislanguage = "Arabic"; }
1249	elsif ( $language eq "bg" ) { $nsislanguage = "Bulgarian"; }
1250	elsif ( $language eq "ca" ) { $nsislanguage = "Catalan"; }
1251	elsif ( $language eq "hr" ) { $nsislanguage = "Croatian"; }
1252	elsif ( $language eq "cs" ) { $nsislanguage = "Czech"; }
1253	elsif ( $language eq "da" ) { $nsislanguage = "Danish"; }
1254	elsif ( $language eq "nl" ) { $nsislanguage = "Dutch"; }
1255	elsif ( $language eq "de" ) { $nsislanguage = "German"; }
1256	elsif ( $language eq "de-LU" ) { $nsislanguage = "Luxembourgish"; }
1257	elsif ( $language eq "et" ) { $nsislanguage = "Estonian"; }
1258	elsif ( $language eq "fa" ) { $nsislanguage = "Farsi"; }
1259	elsif ( $language eq "el" ) { $nsislanguage = "Greek"; }
1260	elsif ( $language eq "fi" ) { $nsislanguage = "Finnish"; }
1261	elsif ( $language eq "fr" ) { $nsislanguage = "French"; }
1262	elsif ( $language eq "hu" ) { $nsislanguage = "Hungarian"; }
1263	elsif ( $language eq "he" ) { $nsislanguage = "Hebrew"; }
1264	elsif ( $language eq "is" ) { $nsislanguage = "Icelandic"; }
1265	elsif ( $language eq "id" ) { $nsislanguage = "Indonesian"; }
1266	elsif ( $language eq "it" ) { $nsislanguage = "Italian"; }
1267	elsif ( $language eq "lv" ) { $nsislanguage = "Latvian"; }
1268	elsif ( $language eq "lt" ) { $nsislanguage = "Lithuanian"; }
1269	elsif ( $language eq "mk" ) { $nsislanguage = "Macedonian"; }
1270	elsif ( $language eq "mn" ) { $nsislanguage = "Mongolian"; }
1271	elsif ( $language eq "no" ) { $nsislanguage = "Norwegian"; }
1272	elsif ( $language eq "no-NO" ) { $nsislanguage = "Norwegian"; }
1273	elsif ( $language eq "es" ) { $nsislanguage = "Spanish"; }
1274	elsif ( $language eq "sl" ) { $nsislanguage = "Slovenian"; }
1275	elsif ( $language eq "sv" ) { $nsislanguage = "Swedish"; }
1276	elsif ( $language eq "sk" ) { $nsislanguage = "Slovak"; }
1277	elsif ( $language eq "pl" ) { $nsislanguage = "Polish"; }
1278	elsif ( $language eq "pt-BR" ) { $nsislanguage = "PortugueseBR"; }
1279	elsif ( $language eq "pt" ) { $nsislanguage = "Portuguese"; }
1280	elsif ( $language eq "ro" ) { $nsislanguage = "Romanian"; }
1281	elsif ( $language eq "ru" ) { $nsislanguage = "Russian"; }
1282	elsif ( $language eq "sh" ) { $nsislanguage = "SerbianLatin"; }
1283	elsif ( $language eq "sr" ) { $nsislanguage = "Serbian"; }
1284	elsif ( $language eq "sr-SP" ) { $nsislanguage = "Serbian"; }
1285	elsif ( $language eq "uk" ) { $nsislanguage = "Ukrainian"; }
1286	elsif ( $language eq "tr" ) { $nsislanguage = "Turkish"; }
1287	elsif ( $language eq "ja" ) { $nsislanguage = "Japanese"; }
1288	elsif ( $language eq "ko" ) { $nsislanguage = "Korean"; }
1289	elsif ( $language eq "th" ) { $nsislanguage = "Thai"; }
1290	elsif ( $language eq "vi" ) { $nsislanguage = "Vietnamese"; }
1291	elsif ( $language eq "zh-CN" ) { $nsislanguage = "SimpChinese"; }
1292	elsif ( $language eq "zh-TW" ) { $nsislanguage = "TradChinese"; }
1293	else {
1294		my $infoline = "NSIS language_converter : Could not find nsis language for $language!\n";
1295		push( @installer::globals::logfileinfo, $infoline);
1296		$nsislanguage = "English";
1297		# installer::exiter::exit_program("ERROR: Could not find nsis language for $language!", "nsis_language_converter");
1298	}
1299
1300	return $nsislanguage;
1301}
1302
1303##################################################################
1304# Windows: Including list of all languages into nsi template
1305##################################################################
1306
1307sub put_language_list_into_template
1308{
1309	my ($templatefile, $languagesarrayref) = @_;
1310
1311	my $alllangstring = "";
1312	my %nsislangs;
1313
1314	for ( my $i = 0; $i <= $#{$languagesarrayref}; $i++ )
1315	{
1316		my $onelanguage = ${$languagesarrayref}[$i];
1317		my $nsislanguage = nsis_language_converter($onelanguage);
1318		$nsislangs{$nsislanguage}++;
1319	}
1320
1321	foreach my $nsislanguage ( keys(%nsislangs) )
1322	{
1323		# Syntax: !insertmacro MUI_LANGUAGE "English"
1324		my $langstring = "\!insertmacro MUI_LANGUAGE_PACK " . $nsislanguage . "\n";
1325		if ( $nsislanguage eq "English" )
1326		{
1327			$alllangstring = $langstring . $alllangstring;
1328		}
1329		else
1330		{
1331			$alllangstring = $alllangstring . $langstring;
1332		}
1333	}
1334
1335	$alllangstring =~ s/\s*$//;
1336
1337	replace_one_variable($templatefile, "ALLLANGUAGESPLACEHOLDER", $alllangstring);
1338}
1339
1340##################################################################
1341# Windows: Collecting all identifier from mlf file
1342##################################################################
1343
1344sub get_identifier
1345{
1346	my ( $mlffile ) = @_;
1347
1348	my @identifier = ();
1349
1350	for ( my $i = 0; $i <= $#{$mlffile}; $i++ )
1351	{
1352		my $oneline = ${$mlffile}[$i];
1353
1354		if ( $oneline =~ /^\s*\[(.+)\]\s*$/ )
1355		{
1356			my $identifier = $1;
1357			push(@identifier, $identifier);
1358		}
1359	}
1360
1361	return \@identifier;
1362}
1363
1364##############################################################
1365# Returning the complete block in all languages
1366# for a specified string
1367##############################################################
1368
1369sub get_language_block_from_language_file
1370{
1371	my ($searchstring, $languagefile) = @_;
1372
1373	my @language_block = ();
1374
1375	for ( my $i = 0; $i <= $#{$languagefile}; $i++ )
1376	{
1377		if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ )
1378		{
1379			my $counter = $i;
1380
1381			push(@language_block, ${$languagefile}[$counter]);
1382			$counter++;
1383
1384			while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ )))
1385			{
1386				push(@language_block, ${$languagefile}[$counter]);
1387				$counter++;
1388			}
1389
1390			last;
1391		}
1392	}
1393
1394	return \@language_block;
1395}
1396
1397##############################################################
1398# Returning a specific language string from the block
1399# of all translations
1400##############################################################
1401
1402sub get_language_string_from_language_block
1403{
1404	my ($language_block, $language) = @_;
1405
1406	my $newstring = "";
1407
1408	for ( my $i = 0; $i <= $#{$language_block}; $i++ )
1409	{
1410		if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
1411		{
1412			$newstring = $1;
1413			last;
1414		}
1415	}
1416
1417	if ( $newstring eq "" )
1418	{
1419		$language = "en-US"; 	# defaulting to english
1420
1421		for ( my $i = 0; $i <= $#{$language_block}; $i++ )
1422		{
1423			if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
1424			{
1425				$newstring = $1;
1426				last;
1427			}
1428		}
1429	}
1430
1431	return $newstring;
1432}
1433
1434##################################################################
1435# Windows: Replacing strings in NSIS nsh file
1436# nsh file syntax:
1437# !define MUI_TEXT_DIRECTORY_TITLE "Zielverzeichnis ausw�hlen"
1438##################################################################
1439
1440sub replace_identifier_in_nshfile
1441{
1442	my ( $nshfile, $identifier, $newstring, $nshfilename, $onelanguage ) = @_;
1443
1444	if ( $installer::globals::nsis231 )
1445	{
1446		$newstring =~ s/\\r/\$\\r/g;	# \r -> $\r  in modern nsis versions
1447		$newstring =~ s/\\n/\$\\n/g;	# \n -> $\n  in modern nsis versions
1448	}
1449
1450	for ( my $i = 0; $i <= $#{$nshfile}; $i++ )
1451	{
1452		if ( ${$nshfile}[$i] =~ /\s+\Q$identifier\E\s+\"(.+)\"\s*$/ )
1453		{
1454			my $oldstring = $1;
1455			${$nshfile}[$i] =~ s/\Q$oldstring\E/$newstring/;
1456			my $infoline = "NSIS replacement in $nshfilename ($onelanguage): $oldstring \-\> $newstring\n";
1457			push( @installer::globals::logfileinfo, $infoline);
1458		}
1459	}
1460}
1461
1462##################################################################
1463# Windows: Replacing strings in NSIS nlf file
1464# nlf file syntax (2 lines):
1465# # ^DirSubText
1466# Zielverzeichnis
1467##################################################################
1468
1469sub replace_identifier_in_nlffile
1470{
1471	my ( $nlffile, $identifier, $newstring, $nlffilename, $onelanguage ) = @_;
1472
1473	for ( my $i = 0; $i <= $#{$nlffile}; $i++ )
1474	{
1475		if ( ${$nlffile}[$i] =~ /^\s*\#\s+\^\s*\Q$identifier\E\s*$/ )
1476		{
1477			my $next = $i+1;
1478			my $oldstring = ${$nlffile}[$next];
1479			${$nlffile}[$next] = $newstring . "\n";
1480			$oldstring =~ s/\s*$//;
1481			my $infoline = "NSIS replacement in $nlffilename ($onelanguage): $oldstring \-\> $newstring\n";
1482			push( @installer::globals::logfileinfo, $infoline);
1483		}
1484	}
1485}
1486
1487##################################################################
1488# Windows: Translating the NSIS nsh and nlf file
1489##################################################################
1490
1491sub translate_nsh_nlf_file
1492{
1493	my ($nshfile, $nlffile, $mlffile, $onelanguage, $nshfilename, $nlffilename, $nsislanguage) = @_;
1494
1495	# Analyzing the mlf file, collecting all Identifier
1496	my $allidentifier = get_identifier($mlffile);
1497
1498	$onelanguage = "en-US" if ( $nsislanguage eq "English" && $onelanguage ne "en-US");
1499	for ( my $i = 0; $i <= $#{$allidentifier}; $i++ )
1500	{
1501		my $identifier = ${$allidentifier}[$i];
1502		my $language_block = get_language_block_from_language_file($identifier, $mlffile);
1503		my $newstring = get_language_string_from_language_block($language_block, $onelanguage);
1504
1505		# removing mask
1506		$newstring =~ s/\\\'/\'/g;
1507
1508		replace_identifier_in_nshfile($nshfile, $identifier, $newstring, $nshfilename, $onelanguage);
1509		replace_identifier_in_nlffile($nlffile, $identifier, $newstring, $nlffilename, $onelanguage);
1510	}
1511}
1512
1513##################################################################
1514# Converting utf 16 file to utf 8
1515##################################################################
1516
1517sub convert_utf16_to_utf8
1518{
1519	my ( $filename ) = @_;
1520
1521	my @localfile = ();
1522
1523	my $savfilename = $filename . "_before.utf16";
1524	installer::systemactions::copy_one_file($filename, $savfilename);
1525
1526#	open( IN, "<:utf16", $filename ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for reading", "convert_utf16_to_utf8");
1527#	open( IN, "<:para:crlf:uni", $filename ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for reading", "convert_utf16_to_utf8");
1528	open( IN, "<:encoding(UTF16-LE)", $filename ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for reading", "convert_utf16_to_utf8");
1529	while ( $line = <IN> ) {
1530		push @localfile, $line;
1531	}
1532	close( IN );
1533
1534	if ( open( OUT, ">:utf8", $filename ) )
1535	{
1536		print OUT @localfile;
1537		close(OUT);
1538	}
1539
1540	$savfilename = $filename . "_before.utf8";
1541	installer::systemactions::copy_one_file($filename, $savfilename);
1542}
1543
1544##################################################################
1545# Converting utf 8 file to utf 16
1546##################################################################
1547
1548sub convert_utf8_to_utf16
1549{
1550	my ( $filename ) = @_;
1551
1552	my @localfile = ();
1553
1554	my $savfilename = $filename . "_after.utf8";
1555	installer::systemactions::copy_one_file($filename, $savfilename);
1556
1557	open( IN, "<:utf8", $filename ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for reading", "convert_utf8_to_utf16");
1558	while ( $line = <IN> ) {
1559		push @localfile, $line;
1560	}
1561	close( IN );
1562
1563	if ( open( OUT, ">:raw:encoding(UTF16-LE):crlf:utf8", $filename ) )
1564	{
1565		print OUT @localfile;
1566		close(OUT);
1567	}
1568
1569	$savfilename = $filename . "_after.utf16";
1570	installer::systemactions::copy_one_file($filename, $savfilename);
1571}
1572
1573##################################################################
1574# Converting text string to utf 16
1575##################################################################
1576
1577sub convert_textstring_to_utf16
1578{
1579	my ( $textstring, $localnsisdir, $shortfilename ) = @_;
1580
1581	my $filename = $localnsisdir . $installer::globals::separator . $shortfilename;
1582	my @filecontent = ();
1583	push(@filecontent, $textstring);
1584	installer::files::save_file($filename, \@filecontent);
1585	convert_utf8_to_utf16($filename);
1586	my $newfile = installer::files::read_file($filename);
1587	my $utf16string = "";
1588	if ( ${$newfile}[0] ne "" ) { $utf16string = ${$newfile}[0]; }
1589
1590	return $utf16string;
1591}
1592
1593##################################################################
1594# Windows: Copying NSIS language files to local nsis directory
1595##################################################################
1596
1597sub copy_and_translate_nsis_language_files
1598{
1599	my ($nsispath, $localnsisdir, $languagesarrayref, $allvariables) = @_;
1600
1601	my $nlffilepath = $nsispath . $installer::globals::separator . "Contrib" . $installer::globals::separator . "Language\ files" . $installer::globals::separator;
1602	my $nshfilepath = $nsispath . $installer::globals::separator . "Contrib" . $installer::globals::separator . "Modern\ UI" . $installer::globals::separator . "Language files" . $installer::globals::separator;
1603
1604	my $infoline = "";
1605
1606	for ( my $i = 0; $i <= $#{$languagesarrayref}; $i++ )
1607	{
1608		my $onelanguage = ${$languagesarrayref}[$i];
1609		my $nsislanguage = nsis_language_converter($onelanguage);
1610
1611		# Copying the nlf file
1612		my $sourcepath = $nlffilepath . $nsislanguage . "\.nlf";
1613		if ( ! -f $sourcepath ) { installer::exiter::exit_program("ERROR: Could not find nsis file: $sourcepath!", "copy_and_translate_nsis_language_files"); }
1614		my $nlffilename = $localnsisdir . $installer::globals::separator . $nsislanguage . "_pack.nlf";
1615		if ( $^O =~ /cygwin/i ) { $nlffilename =~ s/\//\\/g; }
1616		installer::systemactions::copy_one_file($sourcepath, $nlffilename);
1617
1618		# Copying the nsh file
1619		# In newer nsis versions, the nsh file is located next to the nlf file
1620		$sourcepath = $nshfilepath . $nsislanguage . "\.nsh";
1621		if ( ! -f $sourcepath )
1622		{
1623			# trying to find the nsh file next to the nlf file
1624			$sourcepath = $nlffilepath . $nsislanguage . "\.nsh";
1625			if ( ! -f $sourcepath )
1626			{
1627				installer::exiter::exit_program("ERROR: Could not find nsis file: $sourcepath!", "copy_and_translate_nsis_language_files");
1628			}
1629		}
1630		my $nshfilename = $localnsisdir . $installer::globals::separator . $nsislanguage . "_pack.nsh";
1631		if ( $^O =~ /cygwin/i ) { $nshfilename =~ s/\//\\/g; }
1632		installer::systemactions::copy_one_file($sourcepath, $nshfilename);
1633
1634		# Changing the macro name in nsh file: MUI_LANGUAGEFILE_BEGIN -> MUI_LANGUAGEFILE_PACK_BEGIN
1635		my $nshfile = installer::files::read_file($nshfilename);
1636		set_nsis_version($nshfile);
1637
1638		if ( $installer::globals::unicodensis )
1639		{
1640			$infoline = "This is Unicode NSIS!\n";
1641			push( @installer::globals::logfileinfo, $infoline);
1642			convert_utf16_to_utf8($nshfilename);
1643			convert_utf16_to_utf8($nlffilename);
1644			$nshfile = installer::files::read_file($nshfilename);	# read nsh file again
1645		}
1646
1647		replace_one_variable($nshfile, "MUI_LANGUAGEFILE_BEGIN", "MUI_LANGUAGEFILE_PACK_BEGIN");
1648
1649		# find the ulf file for translation
1650		my $mlffile = get_translation_file($allvariables);
1651
1652		# Translate the files
1653		my $nlffile = installer::files::read_file($nlffilename);
1654		translate_nsh_nlf_file($nshfile, $nlffile, $mlffile, $onelanguage, $nshfilename, $nlffilename, $nsislanguage);
1655
1656		installer::files::save_file($nshfilename, $nshfile);
1657		installer::files::save_file($nlffilename, $nlffile);
1658
1659		if ( $installer::globals::unicodensis )
1660		{
1661			convert_utf8_to_utf16($nshfilename);
1662			convert_utf8_to_utf16($nlffilename);
1663		}
1664	}
1665
1666}
1667
1668##################################################################
1669# Windows: Including the nsis path into the nsi template
1670##################################################################
1671
1672sub put_nsis_path_into_template
1673{
1674	my ($templatefile, $nsisdir) = @_;
1675
1676	replace_one_variable($templatefile, "NSISPATHPLACEHOLDER", $nsisdir);
1677}
1678
1679##################################################################
1680# Windows: Including the output path into the nsi template
1681##################################################################
1682
1683sub put_output_path_into_template
1684{
1685	my ($templatefile, $downloaddir) = @_;
1686
1687	if ( $^O =~ /cygwin/i ) { $downloaddir =~ s/\//\\/g; }
1688
1689	replace_one_variable($templatefile, "OUTPUTDIRPLACEHOLDER", $downloaddir);
1690}
1691
1692##################################################################
1693# Windows: Only allow specific code for nsis 2.0.4 or nsis 2.3.1
1694##################################################################
1695
1696sub put_version_specific_code_into_template
1697{
1698	my ($templatefile) = @_;
1699
1700	my $subst204 = "";
1701	my $subst231 = "";
1702
1703	if ( $installer::globals::nsis204 )
1704	{
1705		$subst231 = ";";
1706	}
1707	else
1708	{
1709		$subst204 = ";";
1710	}
1711
1712	replace_one_variable($templatefile, "\#204\#", $subst204);
1713	replace_one_variable($templatefile, "\#231\#", $subst231);
1714}
1715
1716##################################################################
1717# Windows: Finding the path to the nsis SDK
1718##################################################################
1719
1720sub get_path_to_nsis_sdk
1721{
1722	my $vol;
1723	my $dir;
1724	my $file;
1725	my $nsispath = "";
1726
1727	if ( $ENV{'NSIS_PATH'} ) {
1728		$nsispath = $ENV{'NSIS_PATH'};
1729	} elsif ( $ENV{'SOLARROOT'} ) {
1730		$nsispath = $ENV{'SOLARROOT'} . $installer::globals::separator . "NSIS";
1731	} else {
1732		# do we have nsis already in path ?
1733		@paths = split(/:/, $ENV{'PATH'});
1734		foreach $paths (@paths) {
1735			$paths =~ s/[\/\\]+$//; # remove trailing slashes;
1736			$nsispath = $paths . "/nsis";
1737
1738			if ( -x $nsispath ) {
1739				$nsispath = $paths;
1740				last;
1741			}
1742			else {
1743				$nsispath = "";
1744			}
1745		}
1746	}
1747	if ( $ENV{'NSISSDK_SOURCE'} ) {
1748	    installer::logger::print_warning( "NSISSDK_SOURCE is deprecated. use NSIS_PATH instead.\n" );
1749        $nsispath = $ENV{'NSISSDK_SOURCE'};	# overriding the NSIS SDK with NSISSDK_SOURCE
1750    }
1751
1752#	if( ($^O =~ /cygwin/i) and $nsispath =~ /\\/ ) {
1753#		# We need a POSIX path for W32-4nt-cygwin-perl
1754#		$nsispath =~ s/\\/\\\\/g;
1755#		chomp( $nsispath = qx{cygpath -u "$nsispath"} );
1756#	}
1757
1758	if ( $nsispath eq "" )
1759	{
1760		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");
1761	} elsif ( ! -d $nsispath )
1762	{
1763		installer::exiter::exit_program("ERROR: NSIS path $nsispath does not exist!", "get_path_to_nsis_sdk");
1764	}
1765
1766	return $nsispath;
1767}
1768
1769##################################################################
1770# Windows: Executing NSIS to create the installation set
1771##################################################################
1772
1773sub call_nsis
1774{
1775	my ( $nsispath, $nsifile ) = @_;
1776
1777	my $makensisexe = $nsispath . $installer::globals::separator . "makensis.exe";
1778
1779	installer::logger::print_message( "... starting $makensisexe ... \n" );
1780
1781	if( $^O =~ /cygwin/i ) { $nsifile =~ s/\\/\//g;	}
1782
1783	my $systemcall = "$makensisexe $nsifile |";
1784
1785	my $infoline = "Systemcall: $systemcall\n";
1786	push( @installer::globals::logfileinfo, $infoline);
1787
1788	my @nsisoutput = ();
1789
1790	open (NSI, "$systemcall");
1791	while (<NSI>) {push(@nsisoutput, $_); }
1792	close (NSI);
1793
1794	my $returnvalue = $?;	# $? contains the return value of the systemcall
1795
1796	if ($returnvalue)
1797	{
1798		$infoline = "ERROR: $systemcall !\n";
1799		push( @installer::globals::logfileinfo, $infoline);
1800	}
1801	else
1802	{
1803		$infoline = "Success: $systemcall\n";
1804		push( @installer::globals::logfileinfo, $infoline);
1805	}
1806
1807	for ( my $i = 0; $i <= $#nsisoutput; $i++ ) { push( @installer::globals::logfileinfo, "$nsisoutput[$i]"); }
1808
1809}
1810
1811#################################################################################
1812# Replacing one variable in one files
1813#################################################################################
1814
1815sub replace_one_variable_in_translationfile
1816{
1817	my ($translationfile, $variable, $searchstring) = @_;
1818
1819	for ( my $i = 0; $i <= $#{$translationfile}; $i++ )
1820	{
1821		${$translationfile}[$i] =~ s/\%$searchstring/$variable/g;
1822	}
1823}
1824
1825#################################################################################
1826# Replacing the variables in the translation file
1827#################################################################################
1828
1829sub replace_variables
1830{
1831	my ($translationfile, $variableshashref) = @_;
1832
1833	foreach $key (keys %{$variableshashref})
1834	{
1835		my $value = $variableshashref->{$key};
1836
1837		# special handling for PRODUCTVERSION, if $allvariables->{'POSTVERSIONEXTENSION'}
1838		if (( $key eq "PRODUCTVERSION" ) && ( $variableshashref->{'POSTVERSIONEXTENSION'} )) { $value = $value . " " . $variableshashref->{'POSTVERSIONEXTENSION'}; }
1839
1840		replace_one_variable_in_translationfile($translationfile, $value, $key);
1841	}
1842}
1843
1844#########################################################
1845# Getting the translation file for the nsis installer
1846#########################################################
1847
1848sub get_translation_file
1849{
1850	my ($allvariableshashref) = @_;
1851	my $translationfilename = $installer::globals::idtlanguagepath . $installer::globals::separator . $installer::globals::nsisfilename;
1852	if ( $installer::globals::unicodensis ) { $translationfilename = $translationfilename . ".uulf"; }
1853	else { $translationfilename = $translationfilename . ".mlf"; }
1854	if ( ! -f $translationfilename ) { installer::exiter::exit_program("ERROR: Could not find language file $translationfilename!", "get_translation_file"); }
1855	my $translationfile = installer::files::read_file($translationfilename);
1856	replace_variables($translationfile, $allvariableshashref);
1857
1858	my $infoline = "Reading translation file: $translationfilename\n";
1859	push( @installer::globals::logfileinfo, $infoline);
1860
1861	return $translationfile;
1862}
1863
1864####################################################
1865# Removing english, if it was added before
1866####################################################
1867
1868sub remove_english_for_nsis_installer
1869{
1870	my ($languagestringref, $languagesarrayref) = @_;
1871
1872	# $$languagestringref =~ s/en-US_//;
1873	# shift(@{$languagesarrayref});
1874
1875	@{$languagesarrayref} = ("en-US");	# only english for NSIS installer!
1876}
1877
1878####################################################
1879# Creating link tree for upload
1880####################################################
1881
1882sub create_link_tree
1883{
1884	my ($sourcedownloadfile, $destfilename, $versionstring) = @_;
1885
1886	if ( ! $installer::globals::ooouploaddir ) { installer::exiter::exit_program("ERROR: Directory for OOo upload not defined!", "create_link_tree"); }
1887	my $versiondir = $installer::globals::ooouploaddir . $installer::globals::separator . $versionstring;
1888	my $infoline = "Directory for the link: $versiondir\n";
1889	push(@installer::globals::logfileinfo, $infoline);
1890
1891	if ( ! -d $versiondir ) { installer::systemactions::create_directory_structure($versiondir); }
1892
1893	# inside directory $versiondir all links have to be created
1894	my $linkdestination = $versiondir . $installer::globals::separator . $destfilename;
1895
1896	# If there is an older version of this file (link), it has to be removed
1897	if ( -f $linkdestination ) { unlink($linkdestination); }
1898
1899	$infoline = "Creating hard link from $sourcedownloadfile to $linkdestination\n";
1900	push(@installer::globals::logfileinfo, $infoline);
1901	installer::systemactions::hardlink_one_file($sourcedownloadfile, $linkdestination);
1902}
1903
1904#######################################################
1905# Setting supported platform for Sun OpenOffice.org
1906# builds
1907#######################################################
1908
1909sub is_supported_platform
1910{
1911	my $is_supported = 0;
1912
1913	if (( $installer::globals::islinuxrpmbuild ) ||
1914		( $installer::globals::issolarissparcbuild ) ||
1915		( $installer::globals::issolarisx86build ) ||
1916		( $installer::globals::iswindowsbuild ))
1917	{
1918		$is_supported = 1;
1919	}
1920
1921	return $is_supported;
1922}
1923
1924####################################################
1925# Creating download installation sets
1926####################################################
1927
1928sub create_download_sets
1929{
1930	my ($installationdir, $includepatharrayref, $allvariableshashref, $downloadname, $languagestringref, $languagesarrayref) = @_;
1931
1932	my $infoline = "";
1933
1934	my $force = 1; # print this message even in 'quiet' mode
1935	installer::logger::print_message( "\n******************************************\n" );
1936	installer::logger::print_message( "... creating download installation set ...\n", $force );
1937	installer::logger::print_message( "******************************************\n" );
1938
1939	installer::logger::include_header_into_logfile("Creating download installation sets:");
1940
1941	# special handling for installation sets, to which english was added automatically
1942	if ( $installer::globals::added_english ) { remove_english_for_nsis_installer($languagestringref, $languagesarrayref); }
1943
1944	my $firstdir = $installationdir;
1945	installer::pathanalyzer::get_path_from_fullqualifiedname(\$firstdir);
1946
1947	my $lastdir = $installationdir;
1948	installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$lastdir);
1949
1950	if ( $lastdir =~ /\./ ) { $lastdir =~ s/\./_download_inprogress\./ }
1951	else { $lastdir = $lastdir . "_download_inprogress"; }
1952
1953	# removing existing directory "_native_packed_inprogress" and "_native_packed_witherror" and "_native_packed"
1954
1955	my $downloaddir = $firstdir . $lastdir;
1956
1957	if ( -d $downloaddir ) { installer::systemactions::remove_complete_directory($downloaddir); }
1958
1959	my $olddir = $downloaddir;
1960	$olddir =~ s/_inprogress/_witherror/;
1961	if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); }
1962
1963	$olddir = $downloaddir;
1964	$olddir =~ s/_inprogress//;
1965	if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); }
1966
1967	# creating the new directory
1968
1969	installer::systemactions::create_directory($downloaddir);
1970
1971	$installer::globals::saveinstalldir = $downloaddir;
1972
1973	# evaluating the name of the download file
1974
1975	if ( $allvariableshashref->{'OOODOWNLOADNAME'} ) { $downloadname = set_download_filename($languagestringref, $allvariableshashref); }
1976	else { $downloadname = resolve_variables_in_downloadname($allvariableshashref, $downloadname, $languagestringref); }
1977
1978	if ( ! $installer::globals::iswindowsbuild )	# Unix specific part
1979	{
1980
1981		# getting the path of the getuid.so (only required for Solaris and Linux)
1982		my $getuidlibrary = "";
1983		if (( $installer::globals::issolarisbuild ) || ( $installer::globals::islinuxbuild )) {	$getuidlibrary = get_path_for_library($includepatharrayref); }
1984
1985		if ( $allvariableshashref->{'OOODOWNLOADNAME'} )
1986		{
1987			my $downloadfile = create_tar_gz_file_from_directory($installationdir, $getuidlibrary, $downloaddir, $downloadname);
1988		}
1989		else
1990		{
1991			# find and read setup script template
1992			my $scriptfilename = "downloadscript.sh";
1993
1994			my $scriptref = "";
1995
1996			if ( $installer::globals::include_pathes_read )
1997			{
1998				$scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptfilename, $includepatharrayref, 0);
1999			}
2000			else
2001			{
2002				$scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$scriptfilename, $includepatharrayref, 0);
2003			}
2004
2005			if ($$scriptref eq "") { installer::exiter::exit_program("ERROR: Could not find script file $scriptfilename!", "create_download_sets"); }
2006			my $scriptfile = installer::files::read_file($$scriptref);
2007
2008			$infoline = "Found  script file $scriptfilename: $$scriptref \n";
2009			push( @installer::globals::logfileinfo, $infoline);
2010
2011			# add product name into script template
2012			put_productname_into_script($scriptfile, $allvariableshashref);
2013
2014			# replace linenumber in script template
2015			put_linenumber_into_script($scriptfile);
2016
2017			# create tar file
2018			my $temporary_tarfile_name = $downloaddir . $installer::globals::separator . 'installset.tar';
2019			my $size = tar_package($installationdir, $temporary_tarfile_name, $getuidlibrary);
2020			installer::exiter::exit_program("ERROR: Could not create tar file $temporary_tarfile_name!", "create_download_sets") unless $size;
2021
2022			# calling sum to determine checksum and size of the tar file
2023			my $sumout = call_sum($temporary_tarfile_name);
2024
2025			# writing checksum and size into scriptfile
2026			put_checksum_and_size_into_script($scriptfile, $sumout);
2027
2028			# saving the script file
2029			my $newscriptfilename = determine_scriptfile_name($downloadname);
2030			$newscriptfilename = save_script_file($downloaddir, $newscriptfilename, $scriptfile);
2031
2032			installer::logger::print_message( "... including installation set into $newscriptfilename ... \n" );
2033            # Append tar file to script
2034			include_tar_into_script($newscriptfilename, $temporary_tarfile_name);
2035		}
2036	}
2037	else	# Windows specific part
2038	{
2039		my $localnsisdir = installer::systemactions::create_directories("nsis", $languagestringref);
2040		# push(@installer::globals::removedirs, $localnsisdir);
2041
2042		# find nsis in the system
2043		my $nsispath = get_path_to_nsis_sdk();
2044
2045		if ( $nsispath eq "" ) {
2046			# If nsis is not found just skip the rest of this function
2047			# and do not create the NSIS file.
2048			$infoline = "\nNo NSIS SDK found. Skipping the generation of NSIS file.\n";
2049			push(@installer::globals::logfileinfo, $infoline);
2050			installer::logger::print_message( "... no NSIS SDK found. Skipping the generation of NSIS file ... \n" );
2051			return $downloaddir;
2052		}
2053
2054		# copy language files into nsis directory and translate them
2055		copy_and_translate_nsis_language_files($nsispath, $localnsisdir, $languagesarrayref, $allvariableshashref);
2056
2057		# find and read the nsi file template
2058		my $templatefilename = "downloadtemplate.nsi";
2059
2060		my $templateref = "";
2061
2062		if ( $installer::globals::include_pathes_read )
2063		{
2064			$templateref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$templatefilename, $includepatharrayref, 0);
2065		}
2066		else
2067		{
2068			$templateref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$templatefilename, $includepatharrayref, 0);
2069		}
2070
2071		if ($$templateref eq "") { installer::exiter::exit_program("ERROR: Could not find nsi template file $templatefilename!", "create_download_sets"); }
2072		my $templatefile = installer::files::read_file($$templateref);
2073
2074		# add product name into script template
2075		put_windows_productname_into_template($templatefile, $allvariableshashref);
2076		put_banner_bmp_into_template($templatefile, $includepatharrayref, $allvariableshashref);
2077		put_welcome_bmp_into_template($templatefile, $includepatharrayref, $allvariableshashref);
2078		put_setup_ico_into_template($templatefile, $includepatharrayref, $allvariableshashref);
2079		put_publisher_into_template($templatefile);
2080		put_website_into_template($templatefile);
2081		put_javafilename_into_template($templatefile, $allvariableshashref);
2082		put_windows_productversion_into_template($templatefile, $allvariableshashref);
2083		put_windows_productpath_into_template($templatefile, $allvariableshashref, $languagestringref, $localnsisdir);
2084		put_outputfilename_into_template($templatefile, $downloadname);
2085		put_filelist_into_template($templatefile, $installationdir);
2086		put_language_list_into_template($templatefile, $languagesarrayref);
2087		put_nsis_path_into_template($templatefile, $localnsisdir);
2088		put_output_path_into_template($templatefile, $downloaddir);
2089		put_version_specific_code_into_template($templatefile);
2090
2091		my $nsifilename = save_script_file($localnsisdir, $templatefilename, $templatefile);
2092
2093		installer::logger::print_message( "... created NSIS file $nsifilename ... \n" );
2094
2095		# starting the NSIS SDK to create the download file
2096		call_nsis($nsispath, $nsifilename);
2097	}
2098
2099	return $downloaddir;
2100}
2101
2102####################################################
2103# Creating OOo upload tree
2104####################################################
2105
2106sub create_download_link_tree
2107{
2108	my ($downloaddir, $languagestringref, $allvariableshashref) = @_;
2109
2110	my $infoline;
2111
2112	installer::logger::print_message( "\n******************************************\n" );
2113	installer::logger::print_message( "... creating download hard link ...\n" );
2114	installer::logger::print_message( "******************************************\n" );
2115
2116	installer::logger::include_header_into_logfile("Creating download hard link:");
2117	installer::logger::include_timestamp_into_logfile("\nPerformance Info: Creating hard link, start");
2118
2119	if ( is_supported_platform() )
2120	{
2121		my $versionstring = "";
2122		# Already defined $installer::globals::oooversionstring and $installer::globals::ooodownloadfilename ?
2123
2124		if ( ! $installer::globals::oooversionstring ) { $versionstring = get_current_version(); }
2125		else { $versionstring = $installer::globals::oooversionstring; }
2126
2127		# Is $versionstring empty? If yes, there is nothing to do now.
2128
2129		$infoline = "Version string is set to: $versionstring\n";
2130		push( @installer::globals::logfileinfo, $infoline);
2131
2132		if ( $versionstring )
2133		{
2134			# Now the downloadfilename has to be set (if not already done)
2135			my $destdownloadfilename = "";
2136			if ( ! $installer::globals::ooodownloadfilename ) { $destdownloadfilename = set_download_filename($languagestringref, $versionstring, $allvariableshashref); }
2137			else { $destdownloadfilename = $installer::globals::ooodownloadfilename; }
2138
2139			if ( $destdownloadfilename )
2140			{
2141				$destdownloadfilename = $destdownloadfilename . $installer::globals::downloadfileextension;
2142
2143				$infoline = "Setting destination download file name: $destdownloadfilename\n";
2144				push( @installer::globals::logfileinfo, $infoline);
2145
2146				my $sourcedownloadfile = $downloaddir . $installer::globals::separator . $installer::globals::downloadfilename;
2147
2148				$infoline = "Setting source download file name: $sourcedownloadfile\n";
2149				push( @installer::globals::logfileinfo, $infoline);
2150
2151				create_link_tree($sourcedownloadfile, $destdownloadfilename, $versionstring);
2152				# my $md5sumoutput = call_md5sum($downloadfile);
2153				# my $md5sum = get_md5sum($md5sumoutput);
2154
2155			}
2156		}
2157		else
2158		{
2159			$infoline = "Version string is empty. Nothing to do!\n";
2160			push( @installer::globals::logfileinfo, $infoline);
2161		}
2162	}
2163	else
2164	{
2165		$infoline = "Platform not used for hard linking. Nothing to do!\n";
2166		push( @installer::globals::logfileinfo, $infoline);
2167	}
2168
2169	installer::logger::include_timestamp_into_logfile("Performance Info: Creating hard link, stop");
2170}
2171
21721;
2173