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