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::scriptitems;
25cdf0e10cSrcweir
26cdf0e10cSrcweiruse installer::converter;
27cdf0e10cSrcweiruse installer::existence;
28cdf0e10cSrcweiruse installer::exiter;
29cdf0e10cSrcweiruse installer::globals;
30cdf0e10cSrcweiruse installer::languages;
31cdf0e10cSrcweiruse installer::logger;
32cdf0e10cSrcweiruse installer::pathanalyzer;
33cdf0e10cSrcweiruse installer::remover;
34cdf0e10cSrcweiruse installer::systemactions;
35cdf0e10cSrcweir
368bd5297cSJürgen Schmidtuse File::Spec;
378bd5297cSJürgen Schmidtuse SvnRevision;
38*c6dedb65SAndre Fischeruse ExtensionsLst;
398bd5297cSJürgen Schmidt
40cdf0e10cSrcweir################################################################
41cdf0e10cSrcweir# Resolving the GID for the directories defined in setup script
42cdf0e10cSrcweir################################################################
43cdf0e10cSrcweir
44cdf0e10cSrcweirsub resolve_all_directory_names
45cdf0e10cSrcweir{
46cdf0e10cSrcweir	my ($directoryarrayref) = @_;
47cdf0e10cSrcweir
48cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::resolve_all_directory_names : $#{$directoryarrayref}"); }
49cdf0e10cSrcweir
50cdf0e10cSrcweir	# After this procedure the hash shall contain the complete language
51cdf0e10cSrcweir	# dependent path, not only the language dependent HostName.
52cdf0e10cSrcweir
53cdf0e10cSrcweir	my ($key, $value, $parentvalue, $parentgid, $parentdirectoryhashref);
54cdf0e10cSrcweir
55cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$directoryarrayref}; $i++ )
56cdf0e10cSrcweir	{
57cdf0e10cSrcweir		my $directoryhashref = ${$directoryarrayref}[$i];
58cdf0e10cSrcweir		my $gid = $directoryhashref-> {'gid'};
59cdf0e10cSrcweir		my $parentid = $directoryhashref-> {'ParentID'};
60cdf0e10cSrcweir
61cdf0e10cSrcweir		if ( $parentid ne "PREDEFINED_PROGDIR" )
62cdf0e10cSrcweir		{
63cdf0e10cSrcweir			# find the array of the parentid, which has to be defined before in setup script
64cdf0e10cSrcweir			# and is therefore listed before in this array
65cdf0e10cSrcweir
66cdf0e10cSrcweir			for ( my $j = 0; $j <= $i; $j++ )
67cdf0e10cSrcweir			{
68cdf0e10cSrcweir				$parentdirectoryhashref = ${$directoryarrayref}[$j];
69cdf0e10cSrcweir				$parentgid = $parentdirectoryhashref->{'gid'};
70cdf0e10cSrcweir
71cdf0e10cSrcweir				if ( $parentid eq $parentgid)
72cdf0e10cSrcweir				{
73cdf0e10cSrcweir					last;
74cdf0e10cSrcweir				}
75cdf0e10cSrcweir			}
76cdf0e10cSrcweir
77cdf0e10cSrcweir			# and now we can put the path together
78cdf0e10cSrcweir			# But take care of the languages!
79cdf0e10cSrcweir
80cdf0e10cSrcweir			my $dirismultilingual = $directoryhashref->{'ismultilingual'};
81cdf0e10cSrcweir			my $parentismultilingual = $parentdirectoryhashref->{'ismultilingual'};
82cdf0e10cSrcweir
83cdf0e10cSrcweir			# First: Both directories are language independent or both directories are language dependent
84cdf0e10cSrcweir
85cdf0e10cSrcweir			if ((( ! $dirismultilingual ) && ( ! $parentismultilingual )) ||
86cdf0e10cSrcweir				(( $dirismultilingual ) && ( $parentismultilingual )))
87cdf0e10cSrcweir			{
88cdf0e10cSrcweir				foreach $key (keys %{$directoryhashref})
89cdf0e10cSrcweir				{
90cdf0e10cSrcweir					# the key ("HostName (en-US)") must be usable for both hashes
91cdf0e10cSrcweir
92cdf0e10cSrcweir					if ( $key =~ /\bHostName\b/ )
93cdf0e10cSrcweir					{
94cdf0e10cSrcweir						$parentvalue = "";
95cdf0e10cSrcweir						$value = $directoryhashref->{$key};
96cdf0e10cSrcweir						if ( $parentdirectoryhashref->{$key} ) { $parentvalue = $parentdirectoryhashref->{$key}; }
97cdf0e10cSrcweir
98cdf0e10cSrcweir						# It is possible, that in scp project, a directory is defined in more languages than
99cdf0e10cSrcweir						# the directory parent (happened after automatic generation of macros.inc).
100cdf0e10cSrcweir						# Therefore this is checked now and written with a warning into the logfile.
101cdf0e10cSrcweir						# This is no error, because (in most cases) the concerned language is not build.
102cdf0e10cSrcweir
103cdf0e10cSrcweir						if ($parentvalue eq "")
104cdf0e10cSrcweir						{
105cdf0e10cSrcweir							$directoryhashref->{$key} = "FAILURE";
106cdf0e10cSrcweir							my $infoline = "WARNING: No hostname for $parentid with \"$key\". Needed by child directory $gid !\n";
107cdf0e10cSrcweir							push( @installer::globals::globallogfileinfo, $infoline);
108cdf0e10cSrcweir						}
109cdf0e10cSrcweir						else
110cdf0e10cSrcweir						{
111cdf0e10cSrcweir							$directoryhashref->{$key} = $parentvalue . $installer::globals::separator . $value;
112cdf0e10cSrcweir						}
113cdf0e10cSrcweir					}
114cdf0e10cSrcweir				}
115cdf0e10cSrcweir			}
116cdf0e10cSrcweir
117cdf0e10cSrcweir			# Second: The directory is language dependent, the parent not
118cdf0e10cSrcweir
119cdf0e10cSrcweir			if (( $dirismultilingual ) && ( ! $parentismultilingual ))
120cdf0e10cSrcweir			{
121cdf0e10cSrcweir				$parentvalue = $parentdirectoryhashref->{'HostName'};		# there is only one
122cdf0e10cSrcweir
123cdf0e10cSrcweir				foreach $key (keys %{$directoryhashref})		# the current directory
124cdf0e10cSrcweir				{
125cdf0e10cSrcweir					if ( $key =~ /\bHostName\b/ )
126cdf0e10cSrcweir					{
127cdf0e10cSrcweir						$value = $directoryhashref->{$key};
128cdf0e10cSrcweir						$directoryhashref->{$key} = $parentvalue . $installer::globals::separator . $value;
129cdf0e10cSrcweir					}
130cdf0e10cSrcweir				}
131cdf0e10cSrcweir			}
132cdf0e10cSrcweir
133cdf0e10cSrcweir			# Third: The directory is not language dependent, the parent is language dependent
134cdf0e10cSrcweir
135cdf0e10cSrcweir			if (( ! $dirismultilingual ) && ( $parentismultilingual ))
136cdf0e10cSrcweir			{
137cdf0e10cSrcweir				$value = $directoryhashref->{'HostName'};		# there is only one
138cdf0e10cSrcweir				delete($directoryhashref->{'HostName'});
139cdf0e10cSrcweir
140cdf0e10cSrcweir				foreach $key (keys %{$parentdirectoryhashref})		# the parent directory
141cdf0e10cSrcweir				{
142cdf0e10cSrcweir					if ( $key =~ /\bHostName\b/ )
143cdf0e10cSrcweir					{
144cdf0e10cSrcweir						$parentvalue = $parentdirectoryhashref->{$key};		# there is only one
145cdf0e10cSrcweir						$directoryhashref->{$key} = $parentvalue . $installer::globals::separator . $value;
146cdf0e10cSrcweir					}
147cdf0e10cSrcweir				}
148cdf0e10cSrcweir
149cdf0e10cSrcweir				$directoryhashref->{'ismultilingual'} = 1;	# now this directory is also language dependent
150cdf0e10cSrcweir			}
151cdf0e10cSrcweir		}
152cdf0e10cSrcweir	}
153cdf0e10cSrcweir}
154cdf0e10cSrcweir
155cdf0e10cSrcweir#############################################################################
156cdf0e10cSrcweir# Files with flag DELETE_ONLY do not need to be packed into installation set
157cdf0e10cSrcweir#############################################################################
158cdf0e10cSrcweir
159cdf0e10cSrcweirsub remove_delete_only_files_from_productlists
160cdf0e10cSrcweir{
161cdf0e10cSrcweir	my ($productarrayref) = @_;
162cdf0e10cSrcweir
163cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_delete_only_files_from_productlists : $#{$productarrayref}"); }
164cdf0e10cSrcweir
165cdf0e10cSrcweir	my @newitems = ();
166cdf0e10cSrcweir
167cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$productarrayref}; $i++ )
168cdf0e10cSrcweir	{
169cdf0e10cSrcweir		my $oneitem = ${$productarrayref}[$i];
170cdf0e10cSrcweir		my $styles = "";
171cdf0e10cSrcweir
172cdf0e10cSrcweir		if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
173cdf0e10cSrcweir
174cdf0e10cSrcweir		if (!($styles =~ /\bDELETE_ONLY\b/))
175cdf0e10cSrcweir		{
176cdf0e10cSrcweir			push(@newitems, $oneitem);
177cdf0e10cSrcweir		}
178cdf0e10cSrcweir	}
179cdf0e10cSrcweir
180cdf0e10cSrcweir	return \@newitems;
181cdf0e10cSrcweir}
182cdf0e10cSrcweir
183cdf0e10cSrcweir#############################################################################
184cdf0e10cSrcweir# Files with flag NOT_IN_SUITE do not need to be packed into
185cdf0e10cSrcweir# Suite installation sets
186cdf0e10cSrcweir#############################################################################
187cdf0e10cSrcweir
188cdf0e10cSrcweirsub remove_notinsuite_files_from_productlists
189cdf0e10cSrcweir{
190cdf0e10cSrcweir	my ($productarrayref) = @_;
191cdf0e10cSrcweir
192cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_notinsuite_files_from_productlists : $#{$productarrayref}"); }
193cdf0e10cSrcweir
194cdf0e10cSrcweir	my @newitems = ();
195cdf0e10cSrcweir
196cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$productarrayref}; $i++ )
197cdf0e10cSrcweir	{
198cdf0e10cSrcweir		my $oneitem = ${$productarrayref}[$i];
199cdf0e10cSrcweir		my $styles = "";
200cdf0e10cSrcweir
201cdf0e10cSrcweir		if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
202cdf0e10cSrcweir
203cdf0e10cSrcweir		if (!($styles =~ /\bNOT_IN_SUITE\b/))
204cdf0e10cSrcweir		{
205cdf0e10cSrcweir			push(@newitems, $oneitem);
206cdf0e10cSrcweir		}
207cdf0e10cSrcweir		else
208cdf0e10cSrcweir		{
209cdf0e10cSrcweir			my $infoline = "INFO: Flag NOT_IN_SUITE \-\> Removing $oneitem->{'gid'} from file list.\n";
210cdf0e10cSrcweir			push( @installer::globals::globallogfileinfo, $infoline);
211cdf0e10cSrcweir		}
212cdf0e10cSrcweir	}
213cdf0e10cSrcweir
214cdf0e10cSrcweir	return \@newitems;
215cdf0e10cSrcweir}
216cdf0e10cSrcweir
217cdf0e10cSrcweir#############################################################################
218cdf0e10cSrcweir# Files with flag NOT_IN_SUITE do not need to be packed into
219cdf0e10cSrcweir# Suite installation sets
220cdf0e10cSrcweir#############################################################################
221cdf0e10cSrcweir
222cdf0e10cSrcweirsub remove_office_start_language_files
223cdf0e10cSrcweir{
224cdf0e10cSrcweir	my ($productarrayref) = @_;
225cdf0e10cSrcweir
226cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_notinsuite_files_from_productlists : $#{$productarrayref}"); }
227cdf0e10cSrcweir
228cdf0e10cSrcweir	my @newitems = ();
229cdf0e10cSrcweir
230cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$productarrayref}; $i++ )
231cdf0e10cSrcweir	{
232cdf0e10cSrcweir		my $oneitem = ${$productarrayref}[$i];
233cdf0e10cSrcweir		my $styles = "";
234cdf0e10cSrcweir
235cdf0e10cSrcweir		if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
236cdf0e10cSrcweir
237cdf0e10cSrcweir		if (!($styles =~ /\bSET_OFFICE_LANGUAGE\b/))
238cdf0e10cSrcweir		{
239cdf0e10cSrcweir			push(@newitems, $oneitem);
240cdf0e10cSrcweir		}
241cdf0e10cSrcweir		else
242cdf0e10cSrcweir		{
243cdf0e10cSrcweir			my $infoline = "INFO: Flag SET_OFFICE_LANGUAGE \-\> Removing $oneitem->{'gid'} from file list.\n";
244cdf0e10cSrcweir			push( @installer::globals::logfileinfo, $infoline);
245cdf0e10cSrcweir		}
246cdf0e10cSrcweir	}
247cdf0e10cSrcweir
248cdf0e10cSrcweir	return \@newitems;
249cdf0e10cSrcweir}
250cdf0e10cSrcweir
251cdf0e10cSrcweir#############################################################################
252cdf0e10cSrcweir# Registryitems for Uninstall have to be removed
253cdf0e10cSrcweir#############################################################################
254cdf0e10cSrcweir
255cdf0e10cSrcweirsub remove_uninstall_regitems_from_script
256cdf0e10cSrcweir{
257cdf0e10cSrcweir	my ($registryarrayref) = @_;
258cdf0e10cSrcweir
259cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_uninstall_regitems_from_script : $#{$registryarrayref}"); }
260cdf0e10cSrcweir
261cdf0e10cSrcweir	my @newitems = ();
262cdf0e10cSrcweir
263cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$registryarrayref}; $i++ )
264cdf0e10cSrcweir	{
265cdf0e10cSrcweir		my $oneitem = ${$registryarrayref}[$i];
266cdf0e10cSrcweir		my $subkey = "";
267cdf0e10cSrcweir
268cdf0e10cSrcweir		if ( $oneitem->{'Subkey'} ) { $subkey = $oneitem->{'Subkey'}; }
269cdf0e10cSrcweir
270cdf0e10cSrcweir		if ( $subkey =~ /Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall/ ) { next; }
271cdf0e10cSrcweir
272cdf0e10cSrcweir		push(@newitems, $oneitem);
273cdf0e10cSrcweir	}
274cdf0e10cSrcweir
275cdf0e10cSrcweir	return \@newitems;
276cdf0e10cSrcweir}
277cdf0e10cSrcweir
278cdf0e10cSrcweir##############################################################################
279cdf0e10cSrcweir# Searching the language module for a specified language
280cdf0e10cSrcweir##############################################################################
281cdf0e10cSrcweir
282cdf0e10cSrcweirsub get_languagespecific_module
283cdf0e10cSrcweir{
284cdf0e10cSrcweir	my ( $lang, $modulestring ) = @_;
285cdf0e10cSrcweir
286cdf0e10cSrcweir	my $langmodulestring = "";
287cdf0e10cSrcweir
288cdf0e10cSrcweir	my $module;
289cdf0e10cSrcweir	foreach	$module ( keys %installer::globals::alllangmodules )
290cdf0e10cSrcweir	{
291cdf0e10cSrcweir		if (( $installer::globals::alllangmodules{$module} eq $lang ) && ( $modulestring =~ /\b$module\b/ ))
292cdf0e10cSrcweir		{
293cdf0e10cSrcweir			$langmodulestring = "$langmodulestring,$module";
294cdf0e10cSrcweir		}
295cdf0e10cSrcweir	}
296cdf0e10cSrcweir
297cdf0e10cSrcweir	$langmodulestring =~ s/^\s*,//;
298cdf0e10cSrcweir
299cdf0e10cSrcweir	if ( $langmodulestring eq "" ) { installer::exiter::exit_program("ERROR: No language pack module found for language $lang in string \"$modulestring\"!", "get_languagespecific_module");  }
300cdf0e10cSrcweir
301cdf0e10cSrcweir	return $langmodulestring;
302cdf0e10cSrcweir}
303cdf0e10cSrcweir
304cdf0e10cSrcweir##############################################################################
305cdf0e10cSrcweir# Removing all items in product lists which do not have the correct languages
306cdf0e10cSrcweir##############################################################################
307cdf0e10cSrcweir
308cdf0e10cSrcweirsub resolving_all_languages_in_productlists
309cdf0e10cSrcweir{
310cdf0e10cSrcweir	my ($productarrayref, $languagesarrayref) = @_;
311cdf0e10cSrcweir
312cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::resolving_all_languages_in_productlists : $#{$productarrayref} : $#{$languagesarrayref}"); }
313cdf0e10cSrcweir
314cdf0e10cSrcweir	my @itemsinalllanguages = ();
315cdf0e10cSrcweir
316cdf0e10cSrcweir	my ($key, $value);
317cdf0e10cSrcweir
318cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$productarrayref}; $i++ )
319cdf0e10cSrcweir	{
320cdf0e10cSrcweir		my $oneitem = ${$productarrayref}[$i];
321cdf0e10cSrcweir
322cdf0e10cSrcweir		my $ismultilingual = $oneitem->{'ismultilingual'};
323cdf0e10cSrcweir
324cdf0e10cSrcweir		if (!($ismultilingual))	# nothing to do with single language items
325cdf0e10cSrcweir		{
326cdf0e10cSrcweir			$oneitem->{'specificlanguage'} = "";
327cdf0e10cSrcweir			push(@itemsinalllanguages, $oneitem);
328cdf0e10cSrcweir		}
329cdf0e10cSrcweir		else	#all language dependent files
330cdf0e10cSrcweir		{
331cdf0e10cSrcweir			for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ )	# iterating over all languages
332cdf0e10cSrcweir			{
333cdf0e10cSrcweir				my $onelanguage = ${$languagesarrayref}[$j];
334cdf0e10cSrcweir
335cdf0e10cSrcweir				my %oneitemhash = ();
336cdf0e10cSrcweir
337cdf0e10cSrcweir				foreach $key (keys %{$oneitem})
338cdf0e10cSrcweir				{
339cdf0e10cSrcweir					if ( $key =~ /\(\S+\)/ )	# this are the language dependent keys
340cdf0e10cSrcweir					{
341cdf0e10cSrcweir						if ( $key =~ /\(\Q$onelanguage\E\)/ )
342cdf0e10cSrcweir						{
343cdf0e10cSrcweir							$value = $oneitem->{$key};
344cdf0e10cSrcweir							$oneitemhash{$key} = $value;
345cdf0e10cSrcweir						}
346cdf0e10cSrcweir					}
347cdf0e10cSrcweir					else
348cdf0e10cSrcweir					{
349cdf0e10cSrcweir						$value = $oneitem->{$key};
350cdf0e10cSrcweir						$oneitemhash{$key} = $value;
351cdf0e10cSrcweir					}
352cdf0e10cSrcweir				}
353cdf0e10cSrcweir
354cdf0e10cSrcweir				$oneitemhash{'specificlanguage'} = $onelanguage;
355cdf0e10cSrcweir
356cdf0e10cSrcweir				if ( $oneitemhash{'haslanguagemodule'} )
357cdf0e10cSrcweir				{
358cdf0e10cSrcweir					my $langmodulestring = get_languagespecific_module($onelanguage, $oneitemhash{'modules'});
359cdf0e10cSrcweir					$oneitemhash{'modules'} = $langmodulestring;
360cdf0e10cSrcweir				}
361cdf0e10cSrcweir
362cdf0e10cSrcweir				push(@itemsinalllanguages, \%oneitemhash);
363cdf0e10cSrcweir			}
364cdf0e10cSrcweir		}
365cdf0e10cSrcweir	}
366cdf0e10cSrcweir
367cdf0e10cSrcweir	return \@itemsinalllanguages;
368cdf0e10cSrcweir}
369cdf0e10cSrcweir
370cdf0e10cSrcweir################################################################################
371cdf0e10cSrcweir# Removing all modules, that have the flag LANGUAGEMODULE, but do not
372cdf0e10cSrcweir# have the correct language
373cdf0e10cSrcweir################################################################################
374cdf0e10cSrcweir
375cdf0e10cSrcweirsub remove_not_required_language_modules
376cdf0e10cSrcweir{
377cdf0e10cSrcweir	my ($modulesarrayref, $languagesarrayref) = @_;
378cdf0e10cSrcweir
379cdf0e10cSrcweir	my @allmodules = ();
380cdf0e10cSrcweir
381cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ )
382cdf0e10cSrcweir	{
383cdf0e10cSrcweir		my $module = ${$modulesarrayref}[$i];
384cdf0e10cSrcweir		my $styles = "";
385cdf0e10cSrcweir		if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; }
386cdf0e10cSrcweir
387cdf0e10cSrcweir		if ( $styles =~ /\bLANGUAGEMODULE\b/ )
388cdf0e10cSrcweir		{
389cdf0e10cSrcweir			if ( ! exists($module->{'Language'}) ) { installer::exiter::exit_program("ERROR: \"$module->{'gid'}\" has flag LANGUAGEMODULE, but does not know its language!", "remove_not_required_language_modules"); }
390cdf0e10cSrcweir			my $modulelanguage = $module->{'Language'};
391cdf0e10cSrcweir			# checking, if language is required
392cdf0e10cSrcweir			my $doinclude = 0;
393cdf0e10cSrcweir			for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ )
394cdf0e10cSrcweir			{
395cdf0e10cSrcweir				my $onelanguage = ${$languagesarrayref}[$j];
396cdf0e10cSrcweir				if ( $onelanguage eq $modulelanguage )
397cdf0e10cSrcweir				{
398cdf0e10cSrcweir					$doinclude = 1;
399cdf0e10cSrcweir					last;
400cdf0e10cSrcweir				}
401cdf0e10cSrcweir			}
402cdf0e10cSrcweir
403cdf0e10cSrcweir			if ( $doinclude ) { push(@allmodules, $module); }
404cdf0e10cSrcweir		}
405cdf0e10cSrcweir		else
406cdf0e10cSrcweir		{
407cdf0e10cSrcweir			push(@allmodules, $module);
408cdf0e10cSrcweir		}
409cdf0e10cSrcweir	}
410cdf0e10cSrcweir
411cdf0e10cSrcweir	return \@allmodules;
412cdf0e10cSrcweir}
413cdf0e10cSrcweir
414cdf0e10cSrcweir################################################################################
415cdf0e10cSrcweir# Removing all modules, that have a spellchecker language that is not
416cdf0e10cSrcweir# required for this product (spellchecker selection).
417cdf0e10cSrcweir# All required spellchecker languages are stored in
418cdf0e10cSrcweir# %installer::globals::spellcheckerlanguagehash
419cdf0e10cSrcweir################################################################################
420cdf0e10cSrcweir
421cdf0e10cSrcweirsub remove_not_required_spellcheckerlanguage_modules
422cdf0e10cSrcweir{
423cdf0e10cSrcweir	my ($modulesarrayref) = @_;
424cdf0e10cSrcweir
425cdf0e10cSrcweir	my $infoline = "";
426cdf0e10cSrcweir	my @allmodules = ();
427cdf0e10cSrcweir
428cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ )
429cdf0e10cSrcweir	{
430cdf0e10cSrcweir		my $module = ${$modulesarrayref}[$i];
431cdf0e10cSrcweir		if ( $module->{'Spellcheckerlanguage'} )	# selecting modules with Spellcheckerlanguage
432cdf0e10cSrcweir		{
433cdf0e10cSrcweir			if ( exists($installer::globals::spellcheckerlanguagehash{$module->{'Spellcheckerlanguage'}}) )
434cdf0e10cSrcweir			{
435cdf0e10cSrcweir				push(@allmodules, $module);
436cdf0e10cSrcweir			}
437cdf0e10cSrcweir			else
438cdf0e10cSrcweir			{
439cdf0e10cSrcweir				$infoline = "Spellchecker selection: Removing module $module->{'gid'}\n";
440cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
441cdf0e10cSrcweir
442cdf0e10cSrcweir				# Collecting all files at modules that are removed
443cdf0e10cSrcweir
444cdf0e10cSrcweir				if ( $module->{'Files'} )
445cdf0e10cSrcweir				{
446cdf0e10cSrcweir					if ( $module->{'Files'} =~ /^\s*\((.*?)\)\s*$/ )
447cdf0e10cSrcweir					{
448cdf0e10cSrcweir						my $filelist = $1;
449cdf0e10cSrcweir
450cdf0e10cSrcweir						my $filelisthash = installer::converter::convert_stringlist_into_hash(\$filelist, ",");
451cdf0e10cSrcweir						foreach my $onefile ( keys %{$filelisthash} ) { $installer::globals::spellcheckerfilehash{$onefile} = 1; }
452cdf0e10cSrcweir					}
453cdf0e10cSrcweir				}
454cdf0e10cSrcweir			}
455cdf0e10cSrcweir		}
456cdf0e10cSrcweir		else
457cdf0e10cSrcweir		{
458cdf0e10cSrcweir			push(@allmodules, $module);
459cdf0e10cSrcweir		}
460cdf0e10cSrcweir	}
461cdf0e10cSrcweir
462cdf0e10cSrcweir	return \@allmodules;
463cdf0e10cSrcweir}
464cdf0e10cSrcweir
465cdf0e10cSrcweir################################################################################
466cdf0e10cSrcweir# Removing all modules, that belong to a module that was removed
467cdf0e10cSrcweir# in "remove_not_required_spellcheckerlanguage_modules" because of the
468cdf0e10cSrcweir# spellchecker language. The files belonging to the modules are collected
469cdf0e10cSrcweir# in %installer::globals::spellcheckerfilehash.
470cdf0e10cSrcweir################################################################################
471cdf0e10cSrcweir
472cdf0e10cSrcweirsub remove_not_required_spellcheckerlanguage_files
473cdf0e10cSrcweir{
474cdf0e10cSrcweir	my ($filesarrayref) = @_;
475cdf0e10cSrcweir
476cdf0e10cSrcweir	my @filesarray = ();
477cdf0e10cSrcweir	my $infoline = "";
478cdf0e10cSrcweir
479cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
480cdf0e10cSrcweir	{
481cdf0e10cSrcweir		my $onefile = ${$filesarrayref}[$i];
482cdf0e10cSrcweir		if ( exists($installer::globals::spellcheckerfilehash{$onefile->{'gid'}}) )
483cdf0e10cSrcweir		{
484cdf0e10cSrcweir			$infoline = "Spellchecker selection: Removing file $onefile->{'gid'}\n";
485cdf0e10cSrcweir			push( @installer::globals::logfileinfo, $infoline);
486cdf0e10cSrcweir			next;
487cdf0e10cSrcweir		}
488cdf0e10cSrcweir		push(@filesarray, $onefile);
489cdf0e10cSrcweir	}
490cdf0e10cSrcweir
491cdf0e10cSrcweir	return \@filesarray;
492cdf0e10cSrcweir}
493cdf0e10cSrcweir
494*c6dedb65SAndre Fischer=head3 add_bundled_extension_blobs
495*c6dedb65SAndre Fischer    Add entries for extension blobs to the global file list.
496*c6dedb65SAndre Fischer    Extension blobs, unlike preregistered extensions, are not
497*c6dedb65SAndre Fischer    extracted before included into a pack set.
498*c6dedb65SAndre Fischer
499*c6dedb65SAndre Fischer    The set of extensions to include is taken from the BUNDLED_EXTENSION_BLOBS
500*c6dedb65SAndre Fischer    environment variable (typically set in configure.)
501*c6dedb65SAndre Fischer
502*c6dedb65SAndre Fischer    If that variable is not defined then the content of main/extensions.lst defines
503*c6dedb65SAndre Fischer    the default set.
504*c6dedb65SAndre Fischer
505*c6dedb65SAndre Fischer    Extension blobs are placed in gid_Brand_Dir_Share_Extensions_Install.
506*c6dedb65SAndre Fischer=cut
507010ec03aSHerbert Dürrsub add_bundled_extension_blobs
508010ec03aSHerbert Dürr{
509010ec03aSHerbert Dürr	my @filelist = @{$_[0]};
510010ec03aSHerbert Dürr
511*c6dedb65SAndre Fischer    my @bundle_files = ();
512*c6dedb65SAndre Fischer    my $bundleenv = $ENV{'BUNDLED_EXTENSION_BLOBS'};
513*c6dedb65SAndre Fischer    my $bundlesrc = $ENV{'TARFILE_LOCATION'};
514*c6dedb65SAndre Fischer
515*c6dedb65SAndre Fischer    if ($installer::globals::product =~ /(SDK|URE)/i )
516*c6dedb65SAndre Fischer    {
517*c6dedb65SAndre Fischer        # No extensions for the SDK.
518*c6dedb65SAndre Fischer    }
519*c6dedb65SAndre Fischer    elsif (defined $bundleenv)
520*c6dedb65SAndre Fischer    {
521*c6dedb65SAndre Fischer        # Use the list of extensions that was explicitly given to configure.
522*c6dedb65SAndre Fischer        @bundle_files = split(/\s+/, $bundleenv, -1);
523*c6dedb65SAndre Fischer    }
524*c6dedb65SAndre Fischer    else
525*c6dedb65SAndre Fischer    {
526*c6dedb65SAndre Fischer        # Add the default rextensions for the current language set.
527*c6dedb65SAndre Fischer        @bundle_files = ExtensionsLst::GetExtensionList("http|https", @installer::globals::languageproducts);
528*c6dedb65SAndre Fischer    }
529*c6dedb65SAndre Fischer
530*c6dedb65SAndre Fischer    installer::logger::print_message(
531*c6dedb65SAndre Fischer        sprintf("preparing %d extension blob%s for language%s %s:\n    %s\n",
532*c6dedb65SAndre Fischer           $#bundle_files + 1,
533*c6dedb65SAndre Fischer           $#bundle_files!=0 ? "s" : "",
534*c6dedb65SAndre Fischer           $#installer::globals::languageproducts!=0 ? "s" : "",
535*c6dedb65SAndre Fischer           join(" ", @installer::globals::languageproducts),
536*c6dedb65SAndre Fischer           join("\n    ", @bundle_files)));
537*c6dedb65SAndre Fischer
538*c6dedb65SAndre Fischer    foreach my $filename ( @bundle_files)
539*c6dedb65SAndre Fischer    {
540*c6dedb65SAndre Fischer        my $basename = File::Basename::basename( $filename);
541*c6dedb65SAndre Fischer        my $onefile = {
542*c6dedb65SAndre Fischer            'Dir' => 'gid_Brand_Dir_Share_Extensions_Install',
543*c6dedb65SAndre Fischer            'Name' => $basename,
544*c6dedb65SAndre Fischer            'Styles' => '(PACKED)',
545*c6dedb65SAndre Fischer            'UnixRights' => '444',
546*c6dedb65SAndre Fischer            'sourcepath' => $bundlesrc . $installer::globals::separator . $filename,
547*c6dedb65SAndre Fischer            'modules' => "gid_Module_Dictionaries",
548*c6dedb65SAndre Fischer            'gid' => "gid_File_Extension_".$basename
549*c6dedb65SAndre Fischer        };
550*c6dedb65SAndre Fischer        push( @filelist, $onefile);
551*c6dedb65SAndre Fischer        push( @installer::globals::logfileinfo, "\tbundling \"$filename\" extension\n");
552*c6dedb65SAndre Fischer    }
553*c6dedb65SAndre Fischer
554010ec03aSHerbert Dürr	return \@filelist;
555010ec03aSHerbert Dürr}
556010ec03aSHerbert Dürr
557*c6dedb65SAndre Fischer=head3 add_bundled_prereg_extensions
558*c6dedb65SAndre Fischer    Add entries for preregistered extensions to the global file list.
559*c6dedb65SAndre Fischer
560*c6dedb65SAndre Fischer    The set of extensions to include is taken from the BUNDLED_PREREG_EXTENSIONS
561*c6dedb65SAndre Fischer    environment variable (typically set in configure.)
562*c6dedb65SAndre Fischer
563*c6dedb65SAndre Fischer    If that variable is not defined then the content of main/extensions.lst defines
564*c6dedb65SAndre Fischer    the default set.
565*c6dedb65SAndre Fischer
566*c6dedb65SAndre Fischer    Preregistered extensions are placed in subdirectories of gid_Brand_Dir_Share_Prereg_Bundled.
567*c6dedb65SAndre Fischer=cut
568010ec03aSHerbert Dürrsub add_bundled_prereg_extensions
569010ec03aSHerbert Dürr{
570010ec03aSHerbert Dürr	my @filelist = @{$_[0]};
571*c6dedb65SAndre Fischer    my $dirsref = $_[1];
572*c6dedb65SAndre Fischer
573*c6dedb65SAndre Fischer    my @bundle_files = ();
574*c6dedb65SAndre Fischer    my $bundleenv = $ENV{'BUNDLED_PREREG_EXTENSIONS'};
575*c6dedb65SAndre Fischer
576*c6dedb65SAndre Fischer    if ($installer::globals::product =~ /(SDK|URE)/i )
577*c6dedb65SAndre Fischer    {
578*c6dedb65SAndre Fischer        # No extensions for the SDK.
579*c6dedb65SAndre Fischer    }
580*c6dedb65SAndre Fischer    elsif (defined $bundleenv)
581*c6dedb65SAndre Fischer    {
582*c6dedb65SAndre Fischer        # Use the list of extensions that was explicitly given to configure.
583*c6dedb65SAndre Fischer        @bundle_files = split(/\s+/, $bundleenv, -1);
584*c6dedb65SAndre Fischer    }
585*c6dedb65SAndre Fischer    else
586*c6dedb65SAndre Fischer    {
587*c6dedb65SAndre Fischer        # Add the default rextensions for the current language set.
588*c6dedb65SAndre Fischer        @bundle_files = ExtensionsLst::GetExtensionList("file", @installer::globals::languageproducts);
589*c6dedb65SAndre Fischer    }
590*c6dedb65SAndre Fischer
591*c6dedb65SAndre Fischer    installer::logger::print_message(
592*c6dedb65SAndre Fischer        sprintf("preparing %d bundled extension%s for language%s %s:\n    %s\n",
593*c6dedb65SAndre Fischer           $#bundle_files + 1,
594*c6dedb65SAndre Fischer           $#bundle_files!=0 ? "s" : "",
595*c6dedb65SAndre Fischer           $#installer::globals::languageproducts!=0 ? "s" : "",
596*c6dedb65SAndre Fischer           join(" ", @installer::globals::languageproducts),
597*c6dedb65SAndre Fischer           join("\n    ", @bundle_files)));
598*c6dedb65SAndre Fischer
599*c6dedb65SAndre Fischer    # Find the prereg directory entry so that we can create a new sub-directory.
600*c6dedb65SAndre Fischer    my $parentdir_gid = "gid_Brand_Dir_Share_Prereg_Bundled";
601*c6dedb65SAndre Fischer    my $parentdir = undef;
602*c6dedb65SAndre Fischer    foreach my $dir (@{$dirsref})
603*c6dedb65SAndre Fischer    {
604*c6dedb65SAndre Fischer        if ($dir->{'gid'} eq $parentdir_gid)
605*c6dedb65SAndre Fischer        {
606*c6dedb65SAndre Fischer            $parentdir = $dir;
607*c6dedb65SAndre Fischer            last;
608*c6dedb65SAndre Fischer        }
609*c6dedb65SAndre Fischer    }
610*c6dedb65SAndre Fischer
611*c6dedb65SAndre Fischer    foreach my $filename ( @bundle_files)
612*c6dedb65SAndre Fischer    {
613*c6dedb65SAndre Fischer        my $basename = File::Basename::basename( $filename);
614*c6dedb65SAndre Fischer
615*c6dedb65SAndre Fischer        # Create a new directory into which the extension will be installed.
616*c6dedb65SAndre Fischer        my $dirgid =  $parentdir_gid . "_" . $basename;
617*c6dedb65SAndre Fischer        my $onedir = {
618*c6dedb65SAndre Fischer            'modules' => 'gid_Module_Root_Brand',
619*c6dedb65SAndre Fischer            'ismultilingual' => 0,
620*c6dedb65SAndre Fischer            'Styles' => '(CREATE)',
621*c6dedb65SAndre Fischer            'ParentID' => $parentdir_gid,
622*c6dedb65SAndre Fischer            'specificlanguage' => "",
623*c6dedb65SAndre Fischer            'haslanguagemodule' => 0,
624*c6dedb65SAndre Fischer            'gid' => $dirgid,
625*c6dedb65SAndre Fischer            'HostName' => $parentdir->{'HostName'} . $installer::globals::separator . $basename
626*c6dedb65SAndre Fischer        };
627*c6dedb65SAndre Fischer        push (@{$dirsref}, $onedir);
628*c6dedb65SAndre Fischer
629*c6dedb65SAndre Fischer        # Create a new file entry for the extension.
630*c6dedb65SAndre Fischer        my $onefile = {
631*c6dedb65SAndre Fischer            'Dir' => $dirgid,
632*c6dedb65SAndre Fischer            'Name' => $basename,
633*c6dedb65SAndre Fischer            'Styles' => '(PACKED,ARCHIVE)',
634*c6dedb65SAndre Fischer            'UnixRights' => '444',
635*c6dedb65SAndre Fischer            'sourcepath' => File::Spec->catfile($ENV{'OUTDIR'}, "bin", $filename),
636*c6dedb65SAndre Fischer            'specificlanguage' => "",
637*c6dedb65SAndre Fischer            'modules' => "gid_Module_Dictionaries",
638*c6dedb65SAndre Fischer            'gid' => "gid_File_Extension_".$basename
639*c6dedb65SAndre Fischer        };
640*c6dedb65SAndre Fischer        push( @filelist, $onefile);
641*c6dedb65SAndre Fischer        push( @installer::globals::logfileinfo, "\tbundling \"$filename\" extension\n");
642*c6dedb65SAndre Fischer    }
643*c6dedb65SAndre Fischer
644*c6dedb65SAndre Fischer    return (\@filelist, $dirsref);
645010ec03aSHerbert Dürr}
646010ec03aSHerbert Dürr
647cdf0e10cSrcweir################################################################################
648cdf0e10cSrcweir# Looking for directories without correct HostName
649cdf0e10cSrcweir################################################################################
650cdf0e10cSrcweir
651cdf0e10cSrcweirsub checking_directories_with_corrupt_hostname
652cdf0e10cSrcweir{
653cdf0e10cSrcweir	my ($dirsref, $languagesarrayref) = @_;
654cdf0e10cSrcweir
655cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
656cdf0e10cSrcweir	{
657cdf0e10cSrcweir		my $onedir = ${$dirsref}[$i];
658cdf0e10cSrcweir
659cdf0e10cSrcweir		my $hostname = "";
660cdf0e10cSrcweir
661cdf0e10cSrcweir		if ( $onedir->{'HostName'} ) { $hostname = $onedir->{'HostName'}; }
662cdf0e10cSrcweir
663cdf0e10cSrcweir		if ( $hostname eq "" )
664cdf0e10cSrcweir		{
665cdf0e10cSrcweir			my $langstring = "";
666cdf0e10cSrcweir			for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ ) { $langstring .= ${$languagesarrayref}[$j] . " "; }
667cdf0e10cSrcweir			installer::exiter::exit_program("ERROR: HostName not defined for $onedir->{'gid'} for specified language. Probably you wanted to create an installation set, in a language not defined in scp2 project. You selected the following language(s): $langstring", "checking_directories_with_corrupt_hostname");
668cdf0e10cSrcweir		}
669cdf0e10cSrcweir
670cdf0e10cSrcweir		if ( $hostname eq "FAILURE" )
671cdf0e10cSrcweir		{
672cdf0e10cSrcweir			installer::exiter::exit_program("ERROR: Could not create HostName for $onedir->{'gid'} (missing language at parent). See logfile warning for more info!", "checking_directories_with_corrupt_hostname");
673cdf0e10cSrcweir		}
674cdf0e10cSrcweir	}
675cdf0e10cSrcweir}
676cdf0e10cSrcweir
677cdf0e10cSrcweir################################################################################
678cdf0e10cSrcweir# Setting global properties
679cdf0e10cSrcweir################################################################################
680cdf0e10cSrcweir
681cdf0e10cSrcweirsub set_global_directory_hostnames
682cdf0e10cSrcweir{
683cdf0e10cSrcweir	my ($dirsref, $allvariables) = @_;
684cdf0e10cSrcweir
685cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
686cdf0e10cSrcweir	{
687cdf0e10cSrcweir		my $onedir = ${$dirsref}[$i];
688cdf0e10cSrcweir		my $styles = "";
689cdf0e10cSrcweir		if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
690cdf0e10cSrcweir
691cdf0e10cSrcweir		if ( $styles =~ /\bOFFICEDIRECTORY\b/ )
692cdf0e10cSrcweir		{
693cdf0e10cSrcweir			$installer::globals::officedirhostname = $onedir->{'HostName'};
694cdf0e10cSrcweir			$installer::globals::officedirgid = $onedir->{'gid'};
695cdf0e10cSrcweir			$allvariables->{'OFFICEDIRECTORYHOSTNAME'} = $installer::globals::officedirhostname;
696cdf0e10cSrcweir		}
697cdf0e10cSrcweir		if ( $styles =~ /\bSUNDIRECTORY\b/ )
698cdf0e10cSrcweir		{
699cdf0e10cSrcweir			$installer::globals::sundirhostname = $onedir->{'HostName'};
700cdf0e10cSrcweir			$installer::globals::sundirgid = $onedir->{'gid'};
701cdf0e10cSrcweir			$allvariables->{'SUNDIRECTORYHOSTNAME'} = $installer::globals::sundirhostname;
702cdf0e10cSrcweir		}
703cdf0e10cSrcweir	}
704cdf0e10cSrcweir}
705cdf0e10cSrcweir
706cdf0e10cSrcweir########################################################
707cdf0e10cSrcweir# Recursively defined procedure to order
708cdf0e10cSrcweir# modules and directories
709cdf0e10cSrcweir########################################################
710cdf0e10cSrcweir
711cdf0e10cSrcweirsub get_children
712cdf0e10cSrcweir{
713cdf0e10cSrcweir	my ($allitems, $startparent, $newitemorder) = @_;
714cdf0e10cSrcweir
715cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$allitems}; $i++ )
716cdf0e10cSrcweir	{
717cdf0e10cSrcweir		my $gid = ${$allitems}[$i]->{'gid'};
718cdf0e10cSrcweir		my $parent = "";
719cdf0e10cSrcweir		if ( ${$allitems}[$i]->{'ParentID'} ) { $parent = ${$allitems}[$i]->{'ParentID'}; }
720cdf0e10cSrcweir
721cdf0e10cSrcweir		if ( $parent eq $startparent )
722cdf0e10cSrcweir		{
723cdf0e10cSrcweir			push(@{$newitemorder}, ${$allitems}[$i]);
724cdf0e10cSrcweir			my $parent = $gid;
725cdf0e10cSrcweir			get_children($allitems, $parent, $newitemorder);	# recursive!
726cdf0e10cSrcweir		}
727cdf0e10cSrcweir	}
728cdf0e10cSrcweir}
729cdf0e10cSrcweir
730cdf0e10cSrcweir################################################################################
731cdf0e10cSrcweir# Using different HostName for language packs
732cdf0e10cSrcweir################################################################################
733cdf0e10cSrcweir
734cdf0e10cSrcweirsub use_langpack_hostname
735cdf0e10cSrcweir{
736cdf0e10cSrcweir	my ($dirsref) = @_;
737cdf0e10cSrcweir
738cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
739cdf0e10cSrcweir	{
740cdf0e10cSrcweir		my $onedir = ${$dirsref}[$i];
741cdf0e10cSrcweir		if (( $onedir->{'LangPackHostName'} ) && ( $onedir->{'LangPackHostName'} ne "" )) { $onedir->{'HostName'} = $onedir->{'LangPackHostName'}; }
742cdf0e10cSrcweir	}
743cdf0e10cSrcweir}
744cdf0e10cSrcweir
745cdf0e10cSrcweir################################################################################
746cdf0e10cSrcweir# Using different HostName for language packs
747cdf0e10cSrcweir################################################################################
748cdf0e10cSrcweir
749cdf0e10cSrcweirsub use_patch_hostname
750cdf0e10cSrcweir{
751cdf0e10cSrcweir	my ($dirsref) = @_;
752cdf0e10cSrcweir
753cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
754cdf0e10cSrcweir	{
755cdf0e10cSrcweir		my $onedir = ${$dirsref}[$i];
756cdf0e10cSrcweir		if (( $onedir->{'PatchHostName'} ) && ( $onedir->{'PatchHostName'} ne "" )) { $onedir->{'HostName'} = $onedir->{'PatchHostName'}; }
757cdf0e10cSrcweir	}
758cdf0e10cSrcweir}
759cdf0e10cSrcweir
760cdf0e10cSrcweir################################################################################
7611ed5bd48SJürgen Schmidt# Using langpack copy action for language packs
762cdf0e10cSrcweir################################################################################
763cdf0e10cSrcweir
764cdf0e10cSrcweirsub use_langpack_copy_scpaction
765cdf0e10cSrcweir{
766cdf0e10cSrcweir	my ($scpactionsref) = @_;
767cdf0e10cSrcweir
768cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ )
769cdf0e10cSrcweir	{
770cdf0e10cSrcweir		my $onescpaction = ${$scpactionsref}[$i];
771cdf0e10cSrcweir		if (( $onescpaction->{'LangPackCopy'} ) && ( $onescpaction->{'LangPackCopy'} ne "" )) { $onescpaction->{'Copy'} = $onescpaction->{'LangPackCopy'}; }
772cdf0e10cSrcweir	}
773cdf0e10cSrcweir}
774cdf0e10cSrcweir
775cdf0e10cSrcweir################################################################################
7761ed5bd48SJürgen Schmidt# Using copy patch action
777cdf0e10cSrcweir################################################################################
778cdf0e10cSrcweir
779cdf0e10cSrcweirsub use_patch_copy_scpaction
780cdf0e10cSrcweir{
781cdf0e10cSrcweir	my ($scpactionsref) = @_;
782cdf0e10cSrcweir
783cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ )
784cdf0e10cSrcweir	{
785cdf0e10cSrcweir		my $onescpaction = ${$scpactionsref}[$i];
786cdf0e10cSrcweir		if (( $onescpaction->{'PatchCopy'} ) && ( $onescpaction->{'PatchCopy'} ne "" )) { $onescpaction->{'Copy'} = $onescpaction->{'PatchCopy'}; }
787cdf0e10cSrcweir	}
788cdf0e10cSrcweir}
789cdf0e10cSrcweir
7901ed5bd48SJürgen Schmidt################################################################################
7911ed5bd48SJürgen Schmidt# Using dev copy patch action for developer snapshot builds
7921ed5bd48SJürgen Schmidt################################################################################
7931ed5bd48SJürgen Schmidt
7941ed5bd48SJürgen Schmidtsub use_dev_copy_scpaction
7951ed5bd48SJürgen Schmidt{
7961ed5bd48SJürgen Schmidt	my ($scpactionsref) = @_;
7971ed5bd48SJürgen Schmidt
7981ed5bd48SJürgen Schmidt	for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ )
7991ed5bd48SJürgen Schmidt	{
8001ed5bd48SJürgen Schmidt		my $onescpaction = ${$scpactionsref}[$i];
8011ed5bd48SJürgen Schmidt		if (( $onescpaction->{'DevCopy'} ) && ( $onescpaction->{'DevCopy'} ne "" )) { $onescpaction->{'Copy'} = $onescpaction->{'DevCopy'}; }
8021ed5bd48SJürgen Schmidt	}
8031ed5bd48SJürgen Schmidt}
8041ed5bd48SJürgen Schmidt
805cdf0e10cSrcweir################################################################################
806cdf0e10cSrcweir# Shifting parent directories of URE and Basis layer, so that
807cdf0e10cSrcweir# these directories are located below the Brand layer.
808cdf0e10cSrcweir# Style: SHIFT_BASIS_INTO_BRAND_LAYER
809cdf0e10cSrcweir################################################################################
810cdf0e10cSrcweir
811cdf0e10cSrcweirsub shift_basis_directory_parents
812cdf0e10cSrcweir{
813cdf0e10cSrcweir	my ($dirsref) = @_;
814cdf0e10cSrcweir
815cdf0e10cSrcweir	my @alldirs = ();
816cdf0e10cSrcweir	my @savedirs = ();
817cdf0e10cSrcweir	my @shifteddirs = ();
818cdf0e10cSrcweir
819cdf0e10cSrcweir	my $officedirgid = "";
820cdf0e10cSrcweir
821cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
822cdf0e10cSrcweir	{
823cdf0e10cSrcweir		my $onedir = ${$dirsref}[$i];
824cdf0e10cSrcweir		my $styles = "";
825cdf0e10cSrcweir		if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
826cdf0e10cSrcweir
827cdf0e10cSrcweir		if ( $styles =~ /\bOFFICEDIRECTORY\b/ ) { $officedirgid = $onedir->{'gid'}; }
828cdf0e10cSrcweir	}
829cdf0e10cSrcweir
830cdf0e10cSrcweir	if ( $officedirgid ne "" )
831cdf0e10cSrcweir	{
832cdf0e10cSrcweir		for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
833cdf0e10cSrcweir		{
834cdf0e10cSrcweir			my $onedir = ${$dirsref}[$i];
835cdf0e10cSrcweir			my $styles = "";
836cdf0e10cSrcweir			if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
837cdf0e10cSrcweir
838cdf0e10cSrcweir			if (( $styles =~ /\bBASISDIRECTORY\b/ ) || ( $styles =~ /\bUREDIRECTORY\b/ ))
839cdf0e10cSrcweir			{
840cdf0e10cSrcweir				$onedir->{'ParentID'} = $officedirgid;
841cdf0e10cSrcweir			}
842cdf0e10cSrcweir		}
843cdf0e10cSrcweir
844cdf0e10cSrcweir		# Sorting directories
845cdf0e10cSrcweir		my $startgid = "PREDEFINED_PROGDIR";
846cdf0e10cSrcweir		get_children($dirsref, $startgid, \@alldirs);
847cdf0e10cSrcweir	}
848cdf0e10cSrcweir
849cdf0e10cSrcweir	return \@alldirs;
850cdf0e10cSrcweir}
851cdf0e10cSrcweir
852cdf0e10cSrcweir################################################################################
853cdf0e10cSrcweir# Setting the name of the directory with style OFFICEDIRECTORY.
854cdf0e10cSrcweir# The name can be defined in property OFFICEDIRECTORYNAME.
855cdf0e10cSrcweir################################################################################
856cdf0e10cSrcweir
857cdf0e10cSrcweirsub set_officedirectory_name
858cdf0e10cSrcweir{
859cdf0e10cSrcweir	my ($dirsref, $officedirname) = @_;
860cdf0e10cSrcweir
861cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
862cdf0e10cSrcweir	{
863cdf0e10cSrcweir		my $onedir = ${$dirsref}[$i];
864cdf0e10cSrcweir		my $styles = "";
865cdf0e10cSrcweir		if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
866cdf0e10cSrcweir		if ( $styles =~ /\bOFFICEDIRECTORY\b/ )
867cdf0e10cSrcweir		{
868cdf0e10cSrcweir			$onedir->{'HostName'} = $officedirname;
869cdf0e10cSrcweir			last;
870cdf0e10cSrcweir		}
871cdf0e10cSrcweir	}
872cdf0e10cSrcweir}
873cdf0e10cSrcweir
874cdf0e10cSrcweir################################################################################
875cdf0e10cSrcweir# Simplifying the name for language dependent items from "Name (xy)" to "Name"
876cdf0e10cSrcweir################################################################################
877cdf0e10cSrcweir
878cdf0e10cSrcweirsub changing_name_of_language_dependent_keys
879cdf0e10cSrcweir{
880cdf0e10cSrcweir	my ($itemsarrayref) = @_;
881cdf0e10cSrcweir
882cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::changing_name_of_language_dependent_keys : $#{$itemsarrayref}"); }
883cdf0e10cSrcweir
884cdf0e10cSrcweir	# Changing key for multilingual items from "Name ( )" to "Name" or "HostName ( )" to "HostName"
885cdf0e10cSrcweir
886cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
887cdf0e10cSrcweir	{
888cdf0e10cSrcweir		my $oneitem = ${$itemsarrayref}[$i];
889cdf0e10cSrcweir		my $onelanguage = $oneitem->{'specificlanguage'};
890cdf0e10cSrcweir
891cdf0e10cSrcweir		if (!($onelanguage eq "" )) 				# language dependent item
892cdf0e10cSrcweir		{
893cdf0e10cSrcweir			my $itemkey;
894cdf0e10cSrcweir
895cdf0e10cSrcweir			foreach $itemkey (keys %{$oneitem})
896cdf0e10cSrcweir			{
897cdf0e10cSrcweir				if ( $itemkey =~ /^\s*(\S+?)\s+\(\S+\)\s*$/ )
898cdf0e10cSrcweir				{
899cdf0e10cSrcweir					my $newitemkey = $1;
900cdf0e10cSrcweir					my $itemvalue = $oneitem->{$itemkey};
901cdf0e10cSrcweir					$oneitem->{$newitemkey} = $itemvalue;
902cdf0e10cSrcweir					delete($oneitem->{$itemkey});
903cdf0e10cSrcweir				}
904cdf0e10cSrcweir			}
905cdf0e10cSrcweir		}
906cdf0e10cSrcweir	}
907cdf0e10cSrcweir}
908cdf0e10cSrcweir
909cdf0e10cSrcweir################################################################################
910cdf0e10cSrcweir# Collecting language specific names for language packs
911cdf0e10cSrcweir################################################################################
912cdf0e10cSrcweir
913cdf0e10cSrcweirsub collect_language_specific_names
914cdf0e10cSrcweir{
915cdf0e10cSrcweir	my ($itemsarrayref) = @_;
916cdf0e10cSrcweir
917cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
918cdf0e10cSrcweir	{
919cdf0e10cSrcweir		my $oneitem = ${$itemsarrayref}[$i];
920cdf0e10cSrcweir		my $styles = "";
921cdf0e10cSrcweir		if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
922cdf0e10cSrcweir
923cdf0e10cSrcweir		if ( $styles =~ /\bUSELANGUAGENAME\b/ )
924cdf0e10cSrcweir		{
925cdf0e10cSrcweir			my $language = "";
926cdf0e10cSrcweir			if ( $oneitem->{'Language'} ) { $language = $oneitem->{'Language'}; }
927cdf0e10cSrcweir			my $specificlanguage = "";
928cdf0e10cSrcweir			if ( $oneitem->{'specificlanguage'} ) { $specificlanguage = $oneitem->{'specificlanguage'}; }
929cdf0e10cSrcweir
930cdf0e10cSrcweir			if (( $language ne "" ) && ( $language eq $specificlanguage ))
931cdf0e10cSrcweir			{
932cdf0e10cSrcweir				if (! installer::existence::exists_in_array($oneitem->{'Name'}, \@installer::globals::languagenames ))
933cdf0e10cSrcweir				{
934cdf0e10cSrcweir					push(@installer::globals::languagenames, $oneitem->{'Name'});
935cdf0e10cSrcweir				}
936cdf0e10cSrcweir			}
937cdf0e10cSrcweir		}
938cdf0e10cSrcweir	}
939cdf0e10cSrcweir}
940cdf0e10cSrcweir
941cdf0e10cSrcweir################################################################################
942cdf0e10cSrcweir# Replacement of setup variables in ConfigurationItems and ProfileItems
943cdf0e10cSrcweir# <productkey>, <buildid>, <sequence_languages>, <productcode>, <upgradecode>, <productupdate>
944cdf0e10cSrcweir################################################################################
945cdf0e10cSrcweir
946cdf0e10cSrcweirsub replace_setup_variables
947cdf0e10cSrcweir{
948cdf0e10cSrcweir	my ($itemsarrayref, $languagestringref, $hashref) = @_;
949cdf0e10cSrcweir
950cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::replace_setup_variables : $#{$itemsarrayref} : $$languagestringref : $hashref->{'PRODUCTNAME'}"); }
951cdf0e10cSrcweir
952cdf0e10cSrcweir	my $languagesstring = $$languagestringref;
953cdf0e10cSrcweir	$languagesstring =~ s/\_/ /g;	# replacing underscore with whitespace
954cdf0e10cSrcweir	# $languagesstring is "01 49" instead of "en-US de"
955cdf0e10cSrcweir	installer::languages::fake_languagesstring(\$languagesstring);
956cdf0e10cSrcweir
957cdf0e10cSrcweir	my $productname = $hashref->{'PRODUCTNAME'};
958cdf0e10cSrcweir	my $productversion = $hashref->{'PRODUCTVERSION'};
959cdf0e10cSrcweir	my $userdirproductversion = "";
960cdf0e10cSrcweir	if ( $hashref->{'USERDIRPRODUCTVERSION'} ) { $userdirproductversion = $hashref->{'USERDIRPRODUCTVERSION'}; }
961cdf0e10cSrcweir	my $productkey = $productname . " " . $productversion;
962cdf0e10cSrcweir
9638bd5297cSJürgen Schmidt	my $scsrevision = SvnRevision::DetectRevisionId(File::Spec->catfile($ENV{'SRC_ROOT'}, File::Spec->updir()));
9648bd5297cSJürgen Schmidt
965cdf0e10cSrcweir	# string $buildid, which is used to replace the setup variable <buildid>
966cdf0e10cSrcweir
967cdf0e10cSrcweir	my $localminor = "flat";
968cdf0e10cSrcweir	if ( $installer::globals::minor ne "" ) { $localminor = $installer::globals::minor; }
969cdf0e10cSrcweir	else { $localminor = $installer::globals::lastminor; }
970cdf0e10cSrcweir
971cdf0e10cSrcweir	my $localbuild = $installer::globals::build;
972cdf0e10cSrcweir
973cdf0e10cSrcweir	if ( $localbuild =~ /^\s*(\w+?)(\d+)\s*$/ ) { $localbuild = $2; }	# using "680" instead of "src680"
974cdf0e10cSrcweir
975cdf0e10cSrcweir	my $buildidstring = $localbuild . $localminor . "(Build:" . $installer::globals::buildid . ")";
976cdf0e10cSrcweir
977cdf0e10cSrcweir	# the environment variable CWS_WORK_STAMP is set only in CWS
978cdf0e10cSrcweir	if ( $ENV{'CWS_WORK_STAMP'} ) { $buildidstring = $buildidstring . "\[CWS\:" . $ENV{'CWS_WORK_STAMP'} . "\]"; }
979cdf0e10cSrcweir
980cdf0e10cSrcweir	if ( $localminor =~ /^\s*\w(\d+)\w*\s*$/ ) { $localminor = $1; }
981cdf0e10cSrcweir
982cdf0e10cSrcweir	# $updateid
983cdf0e10cSrcweir	my $updateid = $productname . "_" . $userdirproductversion . "_" . $$languagestringref;
984cdf0e10cSrcweir	$updateid =~ s/ /_/g;
985cdf0e10cSrcweir
986cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
987cdf0e10cSrcweir	{
988cdf0e10cSrcweir		my $oneitem = ${$itemsarrayref}[$i];
989cdf0e10cSrcweir		my $value = $oneitem->{'Value'};
990cdf0e10cSrcweir
991cdf0e10cSrcweir		$value =~ s/\<buildid\>/$buildidstring/;
9928bd5297cSJürgen Schmidt		$value =~ s/\<scsrevision\>/$scsrevision/;
993cdf0e10cSrcweir		$value =~ s/\<sequence_languages\>/$languagesstring/;
994cdf0e10cSrcweir		$value =~ s/\<productkey\>/$productkey/;
995cdf0e10cSrcweir		$value =~ s/\<productcode\>/$installer::globals::productcode/;
996cdf0e10cSrcweir		$value =~ s/\<upgradecode\>/$installer::globals::upgradecode/;
997cdf0e10cSrcweir		$value =~ s/\<alllanguages\>/$languagesstring/;
998cdf0e10cSrcweir		$value =~ s/\<productmajor\>/$localbuild/;
999cdf0e10cSrcweir		$value =~ s/\<productminor\>/$localminor/;
1000cdf0e10cSrcweir		$value =~ s/\<productbuildid\>/$installer::globals::buildid/;
1001cdf0e10cSrcweir		$value =~ s/\<sourceid\>/$installer::globals::build/;
1002cdf0e10cSrcweir		$value =~ s/\<updateid\>/$updateid/;
1003cdf0e10cSrcweir		$value =~ s/\<pkgformat\>/$installer::globals::packageformat/;
1004cdf0e10cSrcweir
1005cdf0e10cSrcweir		$oneitem->{'Value'} = $value;
1006cdf0e10cSrcweir	}
1007cdf0e10cSrcweir}
1008cdf0e10cSrcweir
1009cdf0e10cSrcweir################################################################################
1010cdf0e10cSrcweir# By defining variable LOCALUSERDIR in *.lst it is possible to change
1011cdf0e10cSrcweir# the standard destination of user directory defined in scp2 ($SYSUSERCONFIG).
1012cdf0e10cSrcweir################################################################################
1013cdf0e10cSrcweir
1014cdf0e10cSrcweirsub replace_userdir_variable
1015cdf0e10cSrcweir{
1016cdf0e10cSrcweir	my ($itemsarrayref) = @_;
1017cdf0e10cSrcweir
1018cdf0e10cSrcweir	my $userdir = "";
1019cdf0e10cSrcweir	if ( $allvariableshashref->{'LOCALUSERDIR'} ) { $userdir = $allvariableshashref->{'LOCALUSERDIR'}; }
1020cdf0e10cSrcweir	else { $userdir = $installer::globals::simpledefaultuserdir; }
1021cdf0e10cSrcweir
1022cdf0e10cSrcweir	if ( $userdir ne "" )
1023cdf0e10cSrcweir	{
1024cdf0e10cSrcweir		for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
1025cdf0e10cSrcweir		{
1026cdf0e10cSrcweir			my $oneitem = ${$itemsarrayref}[$i];
1027cdf0e10cSrcweir			$oneitem->{'Value'} =~ s/\$SYSUSERCONFIG/$userdir/;
1028cdf0e10cSrcweir		}
1029cdf0e10cSrcweir	}
1030cdf0e10cSrcweir}
1031cdf0e10cSrcweir
1032cdf0e10cSrcweir#####################################################################################
1033cdf0e10cSrcweir# Files and ConfigurationItems are not included for all languages.
1034cdf0e10cSrcweir# For instance asian fonts. These can be removed, if no "Name" is found.
1035cdf0e10cSrcweir# ConfigurationItems are not always defined in the linguistic configuration file.
1036cdf0e10cSrcweir# The "Key" cannot be found for them.
1037cdf0e10cSrcweir#####################################################################################
1038cdf0e10cSrcweir
1039cdf0e10cSrcweirsub remove_non_existent_languages_in_productlists
1040cdf0e10cSrcweir{
1041cdf0e10cSrcweir	my ($itemsarrayref, $languagestringref, $searchkey, $itemtype) = @_;
1042cdf0e10cSrcweir
1043cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_non_existent_languages_in_productlists : $#{$itemsarrayref} : $$languagestringref : $searchkey : $itemtype"); }
1044cdf0e10cSrcweir
1045cdf0e10cSrcweir	# Removing of all non existent files, for instance asian fonts
1046cdf0e10cSrcweir
1047cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Removing for this language $$languagestringref:");
1048cdf0e10cSrcweir
1049cdf0e10cSrcweir	my @allexistentitems = ();
1050cdf0e10cSrcweir
1051cdf0e10cSrcweir	my $infoline;
1052cdf0e10cSrcweir
1053cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
1054cdf0e10cSrcweir	{
1055cdf0e10cSrcweir		my $oneitem = ${$itemsarrayref}[$i];
1056cdf0e10cSrcweir		my $oneitemname = "";		# $searchkey is "Name" for files and "Key" for ConfigurationItems
1057cdf0e10cSrcweir
1058cdf0e10cSrcweir		if ( $oneitem->{$searchkey} ) { $oneitemname = $oneitem->{$searchkey} }
1059cdf0e10cSrcweir
1060cdf0e10cSrcweir		my $itemtoberemoved = 0;
1061cdf0e10cSrcweir
1062cdf0e10cSrcweir		if ($oneitemname eq "") 					# for instance asian font in english installation set
1063cdf0e10cSrcweir		{
1064cdf0e10cSrcweir			$itemtoberemoved = 1;
1065cdf0e10cSrcweir		}
1066cdf0e10cSrcweir
1067cdf0e10cSrcweir		if ($itemtoberemoved)
1068cdf0e10cSrcweir		{
1069cdf0e10cSrcweir			$infoline = "WARNING: Language $$languagestringref: No $itemtype packed for $oneitem->{'gid'}!\n";
1070cdf0e10cSrcweir			push( @installer::globals::logfileinfo, $infoline);
1071cdf0e10cSrcweir		}
1072cdf0e10cSrcweir		else
1073cdf0e10cSrcweir		{
1074cdf0e10cSrcweir			push(@allexistentitems, $oneitem);
1075cdf0e10cSrcweir		}
1076cdf0e10cSrcweir	}
1077cdf0e10cSrcweir
1078cdf0e10cSrcweir	$infoline = "\n";
1079cdf0e10cSrcweir	push( @installer::globals::logfileinfo, $infoline);
1080cdf0e10cSrcweir
1081cdf0e10cSrcweir	return \@allexistentitems;
1082cdf0e10cSrcweir}
1083cdf0e10cSrcweir
1084cdf0e10cSrcweir########################################################################
1085cdf0e10cSrcweir# Input is the directory gid, output the "HostName" of the directory
1086cdf0e10cSrcweir########################################################################
1087cdf0e10cSrcweir
1088cdf0e10cSrcweirsub get_Directoryname_From_Directorygid
1089cdf0e10cSrcweir{
1090cdf0e10cSrcweir	my ($dirsarrayref ,$searchgid, $onelanguage, $oneitemgid) = @_;
1091cdf0e10cSrcweir
1092cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_Directoryname_From_Directorygid : $#{$dirsarrayref} : $searchgid : $onelanguage"); }
1093cdf0e10cSrcweir
1094cdf0e10cSrcweir	my $directoryname = "";
1095cdf0e10cSrcweir	my $onedirectory;
1096cdf0e10cSrcweir	my $foundgid = 0;
1097cdf0e10cSrcweir
1098cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$dirsarrayref}; $i++ )
1099cdf0e10cSrcweir	{
1100cdf0e10cSrcweir		$onedirectory = ${$dirsarrayref}[$i];
1101cdf0e10cSrcweir		my $directorygid = $onedirectory->{'gid'};
1102cdf0e10cSrcweir
1103cdf0e10cSrcweir		if ($directorygid eq $searchgid)
1104cdf0e10cSrcweir		{
1105cdf0e10cSrcweir			$foundgid = 1;
1106cdf0e10cSrcweir			last;
1107cdf0e10cSrcweir		}
1108cdf0e10cSrcweir	}
1109cdf0e10cSrcweir
1110cdf0e10cSrcweir	if (!($foundgid))
1111cdf0e10cSrcweir	{
1112cdf0e10cSrcweir		installer::exiter::exit_program("ERROR: Gid $searchgid not defined in $installer::globals::setupscriptname", "get_Directoryname_From_Directorygid");
1113cdf0e10cSrcweir	}
1114cdf0e10cSrcweir
1115cdf0e10cSrcweir	if ( ! ( $onedirectory->{'ismultilingual'} ))	# the directory is not language dependent
1116cdf0e10cSrcweir	{
1117cdf0e10cSrcweir 		$directoryname = $onedirectory->{'HostName'};
1118cdf0e10cSrcweir	}
1119cdf0e10cSrcweir	else
1120cdf0e10cSrcweir	{
1121cdf0e10cSrcweir		$directoryname = $onedirectory->{"HostName ($onelanguage)"};
1122cdf0e10cSrcweir	}
1123cdf0e10cSrcweir
1124cdf0e10cSrcweir	# gid_Dir_Template_Wizard_Letter is defined as language dependent directory, but the file gid_Dir_Template_Wizard_Letter
1125cdf0e10cSrcweir	# is not language dependent. Therefore $onelanguage is not defined. But which language is the correct language for the
1126cdf0e10cSrcweir	# directory?
1127cdf0e10cSrcweir	# Perhaps better solution: In scp it must be forbidden to have a language independent file in a language dependent directory.
1128cdf0e10cSrcweir
1129cdf0e10cSrcweir	if (( ! $directoryname ) && ( $onelanguage eq "" ))
1130cdf0e10cSrcweir	{
1131cdf0e10cSrcweir		installer::exiter::exit_program("ERROR (in scp): Directory $searchgid is language dependent, but not $oneitemgid inside this directory", "get_Directoryname_From_Directorygid");
1132cdf0e10cSrcweir	}
1133cdf0e10cSrcweir
1134cdf0e10cSrcweir	return \$directoryname;
1135cdf0e10cSrcweir}
1136cdf0e10cSrcweir
1137cdf0e10cSrcweir##################################################################
1138010ec03aSHerbert Dürr# Getting destination directory for links, files and profiles
1139cdf0e10cSrcweir##################################################################
1140cdf0e10cSrcweir
1141cdf0e10cSrcweirsub get_Destination_Directory_For_Item_From_Directorylist		# this is used for Files, Profiles and Links
1142cdf0e10cSrcweir{
1143cdf0e10cSrcweir	my ($itemarrayref, $dirsarrayref) = @_;
1144cdf0e10cSrcweir
1145cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist : $#{$itemarrayref} : $#{$dirsarrayref}"); }
1146cdf0e10cSrcweir
1147cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemarrayref}; $i++ )
1148cdf0e10cSrcweir	{
1149cdf0e10cSrcweir		my $oneitem = ${$itemarrayref}[$i];
1150cdf0e10cSrcweir		my $oneitemgid = $oneitem->{'gid'};
1151cdf0e10cSrcweir		my $directorygid = $oneitem->{'Dir'};		# for instance gid_Dir_Program
1152cdf0e10cSrcweir		my $netdirectorygid = "";
1153cdf0e10cSrcweir		my $onelanguage = $oneitem->{'specificlanguage'};
1154cdf0e10cSrcweir		my $ispredefinedprogdir = 0;
1155cdf0e10cSrcweir		my $ispredefinedconfigdir = 0;
1156cdf0e10cSrcweir
1157cdf0e10cSrcweir		my $oneitemname = $oneitem->{'Name'};
1158cdf0e10cSrcweir
1159cdf0e10cSrcweir		if ( $oneitem->{'NetDir'} ) { $netdirectorygid = $oneitem->{'NetDir'}; }
1160cdf0e10cSrcweir
1161cdf0e10cSrcweir		installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$oneitemname);	# making /registry/schema/org/openoffice/VCL.xcs to VCL.xcs
1162cdf0e10cSrcweir
1163cdf0e10cSrcweir		my $searchdirgid;
1164cdf0e10cSrcweir
1165cdf0e10cSrcweir		if ( $netdirectorygid eq "" )	# if NetDir is defined, it is privileged
1166cdf0e10cSrcweir		{
1167cdf0e10cSrcweir			$searchdirgid = $directorygid
1168cdf0e10cSrcweir		}
1169cdf0e10cSrcweir		else
1170cdf0e10cSrcweir		{
1171cdf0e10cSrcweir			$searchdirgid = $netdirectorygid
1172cdf0e10cSrcweir		}
1173cdf0e10cSrcweir
1174cdf0e10cSrcweir		if ($searchdirgid =~ /PREDEFINED_PROGDIR/)	# the root directory is not defined in setup script
1175cdf0e10cSrcweir		{
1176cdf0e10cSrcweir			$ispredefinedprogdir = 1;
1177cdf0e10cSrcweir		}
1178cdf0e10cSrcweir
1179cdf0e10cSrcweir		if ($searchdirgid =~ /PREDEFINED_CONFIGDIR/)	# the root directory is not defined in setup script
1180cdf0e10cSrcweir		{
1181cdf0e10cSrcweir			$ispredefinedconfigdir = 1;
1182cdf0e10cSrcweir		}
1183cdf0e10cSrcweir
1184cdf0e10cSrcweir		my $destfilename;
1185cdf0e10cSrcweir
1186cdf0e10cSrcweir		if ((!( $ispredefinedprogdir )) && (!( $ispredefinedconfigdir )))
1187cdf0e10cSrcweir		{
1188cdf0e10cSrcweir			my $directorynameref = get_Directoryname_From_Directorygid($dirsarrayref, $searchdirgid, $onelanguage, $oneitemgid);
1189cdf0e10cSrcweir			$destfilename = $$directorynameref . $installer::globals::separator . $oneitemname;
1190cdf0e10cSrcweir		}
1191cdf0e10cSrcweir		else
1192cdf0e10cSrcweir		{
1193cdf0e10cSrcweir			$destfilename = $oneitemname;
1194cdf0e10cSrcweir		}
1195cdf0e10cSrcweir
1196cdf0e10cSrcweir		$oneitem->{'destination'} = $destfilename;
1197cdf0e10cSrcweir	}
1198cdf0e10cSrcweir}
1199cdf0e10cSrcweir
1200cdf0e10cSrcweir##########################################################################
1201cdf0e10cSrcweir# Searching a file in a list of pathes
1202cdf0e10cSrcweir##########################################################################
1203cdf0e10cSrcweir
1204cdf0e10cSrcweirsub get_sourcepath_from_filename_and_includepath_classic
1205cdf0e10cSrcweir{
1206cdf0e10cSrcweir	my ($searchfilenameref, $includepatharrayref, $write_logfile) = @_;
1207cdf0e10cSrcweir
1208cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic : $$searchfilenameref : $#{$includepatharrayref} : $write_logfile"); }
1209cdf0e10cSrcweir
1210cdf0e10cSrcweir	my ($onefile, $includepath, $infoline);
1211cdf0e10cSrcweir
1212cdf0e10cSrcweir	my $foundsourcefile = 0;
1213cdf0e10cSrcweir
1214cdf0e10cSrcweir	for ( my $j = 0; $j <= $#{$includepatharrayref}; $j++ )
1215cdf0e10cSrcweir	{
1216cdf0e10cSrcweir		$includepath = ${$includepatharrayref}[$j];
1217cdf0e10cSrcweir		installer::remover::remove_leading_and_ending_whitespaces(\$includepath);
1218cdf0e10cSrcweir
1219cdf0e10cSrcweir		$onefile = $includepath . $installer::globals::separator . $$searchfilenameref;
1220cdf0e10cSrcweir
1221cdf0e10cSrcweir		if ( -f $onefile )
1222cdf0e10cSrcweir		{
1223cdf0e10cSrcweir			$foundsourcefile = 1;
1224cdf0e10cSrcweir			last;
1225cdf0e10cSrcweir		}
1226cdf0e10cSrcweir	}
1227cdf0e10cSrcweir
1228cdf0e10cSrcweir	if (!($foundsourcefile))
1229cdf0e10cSrcweir	{
1230cdf0e10cSrcweir		$onefile = "";	# the sourcepath has to be empty
1231cdf0e10cSrcweir		if ( $write_logfile)
1232cdf0e10cSrcweir		{
1233cdf0e10cSrcweir			if ( $ENV{'DEFAULT_TO_ENGLISH_FOR_PACKING'} )
1234cdf0e10cSrcweir			{
1235cdf0e10cSrcweir				$infoline = "WARNING: Source for $$searchfilenameref not found!\n";	 # Important message in log file
1236cdf0e10cSrcweir			}
1237cdf0e10cSrcweir			else
1238cdf0e10cSrcweir			{
1239cdf0e10cSrcweir				$infoline = "ERROR: Source for $$searchfilenameref not found!\n";	 # Important message in log file
1240cdf0e10cSrcweir			}
1241cdf0e10cSrcweir
1242cdf0e10cSrcweir			push( @installer::globals::logfileinfo, $infoline);
1243cdf0e10cSrcweir		}
1244cdf0e10cSrcweir	}
1245cdf0e10cSrcweir	else
1246cdf0e10cSrcweir	{
1247cdf0e10cSrcweir		if ( $write_logfile)
1248cdf0e10cSrcweir		{
1249cdf0e10cSrcweir			$infoline = "SUCCESS: Source for $$searchfilenameref: $onefile\n";
1250cdf0e10cSrcweir			push( @installer::globals::logfileinfo, $infoline);
1251cdf0e10cSrcweir		}
1252cdf0e10cSrcweir	}
1253cdf0e10cSrcweir
1254cdf0e10cSrcweir	return \$onefile;
1255cdf0e10cSrcweir}
1256cdf0e10cSrcweir
1257cdf0e10cSrcweir##########################################################################
1258cdf0e10cSrcweir# Input is one file name, output the complete absolute path of this file
1259cdf0e10cSrcweir##########################################################################
1260cdf0e10cSrcweir
1261cdf0e10cSrcweirsub get_sourcepath_from_filename_and_includepath
1262cdf0e10cSrcweir{
1263cdf0e10cSrcweir	my ($searchfilenameref, $unused, $write_logfile) = @_;
1264cdf0e10cSrcweir
1265cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_sourcepath_from_filename_and_includepath : $$searchfilenameref : $#{$includepatharrayref} : $write_logfile"); }
1266cdf0e10cSrcweir
1267cdf0e10cSrcweir	my ($onefile, $includepath, $infoline);
1268cdf0e10cSrcweir
1269cdf0e10cSrcweir	my $foundsourcefile = 0;
1270cdf0e10cSrcweir	my $foundnewname = 0;
1271cdf0e10cSrcweir
1272cdf0e10cSrcweir	for ( my $j = 0; $j <= $#installer::globals::allincludepathes; $j++ )
1273cdf0e10cSrcweir	{
1274cdf0e10cSrcweir		my $allfiles = $installer::globals::allincludepathes[$j];
1275cdf0e10cSrcweir
1276cdf0e10cSrcweir		if ( exists( $allfiles->{$$searchfilenameref} ))
1277cdf0e10cSrcweir		{
1278cdf0e10cSrcweir			$onefile = $allfiles->{'includepath'} . $installer::globals::separator . $$searchfilenameref;
1279cdf0e10cSrcweir			$foundsourcefile = 1;
1280cdf0e10cSrcweir			last;
1281cdf0e10cSrcweir		}
1282cdf0e10cSrcweir	}
1283cdf0e10cSrcweir
1284cdf0e10cSrcweir	if (!($foundsourcefile))	# testing with lowercase filename
1285cdf0e10cSrcweir	{
1286cdf0e10cSrcweir		# Attention: README01.html is copied for Windows to readme01.html, not case sensitive
1287cdf0e10cSrcweir
1288cdf0e10cSrcweir		for ( my $j = 0; $j <= $#installer::globals::allincludepathes; $j++ )
1289cdf0e10cSrcweir		{
1290cdf0e10cSrcweir			my $allfiles = $installer::globals::allincludepathes[$j];
1291cdf0e10cSrcweir
1292cdf0e10cSrcweir			my $newfilename = $$searchfilenameref;
1293cdf0e10cSrcweir			$newfilename =~ s/readme/README/;		# special handling for readme files
1294cdf0e10cSrcweir			$newfilename =~ s/license/LICENSE/;		# special handling for license files
1295cdf0e10cSrcweir
1296cdf0e10cSrcweir			if ( exists( $allfiles->{$newfilename} ))
1297cdf0e10cSrcweir			{
1298cdf0e10cSrcweir				$onefile = $allfiles->{'includepath'} . $installer::globals::separator . $newfilename;
1299cdf0e10cSrcweir				$foundsourcefile = 1;
1300cdf0e10cSrcweir				$foundnewname = 1;
1301cdf0e10cSrcweir				last;
1302cdf0e10cSrcweir			}
1303cdf0e10cSrcweir		}
1304cdf0e10cSrcweir	}
1305cdf0e10cSrcweir
1306cdf0e10cSrcweir	if (!($foundsourcefile))
1307cdf0e10cSrcweir	{
1308cdf0e10cSrcweir		$onefile = "";	# the sourcepath has to be empty
1309cdf0e10cSrcweir		if ( $write_logfile)
1310cdf0e10cSrcweir		{
1311cdf0e10cSrcweir			if ( $ENV{'DEFAULT_TO_ENGLISH_FOR_PACKING'} )
1312cdf0e10cSrcweir			{
1313cdf0e10cSrcweir				$infoline = "WARNING: Source for $$searchfilenameref not found!\n";	 # Important message in log file
1314cdf0e10cSrcweir			}
1315cdf0e10cSrcweir			else
1316cdf0e10cSrcweir			{
1317cdf0e10cSrcweir				$infoline = "ERROR: Source for $$searchfilenameref not found!\n";	 # Important message in log file
1318cdf0e10cSrcweir			}
1319cdf0e10cSrcweir
1320cdf0e10cSrcweir			push( @installer::globals::logfileinfo, $infoline);
1321cdf0e10cSrcweir		}
1322cdf0e10cSrcweir	}
1323cdf0e10cSrcweir	else
1324cdf0e10cSrcweir	{
1325cdf0e10cSrcweir		if ( $write_logfile)
1326cdf0e10cSrcweir		{
1327cdf0e10cSrcweir			if (!($foundnewname))
1328cdf0e10cSrcweir			{
1329cdf0e10cSrcweir				$infoline = "SUCCESS: Source for $$searchfilenameref: $onefile\n";
1330cdf0e10cSrcweir			}
1331cdf0e10cSrcweir			else
1332cdf0e10cSrcweir			{
1333cdf0e10cSrcweir				$infoline = "SUCCESS/WARNING: Special handling for $$searchfilenameref: $onefile\n";
1334cdf0e10cSrcweir			}
1335cdf0e10cSrcweir			push( @installer::globals::logfileinfo, $infoline);
1336cdf0e10cSrcweir		}
1337cdf0e10cSrcweir	}
1338cdf0e10cSrcweir
1339cdf0e10cSrcweir	return \$onefile;
1340cdf0e10cSrcweir}
1341cdf0e10cSrcweir
1342cdf0e10cSrcweir##############################################################
1343cdf0e10cSrcweir# Determining, whether a specified directory is language
1344cdf0e10cSrcweir# dependent
1345cdf0e10cSrcweir##############################################################
1346cdf0e10cSrcweir
1347cdf0e10cSrcweirsub determine_directory_language_dependency
1348cdf0e10cSrcweir{
1349cdf0e10cSrcweir	my($directorygid, $dirsref) = @_;
1350cdf0e10cSrcweir
1351cdf0e10cSrcweir	my $is_multilingual = 0;
1352cdf0e10cSrcweir
1353cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
1354cdf0e10cSrcweir	{
1355cdf0e10cSrcweir		my $onedir = ${$dirsref}[$i];
1356cdf0e10cSrcweir		my $gid = $onedir->{'gid'};
1357cdf0e10cSrcweir
1358cdf0e10cSrcweir		if ( $gid eq $directorygid )
1359cdf0e10cSrcweir		{
1360cdf0e10cSrcweir			$is_multilingual = $onedir->{'ismultilingual'};
1361cdf0e10cSrcweir			last;
1362cdf0e10cSrcweir		}
1363cdf0e10cSrcweir	}
1364cdf0e10cSrcweir
1365cdf0e10cSrcweir	return $is_multilingual;
1366cdf0e10cSrcweir}
1367cdf0e10cSrcweir
1368cdf0e10cSrcweir##############################################################
1369cdf0e10cSrcweir# Getting all source pathes for all files to be packed
1370cdf0e10cSrcweir# $item can be "Files" or "ScpActions"
1371cdf0e10cSrcweir##############################################################
1372cdf0e10cSrcweir
1373cdf0e10cSrcweirsub get_Source_Directory_For_Files_From_Includepathlist
1374cdf0e10cSrcweir{
1375cdf0e10cSrcweir	my ($filesarrayref, $includepatharrayref, $dirsref, $item) = @_;
1376cdf0e10cSrcweir
1377cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_Source_Directory_For_Files_From_Includepathlist : $#{$filesarrayref} : $#{$includepatharrayref} : $item"); }
1378cdf0e10cSrcweir
1379cdf0e10cSrcweir	installer::logger::include_header_into_logfile("$item:");
1380cdf0e10cSrcweir
1381cdf0e10cSrcweir	my $infoline = "";
1382cdf0e10cSrcweir
1383cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
1384cdf0e10cSrcweir	{
1385cdf0e10cSrcweir		my $onefile = ${$filesarrayref}[$i];
1386cdf0e10cSrcweir		my $onelanguage = $onefile->{'specificlanguage'};
1387cdf0e10cSrcweir
1388cdf0e10cSrcweir		if ( ! $onefile->{'Name'} ) { installer::exiter::exit_program("ERROR: $item without name ! GID: $onefile->{'gid'} ! Language: $onelanguage", "get_Source_Directory_For_Files_From_Includepathlist"); }
1389cdf0e10cSrcweir
1390cdf0e10cSrcweir		my $onefilename = $onefile->{'Name'};
1391cdf0e10cSrcweir		if ( $item eq "ScpActions" ) { $onefilename =~ s/\//$installer::globals::separator/g; }
1392cdf0e10cSrcweir		$onefilename =~ s/^\s*\Q$installer::globals::separator\E//;		# filename begins with a slash, for instance /registry/schema/org/openoffice/VCL.xcs
1393cdf0e10cSrcweir
1394cdf0e10cSrcweir		my $styles = "";
1395cdf0e10cSrcweir		my $file_can_miss = 0;
1396cdf0e10cSrcweir		if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
1397cdf0e10cSrcweir		if ( $styles =~ /\bFILE_CAN_MISS\b/ ) { $file_can_miss = 1; }
1398cdf0e10cSrcweir
1399cdf0e10cSrcweir		if (( $installer::globals::languagepack ) && ( ! $onefile->{'ismultilingual'} ) && ( ! ( $styles =~ /\bFORCELANGUAGEPACK\b/ ))) { $file_can_miss = 1; }
1400cdf0e10cSrcweir
1401cdf0e10cSrcweir		my $sourcepathref = "";
1402cdf0e10cSrcweir
1403cdf0e10cSrcweir		if ( $file_can_miss ) { $sourcepathref = get_sourcepath_from_filename_and_includepath(\$onefilename, $includepatharrayref, 0); }
1404cdf0e10cSrcweir		else { $sourcepathref = get_sourcepath_from_filename_and_includepath(\$onefilename, $includepatharrayref, 1); }
1405cdf0e10cSrcweir
1406cdf0e10cSrcweir		$onefile->{'sourcepath'} = $$sourcepathref;	# This $$sourcepathref is empty, if no source was found
1407cdf0e10cSrcweir
1408cdf0e10cSrcweir		# defaulting to english for multilingual files if DEFAULT_TO_ENGLISH_FOR_PACKING is set
1409cdf0e10cSrcweir
1410cdf0e10cSrcweir		if ( $ENV{'DEFAULT_TO_ENGLISH_FOR_PACKING'} )
1411cdf0e10cSrcweir		{
1412cdf0e10cSrcweir			if (( ! $onefile->{'sourcepath'} ) && ( $onefile->{'ismultilingual'} ))
1413cdf0e10cSrcweir			{
1414cdf0e10cSrcweir				my $oldname = $onefile->{'Name'};
1415cdf0e10cSrcweir				my $oldlanguage = $onefile->{'specificlanguage'};
1416cdf0e10cSrcweir				my $newlanguage = "en-US";
1417cdf0e10cSrcweir				# $onefile->{'Name'} =~ s/$oldlanguage\./$newlanguage\./;	# Example: tplwizfax_it.zip -> tplwizfax_en-US.zip
1418cdf0e10cSrcweir				$onefilename = $onefile->{'Name'};
1419cdf0e10cSrcweir				$onefilename =~ s/$oldlanguage\./$newlanguage\./;	# Example: tplwizfax_it.zip -> tplwizfax_en-US.zip
1420cdf0e10cSrcweir				$onefilename =~ s/^\s*\Q$installer::globals::separator\E//;		# filename begins with a slash, for instance /registry/schema/org/openoffice/VCL.xcs
1421cdf0e10cSrcweir				$sourcepathref = get_sourcepath_from_filename_and_includepath(\$onefilename, $includepatharrayref, 1);
1422cdf0e10cSrcweir				$onefile->{'sourcepath'} = $$sourcepathref;						# This $$sourcepathref is empty, if no source was found
1423cdf0e10cSrcweir
1424cdf0e10cSrcweir				if ($onefile->{'sourcepath'})	# defaulting to english was successful
1425cdf0e10cSrcweir				{
1426cdf0e10cSrcweir					$infoline = "WARNING: Using $onefilename instead of $oldname\n";
1427cdf0e10cSrcweir					push( @installer::globals::logfileinfo, $infoline);
1428cdf0e10cSrcweir					print "    $infoline";
1429cdf0e10cSrcweir					# if ( $onefile->{'destination'} ) { $onefile->{'destination'} =~ s/\Q$oldname\E/$onefile->{'Name'}/; }
1430cdf0e10cSrcweir
1431cdf0e10cSrcweir					# If the directory, in which the new file is installed, is not language dependent,
1432cdf0e10cSrcweir					# the filename has to be changed to avoid installation conflicts
1433cdf0e10cSrcweir					# No mechanism for resource files!
1434cdf0e10cSrcweir					# -> implementing for the content of ARCHIVE files
1435cdf0e10cSrcweir
1436cdf0e10cSrcweir					if ( $onefile->{'Styles'} =~ /\bARCHIVE\b/ )
1437cdf0e10cSrcweir					{
1438cdf0e10cSrcweir						my $directorygid = $onefile->{'Dir'};
1439cdf0e10cSrcweir						my $islanguagedependent = determine_directory_language_dependency($directorygid, $dirsref);
1440cdf0e10cSrcweir
1441cdf0e10cSrcweir						if ( ! $islanguagedependent )
1442cdf0e10cSrcweir						{
1443cdf0e10cSrcweir							$onefile->{'Styles'} =~ s/\bARCHIVE\b/ARCHIVE, RENAME_TO_LANGUAGE/;	# Setting new flag RENAME_TO_LANGUAGE
1444cdf0e10cSrcweir							$infoline = "Setting flag RENAME_TO_LANGUAGE: File $onefile->{'Name'} in directory: $directorygid\n";
1445cdf0e10cSrcweir							push( @installer::globals::logfileinfo, $infoline);
1446cdf0e10cSrcweir						}
1447cdf0e10cSrcweir					}
1448cdf0e10cSrcweir				}
1449cdf0e10cSrcweir				else
1450cdf0e10cSrcweir				{
1451cdf0e10cSrcweir					$infoline = "WARNING: Using $onefile->{'Name'} instead of $oldname was not successful\n";
1452cdf0e10cSrcweir					push( @installer::globals::logfileinfo, $infoline);
1453cdf0e10cSrcweir					$onefile->{'Name'} = $oldname;	# Switching back to old file name
1454cdf0e10cSrcweir				}
1455cdf0e10cSrcweir			}
1456cdf0e10cSrcweir		}
1457cdf0e10cSrcweir	}
1458cdf0e10cSrcweir
1459cdf0e10cSrcweir	$infoline = "\n";	# empty line after listing of all files
1460cdf0e10cSrcweir	push( @installer::globals::logfileinfo, $infoline);
1461cdf0e10cSrcweir}
1462cdf0e10cSrcweir
1463cdf0e10cSrcweir#################################################################################
1464cdf0e10cSrcweir# Removing files, that shall not be included into languagepacks
1465cdf0e10cSrcweir# (because of rpm conflicts)
1466cdf0e10cSrcweir#################################################################################
1467cdf0e10cSrcweir
1468cdf0e10cSrcweirsub remove_Files_For_Languagepacks
1469cdf0e10cSrcweir{
1470cdf0e10cSrcweir	my ($itemsarrayref) = @_;
1471cdf0e10cSrcweir
1472cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_Files_For_Languagepacks : $#{$filesarrayref}"); }
1473cdf0e10cSrcweir
1474cdf0e10cSrcweir	my $infoline;
1475cdf0e10cSrcweir
1476cdf0e10cSrcweir	my @newitemsarray = ();
1477cdf0e10cSrcweir
1478cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
1479cdf0e10cSrcweir	{
1480cdf0e10cSrcweir		my $oneitem = ${$itemsarrayref}[$i];
1481cdf0e10cSrcweir		my $gid = $oneitem->{'gid'};
1482cdf0e10cSrcweir
1483cdf0e10cSrcweir		# scp Todo: Remove asap after removal of old setup
1484cdf0e10cSrcweir
1485cdf0e10cSrcweir		if (( $gid eq "gid_File_Extra_Fontunxpsprint" ) ||
1486cdf0e10cSrcweir			( $gid eq "gid_File_Extra_Migration_Lang" ))
1487cdf0e10cSrcweir		{
1488cdf0e10cSrcweir			$infoline = "ATTENTION: Removing item $oneitem->{'gid'} from the installation set.\n";
1489cdf0e10cSrcweir			push( @installer::globals::logfileinfo, $infoline);
1490cdf0e10cSrcweir
1491cdf0e10cSrcweir			next;
1492cdf0e10cSrcweir		}
1493cdf0e10cSrcweir
1494cdf0e10cSrcweir		push(@newitemsarray, $oneitem);
1495cdf0e10cSrcweir	}
1496cdf0e10cSrcweir
1497cdf0e10cSrcweir	return \@newitemsarray;
1498cdf0e10cSrcweir}
1499cdf0e10cSrcweir
1500cdf0e10cSrcweir#################################################################################
1501cdf0e10cSrcweir# Files, whose source directory is not found, are removed now (this is an ERROR)
1502cdf0e10cSrcweir#################################################################################
1503cdf0e10cSrcweir
1504cdf0e10cSrcweirsub remove_Files_Without_Sourcedirectory
1505cdf0e10cSrcweir{
1506cdf0e10cSrcweir	my ($filesarrayref) = @_;
1507cdf0e10cSrcweir
1508cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_Files_Without_Sourcedirectory : $#{$filesarrayref}"); }
1509cdf0e10cSrcweir
1510cdf0e10cSrcweir	my $infoline;
1511cdf0e10cSrcweir
1512cdf0e10cSrcweir	my $error_occured = 0;
1513cdf0e10cSrcweir	my @missingfiles = ();
1514cdf0e10cSrcweir	push(@missingfiles, "ERROR: The following files could not be found: \n");
1515cdf0e10cSrcweir
1516cdf0e10cSrcweir	my @newfilesarray = ();
1517cdf0e10cSrcweir
1518cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
1519cdf0e10cSrcweir	{
1520cdf0e10cSrcweir		my $onefile = ${$filesarrayref}[$i];
1521cdf0e10cSrcweir		my $sourcepath = $onefile->{'sourcepath'};
1522cdf0e10cSrcweir
1523cdf0e10cSrcweir		if ($sourcepath eq "")
1524cdf0e10cSrcweir		{
1525cdf0e10cSrcweir			my $styles = $onefile->{'Styles'};
1526cdf0e10cSrcweir			my $filename = $onefile->{'Name'};
1527cdf0e10cSrcweir
1528cdf0e10cSrcweir			if ( ! $installer::globals::languagepack )
1529cdf0e10cSrcweir			{
1530010ec03aSHerbert Dürr				$infoline = "ERROR: No sourcepath -> Removing file $filename from file list.\n";
1531cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
1532cdf0e10cSrcweir
1533cdf0e10cSrcweir				push(@missingfiles, "ERROR: File not found: $filename\n");
1534cdf0e10cSrcweir				$error_occured = 1;
1535cdf0e10cSrcweir
1536cdf0e10cSrcweir				next;	# removing this file from list, if sourcepath is empty
1537cdf0e10cSrcweir			}
1538cdf0e10cSrcweir			else # special case for language packs
1539cdf0e10cSrcweir			{
1540cdf0e10cSrcweir				if (( $onefile->{'ismultilingual'} ) || ( $styles =~ /\bFORCELANGUAGEPACK\b/ ))
1541cdf0e10cSrcweir				{
1542cdf0e10cSrcweir					$infoline = "ERROR: Removing file $filename from file list.\n";
1543cdf0e10cSrcweir					push( @installer::globals::logfileinfo, $infoline);
1544cdf0e10cSrcweir
1545cdf0e10cSrcweir					push(@missingfiles, "ERROR: File not found: $filename\n");
1546cdf0e10cSrcweir					$error_occured = 1;
1547cdf0e10cSrcweir
1548cdf0e10cSrcweir					next;	# removing this file from list, if sourcepath is empty
1549cdf0e10cSrcweir				}
1550cdf0e10cSrcweir				else
1551cdf0e10cSrcweir				{
1552cdf0e10cSrcweir					$infoline = "INFO: Removing file $filename from file list. It is not language dependent.\n";
1553cdf0e10cSrcweir					push( @installer::globals::logfileinfo, $infoline);
1554cdf0e10cSrcweir					$infoline = "INFO: It is not language dependent and can be ignored in language packs.\n";
1555cdf0e10cSrcweir					push( @installer::globals::logfileinfo, $infoline);
1556cdf0e10cSrcweir
1557cdf0e10cSrcweir					next;	# removing this file from list, if sourcepath is empty
1558cdf0e10cSrcweir				}
1559cdf0e10cSrcweir			}
1560cdf0e10cSrcweir		}
1561cdf0e10cSrcweir
1562cdf0e10cSrcweir		push(@newfilesarray, $onefile);
1563cdf0e10cSrcweir	}
1564cdf0e10cSrcweir
1565cdf0e10cSrcweir	$infoline = "\n";
1566cdf0e10cSrcweir	push( @installer::globals::logfileinfo, $infoline);
1567cdf0e10cSrcweir
1568cdf0e10cSrcweir	if ( $error_occured )
1569cdf0e10cSrcweir	{
1570cdf0e10cSrcweir		for ( my $i = 0; $i <= $#missingfiles; $i++ ) { print "$missingfiles[$i]"; }
1571cdf0e10cSrcweir		installer::exiter::exit_program("ERROR: Missing files", "remove_Files_Without_Sourcedirectory");
1572cdf0e10cSrcweir	}
1573cdf0e10cSrcweir
1574cdf0e10cSrcweir	return \@newfilesarray;
1575cdf0e10cSrcweir}
1576cdf0e10cSrcweir
1577cdf0e10cSrcweir############################################################################
1578cdf0e10cSrcweir# License and Readme files in the default language have to be installed
1579cdf0e10cSrcweir# in the directory with flag OFFICEDIRECTORY. If this is not defined
1580cdf0e10cSrcweir# they have to be installed in the installation root.
1581cdf0e10cSrcweir############################################################################
1582cdf0e10cSrcweir
1583cdf0e10cSrcweirsub get_office_directory_gid_and_hostname
1584cdf0e10cSrcweir{
1585cdf0e10cSrcweir	my ($dirsarrayref) = @_;
1586cdf0e10cSrcweir
1587cdf0e10cSrcweir	my $foundofficedir = 0;
1588cdf0e10cSrcweir	my $gid = "";
1589cdf0e10cSrcweir	my $hostname = "";
1590cdf0e10cSrcweir
1591cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$dirsarrayref}; $i++ )
1592cdf0e10cSrcweir	{
1593cdf0e10cSrcweir		my $onedir = ${$dirsarrayref}[$i];
1594cdf0e10cSrcweir		if ( $onedir->{'Styles'} )
1595cdf0e10cSrcweir		{
1596cdf0e10cSrcweir			my $styles = $onedir->{'Styles'};
1597cdf0e10cSrcweir
1598cdf0e10cSrcweir			if ( $styles =~ /\bOFFICEDIRECTORY\b/ )
1599cdf0e10cSrcweir			{
1600cdf0e10cSrcweir				$foundofficedir = 1;
1601cdf0e10cSrcweir				$gid = $onedir->{'gid'};
1602cdf0e10cSrcweir				$hostname = $onedir->{'HostName'};
1603cdf0e10cSrcweir				last;
1604cdf0e10cSrcweir			}
1605cdf0e10cSrcweir		}
1606cdf0e10cSrcweir	}
1607cdf0e10cSrcweir
1608cdf0e10cSrcweir	return ($foundofficedir, $gid, $hostname);
1609cdf0e10cSrcweir}
1610cdf0e10cSrcweir
1611cdf0e10cSrcweir############################################################################
1612cdf0e10cSrcweir# License and Readme files in the default language have to be installed
1613cdf0e10cSrcweir# in the installation root (next to the program dir). This is in scp
1614cdf0e10cSrcweir# project done by a post install basic script
1615cdf0e10cSrcweir############################################################################
1616cdf0e10cSrcweir
1617cdf0e10cSrcweirsub add_License_Files_into_Installdir
1618cdf0e10cSrcweir{
1619cdf0e10cSrcweir	my ($filesarrayref, $dirsarrayref, $languagesarrayref) = @_;
1620cdf0e10cSrcweir
1621cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::add_License_Files_into_Installdir : $#{$filesarrayref} : $#{$languagesarrayref}"); }
1622cdf0e10cSrcweir
1623cdf0e10cSrcweir	my $infoline;
1624cdf0e10cSrcweir
1625cdf0e10cSrcweir	my @newfilesarray = ();
1626cdf0e10cSrcweir
1627cdf0e10cSrcweir	my $defaultlanguage = installer::languages::get_default_language($languagesarrayref);
1628cdf0e10cSrcweir
1629cdf0e10cSrcweir	my ($foundofficedir, $officedirectorygid, $officedirectoryhostname) = get_office_directory_gid_and_hostname($dirsarrayref);
1630cdf0e10cSrcweir
1631cdf0e10cSrcweir	# copy all files from directory share/readme, that contain the default language in their name
1632cdf0e10cSrcweir	# without default language into the installation root. This makes the settings of the correct
1633cdf0e10cSrcweir	# file names superfluous. On the other hand this requires a dependency to the directory
1634cdf0e10cSrcweir	# share/readme
1635cdf0e10cSrcweir
1636cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
1637cdf0e10cSrcweir	{
1638cdf0e10cSrcweir		my $onefile = ${$filesarrayref}[$i];
1639cdf0e10cSrcweir		my $destination = $onefile->{'destination'};
1640cdf0e10cSrcweir		my $styles = "";
1641cdf0e10cSrcweir		if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
1642cdf0e10cSrcweir
1643cdf0e10cSrcweir		if ( ( $destination =~ /share\Q$installer::globals::separator\Ereadme\Q$installer::globals::separator\E(\w+?)_?$defaultlanguage\.?(\w*)\s*/ )
1644cdf0e10cSrcweir			|| (( $styles =~ /\bROOTLICENSEFILE\b/ ) && ( $destination =~ /\Q$installer::globals::separator\E?(\w+?)_?$defaultlanguage\.?(\w*?)\s*$/ )) )
1645cdf0e10cSrcweir		{
1646cdf0e10cSrcweir			my $filename = $1;
1647cdf0e10cSrcweir			my $extension = $2;
1648cdf0e10cSrcweir
1649cdf0e10cSrcweir			my $newfilename;
1650cdf0e10cSrcweir
1651cdf0e10cSrcweir			if ( $extension eq "" ) { $newfilename = $filename; }
1652cdf0e10cSrcweir			else { $newfilename = $filename . "\." . $extension; }
1653cdf0e10cSrcweir
1654cdf0e10cSrcweir			my %newfile = ();
1655cdf0e10cSrcweir			my $newfile = \%newfile;
1656cdf0e10cSrcweir
1657cdf0e10cSrcweir			installer::converter::copy_item_object($onefile, $newfile);
1658cdf0e10cSrcweir
1659cdf0e10cSrcweir			$newfile->{'gid'} = $onefile->{'gid'} . "_Copy";
1660cdf0e10cSrcweir			$newfile->{'Name'} = $newfilename;
1661cdf0e10cSrcweir			$newfile->{'ismultilingual'} = "0";
1662cdf0e10cSrcweir			$newfile->{'specificlanguage'} = "";
1663cdf0e10cSrcweir			$newfile->{'haslanguagemodule'} = "0";
1664cdf0e10cSrcweir
1665cdf0e10cSrcweir			if ( defined $newfile->{'InstallName'} )
1666cdf0e10cSrcweir			{
1667cdf0e10cSrcweir				if ( $newfile->{'InstallName'} =~ /^\s*(.*?)_$defaultlanguage\.?(\w*?)\s*$/ )
1668cdf0e10cSrcweir				{
1669cdf0e10cSrcweir					my $localfilename = $1;
1670cdf0e10cSrcweir					my $localextension = $2;
1671cdf0e10cSrcweir
1672cdf0e10cSrcweir					if ( $localextension eq "" ) { $newfile->{'InstallName'} = $localfilename; }
1673cdf0e10cSrcweir					else { $newfile->{'InstallName'} = $localfilename . "\." . $localextension; }
1674cdf0e10cSrcweir				}
1675cdf0e10cSrcweir			}
1676cdf0e10cSrcweir
1677cdf0e10cSrcweir			$newfile->{'removelangfromfile'} = "1"; # Important for files with an InstallName, because language also has to be removed there.
1678cdf0e10cSrcweir
1679cdf0e10cSrcweir			if ( $foundofficedir )
1680cdf0e10cSrcweir			{
1681cdf0e10cSrcweir				$newfile->{'Dir'} = $officedirectorygid;
1682cdf0e10cSrcweir				$newfile->{'destination'} = $officedirectoryhostname . $installer::globals::separator . $newfilename;
1683cdf0e10cSrcweir			}
1684cdf0e10cSrcweir			else
1685cdf0e10cSrcweir			{
1686cdf0e10cSrcweir				$newfile->{'Dir'} = "PREDEFINED_PROGDIR";
1687cdf0e10cSrcweir				$newfile->{'destination'} = $newfilename;
1688cdf0e10cSrcweir			}
1689cdf0e10cSrcweir
1690cdf0e10cSrcweir			# Also setting "modules=gid_Module_Root_Brand" (module with style: ROOT_BRAND_PACKAGE)
1691cdf0e10cSrcweir			if ( $installer::globals::rootbrandpackageset )
1692cdf0e10cSrcweir			{
1693cdf0e10cSrcweir				$newfile->{'modules'} = $installer::globals::rootbrandpackage;
1694cdf0e10cSrcweir			}
1695cdf0e10cSrcweir
1696cdf0e10cSrcweir			push(@newfilesarray, $newfile);
1697cdf0e10cSrcweir
1698cdf0e10cSrcweir			$infoline = "New files: Adding file $newfilename for the installation root to the file list. Language: $defaultlanguage\n";
1699cdf0e10cSrcweir			push( @installer::globals::logfileinfo, $infoline);
1700cdf0e10cSrcweir
1701cdf0e10cSrcweir			if ( defined $newfile->{'InstallName'} )
1702cdf0e10cSrcweir			{
1703cdf0e10cSrcweir				$infoline = "New files: Using installation name: $newfile->{'InstallName'}\n";
1704cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
1705cdf0e10cSrcweir			}
1706cdf0e10cSrcweir
1707cdf0e10cSrcweir			# Collecting license and readme file for the installation set
1708cdf0e10cSrcweir
1709cdf0e10cSrcweir			push(@installer::globals::installsetfiles, $newfile);
1710cdf0e10cSrcweir			$infoline = "New files: Adding file $newfilename to the file collector for the installation set. Language: $defaultlanguage\n";
1711cdf0e10cSrcweir			push( @installer::globals::logfileinfo, $infoline);
1712cdf0e10cSrcweir		}
1713cdf0e10cSrcweir
1714cdf0e10cSrcweir		push(@newfilesarray, $onefile);
1715cdf0e10cSrcweir	}
1716cdf0e10cSrcweir
1717cdf0e10cSrcweir	return \@newfilesarray;
1718cdf0e10cSrcweir}
1719cdf0e10cSrcweir
1720cdf0e10cSrcweir############################################################################
1721cdf0e10cSrcweir# Removing files with flag ONLY_ASIA_LANGUAGE, only if no asian
1722cdf0e10cSrcweir# language is part of the product.
1723cdf0e10cSrcweir# This special files are connected to the root module and are not
1724cdf0e10cSrcweir# included into a language pack (would lead to conflicts!).
1725cdf0e10cSrcweir# But this files shall only be included into the product, if the
1726cdf0e10cSrcweir# product contains at least one asian language.
1727cdf0e10cSrcweir############################################################################
1728cdf0e10cSrcweir
1729cdf0e10cSrcweirsub remove_onlyasialanguage_files_from_productlists
1730cdf0e10cSrcweir{
1731cdf0e10cSrcweir	my ($filesarrayref) = @_;
1732cdf0e10cSrcweir
1733cdf0e10cSrcweir	my $infoline;
1734cdf0e10cSrcweir
1735cdf0e10cSrcweir	my @newfilesarray = ();
1736cdf0e10cSrcweir	my $returnfilesarrayref;
1737cdf0e10cSrcweir
1738cdf0e10cSrcweir	my $containsasianlanguage = installer::languages::detect_asian_language($installer::globals::alllanguagesinproductarrayref);
1739cdf0e10cSrcweir
1740cdf0e10cSrcweir	my $alllangstring = installer::converter::convert_array_to_comma_separated_string($installer::globals::alllanguagesinproductarrayref);
1741cdf0e10cSrcweir	$infoline = "\nLanguages in complete product: $alllangstring\n";
1742cdf0e10cSrcweir	push( @installer::globals::logfileinfo, $infoline);
1743cdf0e10cSrcweir
1744cdf0e10cSrcweir	if ( ! $containsasianlanguage )
1745cdf0e10cSrcweir	{
1746cdf0e10cSrcweir		$infoline = "Product does not contain asian language -> removing files\n";
1747cdf0e10cSrcweir		push( @installer::globals::logfileinfo, $infoline);
1748cdf0e10cSrcweir
1749cdf0e10cSrcweir		for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
1750cdf0e10cSrcweir		{
1751cdf0e10cSrcweir			my $onefile = ${$filesarrayref}[$i];
1752cdf0e10cSrcweir			my $styles = "";
1753cdf0e10cSrcweir			if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
1754cdf0e10cSrcweir			if ( $styles =~ /\bONLY_ASIA_LANGUAGE\b/ )
1755cdf0e10cSrcweir			{
1756cdf0e10cSrcweir				$infoline = "Flag ONLY_ASIA_LANGUAGE: Removing file $onefile->{'Name'} from files collector!\n";
1757cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
1758cdf0e10cSrcweir				next;
1759cdf0e10cSrcweir			}
1760cdf0e10cSrcweir
1761cdf0e10cSrcweir			push(@newfilesarray, $onefile);
1762cdf0e10cSrcweir		}
1763cdf0e10cSrcweir
1764cdf0e10cSrcweir		$returnfilesarrayref = \@newfilesarray;
1765cdf0e10cSrcweir	}
1766cdf0e10cSrcweir	else
1767cdf0e10cSrcweir	{
1768cdf0e10cSrcweir		$returnfilesarrayref = $filesarrayref;
1769cdf0e10cSrcweir
1770cdf0e10cSrcweir		$infoline = "Product contains asian language -> Nothing to do\n";
1771cdf0e10cSrcweir		push( @installer::globals::logfileinfo, $infoline);
1772cdf0e10cSrcweir
1773cdf0e10cSrcweir	}
1774cdf0e10cSrcweir
1775cdf0e10cSrcweir	return $returnfilesarrayref;
1776cdf0e10cSrcweir}
1777cdf0e10cSrcweir
1778cdf0e10cSrcweir############################################################################
1779cdf0e10cSrcweir# Removing files with flag ONLY_WESTERN_LANGUAGE, only if no western
1780cdf0e10cSrcweir# language is part of the product.
1781cdf0e10cSrcweir# This special files are connected to the root module and are not
1782cdf0e10cSrcweir# included into a language pack (would lead to conflicts!).
1783cdf0e10cSrcweir# But this files shall only be included into the product, if the
1784cdf0e10cSrcweir# product contains at least one western language.
1785cdf0e10cSrcweir############################################################################
1786cdf0e10cSrcweir
1787cdf0e10cSrcweirsub remove_onlywesternlanguage_files_from_productlists
1788cdf0e10cSrcweir{
1789cdf0e10cSrcweir	my ($filesarrayref) = @_;
1790cdf0e10cSrcweir
1791cdf0e10cSrcweir	my $infoline;
1792cdf0e10cSrcweir
1793cdf0e10cSrcweir	my @newfilesarray = ();
1794cdf0e10cSrcweir	my $returnfilesarrayref;
1795cdf0e10cSrcweir
1796cdf0e10cSrcweir	my $containswesternlanguage = installer::languages::detect_western_language($installer::globals::alllanguagesinproductarrayref);
1797cdf0e10cSrcweir
1798cdf0e10cSrcweir	my $alllangstring = installer::converter::convert_array_to_comma_separated_string($installer::globals::alllanguagesinproductarrayref);
1799cdf0e10cSrcweir	$infoline = "\nLanguages in complete product: $alllangstring\n";
1800cdf0e10cSrcweir	push( @installer::globals::logfileinfo, $infoline);
1801cdf0e10cSrcweir
1802cdf0e10cSrcweir	if ( ! $containswesternlanguage )
1803cdf0e10cSrcweir	{
1804cdf0e10cSrcweir		$infoline = "Product does not contain western language -> removing files\n";
1805cdf0e10cSrcweir		push( @installer::globals::logfileinfo, $infoline);
1806cdf0e10cSrcweir
1807cdf0e10cSrcweir		for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
1808cdf0e10cSrcweir		{
1809cdf0e10cSrcweir			my $onefile = ${$filesarrayref}[$i];
1810cdf0e10cSrcweir			my $styles = "";
1811cdf0e10cSrcweir			if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
1812cdf0e10cSrcweir			if ( $styles =~ /\bONLY_WESTERN_LANGUAGE\b/ )
1813cdf0e10cSrcweir			{
1814cdf0e10cSrcweir				$infoline = "Flag ONLY_WESTERN_LANGUAGE: Removing file $onefile->{'Name'} from files collector!\n";
1815cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
1816cdf0e10cSrcweir				next;
1817cdf0e10cSrcweir			}
1818cdf0e10cSrcweir
1819cdf0e10cSrcweir			push(@newfilesarray, $onefile);
1820cdf0e10cSrcweir		}
1821cdf0e10cSrcweir
1822cdf0e10cSrcweir		$returnfilesarrayref = \@newfilesarray;
1823cdf0e10cSrcweir	}
1824cdf0e10cSrcweir	else
1825cdf0e10cSrcweir	{
1826cdf0e10cSrcweir		$returnfilesarrayref = $filesarrayref;
1827cdf0e10cSrcweir
1828cdf0e10cSrcweir		$infoline = "Product contains western language -> Nothing to do\n";
1829cdf0e10cSrcweir		push( @installer::globals::logfileinfo, $infoline);
1830cdf0e10cSrcweir
1831cdf0e10cSrcweir	}
1832cdf0e10cSrcweir
1833cdf0e10cSrcweir	return $returnfilesarrayref;
1834cdf0e10cSrcweir}
1835cdf0e10cSrcweir
1836cdf0e10cSrcweir############################################################################
1837cdf0e10cSrcweir# Some files are included for more than one language and have the same
1838cdf0e10cSrcweir# name and the same destination directory for all languages. This would
1839cdf0e10cSrcweir# lead to conflicts, if the filenames are not changed.
1840cdf0e10cSrcweir# In scp project this files must have the flag MAKE_LANG_SPECIFIC
1841cdf0e10cSrcweir# For this files, the language is included into the filename.
1842cdf0e10cSrcweir############################################################################
1843cdf0e10cSrcweir
1844cdf0e10cSrcweirsub make_filename_language_specific
1845cdf0e10cSrcweir{
1846cdf0e10cSrcweir	my ($filesarrayref) = @_;
1847cdf0e10cSrcweir
1848cdf0e10cSrcweir	my $infoline = "";
1849cdf0e10cSrcweir
1850cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
1851cdf0e10cSrcweir	{
1852cdf0e10cSrcweir		my $onefile = ${$filesarrayref}[$i];
1853cdf0e10cSrcweir
1854cdf0e10cSrcweir		if ( $onefile->{'ismultilingual'} )
1855cdf0e10cSrcweir		{
1856cdf0e10cSrcweir			my $styles = "";
1857cdf0e10cSrcweir			if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
1858cdf0e10cSrcweir			if ( $styles =~ /\bMAKE_LANG_SPECIFIC\b/ )
1859cdf0e10cSrcweir			{
1860cdf0e10cSrcweir				my $language = $onefile->{'specificlanguage'};
1861cdf0e10cSrcweir				my $olddestination = $onefile->{'destination'};
1862cdf0e10cSrcweir				my $oldname = $onefile->{'Name'};
1863cdf0e10cSrcweir
1864cdf0e10cSrcweir				# Including the language into the file name.
1865cdf0e10cSrcweir				# But be sure, to include the language before the file extension.
1866cdf0e10cSrcweir
1867cdf0e10cSrcweir				my $fileextension = "";
1868cdf0e10cSrcweir
1869cdf0e10cSrcweir				if ( $onefile->{'Name'} =~ /(\.\w+?)\s*$/ ) { $fileextension = $1; }
1870cdf0e10cSrcweir				if ( $fileextension ne "" )
1871cdf0e10cSrcweir				{
1872cdf0e10cSrcweir					$onefile->{'Name'} =~ s/\Q$fileextension\E\s*$/_$language$fileextension/;
1873cdf0e10cSrcweir					$onefile->{'destination'} =~ s/\Q$fileextension\E\s*$/_$language$fileextension/;
1874cdf0e10cSrcweir				}
1875cdf0e10cSrcweir
1876cdf0e10cSrcweir				$infoline = "Flag MAKE_LANG_SPECIFIC:\n";
1877cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
1878cdf0e10cSrcweir				$infoline = "Changing name from $oldname to $onefile->{'Name'} !\n";
1879cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
1880cdf0e10cSrcweir				$infoline = "Changing destination from $olddestination to $onefile->{'destination'} !\n";
1881cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
1882cdf0e10cSrcweir			}
1883cdf0e10cSrcweir		}
1884cdf0e10cSrcweir	}
1885cdf0e10cSrcweir}
1886cdf0e10cSrcweir
1887cdf0e10cSrcweir############################################################################
1888cdf0e10cSrcweir# Removing all scpactions, that have no name.
1889cdf0e10cSrcweir# See: FlatLoaderZip
1890cdf0e10cSrcweir############################################################################
1891cdf0e10cSrcweir
1892cdf0e10cSrcweirsub remove_scpactions_without_name
1893cdf0e10cSrcweir{
1894cdf0e10cSrcweir	my ($itemsarrayref) = @_;
1895cdf0e10cSrcweir
1896cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_scpactions_without_name : $#{$itemsarrayref}"); }
1897cdf0e10cSrcweir
1898cdf0e10cSrcweir	my $infoline;
1899cdf0e10cSrcweir
1900cdf0e10cSrcweir	my @newitemsarray = ();
1901cdf0e10cSrcweir
1902cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
1903cdf0e10cSrcweir	{
1904cdf0e10cSrcweir		my $oneitem = ${$itemsarrayref}[$i];
1905cdf0e10cSrcweir		my $name = "";
1906cdf0e10cSrcweir
1907cdf0e10cSrcweir		if ( $oneitem->{'Name'} ) { $name = $oneitem->{'Name'}; }
1908cdf0e10cSrcweir
1909cdf0e10cSrcweir		if  ( $name eq "" )
1910cdf0e10cSrcweir		{
1911cdf0e10cSrcweir			$infoline = "ATTENTION: Removing scpaction $oneitem->{'gid'} from the installation set.\n";
1912cdf0e10cSrcweir			push( @installer::globals::logfileinfo, $infoline);
1913cdf0e10cSrcweir			next;
1914cdf0e10cSrcweir		}
1915cdf0e10cSrcweir
1916cdf0e10cSrcweir		push(@newitemsarray, $oneitem);
1917cdf0e10cSrcweir	}
1918cdf0e10cSrcweir
1919cdf0e10cSrcweir	return \@newitemsarray;
1920cdf0e10cSrcweir}
1921cdf0e10cSrcweir
1922cdf0e10cSrcweir############################################################################
1923cdf0e10cSrcweir# Because of the item "File" the source name must be "Name". Therefore
1924cdf0e10cSrcweir# "Copy" is changed to "Name" and "Name" is changed to "DestinationName".
1925cdf0e10cSrcweir############################################################################
1926cdf0e10cSrcweir
1927cdf0e10cSrcweirsub change_keys_of_scpactions
1928cdf0e10cSrcweir{
1929cdf0e10cSrcweir	my ($itemsarrayref) = @_;
1930cdf0e10cSrcweir
1931cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::change_keys_of_scpactions : $#{$itemsarrayref}"); }
1932cdf0e10cSrcweir
1933cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
1934cdf0e10cSrcweir	{
1935cdf0e10cSrcweir		my $oneitem = ${$itemsarrayref}[$i];
1936cdf0e10cSrcweir
1937cdf0e10cSrcweir		my $key;
1938cdf0e10cSrcweir
1939cdf0e10cSrcweir		# First Name to DestinationName, then deleting Name
1940cdf0e10cSrcweir		foreach $key (keys %{$oneitem})
1941cdf0e10cSrcweir		{
1942cdf0e10cSrcweir			if ( $key =~ /\bName\b/ )
1943cdf0e10cSrcweir			{
1944cdf0e10cSrcweir				my $value = $oneitem->{$key};
1945cdf0e10cSrcweir				my $oldkey = $key;
1946cdf0e10cSrcweir				$key =~ s/Name/DestinationName/;
1947cdf0e10cSrcweir				$oneitem->{$key} = $value;
1948cdf0e10cSrcweir				delete($oneitem->{$oldkey});
1949cdf0e10cSrcweir			}
1950cdf0e10cSrcweir		}
1951cdf0e10cSrcweir
1952cdf0e10cSrcweir		# Second Copy to Name, then deleting Copy
1953cdf0e10cSrcweir		foreach $key (keys %{$oneitem})
1954cdf0e10cSrcweir		{
1955cdf0e10cSrcweir			if ( $key =~ /\bCopy\b/ )
1956cdf0e10cSrcweir			{
1957cdf0e10cSrcweir				my $value = $oneitem->{$key};
1958cdf0e10cSrcweir				my $oldkey = $key;
1959cdf0e10cSrcweir				$key =~ s/Copy/Name/;
1960cdf0e10cSrcweir				$oneitem->{$key} = $value;
1961cdf0e10cSrcweir				delete($oneitem->{$oldkey});
1962cdf0e10cSrcweir			}
1963cdf0e10cSrcweir		}
1964cdf0e10cSrcweir	}
1965cdf0e10cSrcweir}
1966cdf0e10cSrcweir
1967cdf0e10cSrcweir############################################################################
1968cdf0e10cSrcweir# Removing all xpd only items from installation set (scpactions with
1969cdf0e10cSrcweir# the style XPD_ONLY), except an xpd installation set is created
1970cdf0e10cSrcweir############################################################################
1971cdf0e10cSrcweir
1972cdf0e10cSrcweirsub remove_Xpdonly_Items
1973cdf0e10cSrcweir{
1974cdf0e10cSrcweir	my ($itemsarrayref) = @_;
1975cdf0e10cSrcweir
1976cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_Xpdonly_Items : $#{$itemsarrayref}"); }
1977cdf0e10cSrcweir
1978cdf0e10cSrcweir	my $infoline;
1979cdf0e10cSrcweir
1980cdf0e10cSrcweir	my @newitemsarray = ();
1981cdf0e10cSrcweir
1982cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
1983cdf0e10cSrcweir	{
1984cdf0e10cSrcweir		my $oneitem = ${$itemsarrayref}[$i];
1985cdf0e10cSrcweir		my $styles = "";
1986cdf0e10cSrcweir		if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
1987cdf0e10cSrcweir
1988cdf0e10cSrcweir		if ( $styles =~ /\bXPD_ONLY\b/ )
1989cdf0e10cSrcweir		{
1990cdf0e10cSrcweir			$infoline = "Removing \"xpd only\" item $oneitem->{'gid'} from the installation set.\n";
1991cdf0e10cSrcweir			push( @installer::globals::globallogfileinfo, $infoline);
1992cdf0e10cSrcweir
1993cdf0e10cSrcweir			next;
1994cdf0e10cSrcweir		}
1995cdf0e10cSrcweir
1996cdf0e10cSrcweir		push(@newitemsarray, $oneitem);
1997cdf0e10cSrcweir	}
1998cdf0e10cSrcweir
1999cdf0e10cSrcweir	$infoline = "\n";
2000cdf0e10cSrcweir	push( @installer::globals::globallogfileinfo, $infoline);
2001cdf0e10cSrcweir
2002cdf0e10cSrcweir	return \@newitemsarray;
2003cdf0e10cSrcweir}
2004cdf0e10cSrcweir
2005cdf0e10cSrcweir############################################################################
2006cdf0e10cSrcweir# Removing all language pack files from installation set (files with
2007cdf0e10cSrcweir# the style LANGUAGEPACK), except this is a language pack.
2008cdf0e10cSrcweir############################################################################
2009cdf0e10cSrcweir
2010cdf0e10cSrcweirsub remove_Languagepacklibraries_from_Installset
2011cdf0e10cSrcweir{
2012cdf0e10cSrcweir	my ($itemsarrayref) = @_;
2013cdf0e10cSrcweir
2014cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_Languagepacklibraries_from_Installset : $#{$itemsarrayref}"); }
2015cdf0e10cSrcweir
2016cdf0e10cSrcweir	my $infoline;
2017cdf0e10cSrcweir
2018cdf0e10cSrcweir	my @newitemsarray = ();
2019cdf0e10cSrcweir
2020cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
2021cdf0e10cSrcweir	{
2022cdf0e10cSrcweir		my $oneitem = ${$itemsarrayref}[$i];
2023cdf0e10cSrcweir		my $styles = "";
2024cdf0e10cSrcweir		if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
2025cdf0e10cSrcweir
2026cdf0e10cSrcweir		if ( $styles =~ /\bLANGUAGEPACK\b/ )
2027cdf0e10cSrcweir		{
2028cdf0e10cSrcweir			$infoline = "Removing language pack file $oneitem->{'gid'} from the installation set.\n";
2029cdf0e10cSrcweir			push( @installer::globals::globallogfileinfo, $infoline);
2030cdf0e10cSrcweir
2031cdf0e10cSrcweir			next;
2032cdf0e10cSrcweir		}
2033cdf0e10cSrcweir
2034cdf0e10cSrcweir		push(@newitemsarray, $oneitem);
2035cdf0e10cSrcweir	}
2036cdf0e10cSrcweir
2037cdf0e10cSrcweir	$infoline = "\n";
2038cdf0e10cSrcweir	push( @installer::globals::globallogfileinfo, $infoline);
2039cdf0e10cSrcweir
2040cdf0e10cSrcweir	return \@newitemsarray;
2041cdf0e10cSrcweir}
2042cdf0e10cSrcweir
2043cdf0e10cSrcweir############################################################################
2044cdf0e10cSrcweir# Removing all files with flag PATCH_ONLY from installation set.
2045cdf0e10cSrcweir# This function is not called during patch creation.
2046cdf0e10cSrcweir############################################################################
2047cdf0e10cSrcweir
2048cdf0e10cSrcweirsub remove_patchonlyfiles_from_Installset
2049cdf0e10cSrcweir{
2050cdf0e10cSrcweir	my ($itemsarrayref) = @_;
2051cdf0e10cSrcweir
2052cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_patchonlyfiles_from_Installset : $#{$itemsarrayref}"); }
2053cdf0e10cSrcweir
2054cdf0e10cSrcweir	my $infoline;
2055cdf0e10cSrcweir
2056cdf0e10cSrcweir	my @newitemsarray = ();
2057cdf0e10cSrcweir
2058cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
2059cdf0e10cSrcweir	{
2060cdf0e10cSrcweir		my $oneitem = ${$itemsarrayref}[$i];
2061cdf0e10cSrcweir		my $styles = "";
2062cdf0e10cSrcweir		if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
2063cdf0e10cSrcweir
2064cdf0e10cSrcweir		if ( $styles =~ /\bPATCH_ONLY\b/ )
2065cdf0e10cSrcweir		{
2066cdf0e10cSrcweir			$infoline = "Removing file with flag PATCH_ONLY $oneitem->{'gid'} from the installation set.\n";
2067cdf0e10cSrcweir			push( @installer::globals::globallogfileinfo, $infoline);
2068cdf0e10cSrcweir
2069cdf0e10cSrcweir			next;
2070cdf0e10cSrcweir		}
2071cdf0e10cSrcweir
2072cdf0e10cSrcweir		push(@newitemsarray, $oneitem);
2073cdf0e10cSrcweir	}
2074cdf0e10cSrcweir
2075cdf0e10cSrcweir	$infoline = "\n";
2076cdf0e10cSrcweir	push( @installer::globals::globallogfileinfo, $infoline);
2077cdf0e10cSrcweir
2078cdf0e10cSrcweir	return \@newitemsarray;
2079cdf0e10cSrcweir}
2080cdf0e10cSrcweir
2081cdf0e10cSrcweir############################################################################
2082cdf0e10cSrcweir# Removing all files with flag TAB_ONLY from installation set.
2083cdf0e10cSrcweir# This function is not called during tab creation.
2084cdf0e10cSrcweir############################################################################
2085cdf0e10cSrcweir
2086cdf0e10cSrcweirsub remove_tabonlyfiles_from_Installset
2087cdf0e10cSrcweir{
2088cdf0e10cSrcweir	my ($itemsarrayref) = @_;
2089cdf0e10cSrcweir
2090cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_tabonlyfiles_from_Installset : $#{$itemsarrayref}"); }
2091cdf0e10cSrcweir
2092cdf0e10cSrcweir	my $infoline;
2093cdf0e10cSrcweir
2094cdf0e10cSrcweir	my @newitemsarray = ();
2095cdf0e10cSrcweir
2096cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
2097cdf0e10cSrcweir	{
2098cdf0e10cSrcweir		my $oneitem = ${$itemsarrayref}[$i];
2099cdf0e10cSrcweir		my $styles = "";
2100cdf0e10cSrcweir		if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
2101cdf0e10cSrcweir
2102cdf0e10cSrcweir		if ( $styles =~ /\bTAB_ONLY\b/ )
2103cdf0e10cSrcweir		{
2104cdf0e10cSrcweir			$infoline = "Removing tab only file $oneitem->{'gid'} from the installation set.\n";
2105cdf0e10cSrcweir			push( @installer::globals::globallogfileinfo, $infoline);
2106cdf0e10cSrcweir
2107cdf0e10cSrcweir			next;
2108cdf0e10cSrcweir		}
2109cdf0e10cSrcweir
2110cdf0e10cSrcweir		push(@newitemsarray, $oneitem);
2111cdf0e10cSrcweir	}
2112cdf0e10cSrcweir
2113cdf0e10cSrcweir	$infoline = "\n";
2114cdf0e10cSrcweir	push( @installer::globals::globallogfileinfo, $infoline);
2115cdf0e10cSrcweir
2116cdf0e10cSrcweir	return \@newitemsarray;
2117cdf0e10cSrcweir}
2118cdf0e10cSrcweir
2119cdf0e10cSrcweir###############################################################################
2120cdf0e10cSrcweir# Removing all files with flag ONLY_INSTALLED_PRODUCT from installation set.
2121cdf0e10cSrcweir# This function is not called for PKGFORMAT installed and archive.
2122cdf0e10cSrcweir###############################################################################
2123cdf0e10cSrcweir
2124cdf0e10cSrcweirsub remove_installedproductonlyfiles_from_Installset
2125cdf0e10cSrcweir{
2126cdf0e10cSrcweir	my ($itemsarrayref) = @_;
2127cdf0e10cSrcweir
2128cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_installedproductonlyfiles_from_Installset : $#{$itemsarrayref}"); }
2129cdf0e10cSrcweir
2130cdf0e10cSrcweir	my $infoline;
2131cdf0e10cSrcweir
2132cdf0e10cSrcweir	my @newitemsarray = ();
2133cdf0e10cSrcweir
2134cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
2135cdf0e10cSrcweir	{
2136cdf0e10cSrcweir		my $oneitem = ${$itemsarrayref}[$i];
2137cdf0e10cSrcweir		my $styles = "";
2138cdf0e10cSrcweir		if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
2139cdf0e10cSrcweir
2140cdf0e10cSrcweir		if ( $styles =~ /\bONLY_INSTALLED_PRODUCT\b/ )
2141cdf0e10cSrcweir		{
2142cdf0e10cSrcweir			$infoline = "Removing file $oneitem->{'gid'} from the installation set. This file is only required for PKGFORMAT archive or installed).\n";
2143cdf0e10cSrcweir			push( @installer::globals::globallogfileinfo, $infoline);
2144cdf0e10cSrcweir			next;
2145cdf0e10cSrcweir		}
2146cdf0e10cSrcweir
2147cdf0e10cSrcweir		push(@newitemsarray, $oneitem);
2148cdf0e10cSrcweir	}
2149cdf0e10cSrcweir
2150cdf0e10cSrcweir	$infoline = "\n";
2151cdf0e10cSrcweir	push( @installer::globals::globallogfileinfo, $infoline);
2152cdf0e10cSrcweir
2153cdf0e10cSrcweir	return \@newitemsarray;
2154cdf0e10cSrcweir}
2155cdf0e10cSrcweir
2156cdf0e10cSrcweir############################################################################
2157cdf0e10cSrcweir# Some files cotain a $ in their name. epm conflicts with such files.
2158cdf0e10cSrcweir# Solution: Renaming this files, converting "$" to "$$"
2159cdf0e10cSrcweir############################################################################
2160cdf0e10cSrcweir
2161cdf0e10cSrcweirsub quoting_illegal_filenames
2162cdf0e10cSrcweir{
2163cdf0e10cSrcweir	my ($filesarrayref) = @_;
2164cdf0e10cSrcweir
2165cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::rename_illegal_filenames : $#{$filesarrayref}"); }
2166cdf0e10cSrcweir
2167cdf0e10cSrcweir	# This function has to be removed as soon as possible!
2168cdf0e10cSrcweir
2169cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Renaming illegal filenames:");
2170cdf0e10cSrcweir
2171cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
2172cdf0e10cSrcweir	{
2173cdf0e10cSrcweir		my $onefile = ${$filesarrayref}[$i];
2174cdf0e10cSrcweir		my $filename = $onefile->{'Name'};
2175cdf0e10cSrcweir
2176cdf0e10cSrcweir		if ( $filename =~ /\$/ )
2177cdf0e10cSrcweir		{
2178cdf0e10cSrcweir			my $sourcepath = $onefile->{'sourcepath'};
2179cdf0e10cSrcweir			my $destpath = $onefile->{'destination'};
2180cdf0e10cSrcweir
2181cdf0e10cSrcweir			# sourcepath and destination have to be quoted for epm list file
2182cdf0e10cSrcweir
2183cdf0e10cSrcweir			# $filename =~ s/\$/\$\$/g;
2184cdf0e10cSrcweir			$destpath =~ s/\$/\$\$/g;
2185cdf0e10cSrcweir			$sourcepath =~ s/\$/\$\$/g;
2186cdf0e10cSrcweir
2187cdf0e10cSrcweir			# my $infoline = "ATTENTION: Files: Renaming $onefile->{'Name'} to $filename\n";
2188cdf0e10cSrcweir			# push( @installer::globals::logfileinfo, $infoline);
2189cdf0e10cSrcweir			my $infoline = "ATTENTION: Files: Quoting sourcepath $onefile->{'sourcepath'} to $sourcepath\n";
2190cdf0e10cSrcweir			push( @installer::globals::logfileinfo, $infoline);
2191cdf0e10cSrcweir			$infoline = "ATTENTION: Files: Quoting destination path $onefile->{'destination'} to $destpath\n";
2192cdf0e10cSrcweir			push( @installer::globals::logfileinfo, $infoline);
2193cdf0e10cSrcweir
2194cdf0e10cSrcweir			# $onefile->{'Name'} = $filename;
2195cdf0e10cSrcweir			$onefile->{'sourcepath'} = $sourcepath;
2196cdf0e10cSrcweir			$onefile->{'destination'} = $destpath;
2197cdf0e10cSrcweir		}
2198cdf0e10cSrcweir	}
2199cdf0e10cSrcweir}
2200cdf0e10cSrcweir
2201cdf0e10cSrcweir############################################################################
2202cdf0e10cSrcweir# Removing multiple occurences of same module.
2203cdf0e10cSrcweir############################################################################
2204cdf0e10cSrcweir
2205cdf0e10cSrcweirsub optimize_list
2206cdf0e10cSrcweir{
2207cdf0e10cSrcweir	my ( $longlist ) = @_;
2208cdf0e10cSrcweir
2209cdf0e10cSrcweir	my $shortlist = "";
2210cdf0e10cSrcweir	my $hashref = installer::converter::convert_stringlist_into_hash(\$longlist, ",");
2211cdf0e10cSrcweir	foreach my $key (sort keys %{$hashref} ) { $shortlist = "$shortlist,$key"; }
2212cdf0e10cSrcweir	$shortlist =~ s/^\s*\,//;
2213cdf0e10cSrcweir
2214cdf0e10cSrcweir	return $shortlist;
2215cdf0e10cSrcweir}
2216cdf0e10cSrcweir
2217cdf0e10cSrcweir#######################################################################
2218cdf0e10cSrcweir# Collecting all directories needed for the epm list
2219cdf0e10cSrcweir# 1. Looking for all destination paths in the files array
2220cdf0e10cSrcweir# 2. Looking for directories with CREATE flag in the directory array
2221cdf0e10cSrcweir#######################################################################
2222cdf0e10cSrcweir
2223cdf0e10cSrcweir##################################
2224cdf0e10cSrcweir# Collecting directories: Part 1
2225cdf0e10cSrcweir##################################
2226cdf0e10cSrcweir
2227cdf0e10cSrcweirsub collect_directories_from_filesarray
2228cdf0e10cSrcweir{
2229cdf0e10cSrcweir	my ($filesarrayref) = @_;
2230cdf0e10cSrcweir
2231cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::collect_directories_from_filesarray : $#{$filesarrayref}"); }
2232cdf0e10cSrcweir
2233cdf0e10cSrcweir	my @alldirectories = ();
2234cdf0e10cSrcweir	my %alldirectoryhash = ();
2235cdf0e10cSrcweir
2236cdf0e10cSrcweir	my $predefinedprogdir_added = 0;
2237cdf0e10cSrcweir	my $alreadyincluded = 0;
2238cdf0e10cSrcweir
2239cdf0e10cSrcweir	# Preparing this already as hash, although the only needed value at the moment is the HostName
2240cdf0e10cSrcweir	# But also adding: "specificlanguage" and "Dir" (for instance gid_Dir_Program)
2241cdf0e10cSrcweir
2242cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
2243cdf0e10cSrcweir	{
2244cdf0e10cSrcweir		my $onefile = ${$filesarrayref}[$i];
2245cdf0e10cSrcweir		my $destinationpath = $onefile->{'destination'};
2246cdf0e10cSrcweir		installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationpath);
2247cdf0e10cSrcweir		$destinationpath =~ s/\Q$installer::globals::separator\E\s*$//;		# removing ending slashes or backslashes
2248cdf0e10cSrcweir
2249cdf0e10cSrcweir		$alreadyincluded = 0;
2250cdf0e10cSrcweir		if  ( exists($alldirectoryhash{$destinationpath}) ) { $alreadyincluded = 1; }
2251cdf0e10cSrcweir
2252cdf0e10cSrcweir		if (!($alreadyincluded))
2253cdf0e10cSrcweir		{
2254cdf0e10cSrcweir			my %directoryhash = ();
2255cdf0e10cSrcweir			$directoryhash{'HostName'} = $destinationpath;
2256cdf0e10cSrcweir			$directoryhash{'specificlanguage'} = $onefile->{'specificlanguage'};
2257cdf0e10cSrcweir			$directoryhash{'Dir'} = $onefile->{'Dir'};
2258cdf0e10cSrcweir			$directoryhash{'modules'} = $onefile->{'modules'}; # NEW, saving modules
2259cdf0e10cSrcweir			# NEVER!!!	if ( ! $installer::globals::iswindowsbuild ) { $directoryhash{'Styles'} = "(CREATE)"; }	# this directories must be created
2260cdf0e10cSrcweir
2261cdf0e10cSrcweir			if ( $onefile->{'Dir'} eq "PREDEFINED_PROGDIR" ) { $predefinedprogdir_added = 1; }
2262cdf0e10cSrcweir
2263cdf0e10cSrcweir			$alldirectoryhash{$destinationpath} = \%directoryhash;
2264cdf0e10cSrcweir
2265cdf0e10cSrcweir			# Problem: The $destinationpath can be share/registry/schema/org/openoffice
2266cdf0e10cSrcweir			# but not all directories contain files and will be added to this list.
2267cdf0e10cSrcweir			# Therefore the path has to be analyzed.
2268cdf0e10cSrcweir
2269cdf0e10cSrcweir			while ( $destinationpath =~ /(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/ )	# as long as the path contains slashes
2270cdf0e10cSrcweir			{
2271cdf0e10cSrcweir				$destinationpath = $1;
2272cdf0e10cSrcweir
2273cdf0e10cSrcweir				$alreadyincluded = 0;
2274cdf0e10cSrcweir				if  ( exists($alldirectoryhash{$destinationpath}) ) { $alreadyincluded = 1; }
2275cdf0e10cSrcweir
2276cdf0e10cSrcweir				if (!($alreadyincluded))
2277cdf0e10cSrcweir				{
2278cdf0e10cSrcweir					my %directoryhash = ();
2279cdf0e10cSrcweir
2280cdf0e10cSrcweir					$directoryhash{'HostName'} = $destinationpath;
2281cdf0e10cSrcweir					$directoryhash{'specificlanguage'} = $onefile->{'specificlanguage'};
2282cdf0e10cSrcweir					$directoryhash{'Dir'} = $onefile->{'Dir'};
2283cdf0e10cSrcweir					$directoryhash{'modules'} = $onefile->{'modules'}; # NEW, saving modules
2284cdf0e10cSrcweir					# NEVER!!! if ( ! $installer::globals::iswindowsbuild ) { $directoryhash{'Styles'} = "(CREATE)"; }	# this directories must be created
2285cdf0e10cSrcweir
2286cdf0e10cSrcweir					$alldirectoryhash{$destinationpath} = \%directoryhash;
2287cdf0e10cSrcweir				}
2288cdf0e10cSrcweir				else
2289cdf0e10cSrcweir				{
2290*c6dedb65SAndre Fischer					# Adding the modules to the module list!
2291cdf0e10cSrcweir					$alldirectoryhash{$destinationpath}->{'modules'} = $alldirectoryhash{$destinationpath}->{'modules'} . "," . $onefile->{'modules'};
2292cdf0e10cSrcweir				}
2293cdf0e10cSrcweir			}
2294cdf0e10cSrcweir		}
2295cdf0e10cSrcweir		else
2296cdf0e10cSrcweir		{
2297cdf0e10cSrcweir			# Adding the modules to the module list!
2298cdf0e10cSrcweir			$alldirectoryhash{$destinationpath}->{'modules'} = $alldirectoryhash{$destinationpath}->{'modules'} . "," . $onefile->{'modules'};
2299cdf0e10cSrcweir
2300cdf0e10cSrcweir			# Also adding the module to all parents
2301cdf0e10cSrcweir			while ( $destinationpath =~ /(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/ )	# as long as the path contains slashes
2302cdf0e10cSrcweir			{
2303cdf0e10cSrcweir				$destinationpath = $1;
2304cdf0e10cSrcweir				$alldirectoryhash{$destinationpath}->{'modules'} = $alldirectoryhash{$destinationpath}->{'modules'} . "," . $onefile->{'modules'};
2305cdf0e10cSrcweir			}
2306cdf0e10cSrcweir		}
2307cdf0e10cSrcweir	}
2308cdf0e10cSrcweir
2309cdf0e10cSrcweir	# if there is no file in the root directory PREDEFINED_PROGDIR, it has to be included into the directory array now
2310cdf0e10cSrcweir	# HostName=	specificlanguage=	Dir=PREDEFINED_PROGDIR
2311cdf0e10cSrcweir
2312cdf0e10cSrcweir	if (! $predefinedprogdir_added )
2313cdf0e10cSrcweir	{
2314cdf0e10cSrcweir		my %directoryhash = ();
2315cdf0e10cSrcweir		$directoryhash{'HostName'} = "";
2316cdf0e10cSrcweir		$directoryhash{'specificlanguage'} = "";
2317cdf0e10cSrcweir		$directoryhash{'modules'} = "";	# ToDo?
2318cdf0e10cSrcweir		$directoryhash{'Dir'} = "PREDEFINED_PROGDIR";
2319cdf0e10cSrcweir
2320cdf0e10cSrcweir		push(@alldirectories, \%directoryhash);
2321cdf0e10cSrcweir	}
2322cdf0e10cSrcweir
2323cdf0e10cSrcweir	# Creating directory array
2324cdf0e10cSrcweir	foreach my $destdir ( sort keys %alldirectoryhash )
2325cdf0e10cSrcweir	{
2326cdf0e10cSrcweir		$alldirectoryhash{$destdir}->{'modules'} = optimize_list($alldirectoryhash{$destdir}->{'modules'});
2327cdf0e10cSrcweir		push(@alldirectories, $alldirectoryhash{$destdir});
2328cdf0e10cSrcweir	}
2329cdf0e10cSrcweir
2330cdf0e10cSrcweir	return (\@alldirectories, \%alldirectoryhash);
2331cdf0e10cSrcweir}
2332cdf0e10cSrcweir
2333cdf0e10cSrcweir##################################
2334cdf0e10cSrcweir# Collecting directories: Part 2
2335cdf0e10cSrcweir##################################
2336cdf0e10cSrcweir
2337cdf0e10cSrcweirsub collect_directories_with_create_flag_from_directoryarray
2338cdf0e10cSrcweir{
2339cdf0e10cSrcweir	my ($directoryarrayref, $alldirectoryhash) = @_;
2340cdf0e10cSrcweir
2341cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::collect_directories_with_create_flag_from_directoryarray : $#{$directoryarrayref}"); }
2342cdf0e10cSrcweir
2343cdf0e10cSrcweir	my $alreadyincluded = 0;
2344cdf0e10cSrcweir	my @alldirectories = ();
2345cdf0e10cSrcweir
2346cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$directoryarrayref}; $i++ )
2347cdf0e10cSrcweir	{
2348cdf0e10cSrcweir		my $onedir = ${$directoryarrayref}[$i];
2349cdf0e10cSrcweir		my $styles = "";
2350cdf0e10cSrcweir		$newdirincluded = 0;
2351cdf0e10cSrcweir
2352cdf0e10cSrcweir		if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
2353cdf0e10cSrcweir
2354cdf0e10cSrcweir		if ( $styles =~ /\bCREATE\b/ )
2355cdf0e10cSrcweir		{
2356cdf0e10cSrcweir			my $directoryname = "";
2357cdf0e10cSrcweir
2358cdf0e10cSrcweir			if ( $onedir->{'HostName'} ) { $directoryname = $onedir->{'HostName'}; }
2359cdf0e10cSrcweir			else { installer::exiter::exit_program("ERROR: No directory name (HostName) set for specified language in gid $onedir->{'gid'}", "collect_directories_with_create_flag_from_directoryarray"); }
2360cdf0e10cSrcweir
2361cdf0e10cSrcweir			$alreadyincluded = 0;
2362cdf0e10cSrcweir			if ( exists($alldirectoryhash->{$directoryname}) ) { $alreadyincluded = 1; }
2363cdf0e10cSrcweir
2364cdf0e10cSrcweir			if (!($alreadyincluded))
2365cdf0e10cSrcweir			{
2366cdf0e10cSrcweir				my %directoryhash = ();
2367cdf0e10cSrcweir				$directoryhash{'HostName'} = $directoryname;
2368cdf0e10cSrcweir				$directoryhash{'specificlanguage'} = $onedir->{'specificlanguage'};
2369cdf0e10cSrcweir				# $directoryhash{'gid'} = $onedir->{'gid'};
2370cdf0e10cSrcweir				$directoryhash{'Dir'} = $onedir->{'gid'};
2371cdf0e10cSrcweir				$directoryhash{'Styles'} = $onedir->{'Styles'};
2372cdf0e10cSrcweir
2373cdf0e10cSrcweir				# saving also the modules
2374cdf0e10cSrcweir				if ( ! $onedir->{'modules'} ) { installer::exiter::exit_program("ERROR: No assigned modules found for directory $onedir->{'gid'}", "collect_directories_with_create_flag_from_directoryarray"); }
2375cdf0e10cSrcweir				$directoryhash{'modules'} = $onedir->{'modules'};
2376cdf0e10cSrcweir
2377cdf0e10cSrcweir				$alldirectoryhash->{$directoryname} = \%directoryhash;
2378cdf0e10cSrcweir				$newdirincluded = 1;
2379cdf0e10cSrcweir
2380cdf0e10cSrcweir				# Problem: The $destinationpath can be share/registry/schema/org/openoffice
2381cdf0e10cSrcweir				# but not all directories contain files and will be added to this list.
2382cdf0e10cSrcweir				# Therefore the path has to be analyzed.
2383cdf0e10cSrcweir
2384cdf0e10cSrcweir				while ( $directoryname =~ /(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/ )	# as long as the path contains slashes
2385cdf0e10cSrcweir				{
2386cdf0e10cSrcweir					$directoryname = $1;
2387cdf0e10cSrcweir
2388cdf0e10cSrcweir					$alreadyincluded = 0;
2389cdf0e10cSrcweir					if ( exists($alldirectoryhash->{$directoryname}) ) { $alreadyincluded = 1; }
2390cdf0e10cSrcweir
2391cdf0e10cSrcweir					if (!($alreadyincluded))
2392cdf0e10cSrcweir					{
2393cdf0e10cSrcweir						my %directoryhash = ();
2394cdf0e10cSrcweir
2395cdf0e10cSrcweir						$directoryhash{'HostName'} = $directoryname;
2396cdf0e10cSrcweir						$directoryhash{'specificlanguage'} = $onedir->{'specificlanguage'};
2397cdf0e10cSrcweir						$directoryhash{'Dir'} = $onedir->{'gid'};
2398cdf0e10cSrcweir						if ( ! $installer::globals::iswindowsbuild ) { $directoryhash{'Styles'} = "(CREATE)"; } # Exeception for Windows?
2399cdf0e10cSrcweir
2400cdf0e10cSrcweir						# saving also the modules
2401cdf0e10cSrcweir						$directoryhash{'modules'} = $onedir->{'modules'};
2402cdf0e10cSrcweir
2403cdf0e10cSrcweir						$alldirectoryhash->{$directoryname} = \%directoryhash;
2404cdf0e10cSrcweir						$newdirincluded = 1;
2405cdf0e10cSrcweir					}
2406cdf0e10cSrcweir					else
2407cdf0e10cSrcweir					{
2408cdf0e10cSrcweir						# Adding the modules to the module list!
2409cdf0e10cSrcweir						$alldirectoryhash->{$directoryname}->{'modules'} = $alldirectoryhash->{$directoryname}->{'modules'} . "," . $onedir->{'modules'};
2410cdf0e10cSrcweir					}
2411cdf0e10cSrcweir				}
2412cdf0e10cSrcweir			}
2413cdf0e10cSrcweir			else
2414cdf0e10cSrcweir			{
2415cdf0e10cSrcweir				# Adding the modules to the module list!
2416cdf0e10cSrcweir				$alldirectoryhash->{$directoryname}->{'modules'} = $alldirectoryhash->{$directoryname}->{'modules'} . "," . $onedir->{'modules'};
2417cdf0e10cSrcweir
2418cdf0e10cSrcweir				while ( $directoryname =~ /(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/ )	# as long as the path contains slashes
2419cdf0e10cSrcweir				{
2420cdf0e10cSrcweir					$directoryname = $1;
2421cdf0e10cSrcweir					# Adding the modules to the module list!
2422cdf0e10cSrcweir					$alldirectoryhash->{$directoryname}->{'modules'} = $alldirectoryhash->{$directoryname}->{'modules'} . "," . $onedir->{'modules'};
2423cdf0e10cSrcweir				}
2424cdf0e10cSrcweir			}
2425cdf0e10cSrcweir		}
2426cdf0e10cSrcweir
2427cdf0e10cSrcweir		# Saving the styles for already added directories in function collect_directories_from_filesarray
2428cdf0e10cSrcweir
2429cdf0e10cSrcweir		if (( ! $newdirincluded ) && ( $styles ne "" ))
2430cdf0e10cSrcweir		{
2431cdf0e10cSrcweir			$styles =~ s/\bWORKSTATION\b//;
2432cdf0e10cSrcweir			$styles =~ s/\bCREATE\b//;
2433cdf0e10cSrcweir
2434cdf0e10cSrcweir			if (( ! ( $styles =~ /^\s*\(\s*\)\s*$/ )) && ( ! ( $styles =~ /^\s*\(\s*\,\s*\)\s*$/ )) && ( ! ( $styles =~ /^\s*$/ ))) # checking, if there are styles left
2435cdf0e10cSrcweir			{
2436cdf0e10cSrcweir				my $directoryname = "";
2437cdf0e10cSrcweir				if ( $onedir->{'HostName'} ) { $directoryname = $onedir->{'HostName'}; }
2438cdf0e10cSrcweir				else { installer::exiter::exit_program("ERROR: No directory name (HostName) set for specified language in gid $onedir->{'gid'}", "collect_directories_with_create_flag_from_directoryarray"); }
2439cdf0e10cSrcweir
2440cdf0e10cSrcweir				if ( exists($alldirectoryhash->{$directoryname}) )
2441cdf0e10cSrcweir				{
2442cdf0e10cSrcweir					$alldirectoryhash->{$directoryname}->{'Styles'} = $styles;
2443cdf0e10cSrcweir				}
2444cdf0e10cSrcweir			}
2445cdf0e10cSrcweir		}
2446cdf0e10cSrcweir	}
2447cdf0e10cSrcweir
2448cdf0e10cSrcweir	# Creating directory array
2449cdf0e10cSrcweir	foreach my $destdir ( sort keys %{$alldirectoryhash} )
2450cdf0e10cSrcweir	{
2451cdf0e10cSrcweir		$alldirectoryhash->{$destdir}->{'modules'} = optimize_list($alldirectoryhash->{$destdir}->{'modules'});
2452cdf0e10cSrcweir		push(@alldirectories, $alldirectoryhash->{$destdir});
2453cdf0e10cSrcweir	}
2454cdf0e10cSrcweir
2455cdf0e10cSrcweir	return (\@alldirectories, \%alldirectoryhash);
2456cdf0e10cSrcweir}
2457cdf0e10cSrcweir
2458cdf0e10cSrcweir#################################################
2459cdf0e10cSrcweir# Determining the destination file of a link
2460cdf0e10cSrcweir#################################################
2461cdf0e10cSrcweir
2462cdf0e10cSrcweirsub get_destination_file_path_for_links
2463cdf0e10cSrcweir{
2464cdf0e10cSrcweir	my ($linksarrayref, $filesarrayref) = @_;
2465cdf0e10cSrcweir
2466cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_destination_file_path_for_links : $#{$linksarrayref} : $#{$filesarrayref}"); }
2467cdf0e10cSrcweir
2468cdf0e10cSrcweir	my $infoline;
2469cdf0e10cSrcweir
2470cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$linksarrayref}; $i++ )
2471cdf0e10cSrcweir	{
2472cdf0e10cSrcweir		my $fileid = "";
2473cdf0e10cSrcweir		my $onelink = ${$linksarrayref}[$i];
2474cdf0e10cSrcweir		if ( $onelink->{'FileID'} ) { $fileid = $onelink->{'FileID'}; }
2475cdf0e10cSrcweir
2476cdf0e10cSrcweir		if (!( $fileid eq "" ))
2477cdf0e10cSrcweir		{
2478cdf0e10cSrcweir			my $foundfile = 0;
2479cdf0e10cSrcweir
2480cdf0e10cSrcweir			for ( my $j = 0; $j <= $#{$filesarrayref}; $j++ )
2481cdf0e10cSrcweir			{
2482cdf0e10cSrcweir				my $onefile = ${$filesarrayref}[$j];
2483cdf0e10cSrcweir				my $filegid = $onefile->{'gid'};
2484cdf0e10cSrcweir
2485cdf0e10cSrcweir				if ( $filegid eq $fileid )
2486cdf0e10cSrcweir				{
2487cdf0e10cSrcweir					$foundfile = 1;
2488cdf0e10cSrcweir					$onelink->{'destinationfile'} = $onefile->{'destination'};
2489cdf0e10cSrcweir					last;
2490cdf0e10cSrcweir				}
2491cdf0e10cSrcweir			}
2492cdf0e10cSrcweir
2493cdf0e10cSrcweir			if (!($foundfile))
2494cdf0e10cSrcweir			{
2495cdf0e10cSrcweir				$infoline = "Warning: FileID $fileid for Link $onelink->{'gid'} not found!\n";
2496cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
2497cdf0e10cSrcweir			}
2498cdf0e10cSrcweir		}
2499cdf0e10cSrcweir	}
2500cdf0e10cSrcweir
2501cdf0e10cSrcweir	$infoline = "\n";
2502cdf0e10cSrcweir	push( @installer::globals::logfileinfo, $infoline);
2503cdf0e10cSrcweir}
2504cdf0e10cSrcweir
2505cdf0e10cSrcweir#################################################
2506cdf0e10cSrcweir# Determining the destination link of a link
2507cdf0e10cSrcweir#################################################
2508cdf0e10cSrcweir
2509cdf0e10cSrcweirsub get_destination_link_path_for_links
2510cdf0e10cSrcweir{
2511cdf0e10cSrcweir	my ($linksarrayref) = @_;
2512cdf0e10cSrcweir
2513cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_destination_link_path_for_links : $#{$linksarrayref}"); }
2514cdf0e10cSrcweir
2515cdf0e10cSrcweir	my $infoline;
2516cdf0e10cSrcweir
2517cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$linksarrayref}; $i++ )
2518cdf0e10cSrcweir	{
2519cdf0e10cSrcweir		my $shortcutid = "";
2520cdf0e10cSrcweir		my $onelink = ${$linksarrayref}[$i];
2521cdf0e10cSrcweir		if ( $onelink->{'ShortcutID'} ) { $shortcutid = $onelink->{'ShortcutID'}; }
2522cdf0e10cSrcweir
2523cdf0e10cSrcweir		if (!( $shortcutid eq "" ))
2524cdf0e10cSrcweir		{
2525cdf0e10cSrcweir			my $foundlink = 0;
2526cdf0e10cSrcweir
2527cdf0e10cSrcweir			for ( my $j = 0; $j <= $#{$linksarrayref}; $j++ )
2528cdf0e10cSrcweir			{
2529cdf0e10cSrcweir				my $destlink = ${$linksarrayref}[$j];
2530cdf0e10cSrcweir				$shortcutgid = $destlink->{'gid'};
2531cdf0e10cSrcweir
2532cdf0e10cSrcweir				if ( $shortcutgid eq $shortcutid )
2533cdf0e10cSrcweir				{
2534cdf0e10cSrcweir					$foundlink = 1;
2535cdf0e10cSrcweir					$onelink->{'destinationfile'} = $destlink->{'destination'};		# making key 'destinationfile'
2536cdf0e10cSrcweir					last;
2537cdf0e10cSrcweir				}
2538cdf0e10cSrcweir			}
2539cdf0e10cSrcweir
2540cdf0e10cSrcweir			if (!($foundlink))
2541cdf0e10cSrcweir			{
2542cdf0e10cSrcweir				$infoline = "Warning: ShortcutID $shortcutid for Link $onelink->{'gid'} not found!\n";
2543cdf0e10cSrcweir				push( @installer::globals::logfileinfo, $infoline);
2544cdf0e10cSrcweir			}
2545cdf0e10cSrcweir		}
2546cdf0e10cSrcweir	}
2547cdf0e10cSrcweir
2548cdf0e10cSrcweir	$infoline = "\n";
2549cdf0e10cSrcweir	push( @installer::globals::logfileinfo, $infoline);
2550cdf0e10cSrcweir}
2551cdf0e10cSrcweir
2552cdf0e10cSrcweir###################################################################################
2553cdf0e10cSrcweir# Items with flag WORKSTATION are not needed (here: links and configurationitems)
2554cdf0e10cSrcweir###################################################################################
2555cdf0e10cSrcweir
2556cdf0e10cSrcweirsub remove_workstation_only_items
2557cdf0e10cSrcweir{
2558cdf0e10cSrcweir	my ($itemarrayref) = @_;
2559cdf0e10cSrcweir
2560cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::remove_workstation_only_items : $#{$itemarrayref}"); }
2561cdf0e10cSrcweir
2562cdf0e10cSrcweir	my @newitemarray = ();
2563cdf0e10cSrcweir
2564cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$itemarrayref}; $i++ )
2565cdf0e10cSrcweir	{
2566cdf0e10cSrcweir		my $oneitem = ${$itemarrayref}[$i];
2567cdf0e10cSrcweir		my $styles = $oneitem->{'Styles'};
2568cdf0e10cSrcweir
2569cdf0e10cSrcweir		if (( $styles =~ /\bWORKSTATION\b/ ) &&
2570cdf0e10cSrcweir			(!( $styles =~ /\bNETWORK\b/ )) &&
2571cdf0e10cSrcweir			(!( $styles =~ /\bSTANDALONE\b/ )))
2572cdf0e10cSrcweir		{
2573cdf0e10cSrcweir			next;	# removing this link, it is only needed for a workstation installation
2574cdf0e10cSrcweir		}
2575cdf0e10cSrcweir
2576cdf0e10cSrcweir		push(@newitemarray, $oneitem);
2577cdf0e10cSrcweir	}
2578cdf0e10cSrcweir
2579cdf0e10cSrcweir	return \@newitemarray;
2580cdf0e10cSrcweir}
2581cdf0e10cSrcweir
2582cdf0e10cSrcweir################################################
2583cdf0e10cSrcweir# Resolving relative path in links
2584cdf0e10cSrcweir################################################
2585cdf0e10cSrcweir
2586cdf0e10cSrcweirsub resolve_links_with_flag_relative
2587cdf0e10cSrcweir{
2588cdf0e10cSrcweir	my ($linksarrayref) = @_;
2589cdf0e10cSrcweir
2590cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::resolve_links_with_flag_relative : $#{$linksarrayref}"); }
2591cdf0e10cSrcweir
2592cdf0e10cSrcweir	# Before this step is:
2593cdf0e10cSrcweir	# destination=program/libsalhelperC52.so.3, this will be the name of the link
2594cdf0e10cSrcweir	# destinationfile=program/libsalhelperC52.so.3, this will be the linked file or name
2595cdf0e10cSrcweir	# If the flag RELATIVE is set, the pathes have to be analyzed. If the flag is not set
2596cdf0e10cSrcweir	# (this will not occur in the future?) destinationfile has to be an absolute path name
2597cdf0e10cSrcweir
2598cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$linksarrayref}; $i++ )
2599cdf0e10cSrcweir	{
2600cdf0e10cSrcweir		my $onelink = ${$linksarrayref}[$i];
2601cdf0e10cSrcweir		my $styles = $onelink->{'Styles'};
2602cdf0e10cSrcweir
2603cdf0e10cSrcweir		if ( $styles =~ /\bRELATIVE\b/ )
2604cdf0e10cSrcweir		{
2605cdf0e10cSrcweir			# ToDo: This is only a simple not sufficient mechanism
2606cdf0e10cSrcweir
2607cdf0e10cSrcweir			my $destination = $onelink->{'destination'};
2608cdf0e10cSrcweir			my $destinationfile = $onelink->{'destinationfile'};
2609cdf0e10cSrcweir
2610cdf0e10cSrcweir			my $destinationpath = $destination;
2611cdf0e10cSrcweir
2612cdf0e10cSrcweir			installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationpath);
2613cdf0e10cSrcweir
2614cdf0e10cSrcweir			my $destinationfilepath = $destinationfile;
2615cdf0e10cSrcweir
2616cdf0e10cSrcweir			# it is possible, that the destinationfile is no longer part of the files collector
2617cdf0e10cSrcweir			if ($destinationfilepath) { installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationfilepath); }
2618cdf0e10cSrcweir			else { $destinationfilepath = ""; }
2619cdf0e10cSrcweir
2620cdf0e10cSrcweir			if ( $destinationpath eq $destinationfilepath )
2621cdf0e10cSrcweir			{
2622cdf0e10cSrcweir				# link and file are in the same directory
2623cdf0e10cSrcweir				# Therefore the path of the file can be removed
2624cdf0e10cSrcweir
2625cdf0e10cSrcweir				my $newdestinationfile = $destinationfile;
2626cdf0e10cSrcweir				installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$newdestinationfile);
2627cdf0e10cSrcweir
2628cdf0e10cSrcweir				$onelink->{'destinationfile'} = $newdestinationfile;
2629cdf0e10cSrcweir			}
2630cdf0e10cSrcweir		}
2631cdf0e10cSrcweir	}
2632cdf0e10cSrcweir}
2633cdf0e10cSrcweir
2634cdf0e10cSrcweir########################################################################
2635cdf0e10cSrcweir# This function is a helper of function "assigning_modules_to_items"
2636cdf0e10cSrcweir########################################################################
2637cdf0e10cSrcweir
2638cdf0e10cSrcweirsub insert_for_item ($$$)
2639cdf0e10cSrcweir{
2640cdf0e10cSrcweir	my ($hash, $item, $id) = @_;
2641cdf0e10cSrcweir
2642cdf0e10cSrcweir	# print STDERR "insert '$id' for '$item'\n";
2643cdf0e10cSrcweir	if (!defined $hash->{$item})
2644cdf0e10cSrcweir	{
2645cdf0e10cSrcweir		my @gids = ();
2646cdf0e10cSrcweir		$hash->{$item} = \@gids;
2647cdf0e10cSrcweir	}
2648cdf0e10cSrcweir	my $gid_list = $hash->{$item};
2649cdf0e10cSrcweir	push @{$gid_list}, $id;
2650cdf0e10cSrcweir	$hash->{$item} = $gid_list;
2651cdf0e10cSrcweir}
2652cdf0e10cSrcweir
2653cdf0e10cSrcweirsub build_modulegids_table
2654cdf0e10cSrcweir{
2655cdf0e10cSrcweir	my ($modulesref, $itemname) = @_;
2656cdf0e10cSrcweir
2657cdf0e10cSrcweir	my %module_lookup_table = ();
2658cdf0e10cSrcweir
2659cdf0e10cSrcweir	# build map of item names to list of respective module gids
2660cdf0e10cSrcweir	# containing these items
2661cdf0e10cSrcweir	for my $onemodule (@{$modulesref})
2662cdf0e10cSrcweir	{
2663cdf0e10cSrcweir		next if ( ! defined $onemodule->{$itemname} );
2664cdf0e10cSrcweir		# these are the items contained in this module
2665cdf0e10cSrcweir		# eg. Files = (gid_a_b_c,gid_d_e_f)
2666cdf0e10cSrcweir		my $module_gids = $onemodule->{$itemname};
2667cdf0e10cSrcweir
2668cdf0e10cSrcweir		# prune outer brackets
2669cdf0e10cSrcweir		$module_gids =~ s|^\s*\(||g;
2670cdf0e10cSrcweir		$module_gids =~ s|\)\s*$||g;
2671cdf0e10cSrcweir		for my $id (split (/,/, $module_gids))
2672cdf0e10cSrcweir		{
2673cdf0e10cSrcweir			chomp $id;
2674cdf0e10cSrcweir			insert_for_item(\%module_lookup_table, lc ($id), $onemodule->{'gid'});
2675cdf0e10cSrcweir		}
2676cdf0e10cSrcweir	}
2677cdf0e10cSrcweir
2678cdf0e10cSrcweir	return \%module_lookup_table;
2679cdf0e10cSrcweir}
2680cdf0e10cSrcweir
2681cdf0e10cSrcweir########################################################################
2682cdf0e10cSrcweir# Items like files do not know their modules
2683cdf0e10cSrcweir# This function is a helper of function "assigning_modules_to_items"
2684cdf0e10cSrcweir########################################################################
2685cdf0e10cSrcweir
2686cdf0e10cSrcweirsub get_string_of_modulegids_for_itemgid
2687cdf0e10cSrcweir{
2688cdf0e10cSrcweir	my ($module_lookup_table, $modulesref, $itemgid, $itemname) = @_;
2689cdf0e10cSrcweir
2690cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::get_string_of_modulegids_for_itemgid : $#{$modulesref} : $itemgid : $itemname"); }
2691cdf0e10cSrcweir
2692cdf0e10cSrcweir	my $allmodules = "";
2693cdf0e10cSrcweir	my $haslanguagemodule = 0;
2694cdf0e10cSrcweir	my %foundmodules = ();
2695cdf0e10cSrcweir
2696cdf0e10cSrcweir	# print STDERR "lookup '" . lc($itemgid) . "'\n";
2697cdf0e10cSrcweir	my $gid_list = $module_lookup_table->{lc($itemgid)};
2698cdf0e10cSrcweir
2699cdf0e10cSrcweir	for my $gid (@{$gid_list})
2700cdf0e10cSrcweir	{
2701cdf0e10cSrcweir		$foundmodules{$gid} = 1;
2702cdf0e10cSrcweir		$allmodules = $allmodules . "," . $gid;
2703cdf0e10cSrcweir		# Is this module a language module? This info should be stored at the file.
2704cdf0e10cSrcweir		if ( exists($installer::globals::alllangmodules{$gid}) ) { $haslanguagemodule = 1; }
2705cdf0e10cSrcweir 	}
2706cdf0e10cSrcweir
2707cdf0e10cSrcweir	$allmodules =~ s/^\s*\,//;	# removing leading comma
2708cdf0e10cSrcweir
2709cdf0e10cSrcweir	# Check: All modules or no module must have flag LANGUAGEMODULE
2710cdf0e10cSrcweir	if ( $haslanguagemodule )
2711cdf0e10cSrcweir	{
2712cdf0e10cSrcweir		my $isreallylanguagemodule = installer::worker::key_in_a_is_also_key_in_b(\%foundmodules, \%installer::globals::alllangmodules);
2713cdf0e10cSrcweir		if ( ! $isreallylanguagemodule ) { installer::exiter::exit_program("ERROR: \"$itemgid\" is assigned to modules with flag \"LANGUAGEMODULE\" and also to modules without this flag! Modules: $allmodules", "get_string_of_modulegids_for_itemgid");  }
2714cdf0e10cSrcweir	}
2715cdf0e10cSrcweir
2716cdf0e10cSrcweir	# print STDERR "get_string_for_itemgid ($itemgid, $itemname) => $allmodules, $haslanguagemodule\n";
2717cdf0e10cSrcweir
2718cdf0e10cSrcweir	return ($allmodules, $haslanguagemodule);
2719cdf0e10cSrcweir}
2720cdf0e10cSrcweir
2721cdf0e10cSrcweir########################################################
2722cdf0e10cSrcweir# Items like files do not know their modules
2723cdf0e10cSrcweir# This function add the {'modules'} to these items
2724cdf0e10cSrcweir########################################################
2725cdf0e10cSrcweir
2726cdf0e10cSrcweirsub assigning_modules_to_items
2727cdf0e10cSrcweir{
2728cdf0e10cSrcweir	my ($modulesref, $itemsref, $itemname) = @_;
2729cdf0e10cSrcweir
2730cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::assigning_modules_to_items : $#{$modulesref} : $#{$itemsref} : $itemname"); }
2731cdf0e10cSrcweir
2732cdf0e10cSrcweir	my $infoline = "";
2733cdf0e10cSrcweir	my $languageassignmenterror = 0;
2734cdf0e10cSrcweir	my @languageassignmenterrors = ();
2735cdf0e10cSrcweir
2736cdf0e10cSrcweir	my $module_lookup_table = build_modulegids_table($modulesref, $itemname);
2737cdf0e10cSrcweir
2738cdf0e10cSrcweir	for my $oneitem (@{$itemsref})
2739cdf0e10cSrcweir	{
2740cdf0e10cSrcweir		my $itemgid = $oneitem->{'gid'};
2741cdf0e10cSrcweir
2742cdf0e10cSrcweir		my $styles = "";
2743cdf0e10cSrcweir		if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
2744cdf0e10cSrcweir		if (( $itemname eq "Dirs" ) && ( ! ( $styles =~ /\bCREATE\b/ ))) { next; }
2745cdf0e10cSrcweir
2746cdf0e10cSrcweir		if ( $itemgid eq "" )
2747cdf0e10cSrcweir		{
2748cdf0e10cSrcweir			installer::exiter::exit_program("ERROR in item collection: No gid for item $oneitem->{'Name'}", "assigning_modules_to_items");
2749cdf0e10cSrcweir		}
2750cdf0e10cSrcweir
2751cdf0e10cSrcweir		# every item can belong to many modules
2752cdf0e10cSrcweir
2753cdf0e10cSrcweir		my ($modulegids, $haslanguagemodule) = get_string_of_modulegids_for_itemgid($module_lookup_table, $modulesref, $itemgid, $itemname);
2754cdf0e10cSrcweir
2755cdf0e10cSrcweir		if ($modulegids eq "")
2756cdf0e10cSrcweir		{
2757cdf0e10cSrcweir			installer::exiter::exit_program("ERROR in file collection: No module found for $itemname $itemgid", "assigning_modules_to_items");
2758cdf0e10cSrcweir		}
2759cdf0e10cSrcweir
2760cdf0e10cSrcweir		$oneitem->{'modules'} = $modulegids;
2761cdf0e10cSrcweir		$oneitem->{'haslanguagemodule'} = $haslanguagemodule;
2762cdf0e10cSrcweir
2763cdf0e10cSrcweir		# Important check: "ismultilingual" and "haslanguagemodule" must have the same value !
2764cdf0e10cSrcweir		if (( $oneitem->{'ismultilingual'} ) && ( ! $oneitem->{'haslanguagemodule'} ))
2765cdf0e10cSrcweir		{
2766cdf0e10cSrcweir			$infoline = "Error: \"$oneitem->{'gid'}\" is multi lingual, but not in language pack (Assigned module: $modulegids)!\n";
2767cdf0e10cSrcweir			push( @installer::globals::globallogfileinfo, $infoline);
2768cdf0e10cSrcweir			push( @languageassignmenterrors, $infoline );
2769cdf0e10cSrcweir			$languageassignmenterror = 1;
2770cdf0e10cSrcweir		}
2771cdf0e10cSrcweir		if (( $oneitem->{'haslanguagemodule'} ) && ( ! $oneitem->{'ismultilingual'} ))
2772cdf0e10cSrcweir		{
2773cdf0e10cSrcweir			$infoline = "Error: \"$oneitem->{'gid'}\" is in language pack, but not multi lingual (Assigned module: $modulegids)!\n";
2774cdf0e10cSrcweir			push( @installer::globals::globallogfileinfo, $infoline);
2775cdf0e10cSrcweir			push( @languageassignmenterrors, $infoline );
2776cdf0e10cSrcweir			$languageassignmenterror = 1;
2777cdf0e10cSrcweir		}
2778cdf0e10cSrcweir	}
2779cdf0e10cSrcweir
2780cdf0e10cSrcweir	if ($languageassignmenterror)
2781cdf0e10cSrcweir	{
2782cdf0e10cSrcweir		for ( my $i = 0; $i <= $#languageassignmenterrors; $i++ ) { print "$languageassignmenterrors[$i]"; }
2783cdf0e10cSrcweir		installer::exiter::exit_program("ERROR: Incorrect assignments for language packs.", "assigning_modules_to_items");
2784cdf0e10cSrcweir	}
2785cdf0e10cSrcweir
2786cdf0e10cSrcweir}
2787cdf0e10cSrcweir
2788cdf0e10cSrcweir#################################################################################################
2789cdf0e10cSrcweir# Root path (for instance /opt/openofficeorg20) needs to be added to directories, files and links
2790cdf0e10cSrcweir#################################################################################################
2791cdf0e10cSrcweir
2792cdf0e10cSrcweirsub add_rootpath_to_directories
2793cdf0e10cSrcweir{
2794cdf0e10cSrcweir	my ($dirsref, $rootpath) = @_;
2795cdf0e10cSrcweir
2796cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::add_rootpath_to_directories : $#{$dirsref} : $rootpath"); }
2797cdf0e10cSrcweir
2798cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
2799cdf0e10cSrcweir	{
2800cdf0e10cSrcweir		my $onedir = ${$dirsref}[$i];
2801cdf0e10cSrcweir		my $dir = "";
2802cdf0e10cSrcweir
2803cdf0e10cSrcweir		if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; }
2804cdf0e10cSrcweir
2805cdf0e10cSrcweir		if (!($dir =~ /\bPREDEFINED_/ ))
2806cdf0e10cSrcweir		{
2807cdf0e10cSrcweir			my $hostname = $onedir->{'HostName'};
2808cdf0e10cSrcweir			$hostname = $rootpath . $installer::globals::separator . $hostname;
2809cdf0e10cSrcweir			$onedir->{'HostName'} = $hostname;
2810cdf0e10cSrcweir		}
2811cdf0e10cSrcweir
2812cdf0e10cSrcweir		# added
2813cdf0e10cSrcweir
2814cdf0e10cSrcweir		if ( $dir =~ /\bPREDEFINED_PROGDIR\b/ )
2815cdf0e10cSrcweir		{
2816cdf0e10cSrcweir			my $hostname = $onedir->{'HostName'};
2817cdf0e10cSrcweir			if ( $hostname eq "" ) { $onedir->{'HostName'} = $rootpath; }
2818cdf0e10cSrcweir			else { $onedir->{'HostName'} = $rootpath . $installer::globals::separator . $hostname; }
2819cdf0e10cSrcweir		}
2820cdf0e10cSrcweir	}
2821cdf0e10cSrcweir}
2822cdf0e10cSrcweir
2823cdf0e10cSrcweirsub add_rootpath_to_files
2824cdf0e10cSrcweir{
2825cdf0e10cSrcweir	my ($filesref, $rootpath) = @_;
2826cdf0e10cSrcweir
2827cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::add_rootpath_to_files : $#{$filesref} : $rootpath"); }
2828cdf0e10cSrcweir
2829cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$filesref}; $i++ )
2830cdf0e10cSrcweir	{
2831cdf0e10cSrcweir		my $onefile = ${$filesref}[$i];
2832cdf0e10cSrcweir		my $destination = $onefile->{'destination'};
2833cdf0e10cSrcweir		$destination = $rootpath . $installer::globals::separator . $destination;
2834cdf0e10cSrcweir		$onefile->{'destination'} = $destination;
2835cdf0e10cSrcweir	}
2836cdf0e10cSrcweir}
2837cdf0e10cSrcweir
2838cdf0e10cSrcweirsub add_rootpath_to_links
2839cdf0e10cSrcweir{
2840cdf0e10cSrcweir	my ($linksref, $rootpath) = @_;
2841cdf0e10cSrcweir
2842cdf0e10cSrcweir	if ( $installer::globals::debug ) { installer::logger::debuginfo("installer::scriptitems::add_rootpath_to_links : $#{$linksref} : $rootpath"); }
2843cdf0e10cSrcweir
2844cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$linksref}; $i++ )
2845cdf0e10cSrcweir	{
2846cdf0e10cSrcweir		my $onelink = ${$linksref}[$i];
2847cdf0e10cSrcweir		my $styles = $onelink->{'Styles'};
2848cdf0e10cSrcweir
2849cdf0e10cSrcweir		my $destination = $onelink->{'destination'};
2850cdf0e10cSrcweir		$destination = $rootpath . $installer::globals::separator . $destination;
2851cdf0e10cSrcweir		$onelink->{'destination'} = $destination;
2852cdf0e10cSrcweir
2853cdf0e10cSrcweir		if (!($styles =~ /\bRELATIVE\b/ )) # for absolute links
2854cdf0e10cSrcweir		{
2855cdf0e10cSrcweir			my $destinationfile = $onelink->{'destinationfile'};
2856cdf0e10cSrcweir			$destinationfile = $rootpath . $installer::globals::separator . $destinationfile;
2857cdf0e10cSrcweir			$onelink->{'destinationfile'} = $destinationfile;
2858cdf0e10cSrcweir		}
2859cdf0e10cSrcweir	}
2860cdf0e10cSrcweir}
2861cdf0e10cSrcweir
2862cdf0e10cSrcweir#################################################################################
2863cdf0e10cSrcweir# Collecting all parent gids
2864cdf0e10cSrcweir#################################################################################
2865cdf0e10cSrcweir
2866cdf0e10cSrcweirsub collect_all_parent_feature
2867cdf0e10cSrcweir{
2868cdf0e10cSrcweir	my ($modulesref) = @_;
2869cdf0e10cSrcweir
2870cdf0e10cSrcweir	my @allparents = ();
2871cdf0e10cSrcweir
2872cdf0e10cSrcweir	my $found_root_module = 0;
2873cdf0e10cSrcweir
2874cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
2875cdf0e10cSrcweir	{
2876cdf0e10cSrcweir		my $onefeature = ${$modulesref}[$i];
2877cdf0e10cSrcweir
2878cdf0e10cSrcweir		my $parentgid = "";
2879cdf0e10cSrcweir		if ( $onefeature->{'ParentID'} )
2880cdf0e10cSrcweir		{
2881cdf0e10cSrcweir			$parentgid = $onefeature->{'ParentID'};
2882cdf0e10cSrcweir		}
2883cdf0e10cSrcweir
2884cdf0e10cSrcweir		if ( $parentgid ne "" )
2885cdf0e10cSrcweir		{
2886cdf0e10cSrcweir			if (! installer::existence::exists_in_array($parentgid, \@allparents))
2887cdf0e10cSrcweir			{
2888cdf0e10cSrcweir				push(@allparents, $parentgid);
2889cdf0e10cSrcweir			}
2890cdf0e10cSrcweir		}
2891cdf0e10cSrcweir
2892cdf0e10cSrcweir		# Setting the global root module
2893cdf0e10cSrcweir
2894cdf0e10cSrcweir		if ( $parentgid eq "" )
2895cdf0e10cSrcweir		{
2896cdf0e10cSrcweir			if ( $found_root_module ) { installer::exiter::exit_program("ERROR: Only one module without ParentID or with empty ParentID allowed ($installer::globals::rootmodulegid, $onefeature->{'gid'}).", "collect_all_parent_feature"); }
2897cdf0e10cSrcweir			$installer::globals::rootmodulegid = $onefeature->{'gid'};
2898cdf0e10cSrcweir			$found_root_module = 1;
2899cdf0e10cSrcweir			$infoline = "Setting Root Module: $installer::globals::rootmodulegid\n";
2900cdf0e10cSrcweir			push( @installer::globals::globallogfileinfo, $infoline);
2901cdf0e10cSrcweir		}
2902cdf0e10cSrcweir
2903cdf0e10cSrcweir		if ( ! $found_root_module ) { installer::exiter::exit_program("ERROR: Could not define root module. No module without ParentID or with empty ParentID exists.", "collect_all_parent_feature"); }
2904cdf0e10cSrcweir
2905cdf0e10cSrcweir	}
2906cdf0e10cSrcweir
2907cdf0e10cSrcweir	return \@allparents;
2908cdf0e10cSrcweir}
2909cdf0e10cSrcweir
2910cdf0e10cSrcweir#################################################################################
2911cdf0e10cSrcweir# Checking for every feature, whether it has children
2912cdf0e10cSrcweir#################################################################################
2913cdf0e10cSrcweir
2914cdf0e10cSrcweirsub set_children_flag
2915cdf0e10cSrcweir{
2916cdf0e10cSrcweir	my ($modulesref) = @_;
2917cdf0e10cSrcweir
2918cdf0e10cSrcweir	my $allparents = collect_all_parent_feature($modulesref);
2919cdf0e10cSrcweir
2920cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
2921cdf0e10cSrcweir	{
2922cdf0e10cSrcweir		my $onefeature = ${$modulesref}[$i];
2923cdf0e10cSrcweir		my $gid = $onefeature->{'gid'};
2924cdf0e10cSrcweir
2925cdf0e10cSrcweir		# is this gid a parent?
2926cdf0e10cSrcweir
2927cdf0e10cSrcweir		if ( installer::existence::exists_in_array($gid, $allparents) )
2928cdf0e10cSrcweir		{
2929cdf0e10cSrcweir			$onefeature->{'has_children'} = 1;
2930cdf0e10cSrcweir		}
2931cdf0e10cSrcweir		else
2932cdf0e10cSrcweir		{
2933cdf0e10cSrcweir			$onefeature->{'has_children'} = 0;
2934cdf0e10cSrcweir		}
2935cdf0e10cSrcweir	}
2936cdf0e10cSrcweir}
2937cdf0e10cSrcweir
2938cdf0e10cSrcweir#################################################################################
2939cdf0e10cSrcweir# All modules, that use a template module, do now get the assignments of
2940cdf0e10cSrcweir# the template module.
2941cdf0e10cSrcweir#################################################################################
2942cdf0e10cSrcweir
2943cdf0e10cSrcweirsub resolve_assigned_modules
2944cdf0e10cSrcweir{
2945cdf0e10cSrcweir	my ($modulesref) = @_;
2946cdf0e10cSrcweir
2947cdf0e10cSrcweir	# collecting all template modules
2948cdf0e10cSrcweir
2949cdf0e10cSrcweir	my %directaccess = ();
2950cdf0e10cSrcweir
2951cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
2952cdf0e10cSrcweir	{
2953cdf0e10cSrcweir		my $onefeature = ${$modulesref}[$i];
2954cdf0e10cSrcweir		my $styles = "";
2955cdf0e10cSrcweir		if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
2956cdf0e10cSrcweir		if ( $styles =~ /\bTEMPLATEMODULE\b/ ) { $directaccess{$onefeature->{'gid'}} = $onefeature; }
2957cdf0e10cSrcweir
2958cdf0e10cSrcweir		# also looking for module with flag ROOT_BRAND_PACKAGE, to save is for further usage
2959cdf0e10cSrcweir		if ( $styles =~ /\bROOT_BRAND_PACKAGE\b/ )
2960cdf0e10cSrcweir		{
2961cdf0e10cSrcweir			$installer::globals::rootbrandpackage = $onefeature->{'gid'};
2962cdf0e10cSrcweir			$installer::globals::rootbrandpackageset = 1;
2963cdf0e10cSrcweir		}
2964cdf0e10cSrcweir	}
2965cdf0e10cSrcweir
2966cdf0e10cSrcweir	# looking, where template modules are assigned
2967cdf0e10cSrcweir
2968cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
2969cdf0e10cSrcweir	{
2970cdf0e10cSrcweir		my $onefeature = ${$modulesref}[$i];
2971cdf0e10cSrcweir		if ( $onefeature->{'Assigns'} )
2972cdf0e10cSrcweir		{
2973cdf0e10cSrcweir			my $templategid = $onefeature->{'Assigns'};
2974cdf0e10cSrcweir
2975cdf0e10cSrcweir			if ( ! exists($directaccess{$templategid}) )
2976cdf0e10cSrcweir			{
2977cdf0e10cSrcweir				installer::exiter::exit_program("ERROR: Did not find definition of assigned template module \"$templategid\"", "resolve_assigned_modules");
2978cdf0e10cSrcweir			}
2979cdf0e10cSrcweir
2980cdf0e10cSrcweir			# Currently no merging of Files, Dirs, ...
2981cdf0e10cSrcweir			# This has to be included here, if it is required
2982cdf0e10cSrcweir			my $item;
2983cdf0e10cSrcweir			foreach $item (@installer::globals::items_at_modules)
2984cdf0e10cSrcweir			{
2985cdf0e10cSrcweir				if ( exists($directaccess{$templategid}->{$item}) ) { $onefeature->{$item} = $directaccess{$templategid}->{$item}; }
2986cdf0e10cSrcweir			}
2987cdf0e10cSrcweir		}
2988cdf0e10cSrcweir	}
2989cdf0e10cSrcweir}
2990cdf0e10cSrcweir
2991cdf0e10cSrcweir#################################################################################
2992cdf0e10cSrcweir# Removing the template modules from the list, after all
2993cdf0e10cSrcweir# assignments are transferred to the "real" modules.
2994cdf0e10cSrcweir#################################################################################
2995cdf0e10cSrcweir
2996cdf0e10cSrcweirsub remove_template_modules
2997cdf0e10cSrcweir{
2998cdf0e10cSrcweir	my ($modulesref) = @_;
2999cdf0e10cSrcweir
3000cdf0e10cSrcweir	my @modules = ();
3001cdf0e10cSrcweir
3002cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
3003cdf0e10cSrcweir	{
3004cdf0e10cSrcweir		my $onefeature = ${$modulesref}[$i];
3005cdf0e10cSrcweir		my $styles = "";
3006cdf0e10cSrcweir		if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
3007cdf0e10cSrcweir		if ( $styles =~ /\bTEMPLATEMODULE\b/ ) { next; }
3008cdf0e10cSrcweir
3009cdf0e10cSrcweir		push(@modules, $onefeature);
3010cdf0e10cSrcweir	}
3011cdf0e10cSrcweir
3012cdf0e10cSrcweir	return \@modules;
3013cdf0e10cSrcweir}
3014cdf0e10cSrcweir
3015cdf0e10cSrcweir#################################################################################
3016cdf0e10cSrcweir# Collecting all modules with flag LANGUAGEMODULE in a global
3017cdf0e10cSrcweir# collector.
3018cdf0e10cSrcweir#################################################################################
3019cdf0e10cSrcweir
3020cdf0e10cSrcweirsub collect_all_languagemodules
3021cdf0e10cSrcweir{
3022cdf0e10cSrcweir	my ($modulesref) = @_;
3023cdf0e10cSrcweir
3024cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
3025cdf0e10cSrcweir	{
3026cdf0e10cSrcweir		my $onefeature = ${$modulesref}[$i];
3027cdf0e10cSrcweir		my $styles = "";
3028cdf0e10cSrcweir		if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
3029cdf0e10cSrcweir		if ( $styles =~ /\bLANGUAGEMODULE\b/ )
3030cdf0e10cSrcweir		{
3031cdf0e10cSrcweir			if ( ! exists($onefeature->{'Language'}) ) { installer::exiter::exit_program("ERROR: \"$onefeature->{'gid'}\" has flag LANGUAGEMODULE, but does not know its language!", "collect_all_languagemodules"); }
3032cdf0e10cSrcweir			$installer::globals::alllangmodules{$onefeature->{'gid'}} = $onefeature->{'Language'};
3033cdf0e10cSrcweir			# Collecting also the english names, that are used for nsis unpack directory for language packs
3034cdf0e10cSrcweir			my $lang = $onefeature->{'Language'};
3035cdf0e10cSrcweir			my $name = "";
3036cdf0e10cSrcweir			foreach my $localkey ( keys %{$onefeature} )
3037cdf0e10cSrcweir			{
3038cdf0e10cSrcweir				if ( $localkey =~ /^\s*Name\s*\(\s*en-US\s*\)\s*$/ )
3039cdf0e10cSrcweir				{
3040cdf0e10cSrcweir					$installer::globals::all_english_languagestrings{$lang} = $onefeature->{$localkey};
3041cdf0e10cSrcweir				}
3042cdf0e10cSrcweir			}
3043cdf0e10cSrcweir		}
3044cdf0e10cSrcweir	}
3045cdf0e10cSrcweir}
3046cdf0e10cSrcweir
3047cdf0e10cSrcweir#################################################################################
3048cdf0e10cSrcweir# Selecting from all collected english language strings those, that are really
3049cdf0e10cSrcweir# required in this installation set.
3050cdf0e10cSrcweir#################################################################################
3051cdf0e10cSrcweir
3052cdf0e10cSrcweirsub select_required_language_strings
3053cdf0e10cSrcweir{
3054cdf0e10cSrcweir	my ($modulesref) = @_;
3055cdf0e10cSrcweir
3056cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
3057cdf0e10cSrcweir	{
3058cdf0e10cSrcweir		my $onefeature = ${$modulesref}[$i];
3059cdf0e10cSrcweir		my $styles = "";
3060cdf0e10cSrcweir		if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
3061cdf0e10cSrcweir		if ( $styles =~ /\bLANGUAGEMODULE\b/ )
3062cdf0e10cSrcweir		{
3063cdf0e10cSrcweir			if ( ! exists($onefeature->{'Language'}) ) { installer::exiter::exit_program("ERROR: \"$onefeature->{'gid'}\" has flag LANGUAGEMODULE, but does not know its language!", "select_required_language_strings"); }
3064cdf0e10cSrcweir			my $lang = $onefeature->{'Language'};
3065cdf0e10cSrcweir
3066cdf0e10cSrcweir			if (( exists($installer::globals::all_english_languagestrings{$lang}) ) && ( ! exists($installer::globals::all_required_english_languagestrings{$lang}) ))
3067cdf0e10cSrcweir			{
3068cdf0e10cSrcweir				$installer::globals::all_required_english_languagestrings{$lang} = $installer::globals::all_english_languagestrings{$lang};
3069cdf0e10cSrcweir			}
3070cdf0e10cSrcweir		}
3071cdf0e10cSrcweir	}
3072cdf0e10cSrcweir}
3073cdf0e10cSrcweir
3074cdf0e10cSrcweir#####################################################################################
3075cdf0e10cSrcweir# Unixlinks are not always required. For Linux RPMs and Solaris Packages they are
3076cdf0e10cSrcweir# created dynamically. Exception: For package formats "installed" or "archive".
3077cdf0e10cSrcweir# In scp2 this unixlinks have the flag LAYERLINK.
3078cdf0e10cSrcweir#####################################################################################
3079cdf0e10cSrcweir
3080cdf0e10cSrcweirsub filter_layerlinks_from_unixlinks
3081cdf0e10cSrcweir{
3082cdf0e10cSrcweir	my ( $unixlinksref ) = @_;
3083cdf0e10cSrcweir
3084cdf0e10cSrcweir	my @alllinks = ();
3085cdf0e10cSrcweir
3086cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$unixlinksref}; $i++ )
3087cdf0e10cSrcweir	{
3088cdf0e10cSrcweir		my $isrequired = 1;
3089cdf0e10cSrcweir
3090cdf0e10cSrcweir		my $onelink = ${$unixlinksref}[$i];
3091cdf0e10cSrcweir		my $styles = "";
3092cdf0e10cSrcweir		if ( $onelink->{'Styles'} ) { $styles = $onelink->{'Styles'}; }
3093cdf0e10cSrcweir
3094cdf0e10cSrcweir		if ( $styles =~ /\bLAYERLINK\b/ )
3095cdf0e10cSrcweir		{
3096cdf0e10cSrcweir			# Platforms, that do not need the layer links
3097cdf0e10cSrcweir			if (( $installer::globals::islinuxrpmbuild ) || ( $installer::globals::issolarispkgbuild ))
3098cdf0e10cSrcweir			{
3099cdf0e10cSrcweir				$isrequired = 0;
3100cdf0e10cSrcweir			}
3101cdf0e10cSrcweir
3102cdf0e10cSrcweir			# Package formats, that need the layer link (platform independent)
3103cdf0e10cSrcweir			if (( $installer::globals::packageformat eq "installed" ) || ( $installer::globals::packageformat eq "archive" ))
3104cdf0e10cSrcweir			{
3105cdf0e10cSrcweir				$isrequired = 1;
3106cdf0e10cSrcweir			}
3107cdf0e10cSrcweir		}
3108cdf0e10cSrcweir
3109cdf0e10cSrcweir		if ( $isrequired ) { push(@alllinks, $onelink); }
3110cdf0e10cSrcweir	}
3111cdf0e10cSrcweir
3112cdf0e10cSrcweir	return \@alllinks;
3113cdf0e10cSrcweir}
3114cdf0e10cSrcweir
3115cdf0e10cSrcweir1;
3116