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::packagelist;
25cdf0e10cSrcweir
26cdf0e10cSrcweiruse installer::converter;
27cdf0e10cSrcweiruse installer::exiter;
28cdf0e10cSrcweiruse installer::globals;
29cdf0e10cSrcweiruse installer::remover;
30cdf0e10cSrcweiruse installer::scriptitems;
31cdf0e10cSrcweir
32cdf0e10cSrcweir########################################
33cdf0e10cSrcweir# Check existence of module
34cdf0e10cSrcweir########################################
35cdf0e10cSrcweir
36cdf0e10cSrcweirsub check_module_existence
37cdf0e10cSrcweir{
38cdf0e10cSrcweir	my ($onegid, $moduleslist) = @_;
39cdf0e10cSrcweir
40cdf0e10cSrcweir	my $foundgid = 0;
41cdf0e10cSrcweir
42cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$moduleslist}; $i++ )
43cdf0e10cSrcweir	{
44cdf0e10cSrcweir		my $gid = ${$moduleslist}[$i]->{'gid'};
45cdf0e10cSrcweir
46cdf0e10cSrcweir		if ( $gid eq $onegid )
47cdf0e10cSrcweir		{
48cdf0e10cSrcweir			$foundgid = 1;
49cdf0e10cSrcweir			last;
50cdf0e10cSrcweir		}
51cdf0e10cSrcweir	}
52cdf0e10cSrcweir
53cdf0e10cSrcweir	return $foundgid;
54cdf0e10cSrcweir}
55cdf0e10cSrcweir
56cdf0e10cSrcweir###################################################
57cdf0e10cSrcweir# Analyzing the gids, defined in the packagelist
58cdf0e10cSrcweir###################################################
59cdf0e10cSrcweir
60cdf0e10cSrcweirsub analyze_list
61cdf0e10cSrcweir{
62cdf0e10cSrcweir	my ($packagelist, $moduleslist) = @_;
63cdf0e10cSrcweir
64cdf0e10cSrcweir	@allpackages = ();
65cdf0e10cSrcweir
66cdf0e10cSrcweir	my $moduleshash = get_module_hash($moduleslist);
67cdf0e10cSrcweir
68cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$packagelist}; $i++ )
69cdf0e10cSrcweir	{
70cdf0e10cSrcweir		my $onepackage = ${$packagelist}[$i];
71cdf0e10cSrcweir
72cdf0e10cSrcweir		my $onegid = $onepackage->{'module'};
73cdf0e10cSrcweir
74cdf0e10cSrcweir		installer::remover::remove_leading_and_ending_whitespaces(\$onegid);
75cdf0e10cSrcweir
76cdf0e10cSrcweir		my $moduleexists = check_module_existence($onegid, $moduleslist);
77cdf0e10cSrcweir
78cdf0e10cSrcweir		if ( ! $moduleexists ) { next; }
79cdf0e10cSrcweir
80cdf0e10cSrcweir		my @allmodules = ();
81cdf0e10cSrcweir
82cdf0e10cSrcweir		push(@allmodules, $onegid);
83cdf0e10cSrcweir
84cdf0e10cSrcweir		# get_children($moduleslist, $onegid, \@allmodules);
85cdf0e10cSrcweir		get_children_with_hash($moduleshash, $onegid, \@allmodules);
86cdf0e10cSrcweir
87cdf0e10cSrcweir		$onepackage->{'allmodules'} = \@allmodules;
88cdf0e10cSrcweir
89cdf0e10cSrcweir		push(@allpackages, $onepackage);
90cdf0e10cSrcweir	}
91cdf0e10cSrcweir
92cdf0e10cSrcweir	return \@allpackages;
93cdf0e10cSrcweir}
94cdf0e10cSrcweir
95cdf0e10cSrcweir###################################################
96cdf0e10cSrcweir# Creating a hash, that contains the module gids
97cdf0e10cSrcweir# as keys and the parentids as values
98cdf0e10cSrcweir###################################################
99cdf0e10cSrcweir
100cdf0e10cSrcweirsub get_module_hash
101cdf0e10cSrcweir{
102cdf0e10cSrcweir	my ($moduleslist) = @_;
103cdf0e10cSrcweir
104cdf0e10cSrcweir	my %modulehash = ();
105cdf0e10cSrcweir
106cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$moduleslist}; $i++ )
107cdf0e10cSrcweir	{
108cdf0e10cSrcweir		my $gid = ${$moduleslist}[$i]->{'gid'};
109cdf0e10cSrcweir		# Containing only modules with parent. Root modules can be ignored.
110cdf0e10cSrcweir		if ( ${$moduleslist}[$i]->{'ParentID'} ) { $modulehash{$gid} = ${$moduleslist}[$i]->{'ParentID'}; }
111cdf0e10cSrcweir	}
112cdf0e10cSrcweir
113cdf0e10cSrcweir	return \%modulehash;
114cdf0e10cSrcweir}
115cdf0e10cSrcweir
116cdf0e10cSrcweir########################################################
117cdf0e10cSrcweir# Recursively defined procedure to order
118cdf0e10cSrcweir# modules and directories
119cdf0e10cSrcweir########################################################
120cdf0e10cSrcweir
121cdf0e10cSrcweirsub get_children_with_hash
122cdf0e10cSrcweir{
123cdf0e10cSrcweir	my ($modulehash, $parentgid, $newitemorder) = @_;
124cdf0e10cSrcweir
125cdf0e10cSrcweir	foreach my $gid ( keys %{$modulehash} )
126cdf0e10cSrcweir	{
127cdf0e10cSrcweir		my $parent = $modulehash->{$gid};
128cdf0e10cSrcweir
129cdf0e10cSrcweir		if ( $parent eq $parentgid )
130cdf0e10cSrcweir		{
131cdf0e10cSrcweir			push(@{$newitemorder}, $gid);
132cdf0e10cSrcweir			my $parent = $gid;
133cdf0e10cSrcweir			get_children_with_hash($modulehash, $parent, $newitemorder);	# recursive!
134cdf0e10cSrcweir		}
135cdf0e10cSrcweir	}
136cdf0e10cSrcweir}
137cdf0e10cSrcweir
138cdf0e10cSrcweir########################################################
139cdf0e10cSrcweir# Recursively defined procedure to order
140cdf0e10cSrcweir# modules and directories
141cdf0e10cSrcweir########################################################
142cdf0e10cSrcweir
143cdf0e10cSrcweirsub get_children
144cdf0e10cSrcweir{
145cdf0e10cSrcweir	my ($allitems, $startparent, $newitemorder) = @_;
146cdf0e10cSrcweir
147cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$allitems}; $i++ )
148cdf0e10cSrcweir	{
149cdf0e10cSrcweir		my $gid = ${$allitems}[$i]->{'gid'};
150cdf0e10cSrcweir		my $parent = "";
151cdf0e10cSrcweir		if ( ${$allitems}[$i]->{'ParentID'} ) { $parent = ${$allitems}[$i]->{'ParentID'}; }
152cdf0e10cSrcweir
153cdf0e10cSrcweir		if ( $parent eq $startparent )
154cdf0e10cSrcweir		{
155cdf0e10cSrcweir			push(@{$newitemorder}, $gid);
156cdf0e10cSrcweir			my $parent = $gid;
157cdf0e10cSrcweir			get_children($allitems, $parent, $newitemorder);	# recursive!
158cdf0e10cSrcweir		}
159cdf0e10cSrcweir	}
160cdf0e10cSrcweir}
161cdf0e10cSrcweir
162cdf0e10cSrcweir#####################################################################
163cdf0e10cSrcweir# All modules below a defined gid_Module_A are collected now for
164cdf0e10cSrcweir# each modules defined in the packagelist. Now the modules have
165cdf0e10cSrcweir# to be removed, that are part of more than one package.
166cdf0e10cSrcweir#####################################################################
167cdf0e10cSrcweir
168cdf0e10cSrcweirsub remove_multiple_modules_packages
169cdf0e10cSrcweir{
170cdf0e10cSrcweir	my ($allpackagemodules) = @_;
171cdf0e10cSrcweir
172cdf0e10cSrcweir	# iterating over all packages
173cdf0e10cSrcweir
174cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$allpackagemodules}; $i++ )
175cdf0e10cSrcweir	{
176cdf0e10cSrcweir		my $onepackage = ${$allpackagemodules}[$i];
177cdf0e10cSrcweir		my $allmodules = $onepackage->{'allmodules'};
178cdf0e10cSrcweir
179cdf0e10cSrcweir		# print "Modules below $onepackage->{'module'}: $#{$allmodules}\n";
180cdf0e10cSrcweir
181cdf0e10cSrcweir		# Comparing each package, with all following packages. If a
182cdf0e10cSrcweir		# gid for the module is part of more than one package, it is
183cdf0e10cSrcweir		# removed if the number of modules in the package is greater
184cdf0e10cSrcweir		# in the current package than in the compare package.
185cdf0e10cSrcweir
186cdf0e10cSrcweir		# Taking all modules from package $i
187cdf0e10cSrcweir
188cdf0e10cSrcweir		my $packagecount = $#{$allmodules};
189cdf0e10cSrcweir
190cdf0e10cSrcweir		my @optimizedpackage = ();
191cdf0e10cSrcweir
192cdf0e10cSrcweir		# iterating over all modules of this package
193cdf0e10cSrcweir
194cdf0e10cSrcweir		for ( my $j = 0; $j <= $#{$allmodules}; $j++ )
195cdf0e10cSrcweir		{
196cdf0e10cSrcweir			my $onemodule = ${$allmodules}[$j];	# this is the module, that shall be removed or not
197cdf0e10cSrcweir
198cdf0e10cSrcweir			my $put_module_into_new_package = 1;
199cdf0e10cSrcweir
200cdf0e10cSrcweir			# iterating over all other packages
201cdf0e10cSrcweir
202cdf0e10cSrcweir			for ( my $k = 0; $k <= $#{$allpackagemodules}; $k++ )
203cdf0e10cSrcweir			{
204cdf0e10cSrcweir				if ( $k == $i ) { next; }	# not comparing equal module
205cdf0e10cSrcweir
206cdf0e10cSrcweir				if (! $put_module_into_new_package) { next; } # do not compare, if already found
207cdf0e10cSrcweir
208cdf0e10cSrcweir				my $comparepackage = ${$allpackagemodules}[$k];
209cdf0e10cSrcweir				my $allcomparemodules = $comparepackage->{'allmodules'};
210cdf0e10cSrcweir
211cdf0e10cSrcweir				my $comparepackagecount = $#{$allcomparemodules};
212cdf0e10cSrcweir
213cdf0e10cSrcweir				# modules will only be removed from packages, that have more modules
214cdf0e10cSrcweir				# than the compare package
215cdf0e10cSrcweir
216cdf0e10cSrcweir				if ( $packagecount <= $comparepackagecount ) { next; }	# nothing to do, take next package
217cdf0e10cSrcweir
218cdf0e10cSrcweir				# iterating over all modules of this package
219cdf0e10cSrcweir
220cdf0e10cSrcweir				for ( my $m = 0; $m <= $#{$allcomparemodules}; $m++ )
221cdf0e10cSrcweir				{
222cdf0e10cSrcweir					my $onecomparemodule = ${$allcomparemodules}[$m];
223cdf0e10cSrcweir
224cdf0e10cSrcweir					if ( $onemodule eq $onecomparemodule )	# this $onemodule has to be removed
225cdf0e10cSrcweir					{
226cdf0e10cSrcweir						$put_module_into_new_package = 0;
227cdf0e10cSrcweir					}
228cdf0e10cSrcweir				}
229cdf0e10cSrcweir			}
230cdf0e10cSrcweir
231cdf0e10cSrcweir			if ( $put_module_into_new_package )
232cdf0e10cSrcweir			{
233cdf0e10cSrcweir				push(@optimizedpackage, $onemodule)
234cdf0e10cSrcweir			}
235cdf0e10cSrcweir		}
236cdf0e10cSrcweir
237cdf0e10cSrcweir		$onepackage->{'allmodules'} = \@optimizedpackage;
238cdf0e10cSrcweir	}
239cdf0e10cSrcweir
240cdf0e10cSrcweir	# for ( my $i = 0; $i <= $#{$allpackagemodules}; $i++ )
241cdf0e10cSrcweir	# {
242cdf0e10cSrcweir	#	my $onepackage = ${$allpackagemodules}[$i];
243cdf0e10cSrcweir	#	my $allmodules = $onepackage->{'allmodules'};
244cdf0e10cSrcweir	#	print "New: Modules below $onepackage->{'module'}: $#{$allmodules}\n";
245cdf0e10cSrcweir	# }
246cdf0e10cSrcweir
247cdf0e10cSrcweir}
248cdf0e10cSrcweir
249cdf0e10cSrcweir#####################################################################
250cdf0e10cSrcweir# Analyzing all files if they belong to a special package.
251cdf0e10cSrcweir# A package is described by a list of modules.
252cdf0e10cSrcweir#####################################################################
253cdf0e10cSrcweir
254cdf0e10cSrcweirsub find_files_for_package
255cdf0e10cSrcweir{
256cdf0e10cSrcweir	my ($filelist, $onepackage) = @_;
257cdf0e10cSrcweir
258cdf0e10cSrcweir	my @newfilelist = ();
259cdf0e10cSrcweir
260cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$filelist}; $i++ )
261cdf0e10cSrcweir	{
262cdf0e10cSrcweir		my $onefile = ${$filelist}[$i];
263cdf0e10cSrcweir		my $modulesstring = $onefile->{'modules'};	 # comma separated modules list
264cdf0e10cSrcweir		my $moduleslist = installer::converter::convert_stringlist_into_array(\$modulesstring, ",");
265cdf0e10cSrcweir
266cdf0e10cSrcweir		my $includefile = 0;
267cdf0e10cSrcweir
268cdf0e10cSrcweir		# iterating over all modules of this file
269cdf0e10cSrcweir
270cdf0e10cSrcweir		for ( my $j = 0; $j <= $#{$moduleslist}; $j++ )
271cdf0e10cSrcweir		{
272cdf0e10cSrcweir			if ( $includefile ) { next; }
273cdf0e10cSrcweir			my $filemodule = ${$moduleslist}[$j];
274cdf0e10cSrcweir			installer::remover::remove_leading_and_ending_whitespaces(\$filemodule);
275cdf0e10cSrcweir
276cdf0e10cSrcweir			# iterating over all modules of the package
277cdf0e10cSrcweir
278cdf0e10cSrcweir			my $packagemodules = $onepackage->{'allmodules'};
279cdf0e10cSrcweir
280cdf0e10cSrcweir			for ( my $k = 0; $k <= $#{$packagemodules}; $k++ )
281cdf0e10cSrcweir			{
282cdf0e10cSrcweir				if ( $includefile ) { next; }
283cdf0e10cSrcweir				my $packagemodule = ${$packagemodules}[$k];
284cdf0e10cSrcweir
285cdf0e10cSrcweir				if ( $filemodule eq $packagemodule )
286cdf0e10cSrcweir				{
287cdf0e10cSrcweir					$includefile = 1;
288cdf0e10cSrcweir					last;
289cdf0e10cSrcweir				}
290cdf0e10cSrcweir			}
291cdf0e10cSrcweir		}
292cdf0e10cSrcweir
293cdf0e10cSrcweir		if ( $includefile )
294cdf0e10cSrcweir		{
295cdf0e10cSrcweir			push(@newfilelist, $onefile);
296cdf0e10cSrcweir		}
297cdf0e10cSrcweir	}
298cdf0e10cSrcweir
299cdf0e10cSrcweir	return \@newfilelist;
300cdf0e10cSrcweir}
301cdf0e10cSrcweir
302cdf0e10cSrcweir#####################################################################
303cdf0e10cSrcweir# Analyzing all links if they belong to a special package.
304cdf0e10cSrcweir# A package is described by a list of modules.
305cdf0e10cSrcweir# A link is inserted into the package, if the corresponding
306cdf0e10cSrcweir# file is also inserted.
307cdf0e10cSrcweir#####################################################################
308cdf0e10cSrcweir
309cdf0e10cSrcweirsub find_links_for_package
310cdf0e10cSrcweir{
311cdf0e10cSrcweir	my ($linklist, $filelist) = @_;
312cdf0e10cSrcweir
313cdf0e10cSrcweir	# First looking for all links with a FileID.
314cdf0e10cSrcweir	# Then looking for all links with a ShortcutID.
315cdf0e10cSrcweir
316cdf0e10cSrcweir	my @newlinklist = ();
317cdf0e10cSrcweir
318cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$linklist}; $i++ )
319cdf0e10cSrcweir	{
320cdf0e10cSrcweir		my $includelink = 0;
321cdf0e10cSrcweir
322cdf0e10cSrcweir		my $onelink = ${$linklist}[$i];
323cdf0e10cSrcweir
324cdf0e10cSrcweir		my $fileid = "";
325cdf0e10cSrcweir		if ( $onelink->{'FileID'} ) { $fileid = $onelink->{'FileID'}; }
326cdf0e10cSrcweir
327cdf0e10cSrcweir		if ( $fileid eq "" ) { next; }	 # A link with a ShortcutID
328cdf0e10cSrcweir
329cdf0e10cSrcweir		for ( my $j = 0; $j <= $#{$filelist}; $j++ )	 # iterating over file list
330cdf0e10cSrcweir		{
331cdf0e10cSrcweir			my $onefile = ${$filelist}[$j];
332cdf0e10cSrcweir			my $gid = $onefile->{'gid'};
333cdf0e10cSrcweir
334cdf0e10cSrcweir			if ( $gid eq $fileid )
335cdf0e10cSrcweir			{
336cdf0e10cSrcweir				$includelink = 1;
337cdf0e10cSrcweir				last;
338cdf0e10cSrcweir			}
339cdf0e10cSrcweir		}
340cdf0e10cSrcweir
341cdf0e10cSrcweir		if ( $includelink )
342cdf0e10cSrcweir		{
343cdf0e10cSrcweir			push(@newlinklist, $onelink);
344cdf0e10cSrcweir		}
345cdf0e10cSrcweir	}
346cdf0e10cSrcweir
347cdf0e10cSrcweir	# iterating over the new list, because of all links with a ShortcutID
348cdf0e10cSrcweir
349cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$linklist}; $i++ )
350cdf0e10cSrcweir	{
351cdf0e10cSrcweir		my $includelink = 0;
352cdf0e10cSrcweir
353cdf0e10cSrcweir		my $onelink = ${$linklist}[$i];
354cdf0e10cSrcweir
355cdf0e10cSrcweir		my $shortcutid = "";
356cdf0e10cSrcweir		if ( $onelink->{'ShortcutID'} ) { $shortcutid = $onelink->{'ShortcutID'}; }
357cdf0e10cSrcweir
358cdf0e10cSrcweir		if ( $shortcutid eq "" ) { next; }	 # A link with a ShortcutID
359cdf0e10cSrcweir
360cdf0e10cSrcweir		for ( my $j = 0; $j <= $#newlinklist; $j++ )	 # iterating over newly created link list
361cdf0e10cSrcweir		{
362cdf0e10cSrcweir			my $onefilelink = $newlinklist[$j];
363cdf0e10cSrcweir			my $gid = $onefilelink->{'gid'};
364cdf0e10cSrcweir
365cdf0e10cSrcweir			if ( $gid eq $shortcutid )
366cdf0e10cSrcweir			{
367cdf0e10cSrcweir				$includelink = 1;
368cdf0e10cSrcweir				last;
369cdf0e10cSrcweir			}
370cdf0e10cSrcweir		}
371cdf0e10cSrcweir
372cdf0e10cSrcweir		if ( $includelink )
373cdf0e10cSrcweir		{
374cdf0e10cSrcweir			push(@newlinklist, $onelink);
375cdf0e10cSrcweir		}
376cdf0e10cSrcweir	}
377cdf0e10cSrcweir
378cdf0e10cSrcweir	return \@newlinklist;
379cdf0e10cSrcweir}
380cdf0e10cSrcweir
381cdf0e10cSrcweir#####################################################################
382cdf0e10cSrcweir# Analyzing all directories if they belong to a special package.
383cdf0e10cSrcweir# A package is described by a list of modules.
384cdf0e10cSrcweir# Directories are included into the package, if they are needed
385cdf0e10cSrcweir# by a file or a link included into the package.
386cdf0e10cSrcweir# Attention: A directory with the flag CREATE, is only included
387cdf0e10cSrcweir# into the root module:
388cdf0e10cSrcweir# ($packagename eq $installer::globals::rootmodulegid)
389cdf0e10cSrcweir#####################################################################
390cdf0e10cSrcweir
391cdf0e10cSrcweirsub find_dirs_for_package
392cdf0e10cSrcweir{
393cdf0e10cSrcweir	my ($dirlist, $onepackage) = @_;
394cdf0e10cSrcweir
395cdf0e10cSrcweir	my @newdirlist = ();
396cdf0e10cSrcweir
397cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$dirlist}; $i++ )
398cdf0e10cSrcweir	{
399cdf0e10cSrcweir		my $onedir = ${$dirlist}[$i];
400cdf0e10cSrcweir		my $modulesstring = $onedir->{'modules'};	 # comma separated modules list
401cdf0e10cSrcweir		my $moduleslist = installer::converter::convert_stringlist_into_array(\$modulesstring, ",");
402cdf0e10cSrcweir
403cdf0e10cSrcweir		my $includedir = 0;
404cdf0e10cSrcweir
405cdf0e10cSrcweir		# iterating over all modules of this dir
406cdf0e10cSrcweir
407cdf0e10cSrcweir		for ( my $j = 0; $j <= $#{$moduleslist}; $j++ )
408cdf0e10cSrcweir		{
409cdf0e10cSrcweir			if ( $includedir ) { last; }
410cdf0e10cSrcweir			my $dirmodule = ${$moduleslist}[$j];
411cdf0e10cSrcweir			installer::remover::remove_leading_and_ending_whitespaces(\$dirmodule);
412cdf0e10cSrcweir
413cdf0e10cSrcweir			# iterating over all modules of the package
414cdf0e10cSrcweir
415cdf0e10cSrcweir			my $packagemodules = $onepackage->{'allmodules'};
416cdf0e10cSrcweir
417cdf0e10cSrcweir			for ( my $k = 0; $k <= $#{$packagemodules}; $k++ )
418cdf0e10cSrcweir			{
419cdf0e10cSrcweir				my $packagemodule = ${$packagemodules}[$k];
420cdf0e10cSrcweir
421cdf0e10cSrcweir				if ( $dirmodule eq $packagemodule )
422cdf0e10cSrcweir				{
423cdf0e10cSrcweir					$includedir = 1;
424cdf0e10cSrcweir					last;
425cdf0e10cSrcweir				}
426cdf0e10cSrcweir			}
427cdf0e10cSrcweir		}
428cdf0e10cSrcweir
429cdf0e10cSrcweir		if ( $includedir )
430cdf0e10cSrcweir		{
431cdf0e10cSrcweir			push(@newdirlist, $onedir);
432cdf0e10cSrcweir		}
433cdf0e10cSrcweir	}
434cdf0e10cSrcweir
435cdf0e10cSrcweir	return \@newdirlist;
436cdf0e10cSrcweir}
437cdf0e10cSrcweir
438cdf0e10cSrcweir#####################################################################
439cdf0e10cSrcweir# Resolving all variables in the packagename.
440cdf0e10cSrcweir#####################################################################
441cdf0e10cSrcweir
442cdf0e10cSrcweirsub resolve_packagevariables
443cdf0e10cSrcweir{
444cdf0e10cSrcweir	my ($packagenameref, $variableshashref, $make_lowercase) = @_;
445cdf0e10cSrcweir
446cdf0e10cSrcweir	my $key;
447cdf0e10cSrcweir
448cdf0e10cSrcweir	# Special handling for dictionaries
449cdf0e10cSrcweir	if ( $$packagenameref =~ /-dict-/ )
450cdf0e10cSrcweir	{
451cdf0e10cSrcweir		if (exists($variableshashref->{'DICTIONARYUNIXPRODUCTNAME'}) ) { $$packagenameref =~ s/\%UNIXPRODUCTNAME/$variableshashref->{'DICTIONARYUNIXPRODUCTNAME'}/g; }
452cdf0e10cSrcweir		if (exists($variableshashref->{'DICTIONARYBRANDPACKAGEVERSION'}) ) { $$packagenameref =~ s/\%BRANDPACKAGEVERSION/$variableshashref->{'DICTIONARYBRANDPACKAGEVERSION'}/g; }
453cdf0e10cSrcweir	}
454cdf0e10cSrcweir
455cdf0e10cSrcweir	foreach $key (keys %{$variableshashref})
456cdf0e10cSrcweir	{
457cdf0e10cSrcweir		my $value = $variableshashref->{$key};
458cdf0e10cSrcweir		if ( $make_lowercase ) { $value = lc($value); }
459cdf0e10cSrcweir		$$packagenameref =~ s/\%$key/$value/g;
460cdf0e10cSrcweir	}
461cdf0e10cSrcweir}
462cdf0e10cSrcweir
463cdf0e10cSrcweir#####################################################################
464cdf0e10cSrcweir# Resolving all variables in the packagename.
465cdf0e10cSrcweir#####################################################################
466cdf0e10cSrcweir
467cdf0e10cSrcweirsub resolve_packagevariables2
468cdf0e10cSrcweir{
469cdf0e10cSrcweir	my ($packagenameref, $variableshashref, $make_lowercase, $isdict ) = @_;
470cdf0e10cSrcweir
471cdf0e10cSrcweir	my $key;
472cdf0e10cSrcweir
473cdf0e10cSrcweir	# Special handling for dictionaries
474cdf0e10cSrcweir	if ( $isdict )
475cdf0e10cSrcweir	{
476cdf0e10cSrcweir		if (exists($variableshashref->{'DICTIONARYUNIXPRODUCTNAME'}) ) { $$packagenameref =~ s/\%UNIXPRODUCTNAME/$variableshashref->{'DICTIONARYUNIXPRODUCTNAME'}/g; }
477cdf0e10cSrcweir		if (exists($variableshashref->{'DICTIONARYBRANDPACKAGEVERSION'}) ) { $$packagenameref =~ s/\%BRANDPACKAGEVERSION/$variableshashref->{'DICTIONARYBRANDPACKAGEVERSION'}/g; }
478cdf0e10cSrcweir	}
479cdf0e10cSrcweir
480cdf0e10cSrcweir	foreach $key (keys %{$variableshashref})
481cdf0e10cSrcweir	{
482cdf0e10cSrcweir		my $value = $variableshashref->{$key};
483cdf0e10cSrcweir		if ( $make_lowercase ) { $value = lc($value); }
484cdf0e10cSrcweir		$$packagenameref =~ s/\%$key/$value/g;
485cdf0e10cSrcweir	}
486cdf0e10cSrcweir}
487cdf0e10cSrcweir
488cdf0e10cSrcweir#####################################################################
489cdf0e10cSrcweir# New packages system.
490cdf0e10cSrcweir#####################################################################
491cdf0e10cSrcweir
492cdf0e10cSrcweir##################################################################
493cdf0e10cSrcweir# Controlling the content of the packagelist
494cdf0e10cSrcweir# 1. Items in @installer::globals::packagelistitems must exist
495cdf0e10cSrcweir# 2. If a shellscript file is defined, it must exist
496cdf0e10cSrcweir##################################################################
497cdf0e10cSrcweir
498cdf0e10cSrcweirsub check_packagelist
499cdf0e10cSrcweir{
500cdf0e10cSrcweir	my ($packages) = @_;
501cdf0e10cSrcweir
502cdf0e10cSrcweir	if ( ! ( $#{$packages} > -1 )) { installer::exiter::exit_program("ERROR: No packages defined!", "check_packagelist"); }
503cdf0e10cSrcweir
504cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$packages}; $i++ )
505cdf0e10cSrcweir	{
506cdf0e10cSrcweir		my $onepackage = ${$packages}[$i];
507cdf0e10cSrcweir
508cdf0e10cSrcweir		my $element;
509cdf0e10cSrcweir
510cdf0e10cSrcweir		# checking all items that must be defined
511cdf0e10cSrcweir
512cdf0e10cSrcweir		foreach $element (@installer::globals::packagelistitems)
513cdf0e10cSrcweir		{
514cdf0e10cSrcweir			if ( ! exists($onepackage->{$element}) )
515cdf0e10cSrcweir			{
516cdf0e10cSrcweir				installer::exiter::exit_program("ERROR in package list: No value for $element !", "check_packagelist");
517cdf0e10cSrcweir			}
518cdf0e10cSrcweir		}
519cdf0e10cSrcweir
520cdf0e10cSrcweir		# checking the existence of the script file, if defined
521cdf0e10cSrcweir
522cdf0e10cSrcweir		if ( $onepackage->{'script'} )
523cdf0e10cSrcweir		{
524cdf0e10cSrcweir			my $scriptfile = $onepackage->{'script'};
525cdf0e10cSrcweir			my $gid =  $onepackage->{'module'};
526cdf0e10cSrcweir			my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptfile, "" , 0);
527cdf0e10cSrcweir
528cdf0e10cSrcweir			if ( $$fileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find script file $scriptfile for module $gid!", "check_packagelist"); }
529cdf0e10cSrcweir
530*b274bc22SAndre Fischer			$installer::logger::Lang->printf("%s: Using script file: \"%s\"!\n", $gid, $$fileref);
531cdf0e10cSrcweir
532cdf0e10cSrcweir			$onepackage->{'script'} = $$fileref;
533cdf0e10cSrcweir		}
534cdf0e10cSrcweir	}
535cdf0e10cSrcweir}
536cdf0e10cSrcweir
537cdf0e10cSrcweir#####################################################################
538cdf0e10cSrcweir# Reading pack info for one module from packinfo file.
539cdf0e10cSrcweir#####################################################################
540cdf0e10cSrcweir
541cdf0e10cSrcweirsub get_packinfo
542cdf0e10cSrcweir{
543cdf0e10cSrcweir	my ($gid, $filename, $packages, $onelanguage, $islanguagemodule) = @_;
544cdf0e10cSrcweir
545cdf0e10cSrcweir	my $packagelist	= installer::files::read_file($filename);
546cdf0e10cSrcweir
547cdf0e10cSrcweir	my @allpackages = ();
548cdf0e10cSrcweir
549cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$packagelist}; $i++ )
550cdf0e10cSrcweir	{
551cdf0e10cSrcweir		my $line = ${$packagelist}[$i];
552cdf0e10cSrcweir
553cdf0e10cSrcweir		if ( $line =~ /^\s*\#/ ) { next; }	# this is a comment line
554cdf0e10cSrcweir
555cdf0e10cSrcweir		if ( $line =~ /^\s*Start\s*$/i ) 	# a new package definition
556cdf0e10cSrcweir		{
557cdf0e10cSrcweir			my %onepackage = ();
558cdf0e10cSrcweir
559cdf0e10cSrcweir			my $counter = $i + 1;
560cdf0e10cSrcweir
561cdf0e10cSrcweir			while (!( ${$packagelist}[$counter] =~ /^\s*End\s*$/i ))
562cdf0e10cSrcweir			{
563cdf0e10cSrcweir				if ( ${$packagelist}[$counter] =~ /^\s*(\S+)\s*\=\s*\"(.*)\"/ )
564cdf0e10cSrcweir				{
565cdf0e10cSrcweir					my $key = $1;
566cdf0e10cSrcweir					my $value = $2;
567cdf0e10cSrcweir					$onepackage{$key} = $value;
568cdf0e10cSrcweir				}
569cdf0e10cSrcweir
570cdf0e10cSrcweir				$counter++;
571cdf0e10cSrcweir			}
572cdf0e10cSrcweir
573cdf0e10cSrcweir			$onepackage{'islanguagemodule'} = $islanguagemodule;
574cdf0e10cSrcweir			if ( $islanguagemodule )
575cdf0e10cSrcweir			{
576cdf0e10cSrcweir				$saveonelanguage = $onelanguage;
577cdf0e10cSrcweir				$saveonelanguage =~ s/_/-/g;
578cdf0e10cSrcweir				$onepackage{'language'} = $saveonelanguage;
579cdf0e10cSrcweir			}
580cdf0e10cSrcweir
581cdf0e10cSrcweir			push(@allpackages, \%onepackage);
582cdf0e10cSrcweir		}
583cdf0e10cSrcweir	}
584cdf0e10cSrcweir
585cdf0e10cSrcweir	# looking for the packinfo with the correct gid
586cdf0e10cSrcweir
587cdf0e10cSrcweir	my $foundgid = 0;
588cdf0e10cSrcweir	my $onepackage;
589cdf0e10cSrcweir	foreach $onepackage (@allpackages)
590cdf0e10cSrcweir	{
591cdf0e10cSrcweir		# Adding the language to the module gid for LanguagePacks !
592cdf0e10cSrcweir		# Making the module gid language specific: gid_Module_Root -> gir_Module_Root_pt_BR (as defined in scp2)
593cdf0e10cSrcweir		if ( $onelanguage ne "" ) { $onepackage->{'module'} = $onepackage->{'module'} . "_$onelanguage"; }
594cdf0e10cSrcweir
595cdf0e10cSrcweir		if ( $onepackage->{'module'} eq $gid )
596cdf0e10cSrcweir		{
597cdf0e10cSrcweir			# Resolving the language identifier
598cdf0e10cSrcweir			my $onekey;
599cdf0e10cSrcweir			foreach $onekey ( keys %{$onepackage} )
600cdf0e10cSrcweir			{
601cdf0e10cSrcweir				# Some keys require "-" instead of "_" for example in "en-US". All package names do not use underlines.
602cdf0e10cSrcweir				my $locallang = $onelanguage;
603cdf0e10cSrcweir				if (( $onekey eq "solarispackagename" ) ||
604cdf0e10cSrcweir				   ( $onekey eq "solarisrequires" ) ||
605cdf0e10cSrcweir				   ( $onekey eq "packagename" ) ||
60633c7867eSAriel Constenla-Haile				   ( $onekey eq "linuxreplaces" ) ||
60733c7867eSAriel Constenla-Haile                   ( $onekey eq "provides" ) ||
608cdf0e10cSrcweir				   ( $onekey eq "requires" )) { $locallang =~ s/_/-/g; } # avoiding illegal package abbreviation
609cdf0e10cSrcweir				$onepackage->{$onekey} =~ s/\%LANGUAGESTRING/$locallang/g;
610cdf0e10cSrcweir			}
611cdf0e10cSrcweir
612cdf0e10cSrcweir			# Saving the language for the package
613cdf0e10cSrcweir			my $lang = $onelanguage;
614cdf0e10cSrcweir			$lang =~ s/_/-/g;
615cdf0e10cSrcweir			$onepackage->{'specificlanguage'} = $lang;
616cdf0e10cSrcweir
617cdf0e10cSrcweir			push(@{$packages}, $onepackage);
618cdf0e10cSrcweir			$foundgid = 1;
619cdf0e10cSrcweir			last;
620cdf0e10cSrcweir		}
621cdf0e10cSrcweir	}
622cdf0e10cSrcweir
623cdf0e10cSrcweir	if ( ! $foundgid )
624cdf0e10cSrcweir	{
625cdf0e10cSrcweir		installer::exiter::exit_program("ERROR: Could not find package info for module $gid in file \"$filename\"!", "get_packinfo");
626cdf0e10cSrcweir	}
627cdf0e10cSrcweir}
628cdf0e10cSrcweir
629cdf0e10cSrcweir#####################################################################
630cdf0e10cSrcweir# Collecting all packages from scp project.
631cdf0e10cSrcweir#####################################################################
632cdf0e10cSrcweir
633cdf0e10cSrcweirsub collectpackages
634cdf0e10cSrcweir{
635cdf0e10cSrcweir	my ( $allmodules, $languagesarrayref ) = @_;
636cdf0e10cSrcweir
637cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Collecting packages:");
638cdf0e10cSrcweir
639cdf0e10cSrcweir	my @packages = ();
640cdf0e10cSrcweir	my %gid_analyzed = ();
641cdf0e10cSrcweir
642cdf0e10cSrcweir	my $onemodule;
643cdf0e10cSrcweir	foreach $onemodule ( @{$allmodules} )
644cdf0e10cSrcweir	{
645cdf0e10cSrcweir		my $packageinfo = "PackageInfo";
646cdf0e10cSrcweir		if (( $installer::globals::tab ) && ( $onemodule->{"TabPackageInfo"} )) { $packageinfo = "TabPackageInfo" }
647cdf0e10cSrcweir
648cdf0e10cSrcweir		if ( $onemodule->{$packageinfo} )	# this is a package module!
649cdf0e10cSrcweir		{
650cdf0e10cSrcweir			my $modulegid = $onemodule->{'gid'};
651cdf0e10cSrcweir
652cdf0e10cSrcweir			# Only collecting modules with correct language for language packs
653cdf0e10cSrcweir#			if ( $installer::globals::languagepack ) { if ( ! ( $modulegid =~ /_$onelanguage\s*$/ )) { next; } }
654cdf0e10cSrcweir			# Resetting language, if this is no language pack
655cdf0e10cSrcweir#			if ( ! $installer::globals::languagepack ) { $onelanguage = ""; }
656cdf0e10cSrcweir
657cdf0e10cSrcweir			my $styles = "";
658cdf0e10cSrcweir			if ( $onemodule->{'Styles'} ) { $styles = $onemodule->{'Styles'}; }
659cdf0e10cSrcweir
660cdf0e10cSrcweir			# checking modules with style LANGUAGEMODULE
661cdf0e10cSrcweir			my $islanguagemodule = 0;
662cdf0e10cSrcweir			my $onelanguage = "";
663cdf0e10cSrcweir			if ( $styles =~ /\bLANGUAGEMODULE\b/ )
664cdf0e10cSrcweir			{
665cdf0e10cSrcweir				$islanguagemodule = 1;
666cdf0e10cSrcweir				$onelanguage = $onemodule->{'Language'}; # already checked, that it is set.
667cdf0e10cSrcweir				$onelanguage =~ s/-/_/g; # pt-BR -> pt_BR in scp
668cdf0e10cSrcweir			}
669cdf0e10cSrcweir
670cdf0e10cSrcweir			# Modules in different languages are listed more than once in multilingual installation sets
671cdf0e10cSrcweir			if ( exists($gid_analyzed{$modulegid}) ) { next; }
672cdf0e10cSrcweir			$gid_analyzed{$modulegid} = 1;
673cdf0e10cSrcweir
674cdf0e10cSrcweir			my $packinfofile = $onemodule->{$packageinfo};
675cdf0e10cSrcweir
676cdf0e10cSrcweir			# The file with package information has to be found in path list
677cdf0e10cSrcweir			my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$packinfofile, "" , 0);
678cdf0e10cSrcweir
679cdf0e10cSrcweir			if ( $$fileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find file $packinfofile for module $modulegid!", "collectpackages"); }
680cdf0e10cSrcweir
681*b274bc22SAndre Fischer			$installer::logger::Lang->printf("%s: Using packinfo: \"%s\"!\n", $modulegid, $$fileref);
682cdf0e10cSrcweir
683cdf0e10cSrcweir			get_packinfo($modulegid, $$fileref, \@packages, $onelanguage, $islanguagemodule);
684cdf0e10cSrcweir		}
685cdf0e10cSrcweir	}
686cdf0e10cSrcweir
687cdf0e10cSrcweir	return \@packages;
688cdf0e10cSrcweir}
689cdf0e10cSrcweir
690cdf0e10cSrcweir#####################################################################
691cdf0e10cSrcweir# Printing packages content for debugging purposes
692cdf0e10cSrcweir#####################################################################
693cdf0e10cSrcweir
694cdf0e10cSrcweirsub log_packages_content
695cdf0e10cSrcweir{
696cdf0e10cSrcweir	my ($packages) = @_;
697cdf0e10cSrcweir
698cdf0e10cSrcweir	if ( ! ( $#{$packages} > -1 )) { installer::exiter::exit_program("ERROR: No packages defined!", "print_content"); }
699cdf0e10cSrcweir
700cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Logging packages content:");
701cdf0e10cSrcweir
702cdf0e10cSrcweir	my $infoline = "";
703cdf0e10cSrcweir
704cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$packages}; $i++ )
705cdf0e10cSrcweir	{
706cdf0e10cSrcweir		my $onepackage = ${$packages}[$i];
707cdf0e10cSrcweir
708cdf0e10cSrcweir		# checking all items that must be defined
709cdf0e10cSrcweir
710*b274bc22SAndre Fischer        $installer::logger::Lang->printf("Package %s\n", $onepackage->{'module'});
711cdf0e10cSrcweir
712cdf0e10cSrcweir		my $key;
713cdf0e10cSrcweir		foreach $key (sort keys %{$onepackage})
714cdf0e10cSrcweir		{
715cdf0e10cSrcweir			if ( $key =~ /^\s*\;/ ) { next; }
716cdf0e10cSrcweir
717cdf0e10cSrcweir			if ( $key eq "allmodules" )
718cdf0e10cSrcweir			{
719*b274bc22SAndre Fischer                $installer::logger::Lang->printf("\t%s:\n", $key);
720cdf0e10cSrcweir				my $onemodule;
721cdf0e10cSrcweir				foreach $onemodule ( @{$onepackage->{$key}} )
722cdf0e10cSrcweir				{
723*b274bc22SAndre Fischer                    $installer::logger::Lang->printf("\t\t%s\n", $onemodule);
724cdf0e10cSrcweir				}
725cdf0e10cSrcweir			}
726cdf0e10cSrcweir			else
727cdf0e10cSrcweir			{
728*b274bc22SAndre Fischer                $installer::logger::Lang->printf("\t%s: %s\n", $key, $onepackage->{$key});
729cdf0e10cSrcweir			}
730cdf0e10cSrcweir		}
731cdf0e10cSrcweir
732*b274bc22SAndre Fischer        $installer::logger::Lang->printf("\n");
733cdf0e10cSrcweir
734cdf0e10cSrcweir	}
735cdf0e10cSrcweir}
736cdf0e10cSrcweir
737cdf0e10cSrcweir#####################################################################
738cdf0e10cSrcweir# Creating assignments from modules to destination pathes.
739cdf0e10cSrcweir# This is required for logging in fileinfo file. Otherwise
740cdf0e10cSrcweir# the complete destination file would not be known in file list.
741cdf0e10cSrcweir# Saved in %installer::globals::moduledestination
742cdf0e10cSrcweir#####################################################################
743cdf0e10cSrcweir
744cdf0e10cSrcweirsub create_module_destination_hash
745cdf0e10cSrcweir{
746cdf0e10cSrcweir	my ($packages, $allvariables) = @_;
747cdf0e10cSrcweir
748cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$packages}; $i++ )
749cdf0e10cSrcweir	{
750cdf0e10cSrcweir		my $onepackage = ${$packages}[$i];
751cdf0e10cSrcweir
752cdf0e10cSrcweir		my $defaultdestination = $onepackage->{'destpath'};
753cdf0e10cSrcweir		resolve_packagevariables(\$defaultdestination, $allvariables, 1);
754cdf0e10cSrcweir		if ( $^O =~ /darwin/i ) { $defaultdestination =~ s/\/opt\//\/Applications\//; }
755cdf0e10cSrcweir
756cdf0e10cSrcweir		foreach my $onemodule ( @{$onepackage->{'allmodules'}} )
757cdf0e10cSrcweir		{
758cdf0e10cSrcweir			$installer::globals::moduledestination{$onemodule} = $defaultdestination;
759cdf0e10cSrcweir		}
760cdf0e10cSrcweir	}
761cdf0e10cSrcweir}
762cdf0e10cSrcweir
763cdf0e10cSrcweir#####################################################################
764cdf0e10cSrcweir# Adding the default pathes into the files collector for Unixes.
765cdf0e10cSrcweir# This is necessary to know the complete destination path in
766cdf0e10cSrcweir# fileinfo log file.
767cdf0e10cSrcweir#####################################################################
768cdf0e10cSrcweir
769cdf0e10cSrcweirsub add_defaultpathes_into_filescollector
770cdf0e10cSrcweir{
771cdf0e10cSrcweir	my ($allfiles) = @_;
772cdf0e10cSrcweir
773cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$allfiles}; $i++ )
774cdf0e10cSrcweir	{
775cdf0e10cSrcweir		my $onefile = ${$allfiles}[$i];
776cdf0e10cSrcweir
777cdf0e10cSrcweir		if ( ! $onefile->{'destination'} ) { installer::exiter::exit_program("ERROR: No destination found at file $onefile->{'gid'}!", "add_defaultpathes_into_filescollector"); }
778cdf0e10cSrcweir		my $destination = $onefile->{'destination'};
779cdf0e10cSrcweir
780cdf0e10cSrcweir		if ( ! $onefile->{'modules'} ) { installer::exiter::exit_program("ERROR: No modules found at file $onefile->{'gid'}!", "add_defaultpathes_into_filescollector"); }
781cdf0e10cSrcweir		my $module = $onefile->{'modules'};
782cdf0e10cSrcweir		# If modules contains a list of modules, only taking the first one.
783cdf0e10cSrcweir		if ( $module =~ /^\s*(.*?)\,/ ) { $module = $1; }
784cdf0e10cSrcweir
785cdf0e10cSrcweir		if ( ! exists($installer::globals::moduledestination{$module}) ) { installer::exiter::exit_program("ERROR: No default destination path found for module $module!", "add_defaultpathes_into_filescollector"); }
786cdf0e10cSrcweir		my $defaultpath = $installer::globals::moduledestination{$module};
787cdf0e10cSrcweir		$defaultpath =~ s/\/\s*$//; # removing ending slashes
788cdf0e10cSrcweir		my $fulldestpath = $defaultpath . $installer::globals::separator . $destination;
789cdf0e10cSrcweir
790cdf0e10cSrcweir		$onefile->{'fulldestpath'} = $fulldestpath;
791cdf0e10cSrcweir	}
792cdf0e10cSrcweir}
793cdf0e10cSrcweir
794cdf0e10cSrcweir#####################################################################
795cdf0e10cSrcweir# Creating list of cabinet files from packages
796cdf0e10cSrcweir#####################################################################
797cdf0e10cSrcweir
798cdf0e10cSrcweirsub prepare_cabinet_files
799cdf0e10cSrcweir{
800cdf0e10cSrcweir	my ($packages, $allvariables) = @_;
801cdf0e10cSrcweir
802cdf0e10cSrcweir	if ( ! ( $#{$packages} > -1 )) { installer::exiter::exit_program("ERROR: No packages defined!", "print_content"); }
803cdf0e10cSrcweir
804cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Preparing cabinet files:");
805cdf0e10cSrcweir
806cdf0e10cSrcweir	my $infoline = "";
807cdf0e10cSrcweir
808cdf0e10cSrcweir	for ( my $i = 0; $i <= $#{$packages}; $i++ )
809cdf0e10cSrcweir	{
810cdf0e10cSrcweir		my $onepackage = ${$packages}[$i];
811cdf0e10cSrcweir
812cdf0e10cSrcweir		my $cabinetfile = "$onepackage->{'packagename'}\.cab";
813cdf0e10cSrcweir
814cdf0e10cSrcweir		resolve_packagevariables(\$cabinetfile, $allvariables, 0);
815cdf0e10cSrcweir
816cdf0e10cSrcweir		$installer::globals::allcabinets{$cabinetfile} = 1;
817cdf0e10cSrcweir
818cdf0e10cSrcweir		# checking all items that must be defined
819cdf0e10cSrcweir
820*b274bc22SAndre Fischer        $installer::logger::Lang->printf("Package %s\n", $onepackage->{'module'});
821cdf0e10cSrcweir
822cdf0e10cSrcweir		# Assigning the cab file to the module and also to all corresponding sub modules
823cdf0e10cSrcweir
824cdf0e10cSrcweir		my $onemodule;
825cdf0e10cSrcweir		foreach $onemodule ( @{$onepackage->{'allmodules'}} )
826cdf0e10cSrcweir		{
827cdf0e10cSrcweir			if ( ! exists($installer::globals::allcabinetassigns{$onemodule}) )
828cdf0e10cSrcweir			{
829cdf0e10cSrcweir				$installer::globals::allcabinetassigns{$onemodule} = $cabinetfile;
830cdf0e10cSrcweir			}
831cdf0e10cSrcweir			else
832cdf0e10cSrcweir			{
833*b274bc22SAndre Fischer                $installer::logger::Lang->printf("Warning: Already existing assignment: %s : %s\n",
834*b274bc22SAndre Fischer                    $onemodule,
835*b274bc22SAndre Fischer                    $installer::globals::allcabinetassigns{$onemodule});
836*b274bc22SAndre Fischer                $installer::logger::Lang->printf("Ignoring further assignment: %s : %s\n",
837*b274bc22SAndre Fischer                    $onemodule,
838*b274bc22SAndre Fischer                    $cabinetfile);
839cdf0e10cSrcweir			}
840cdf0e10cSrcweir		}
841cdf0e10cSrcweir	}
842cdf0e10cSrcweir}
843cdf0e10cSrcweir
844cdf0e10cSrcweir#####################################################################
845cdf0e10cSrcweir# Logging assignments of cabinet files
846cdf0e10cSrcweir#####################################################################
847cdf0e10cSrcweir
848cdf0e10cSrcweirsub log_cabinet_assignments
849cdf0e10cSrcweir{
850cdf0e10cSrcweir	installer::logger::include_header_into_logfile("Logging cabinet files:");
851cdf0e10cSrcweir
852*b274bc22SAndre Fischer    $installer::logger::Lang->printf("List of cabinet files:\n");
853cdf0e10cSrcweir
854cdf0e10cSrcweir	my $key;
855*b274bc22SAndre Fischer	foreach $key ( sort keys %installer::globals::allcabinets )
856*b274bc22SAndre Fischer    {
857*b274bc22SAndre Fischer        $installer::logger::Lang->printf("\t%s\n", $key);
858*b274bc22SAndre Fischer    }
859*b274bc22SAndre Fischer
860*b274bc22SAndre Fischer    $installer::logger::Lang->printf("\n");
861*b274bc22SAndre Fischer    $installer::logger::Lang->printf("List of assignments from modules to cabinet files:\n");
862*b274bc22SAndre Fischer
863*b274bc22SAndre Fischer	foreach $key ( sort keys %installer::globals::allcabinetassigns )
864*b274bc22SAndre Fischer    {
865*b274bc22SAndre Fischer        $installer::logger::Lang->printf("\t%s : %s\n",
866*b274bc22SAndre Fischer            $key,
867*b274bc22SAndre Fischer            $installer::globals::allcabinetassigns{$key});
868*b274bc22SAndre Fischer    }
869cdf0e10cSrcweir}
870cdf0e10cSrcweir
871cdf0e10cSrcweir1;
872