19780544fSAndrew Rist#**************************************************************
29780544fSAndrew Rist#
39780544fSAndrew Rist#  Licensed to the Apache Software Foundation (ASF) under one
49780544fSAndrew Rist#  or more contributor license agreements.  See the NOTICE file
59780544fSAndrew Rist#  distributed with this work for additional information
69780544fSAndrew Rist#  regarding copyright ownership.  The ASF licenses this file
79780544fSAndrew Rist#  to you under the Apache License, Version 2.0 (the
89780544fSAndrew Rist#  "License"); you may not use this file except in compliance
99780544fSAndrew Rist#  with the License.  You may obtain a copy of the License at
109780544fSAndrew Rist#
119780544fSAndrew Rist#    http://www.apache.org/licenses/LICENSE-2.0
129780544fSAndrew Rist#
139780544fSAndrew Rist#  Unless required by applicable law or agreed to in writing,
149780544fSAndrew Rist#  software distributed under the License is distributed on an
159780544fSAndrew Rist#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169780544fSAndrew Rist#  KIND, either express or implied.  See the License for the
179780544fSAndrew Rist#  specific language governing permissions and limitations
189780544fSAndrew Rist#  under the License.
199780544fSAndrew Rist#
209780544fSAndrew Rist#**************************************************************
219780544fSAndrew Rist
229780544fSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweirpackage installer::windows::directory;
25cdf0e10cSrcweir
26cdf0e10cSrcweiruse installer::exiter;
27cdf0e10cSrcweiruse installer::files;
28cdf0e10cSrcweiruse installer::globals;
29cdf0e10cSrcweiruse installer::pathanalyzer;
30cdf0e10cSrcweiruse installer::windows::idtglobal;
3119d58b3aSEike Rathkeuse installer::windows::msiglobal;
32cdf0e10cSrcweir
33cdf0e10cSrcweir##############################################################
34cdf0e10cSrcweir# Collecting all directory trees in global hash
35cdf0e10cSrcweir##############################################################
36cdf0e10cSrcweir
37cdf0e10cSrcweirsub collectdirectorytrees
38cdf0e10cSrcweir{
39cdf0e10cSrcweir	my ( $directoryref ) = @_;
40cdf0e10cSrcweir
41cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$directoryref}; $i++ )
42cdf0e10cSrcweir	{
43cdf0e10cSrcweir		my $onedir = ${$directoryref}[$i];
44cdf0e10cSrcweir		my $styles = "";
45cdf0e10cSrcweir		if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
46cdf0e10cSrcweir
47cdf0e10cSrcweir		if ( $styles ne "" )
48cdf0e10cSrcweir		{
49cdf0e10cSrcweir			foreach my $treestyle ( keys %installer::globals::treestyles )
50cdf0e10cSrcweir			{
51cdf0e10cSrcweir				if ( $styles =~ /\b$treestyle\b/ )
52cdf0e10cSrcweir				{
53cdf0e10cSrcweir					my $hostname = $onedir->{'HostName'};
54cdf0e10cSrcweir					# -> hostname is the key, the style the value!
55cdf0e10cSrcweir					$installer::globals::hostnametreestyles{$hostname} = $treestyle;
56cdf0e10cSrcweir				}
57cdf0e10cSrcweir			}
58cdf0e10cSrcweir		}
59cdf0e10cSrcweir	}
60cdf0e10cSrcweir}
61cdf0e10cSrcweir
62cdf0e10cSrcweir##############################################################
63cdf0e10cSrcweir# Overwriting global programfilesfolder, if required
64cdf0e10cSrcweir##############################################################
65cdf0e10cSrcweir
66cdf0e10cSrcweirsub overwrite_programfilesfolder
67cdf0e10cSrcweir{
68cdf0e10cSrcweir	my ( $allvariables ) = @_;
69cdf0e10cSrcweir
70cdf0e10cSrcweir	if ( $allvariables->{'PROGRAMFILESFOLDERNAME'} )
71cdf0e10cSrcweir	{
72cdf0e10cSrcweir		$installer::globals::programfilesfolder = $allvariables->{'PROGRAMFILESFOLDERNAME'};
73cdf0e10cSrcweir	}
74cdf0e10cSrcweir}
75cdf0e10cSrcweir
76cdf0e10cSrcweir##############################################################
77cdf0e10cSrcweir# Maximum length of directory name is 72.
78cdf0e10cSrcweir# Taking care of underlines, which are the separator.
79cdf0e10cSrcweir##############################################################
80cdf0e10cSrcweir
81cdf0e10cSrcweirsub make_short_dir_version
82cdf0e10cSrcweir{
8319d58b3aSEike Rathke	my ($longstring) = @_;
84cdf0e10cSrcweir
85cdf0e10cSrcweir	my $shortstring = "";
8619d58b3aSEike Rathke	my $cutlength = 60;
8719d58b3aSEike Rathke	my $length = 5; # So the directory can still be recognized
8819d58b3aSEike Rathke	my $longstring_save = $longstring;
89cdf0e10cSrcweir
90cdf0e10cSrcweir	# Splitting the string at each "underline" and allowing only $length characters per directory name.
91cdf0e10cSrcweir	# Checking also uniqueness and length.
92cdf0e10cSrcweir
93cdf0e10cSrcweir	my $stringarray = installer::converter::convert_stringlist_into_array_without_newline(\$longstring, "_");
94cdf0e10cSrcweir
95cdf0e10cSrcweir	foreach my $onestring ( @{$stringarray} )
96cdf0e10cSrcweir	{
97cdf0e10cSrcweir		my $partstring = "";
98cdf0e10cSrcweir
99cdf0e10cSrcweir		if ( $onestring =~ /\-/ )
100cdf0e10cSrcweir		{
101cdf0e10cSrcweir			my $localstringarray = installer::converter::convert_stringlist_into_array_without_newline(\$onestring, "-");
102cdf0e10cSrcweir			foreach my $onelocalstring ( @{$localstringarray} )
103cdf0e10cSrcweir			{
104cdf0e10cSrcweir				if ( length($onelocalstring) > $length ) { $onelocalstring = substr($onelocalstring, 0, $length); }
105cdf0e10cSrcweir				$partstring = $partstring . "-" . $onelocalstring;
106cdf0e10cSrcweir			}
107cdf0e10cSrcweir			$partstring =~ s/^\s*\-//;
108cdf0e10cSrcweir		}
109cdf0e10cSrcweir		else
110cdf0e10cSrcweir		{
111cdf0e10cSrcweir			if ( length($onestring) > $length ) { $partstring = substr($onestring, 0, $length); }
112cdf0e10cSrcweir			else { $partstring = $onestring; }
113cdf0e10cSrcweir		}
114cdf0e10cSrcweir
115cdf0e10cSrcweir		$shortstring = $shortstring . "_" . $partstring;
116cdf0e10cSrcweir	}
117cdf0e10cSrcweir
118cdf0e10cSrcweir	$shortstring =~ s/^\s*\_//;
119cdf0e10cSrcweir
12019d58b3aSEike Rathke	# Setting unique ID to each directory
12119d58b3aSEike Rathke	# No counter allowed, process must be absolute reproducable due to patch creation process.
12219d58b3aSEike Rathke
12319d58b3aSEike Rathke	# chomp(my $id = `echo $longstring_save | md5sum | sed -e "s/ .*//g"`);  # Very, very slow
12419d58b3aSEike Rathke	# my $subid = substr($id, 0, 9); # taking only the first 9 digits
12519d58b3aSEike Rathke
12619d58b3aSEike Rathke	my $subid = installer::windows::msiglobal::calculate_id($longstring_save, 9); # taking only the first 9 digits
12719d58b3aSEike Rathke
12819d58b3aSEike Rathke	if ( length($shortstring) > $cutlength ) { $shortstring = substr($shortstring, 0, $cutlength); }
12919d58b3aSEike Rathke
13019d58b3aSEike Rathke	$shortstring = $shortstring . "_" . $subid;
131cdf0e10cSrcweir
132cdf0e10cSrcweir	return $shortstring;
133cdf0e10cSrcweir}
134cdf0e10cSrcweir
135cdf0e10cSrcweir##############################################################
136cdf0e10cSrcweir# Adding unique directory names to the directory collection
137cdf0e10cSrcweir##############################################################
138cdf0e10cSrcweir
139cdf0e10cSrcweirsub create_unique_directorynames
140cdf0e10cSrcweir{
141cdf0e10cSrcweir	my ($directoryref, $allvariables) = @_;
142cdf0e10cSrcweir
143cdf0e10cSrcweir	$installer::globals::officeinstalldirectoryset = 0;
14419d58b3aSEike Rathke
14519d58b3aSEike Rathke	my %completedirhashstep1 = ();
14619d58b3aSEike Rathke	my %shortdirhash = ();
14719d58b3aSEike Rathke	my %shortdirhashreverse = ();
148cdf0e10cSrcweir	my $infoline = "";
149cdf0e10cSrcweir	my $errorcount = 0;
150cdf0e10cSrcweir
151cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$directoryref}; $i++ )
152cdf0e10cSrcweir	{
153cdf0e10cSrcweir		my $onedir = ${$directoryref}[$i];
15419d58b3aSEike Rathke		my $uniquename = $onedir->{'HostName'};
155cdf0e10cSrcweir
156cdf0e10cSrcweir		my $styles = "";
157cdf0e10cSrcweir		if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
158cdf0e10cSrcweir
159cdf0e10cSrcweir		$uniquename =~ s/^\s*//g;				# removing beginning white spaces
160cdf0e10cSrcweir		$uniquename =~ s/\s*$//g;				# removing ending white spaces
161cdf0e10cSrcweir		$uniquename =~ s/\s//g;					# removing white spaces
162cdf0e10cSrcweir		$uniquename =~ s/\_//g;					# removing existing underlines
163cdf0e10cSrcweir		$uniquename =~ s/\.//g;					# removing dots in directoryname
164cdf0e10cSrcweir		$uniquename =~ s/OpenOffice/OO/g;
16519d58b3aSEike Rathke
16619d58b3aSEike Rathke		$uniquename =~ s/\Q$installer::globals::separator\E/\_/g;	# replacing slash and backslash with underline
16719d58b3aSEike Rathke
168cdf0e10cSrcweir		$uniquename =~ s/_registry/_rgy/g;
169cdf0e10cSrcweir		$uniquename =~ s/_registration/_rgn/g;
170cdf0e10cSrcweir		$uniquename =~ s/_extension/_ext/g;
171cdf0e10cSrcweir		$uniquename =~ s/_frame/_frm/g;
172cdf0e10cSrcweir		$uniquename =~ s/_table/_tbl/g;
173cdf0e10cSrcweir		$uniquename =~ s/_chart/_crt/g;
174cdf0e10cSrcweir
17519d58b3aSEike Rathke		# The names after this small changes must still be unique!
17619d58b3aSEike Rathke		if ( exists($completedirhashstep1{$uniquename}) ) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 1): \"$uniquename\".", "create_unique_directorynames"); }
17719d58b3aSEike Rathke		$completedirhashstep1{$uniquename} = 1;
178cdf0e10cSrcweir
17919d58b3aSEike Rathke		# Starting to make unique name for the parent and its directory
18019d58b3aSEike Rathke		my $originaluniquename = $uniquename;
18119d58b3aSEike Rathke
18219d58b3aSEike Rathke		$uniquename = make_short_dir_version($uniquename);
18319d58b3aSEike Rathke
18419d58b3aSEike Rathke		# Checking if the same directory already exists, but has another short version.
18519d58b3aSEike Rathke		if (( exists($shortdirhash{$originaluniquename}) ) && ( $shortdirhash{$originaluniquename} ne $uniquename )) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 2A): \"$uniquename\".", "create_unique_directorynames"); }
18619d58b3aSEike Rathke
18719d58b3aSEike Rathke		# Also checking vice versa
18819d58b3aSEike Rathke		# Checking if the same short directory already exists, but has another long version.
18919d58b3aSEike Rathke		if (( exists($shortdirhashreverse{$uniquename}) ) && ( $shortdirhashreverse{$uniquename} ne $originaluniquename )) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 2B): \"$uniquename\".", "create_unique_directorynames"); }
190cdf0e10cSrcweir
19119d58b3aSEike Rathke		# Creating assignment from long to short directory names
19219d58b3aSEike Rathke		$shortdirhash{$originaluniquename} = $uniquename;
19319d58b3aSEike Rathke		$shortdirhashreverse{$uniquename} = $originaluniquename;
194cdf0e10cSrcweir
19519d58b3aSEike Rathke		# Important: The unique parent is generated from the string $originaluniquename (with the use of underlines).
196cdf0e10cSrcweir
19719d58b3aSEike Rathke		my $uniqueparentname = $originaluniquename;
19819d58b3aSEike Rathke		my $keepparent = 1;
199cdf0e10cSrcweir
200cdf0e10cSrcweir		if ( $uniqueparentname =~ /^\s*(.*)\_(.*?)\s*$/ )	# the underline is now the separator
201cdf0e10cSrcweir		{
202cdf0e10cSrcweir			$uniqueparentname = $1;
20319d58b3aSEike Rathke			$keepparent = 0;
204cdf0e10cSrcweir		}
205cdf0e10cSrcweir		else
206cdf0e10cSrcweir		{
207cdf0e10cSrcweir			$uniqueparentname = $installer::globals::programfilesfolder;
20819d58b3aSEike Rathke			$keepparent = 1;
209cdf0e10cSrcweir		}
210cdf0e10cSrcweir
21119d58b3aSEike Rathke		if ( $styles =~ /\bPROGRAMFILESFOLDER\b/ )
21219d58b3aSEike Rathke		{
21319d58b3aSEike Rathke			$uniqueparentname = $installer::globals::programfilesfolder;
21419d58b3aSEike Rathke			$keepparent = 1;
21519d58b3aSEike Rathke		}
21619d58b3aSEike Rathke		if ( $styles =~ /\bCOMMONFILESFOLDER\b/ )
21719d58b3aSEike Rathke		{
21819d58b3aSEike Rathke			$uniqueparentname = $installer::globals::commonfilesfolder;
21919d58b3aSEike Rathke			$keepparent = 1;
22019d58b3aSEike Rathke		}
22119d58b3aSEike Rathke		if ( $styles =~ /\bCOMMONAPPDATAFOLDER\b/ )
22219d58b3aSEike Rathke		{
22319d58b3aSEike Rathke			$uniqueparentname = $installer::globals::commonappdatafolder;
22419d58b3aSEike Rathke			$keepparent = 1;
22519d58b3aSEike Rathke		}
22619d58b3aSEike Rathke		if ( $styles =~ /\bLOCALAPPDATAFOLDER\b/ )
22719d58b3aSEike Rathke		{
22819d58b3aSEike Rathke			$uniqueparentname = $installer::globals::localappdatafolder;
22919d58b3aSEike Rathke			$keepparent = 1;
23019d58b3aSEike Rathke		}
231cdf0e10cSrcweir
232cdf0e10cSrcweir		if ( $styles =~ /\bSHAREPOINTPATH\b/ )
233cdf0e10cSrcweir		{
234cdf0e10cSrcweir			$uniqueparentname = "SHAREPOINTPATH";
235cdf0e10cSrcweir			$installer::globals::usesharepointpath = 1;
23619d58b3aSEike Rathke			$keepparent = 1;
237cdf0e10cSrcweir		}
238cdf0e10cSrcweir
23919d58b3aSEike Rathke		# also setting short directory name for the parent
24019d58b3aSEike Rathke
24119d58b3aSEike Rathke		my $originaluniqueparentname = $uniqueparentname;
24219d58b3aSEike Rathke
24319d58b3aSEike Rathke		if ( ! $keepparent )
24419d58b3aSEike Rathke		{
24519d58b3aSEike Rathke			$uniqueparentname = make_short_dir_version($uniqueparentname);
24619d58b3aSEike Rathke		}
24719d58b3aSEike Rathke
24819d58b3aSEike Rathke		# Again checking if the same directory already exists, but has another short version.
24919d58b3aSEike Rathke		if (( exists($shortdirhash{$originaluniqueparentname}) ) && ( $shortdirhash{$originaluniqueparentname} ne $uniqueparentname )) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 3A): \"$uniqueparentname\".", "create_unique_directorynames"); }
25019d58b3aSEike Rathke
25119d58b3aSEike Rathke		# Also checking vice versa
25219d58b3aSEike Rathke		# Checking if the same short directory already exists, but has another long version.
25319d58b3aSEike Rathke		if (( exists($shortdirhashreverse{$uniqueparentname}) ) && ( $shortdirhashreverse{$uniqueparentname} ne $originaluniqueparentname )) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 3B): \"$uniqueparentname\".", "create_unique_directorynames"); }
25419d58b3aSEike Rathke
25519d58b3aSEike Rathke		$shortdirhash{$originaluniqueparentname} = $uniqueparentname;
25619d58b3aSEike Rathke		$shortdirhashreverse{$uniqueparentname} = $originaluniqueparentname;
25719d58b3aSEike Rathke
25819d58b3aSEike Rathke		# Hyphen not allowed in database
259cdf0e10cSrcweir		$uniquename =~ s/\-/\_/g;			# making "-" to "_"
260cdf0e10cSrcweir		$uniqueparentname =~ s/\-/\_/g;		# making "-" to "_"
261cdf0e10cSrcweir
26219d58b3aSEike Rathke		# And finally setting the values for the directories
263cdf0e10cSrcweir		$onedir->{'uniquename'} = $uniquename;
264cdf0e10cSrcweir		$onedir->{'uniqueparentname'} = $uniqueparentname;
265cdf0e10cSrcweir
266cdf0e10cSrcweir		# setting the installlocation directory
267cdf0e10cSrcweir		if ( $styles =~ /\bISINSTALLLOCATION\b/ )
268cdf0e10cSrcweir		{
269cdf0e10cSrcweir			if ( $installer::globals::installlocationdirectoryset ) { installer::exiter::exit_program("ERROR: Directory with flag ISINSTALLLOCATION alread set: \"$installer::globals::installlocationdirectory\".", "create_unique_directorynames"); }
270cdf0e10cSrcweir			$installer::globals::installlocationdirectory = $uniquename;
271cdf0e10cSrcweir			$installer::globals::installlocationdirectoryset = 1;
272cdf0e10cSrcweir			if ( $installer::globals::installlocationdirectory =~ /oracle_/i ) { $installer::globals::sundirexists = 1; }
273cdf0e10cSrcweir		}
274cdf0e10cSrcweir
275cdf0e10cSrcweir		# setting the sundirectory
276cdf0e10cSrcweir		if ( $styles =~ /\bSUNDIRECTORY\b/ )
277cdf0e10cSrcweir		{
278cdf0e10cSrcweir			if ( $installer::globals::vendordirectoryset ) { installer::exiter::exit_program("ERROR: Directory with flag SUNDIRECTORY alread set: \"$installer::globals::vendordirectory\".", "create_unique_directorynames"); }
279cdf0e10cSrcweir			$installer::globals::vendordirectory = $uniquename;
280cdf0e10cSrcweir			$installer::globals::vendordirectoryset = 1;
281cdf0e10cSrcweir		}
28219d58b3aSEike Rathke	}
283cdf0e10cSrcweir}
284cdf0e10cSrcweir
285cdf0e10cSrcweir#####################################################
286cdf0e10cSrcweir# Adding ":." to selected default directory names
287cdf0e10cSrcweir#####################################################
288cdf0e10cSrcweir
289cdf0e10cSrcweirsub check_sourcedir_addon
290cdf0e10cSrcweir{
291cdf0e10cSrcweir	my ( $onedir, $allvariableshashref ) = @_;
292cdf0e10cSrcweir
293cdf0e10cSrcweir	if (($installer::globals::addchildprojects) ||
294cdf0e10cSrcweir		($installer::globals::patch) ||
295cdf0e10cSrcweir		($installer::globals::languagepack) ||
296cdf0e10cSrcweir		($allvariableshashref->{'CHANGETARGETDIR'}))
297cdf0e10cSrcweir	{
298cdf0e10cSrcweir		my $sourcediraddon = "\:\.";
299cdf0e10cSrcweir		$onedir->{'defaultdir'} = $onedir->{'defaultdir'} . $sourcediraddon;
300cdf0e10cSrcweir	}
301cdf0e10cSrcweir
302cdf0e10cSrcweir}
303cdf0e10cSrcweir
304cdf0e10cSrcweir#####################################################
305cdf0e10cSrcweir# The directory with the style ISINSTALLLOCATION
306cdf0e10cSrcweir# will be replaced by INSTALLLOCATION
307cdf0e10cSrcweir#####################################################
308cdf0e10cSrcweir
309cdf0e10cSrcweirsub set_installlocation_directory
310cdf0e10cSrcweir{
311cdf0e10cSrcweir	my ( $directoryref, $allvariableshashref ) = @_;
312cdf0e10cSrcweir
313cdf0e10cSrcweir	if ( ! $installer::globals::installlocationdirectoryset ) { installer::exiter::exit_program("ERROR: Directory with flag ISINSTALLLOCATION not set!", "set_installlocation_directory"); }
314cdf0e10cSrcweir
315cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$directoryref}; $i++ )
316cdf0e10cSrcweir	{
317cdf0e10cSrcweir		my $onedir = ${$directoryref}[$i];
318cdf0e10cSrcweir
319cdf0e10cSrcweir		if ( $onedir->{'uniquename'} eq $installer::globals::installlocationdirectory )
320cdf0e10cSrcweir		{
321cdf0e10cSrcweir			$onedir->{'uniquename'} = "INSTALLLOCATION";
322cdf0e10cSrcweir			check_sourcedir_addon($onedir, $allvariableshashref);
323cdf0e10cSrcweir		}
324cdf0e10cSrcweir
325cdf0e10cSrcweir		if ( $onedir->{'uniquename'} eq $installer::globals::vendordirectory )
326cdf0e10cSrcweir		{
327cdf0e10cSrcweir			check_sourcedir_addon($onedir, $allvariableshashref);
328cdf0e10cSrcweir		}
329cdf0e10cSrcweir
330cdf0e10cSrcweir		if ( $onedir->{'uniqueparentname'} eq $installer::globals::installlocationdirectory )
331cdf0e10cSrcweir		{
332cdf0e10cSrcweir			$onedir->{'uniqueparentname'} = "INSTALLLOCATION";
333cdf0e10cSrcweir		}
334cdf0e10cSrcweir	}
335cdf0e10cSrcweir}
336cdf0e10cSrcweir
337cdf0e10cSrcweir#####################################################
338cdf0e10cSrcweir# Getting the name of the top level directory. This
339cdf0e10cSrcweir# can have only one letter
340cdf0e10cSrcweir#####################################################
341cdf0e10cSrcweir
342cdf0e10cSrcweirsub get_last_directory_name
343cdf0e10cSrcweir{
344cdf0e10cSrcweir	my ($completepathref) = @_;
345cdf0e10cSrcweir
346cdf0e10cSrcweir	if ( $$completepathref =~ /^.*[\/\\](.+?)\s*$/ )
347cdf0e10cSrcweir	{
348cdf0e10cSrcweir		$$completepathref = $1;
349cdf0e10cSrcweir	}
350cdf0e10cSrcweir}
351cdf0e10cSrcweir
352cdf0e10cSrcweir#####################################################
353cdf0e10cSrcweir# Creating the defaultdir for the file Director.idt
354cdf0e10cSrcweir#####################################################
355cdf0e10cSrcweir
356cdf0e10cSrcweirsub create_defaultdir_directorynames
357cdf0e10cSrcweir{
358cdf0e10cSrcweir	my ($directoryref, $shortdirnamehashref) = @_;
359cdf0e10cSrcweir
360cdf0e10cSrcweir	my @shortnames = ();
361*f30bf281SAndre Fischer	if ( $installer::globals::prepare_winpatch ) { @shortnames = values(%installer::globals::saved83dirmapping); }
362cdf0e10cSrcweir
363cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$directoryref}; $i++ )
364cdf0e10cSrcweir	{
365cdf0e10cSrcweir		my $onedir = ${$directoryref}[$i];
366cdf0e10cSrcweir		my $hostname = $onedir->{'HostName'};
367cdf0e10cSrcweir
368cdf0e10cSrcweir		$hostname =~ s/\Q$installer::globals::separator\E\s*$//;
369cdf0e10cSrcweir		get_last_directory_name(\$hostname);
370cdf0e10cSrcweir		# installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$hostname);	# making program/classes to classes
371cdf0e10cSrcweir		my $uniquename = $onedir->{'uniquename'};
372cdf0e10cSrcweir		my $shortstring;
373*f30bf281SAndre Fischer		if (( $installer::globals::prepare_winpatch ) && ( exists($installer::globals::saved83dirmapping{$uniquename}) ))
374cdf0e10cSrcweir		{
375cdf0e10cSrcweir			$shortstring = $installer::globals::saved83dirmapping{$uniquename};
376cdf0e10cSrcweir		}
377cdf0e10cSrcweir		else
378cdf0e10cSrcweir		{
379cdf0e10cSrcweir			$shortstring = installer::windows::idtglobal::make_eight_three_conform($hostname, "dir", \@shortnames);
380cdf0e10cSrcweir		}
381cdf0e10cSrcweir
382cdf0e10cSrcweir		my $defaultdir;
383cdf0e10cSrcweir
384cdf0e10cSrcweir		if ( $shortstring eq $hostname )
385cdf0e10cSrcweir		{
386cdf0e10cSrcweir			$defaultdir = $hostname;
387cdf0e10cSrcweir		}
388cdf0e10cSrcweir		else
389cdf0e10cSrcweir		{
390cdf0e10cSrcweir			$defaultdir = $shortstring . "|" . $hostname;
391cdf0e10cSrcweir		}
392cdf0e10cSrcweir
393cdf0e10cSrcweir		$onedir->{'defaultdir'} = $defaultdir;
394cdf0e10cSrcweir
395cdf0e10cSrcweir		my $fontdir = "";
396cdf0e10cSrcweir		if ( $onedir->{'Dir'} ) { $fontdir = $onedir->{'Dir'}; }
397cdf0e10cSrcweir
398cdf0e10cSrcweir		my $fontdefaultdir = "";
399cdf0e10cSrcweir		if ( $onedir->{'defaultdir'} ) { $fontdefaultdir = $onedir->{'defaultdir'}; }
400cdf0e10cSrcweir
401cdf0e10cSrcweir		if (( $fontdir eq "PREDEFINED_OSSYSTEMFONTDIR" ) && ( $fontdefaultdir eq $installer::globals::fontsdirhostname ))
402cdf0e10cSrcweir		{
403cdf0e10cSrcweir			$installer::globals::fontsdirname = $onedir->{'defaultdir'};
404cdf0e10cSrcweir			$installer::globals::fontsdirparent = $onedir->{'uniqueparentname'};
405cdf0e10cSrcweir		}
406cdf0e10cSrcweir	}
407cdf0e10cSrcweir}
408cdf0e10cSrcweir
409cdf0e10cSrcweir###############################################
410cdf0e10cSrcweir# Fill content into the directory table
411cdf0e10cSrcweir###############################################
412cdf0e10cSrcweir
413cdf0e10cSrcweirsub create_directorytable_from_collection
414cdf0e10cSrcweir{
415cdf0e10cSrcweir	my ($directorytableref, $directoryref) = @_;
416cdf0e10cSrcweir
417cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$directoryref}; $i++ )
418cdf0e10cSrcweir	{
419cdf0e10cSrcweir		my $onedir = ${$directoryref}[$i];
420cdf0e10cSrcweir		my $hostname = $onedir->{'HostName'};
421cdf0e10cSrcweir		my $dir = "";
422cdf0e10cSrcweir
423cdf0e10cSrcweir		if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; }
424cdf0e10cSrcweir
425cdf0e10cSrcweir		if (( $dir eq "PREDEFINED_PROGDIR" ) && ( $hostname eq "" )) { next; }	# removing files from root directory
426cdf0e10cSrcweir
427cdf0e10cSrcweir		my $oneline = $onedir->{'uniquename'} . "\t" . $onedir->{'uniqueparentname'} . "\t" . $onedir->{'defaultdir'} . "\n";
428cdf0e10cSrcweir
429cdf0e10cSrcweir		push(@{$directorytableref}, $oneline);
430cdf0e10cSrcweir	}
431cdf0e10cSrcweir}
432cdf0e10cSrcweir
433cdf0e10cSrcweir###############################################
434cdf0e10cSrcweir# Defining the root installation structure
435cdf0e10cSrcweir###############################################
436cdf0e10cSrcweir
437cdf0e10cSrcweirsub add_root_directories
438cdf0e10cSrcweir{
439cdf0e10cSrcweir	my ($directorytableref, $allvariableshashref) = @_;
440cdf0e10cSrcweir
441cdf0e10cSrcweir#	my $sourcediraddon = "";
442cdf0e10cSrcweir#	if (($installer::globals::addchildprojects) ||
443cdf0e10cSrcweir#		($installer::globals::patch) ||
444cdf0e10cSrcweir#		($installer::globals::languagepack) ||
445cdf0e10cSrcweir#		($allvariableshashref->{'CHANGETARGETDIR'}))
446cdf0e10cSrcweir#	{
447cdf0e10cSrcweir#		$sourcediraddon = "\:\.";
448cdf0e10cSrcweir#	}
449cdf0e10cSrcweir
450cdf0e10cSrcweir	my $oneline = "";
451cdf0e10cSrcweir
452cdf0e10cSrcweir	if (( ! $installer::globals::patch ) && ( ! $installer::globals::languagepack ) && ( ! $allvariableshashref->{'DONTUSESTARTMENUFOLDER'} ))
453cdf0e10cSrcweir	{
454cdf0e10cSrcweir		my $productname = $allvariableshashref->{'PRODUCTNAME'};
455cdf0e10cSrcweir		my $productversion = $allvariableshashref->{'PRODUCTVERSION'};
456cdf0e10cSrcweir		my $baseproductversion = $productversion;
457cdf0e10cSrcweir
458cdf0e10cSrcweir		if (( $installer::globals::prepare_winpatch ) && ( $allvariableshashref->{'BASEPRODUCTVERSION'} ))
459cdf0e10cSrcweir		{
460cdf0e10cSrcweir			$baseproductversion = $allvariableshashref->{'BASEPRODUCTVERSION'};  # for example "2.0" for OOo
461cdf0e10cSrcweir		}
462cdf0e10cSrcweir
463cdf0e10cSrcweir		my $realproductkey = $productname . " " . $productversion;
464cdf0e10cSrcweir		my $productkey = $productname . " " . $baseproductversion;
465cdf0e10cSrcweir
466cdf0e10cSrcweir		if (( $allvariableshashref->{'POSTVERSIONEXTENSION'} ) && ( ! $allvariableshashref->{'DONTUSEEXTENSIONINDEFAULTDIR'} ))
467cdf0e10cSrcweir		{
468cdf0e10cSrcweir			$productkey = $productkey . " " . $allvariableshashref->{'POSTVERSIONEXTENSION'};
469cdf0e10cSrcweir			$realproductkey = $realproductkey . " " . $allvariableshashref->{'POSTVERSIONEXTENSION'};
470cdf0e10cSrcweir		}
471cdf0e10cSrcweir		if ( $allvariableshashref->{'NOVERSIONINDIRNAME'} )
472cdf0e10cSrcweir		{
473cdf0e10cSrcweir			$productkey = $productname;
474cdf0e10cSrcweir			$realproductkey = $realproductname;
475cdf0e10cSrcweir		}
476cdf0e10cSrcweir		if ( $allvariableshashref->{'NOSPACEINDIRECTORYNAME'} )
477cdf0e10cSrcweir		{
478cdf0e10cSrcweir			$productkey =~ s/\ /\_/g;
479cdf0e10cSrcweir			$realproductkey =~ s/\ /\_/g;
480cdf0e10cSrcweir		}
481cdf0e10cSrcweir
482cdf0e10cSrcweir		my $shortproductkey = installer::windows::idtglobal::make_eight_three_conform($productkey, "dir");		# third parameter not used
483cdf0e10cSrcweir		$shortproductkey =~ s/\s/\_/g;									# changing empty space to underline
484cdf0e10cSrcweir
485cdf0e10cSrcweir		$oneline = "$installer::globals::officemenufolder\t$installer::globals::programmenufolder\t$shortproductkey|$realproductkey\n";
486cdf0e10cSrcweir		push(@{$directorytableref}, $oneline);
487cdf0e10cSrcweir	}
488cdf0e10cSrcweir
489cdf0e10cSrcweir	$oneline = "TARGETDIR\t\tSourceDir\n";
490cdf0e10cSrcweir	push(@{$directorytableref}, $oneline);
491cdf0e10cSrcweir
492cdf0e10cSrcweir	$oneline = "$installer::globals::programfilesfolder\tTARGETDIR\t.\n";
493cdf0e10cSrcweir	push(@{$directorytableref}, $oneline);
494cdf0e10cSrcweir
495cdf0e10cSrcweir	$oneline = "$installer::globals::programmenufolder\tTARGETDIR\t.\n";
496cdf0e10cSrcweir	push(@{$directorytableref}, $oneline);
497cdf0e10cSrcweir
498cdf0e10cSrcweir	$oneline = "$installer::globals::startupfolder\tTARGETDIR\t.\n";
499cdf0e10cSrcweir	push(@{$directorytableref}, $oneline);
500cdf0e10cSrcweir
501cdf0e10cSrcweir	$oneline = "$installer::globals::desktopfolder\tTARGETDIR\t.\n";
502cdf0e10cSrcweir	push(@{$directorytableref}, $oneline);
503cdf0e10cSrcweir
504cdf0e10cSrcweir	$oneline = "$installer::globals::startmenufolder\tTARGETDIR\t.\n";
505cdf0e10cSrcweir	push(@{$directorytableref}, $oneline);
506cdf0e10cSrcweir
507cdf0e10cSrcweir	$oneline = "$installer::globals::commonfilesfolder\tTARGETDIR\t.\n";
508cdf0e10cSrcweir	push(@{$directorytableref}, $oneline);
509cdf0e10cSrcweir
510cdf0e10cSrcweir	$oneline = "$installer::globals::commonappdatafolder\tTARGETDIR\t.\n";
511cdf0e10cSrcweir	push(@{$directorytableref}, $oneline);
512cdf0e10cSrcweir
513cdf0e10cSrcweir	$oneline = "$installer::globals::localappdatafolder\tTARGETDIR\t.\n";
514cdf0e10cSrcweir	push(@{$directorytableref}, $oneline);
515cdf0e10cSrcweir
516cdf0e10cSrcweir	if ( $installer::globals::usesharepointpath )
517cdf0e10cSrcweir	{
518cdf0e10cSrcweir		$oneline = "SHAREPOINTPATH\tTARGETDIR\t.\n";
519cdf0e10cSrcweir		push(@{$directorytableref}, $oneline);
520cdf0e10cSrcweir	}
521cdf0e10cSrcweir
522cdf0e10cSrcweir	$oneline = "$installer::globals::systemfolder\tTARGETDIR\t.\n";
523cdf0e10cSrcweir	push(@{$directorytableref}, $oneline);
524cdf0e10cSrcweir
525cdf0e10cSrcweir	my $localtemplatefoldername = $installer::globals::templatefoldername;
526cdf0e10cSrcweir	my $directorytableentry = $localtemplatefoldername;
527cdf0e10cSrcweir	my $shorttemplatefoldername = installer::windows::idtglobal::make_eight_three_conform($localtemplatefoldername, "dir");
528cdf0e10cSrcweir	if ( $shorttemplatefoldername ne $localtemplatefoldername ) { $directorytableentry = "$shorttemplatefoldername|$localtemplatefoldername"; }
529cdf0e10cSrcweir	$oneline = "$installer::globals::templatefolder\tTARGETDIR\t$directorytableentry\n";
530cdf0e10cSrcweir	push(@{$directorytableref}, $oneline);
531cdf0e10cSrcweir
532cdf0e10cSrcweir	if ( $installer::globals::fontsdirname )
533cdf0e10cSrcweir	{
534cdf0e10cSrcweir		$oneline = "$installer::globals::fontsfolder\t$installer::globals::fontsdirparent\t$installer::globals::fontsfoldername\:$installer::globals::fontsdirname\n";
535cdf0e10cSrcweir	}
536cdf0e10cSrcweir	else
537cdf0e10cSrcweir	{
538cdf0e10cSrcweir		$oneline = "$installer::globals::fontsfolder\tTARGETDIR\t$installer::globals::fontsfoldername\n";
539cdf0e10cSrcweir	}
540cdf0e10cSrcweir
541cdf0e10cSrcweir	push(@{$directorytableref}, $oneline);
542cdf0e10cSrcweir
543cdf0e10cSrcweir}
544cdf0e10cSrcweir
545cdf0e10cSrcweir###############################################
546cdf0e10cSrcweir# Creating the file Director.idt dynamically
547cdf0e10cSrcweir###############################################
548cdf0e10cSrcweir
549cdf0e10cSrcweirsub create_directory_table
550cdf0e10cSrcweir{
551cdf0e10cSrcweir	my ($directoryref, $basedir, $allvariableshashref, $shortdirnamehashref, $loggingdir) = @_;
552cdf0e10cSrcweir
553cdf0e10cSrcweir	# Structure of the directory table:
554cdf0e10cSrcweir	# Directory Directory_Parent DefaultDir
555cdf0e10cSrcweir	# Directory is a unique identifier
556cdf0e10cSrcweir	# Directory_Parent is the unique identifier of the parent
557cdf0e10cSrcweir	# DefaultDir is .:APPLIC~1|Application Data with
558cdf0e10cSrcweir	# Before ":" : [sourcedir]:[destdir] (not programmed yet)
559cdf0e10cSrcweir	# After ":" : 8+3 and not 8+3 the destination directory name
56019d58b3aSEike Rathke
561b274bc22SAndre Fischer	$installer::logger::Lang->add_timestamp("Performance Info: Directory Table start");
562cdf0e10cSrcweir
563cdf0e10cSrcweir	my @directorytable = ();
564cdf0e10cSrcweir	my $infoline;
565cdf0e10cSrcweir
566cdf0e10cSrcweir	overwrite_programfilesfolder($allvariableshashref);
567cdf0e10cSrcweir	if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt_local_1.log", $directoryref); }
568cdf0e10cSrcweir	create_unique_directorynames($directoryref, $allvariableshashref);
569cdf0e10cSrcweir	if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt_local_1a.log", $directoryref); }
570cdf0e10cSrcweir	create_defaultdir_directorynames($directoryref, $shortdirnamehashref);	# only destdir!
571cdf0e10cSrcweir	if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt_local_2.log", $directoryref); }
572cdf0e10cSrcweir	set_installlocation_directory($directoryref, $allvariableshashref);
573cdf0e10cSrcweir	if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt_local_3.log", $directoryref); }
574cdf0e10cSrcweir	installer::windows::idtglobal::write_idt_header(\@directorytable, "directory");
575cdf0e10cSrcweir	add_root_directories(\@directorytable, $allvariableshashref);
576cdf0e10cSrcweir	create_directorytable_from_collection(\@directorytable, $directoryref);
577cdf0e10cSrcweir
578cdf0e10cSrcweir	# Saving the file
579cdf0e10cSrcweir
580cdf0e10cSrcweir	my $directorytablename = $basedir . $installer::globals::separator . "Director.idt";
581cdf0e10cSrcweir	installer::files::save_file($directorytablename ,\@directorytable);
582b274bc22SAndre Fischer    $installer::logger::Lang->printf("Created idt file: %s\n", $directorytablename);
58319d58b3aSEike Rathke
584b274bc22SAndre Fischer	$installer::logger::Lang->add_timestamp("Performance Info: Directory Table end");
585cdf0e10cSrcweir}
586cdf0e10cSrcweir
587cdf0e10cSrcweir1;
588