1*9780544fSAndrew Rist#**************************************************************
2*9780544fSAndrew Rist#
3*9780544fSAndrew Rist#  Licensed to the Apache Software Foundation (ASF) under one
4*9780544fSAndrew Rist#  or more contributor license agreements.  See the NOTICE file
5*9780544fSAndrew Rist#  distributed with this work for additional information
6*9780544fSAndrew Rist#  regarding copyright ownership.  The ASF licenses this file
7*9780544fSAndrew Rist#  to you under the Apache License, Version 2.0 (the
8*9780544fSAndrew Rist#  "License"); you may not use this file except in compliance
9*9780544fSAndrew Rist#  with the License.  You may obtain a copy of the License at
10*9780544fSAndrew Rist#
11*9780544fSAndrew Rist#    http://www.apache.org/licenses/LICENSE-2.0
12*9780544fSAndrew Rist#
13*9780544fSAndrew Rist#  Unless required by applicable law or agreed to in writing,
14*9780544fSAndrew Rist#  software distributed under the License is distributed on an
15*9780544fSAndrew Rist#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9780544fSAndrew Rist#  KIND, either express or implied.  See the License for the
17*9780544fSAndrew Rist#  specific language governing permissions and limitations
18*9780544fSAndrew Rist#  under the License.
19*9780544fSAndrew Rist#
20*9780544fSAndrew Rist#**************************************************************
21*9780544fSAndrew Rist
22*9780544fSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweirpackage installer::windows::media;
25cdf0e10cSrcweir
26cdf0e10cSrcweiruse installer::exiter;
27cdf0e10cSrcweiruse installer::files;
28cdf0e10cSrcweiruse installer::globals;
29cdf0e10cSrcweiruse installer::windows::idtglobal;
30cdf0e10cSrcweir
31cdf0e10cSrcweir##############################################################
32cdf0e10cSrcweir# Returning the diskid for the media table.
33cdf0e10cSrcweir##############################################################
34cdf0e10cSrcweir
35cdf0e10cSrcweirsub get_media_diskid
36cdf0e10cSrcweir{
37cdf0e10cSrcweir	my ($id) = @_;
38cdf0e10cSrcweir
39cdf0e10cSrcweir	return $id;
40cdf0e10cSrcweir}
41cdf0e10cSrcweir
42cdf0e10cSrcweir##############################################################
43cdf0e10cSrcweir# Returning the lastsequence for the media table.
44cdf0e10cSrcweir##############################################################
45cdf0e10cSrcweir
46cdf0e10cSrcweirsub get_media_lastsequence
47cdf0e10cSrcweir{
48cdf0e10cSrcweir	my ($fileref) = @_;
49cdf0e10cSrcweir
50cdf0e10cSrcweir	return $fileref->{'sequencenumber'};
51cdf0e10cSrcweir}
52cdf0e10cSrcweir
53cdf0e10cSrcweir##############################################################
54cdf0e10cSrcweir# Returning the diskprompt for the media table.
55cdf0e10cSrcweir##############################################################
56cdf0e10cSrcweir
57cdf0e10cSrcweirsub get_media_diskprompt
58cdf0e10cSrcweir{
59cdf0e10cSrcweir	return 1;
60cdf0e10cSrcweir}
61cdf0e10cSrcweir
62cdf0e10cSrcweir##############################################################
63cdf0e10cSrcweir# Returning the cabinet file name for the media table.
64cdf0e10cSrcweir##############################################################
65cdf0e10cSrcweir
66cdf0e10cSrcweirsub get_media_cabinet
67cdf0e10cSrcweir{
68cdf0e10cSrcweir	my ($id) = @_;
69cdf0e10cSrcweir
70cdf0e10cSrcweir	my $number = 1000 + $id;
71cdf0e10cSrcweir	my $filename = "f_" . $number . ".cab";
72cdf0e10cSrcweir
73cdf0e10cSrcweir	if ( $installer::globals::include_cab_in_msi ) { $filename = "\#" . $filename; }
74cdf0e10cSrcweir
75cdf0e10cSrcweir	return $filename;
76cdf0e10cSrcweir}
77cdf0e10cSrcweir
78cdf0e10cSrcweir##############################################################
79cdf0e10cSrcweir# Returning the volumelabel for the media table.
80cdf0e10cSrcweir##############################################################
81cdf0e10cSrcweir
82cdf0e10cSrcweirsub get_media_volumelabel
83cdf0e10cSrcweir{
84cdf0e10cSrcweir	return "DISK1";
85cdf0e10cSrcweir}
86cdf0e10cSrcweir
87cdf0e10cSrcweir##############################################################
88cdf0e10cSrcweir# Returning the source for the media table.
89cdf0e10cSrcweir##############################################################
90cdf0e10cSrcweir
91cdf0e10cSrcweirsub get_media_source
92cdf0e10cSrcweir{
93cdf0e10cSrcweir	return "";
94cdf0e10cSrcweir}
95cdf0e10cSrcweir
96cdf0e10cSrcweir##############################################################
97cdf0e10cSrcweir# Saving the cabinet file name in the files collector.
98cdf0e10cSrcweir# This is useful for making a list to connect the
99cdf0e10cSrcweir# source of each file with the destination cabinet file.
100cdf0e10cSrcweir##############################################################
101cdf0e10cSrcweir
102cdf0e10cSrcweirsub set_cabinetfilename_for_component_in_file_collector
103cdf0e10cSrcweir{
104cdf0e10cSrcweir	my ($cabinetfilename, $filesref, $componentname, $max) = @_;
105cdf0e10cSrcweir
106cdf0e10cSrcweir	for ( my $i = 0; $i <= $max; $i++ )
107cdf0e10cSrcweir	{
108cdf0e10cSrcweir		my $onefile = ${$filesref}[$i];
109cdf0e10cSrcweir		my $component = $onefile->{'componentname'};
110cdf0e10cSrcweir
111cdf0e10cSrcweir		if ( $component eq $componentname )
112cdf0e10cSrcweir		{
113cdf0e10cSrcweir			my $cabinet = "";
114cdf0e10cSrcweir
115cdf0e10cSrcweir			if ( $onefile->{'cabinet'} ) { $cabinet = $onefile->{'cabinet'}; }
116cdf0e10cSrcweir
117cdf0e10cSrcweir			if ( $cabinet eq "" )
118cdf0e10cSrcweir			{
119cdf0e10cSrcweir				$onefile->{'cabinet'} = $cabinetfilename;
120cdf0e10cSrcweir			}
121cdf0e10cSrcweir		}
122cdf0e10cSrcweir	}
123cdf0e10cSrcweir}
124cdf0e10cSrcweir
125cdf0e10cSrcweir#################################################
126cdf0e10cSrcweir# Creating the cab file name dynamically
127cdf0e10cSrcweir#################################################
128cdf0e10cSrcweir
129cdf0e10cSrcweirsub generate_cab_filename_for_some_cabs
130cdf0e10cSrcweir{
131cdf0e10cSrcweir	my ( $allvariables, $id ) = @_;
132cdf0e10cSrcweir
133cdf0e10cSrcweir	my $name = $allvariables->{'PRODUCTNAME'};
134cdf0e10cSrcweir
135cdf0e10cSrcweir	$name = lc($name);
136cdf0e10cSrcweir	$name =~ s/\.//g;
137cdf0e10cSrcweir	$name =~ s/\s//g;
138cdf0e10cSrcweir
139cdf0e10cSrcweir	# possibility to overwrite the name with variable CABFILENAME
140cdf0e10cSrcweir	if ( $allvariables->{'CABFILENAME'} ) { $name = $allvariables->{'CABFILENAME'}; }
141cdf0e10cSrcweir
142cdf0e10cSrcweir	$name = $name . $id . ".cab";
143cdf0e10cSrcweir
144cdf0e10cSrcweir	if ( $installer::globals::include_cab_in_msi ) { $name = "\#" . $name; }
145cdf0e10cSrcweir
146cdf0e10cSrcweir	return $name;
147cdf0e10cSrcweir}
148cdf0e10cSrcweir
149cdf0e10cSrcweir#################################################
150cdf0e10cSrcweir# Creating the cab file name for cab files
151cdf0e10cSrcweir# defined in packages.
152cdf0e10cSrcweir#################################################
153cdf0e10cSrcweir
154cdf0e10cSrcweirsub get_cabfilename
155cdf0e10cSrcweir{
156cdf0e10cSrcweir	my ($name) = @_;
157cdf0e10cSrcweir
158cdf0e10cSrcweir	if ( $installer::globals::include_cab_in_msi ) { $name = "\#" . $name; }
159cdf0e10cSrcweir
160cdf0e10cSrcweir	return $name;
161cdf0e10cSrcweir}
162cdf0e10cSrcweir
163cdf0e10cSrcweir#################################################
164cdf0e10cSrcweir# Creating the cab file name dynamically
165cdf0e10cSrcweir#################################################
166cdf0e10cSrcweir
167cdf0e10cSrcweirsub generate_cab_filename
168cdf0e10cSrcweir{
169cdf0e10cSrcweir	my ( $allvariables ) = @_;
170cdf0e10cSrcweir
171cdf0e10cSrcweir	my $name = $allvariables->{'PRODUCTNAME'};
172cdf0e10cSrcweir
173cdf0e10cSrcweir	$name = lc($name);
174cdf0e10cSrcweir	$name =~ s/\.//g;
175cdf0e10cSrcweir	$name =~ s/\s//g;
176cdf0e10cSrcweir
177cdf0e10cSrcweir	# possibility to overwrite the name with variable CABFILENAME
178cdf0e10cSrcweir	if ( $allvariables->{'CABFILENAME'} ) { $name = $allvariables->{'CABFILENAME'}; }
179cdf0e10cSrcweir
180cdf0e10cSrcweir	$name = $name . ".cab";
181cdf0e10cSrcweir
182cdf0e10cSrcweir	if ( $installer::globals::include_cab_in_msi ) { $name = "\#" . $name; }
183cdf0e10cSrcweir
184cdf0e10cSrcweir	return $name;
185cdf0e10cSrcweir}
186cdf0e10cSrcweir
187cdf0e10cSrcweirsub get_maximum_filenumber
188cdf0e10cSrcweir{
189cdf0e10cSrcweir	my ($allfiles, $maxcabfilenumber) = @_;
190cdf0e10cSrcweir
191cdf0e10cSrcweir	my $maxfile = 0;
192cdf0e10cSrcweir
193cdf0e10cSrcweir	while ( ! ( $allfiles%$maxcabfilenumber == 0 ))
194cdf0e10cSrcweir	{
195cdf0e10cSrcweir		$allfiles++;
196cdf0e10cSrcweir	}
197cdf0e10cSrcweir
198cdf0e10cSrcweir	$maxfile = $allfiles / $maxcabfilenumber;
199cdf0e10cSrcweir
200cdf0e10cSrcweir	$maxfile++;					# for securitry
201cdf0e10cSrcweir
202cdf0e10cSrcweir	return $maxfile;
203cdf0e10cSrcweir}
204cdf0e10cSrcweir
205cdf0e10cSrcweir#################################################################################
206cdf0e10cSrcweir# Setting the last sequence for the cabinet files
207cdf0e10cSrcweir#################################################################################
208cdf0e10cSrcweir
209cdf0e10cSrcweirsub get_last_sequence
210cdf0e10cSrcweir{
211cdf0e10cSrcweir	my ( $cabfilename, $alludpatelastsequences ) = @_;
212cdf0e10cSrcweir
213cdf0e10cSrcweir	my $sequence = 0;
214cdf0e10cSrcweir
215cdf0e10cSrcweir	if (( $installer::globals::updatedatabase ) && ( exists($alludpatelastsequences->{$cabfilename}) ))
216cdf0e10cSrcweir	{
217cdf0e10cSrcweir		$sequence = $alludpatelastsequences->{$cabfilename};
218cdf0e10cSrcweir	}
219cdf0e10cSrcweir	else
220cdf0e10cSrcweir	{
221cdf0e10cSrcweir		$sequence = $installer::globals::lastsequence{$cabfilename};
222cdf0e10cSrcweir	}
223cdf0e10cSrcweir
224cdf0e10cSrcweir	return $sequence;
225cdf0e10cSrcweir}
226cdf0e10cSrcweir
227cdf0e10cSrcweir#################################################################################
228cdf0e10cSrcweir# Creating the file Media.idt dynamically
229cdf0e10cSrcweir# Content:
230cdf0e10cSrcweir# DiskId LastSequence DiskPrompt Cabinet VolumeLabel Source
231cdf0e10cSrcweir# Idea: Every component is packed into each own cab file
232cdf0e10cSrcweir#################################################################################
233cdf0e10cSrcweir
234cdf0e10cSrcweirsub create_media_table
235cdf0e10cSrcweir{
236cdf0e10cSrcweir	my ($filesref, $basedir, $allvariables, $alludpatelastsequences, $allupdatediskids) = @_;
237cdf0e10cSrcweir
238cdf0e10cSrcweir	my @mediatable = ();
239cdf0e10cSrcweir
240cdf0e10cSrcweir	my $diskid = 0;
241cdf0e10cSrcweir
242cdf0e10cSrcweir	installer::windows::idtglobal::write_idt_header(\@mediatable, "media");
243cdf0e10cSrcweir
244cdf0e10cSrcweir	if ( $allvariables->{'INCLUDE_CAB_IN_MSI'} ) { $installer::globals::include_cab_in_msi = 1; }
245cdf0e10cSrcweir
246cdf0e10cSrcweir	if ( $installer::globals::use_packages_for_cabs )
247cdf0e10cSrcweir	{
248cdf0e10cSrcweir		my $cabfile;
249cdf0e10cSrcweir		foreach $cabfile ( sort keys %installer::globals::lastsequence )
250cdf0e10cSrcweir		{
251cdf0e10cSrcweir			my %media = ();
252cdf0e10cSrcweir			$diskid++;
253cdf0e10cSrcweir
254cdf0e10cSrcweir			$media{'DiskId'} = get_media_diskid($diskid);
255cdf0e10cSrcweir			$media{'LastSequence'} = get_last_sequence($cabfile, $alludpatelastsequences);
256cdf0e10cSrcweir			$media{'DiskPrompt'} = get_media_diskprompt();
257cdf0e10cSrcweir			$media{'Cabinet'} = get_cabfilename($cabfile);
258cdf0e10cSrcweir			$media{'VolumeLabel'} = get_media_volumelabel();
259cdf0e10cSrcweir			$media{'Source'} = get_media_source();
260cdf0e10cSrcweir
261cdf0e10cSrcweir			my $oneline = $media{'DiskId'} . "\t" . $media{'LastSequence'} . "\t" . $media{'DiskPrompt'} . "\t"
262cdf0e10cSrcweir						. $media{'Cabinet'} . "\t" . $media{'VolumeLabel'} . "\t" . $media{'Source'} . "\n";
263cdf0e10cSrcweir
264cdf0e10cSrcweir			push(@mediatable, $oneline);
265cdf0e10cSrcweir
266cdf0e10cSrcweir			# Comparing the disk id with the disk id from update database. Both have to be identical. New files have to be added
267cdf0e10cSrcweir			# to the new pff cabinet file. And existing cab files must not be removed.
268cdf0e10cSrcweir			if ( $installer::globals::updatedatabase )
269cdf0e10cSrcweir			{
270cdf0e10cSrcweir				# Comparing lines in new media table with line from media table in udpate database.
271cdf0e10cSrcweir				if ( exists($allupdatediskids->{$media{'Cabinet'}}) )
272cdf0e10cSrcweir				{
273cdf0e10cSrcweir					if ( $media{'DiskId'} != $allupdatediskids->{$media{'Cabinet'}} )
274cdf0e10cSrcweir					{
275cdf0e10cSrcweir						installer::exiter::exit_program("ERROR: Different DiskIDs for cab file \"$media{'Cabinet'}\".\nCurrent installation set: \"$media{'DiskId'}\", but update database used \"$allupdatediskids->{$media{'Cabinet'}}\".\nWere cabinet files removed or added?", "create_media_table");
276cdf0e10cSrcweir					}
277cdf0e10cSrcweir				}
278cdf0e10cSrcweir				else
279cdf0e10cSrcweir				{
280cdf0e10cSrcweir					my $localinfoline = "Warning: Could not find cabinet file \"$media{'Cabinet'}}\" in update database. This seems to be an new cabinet file!?\n";
281cdf0e10cSrcweir					push(@installer::globals::logfileinfo, $localinfoline);
282cdf0e10cSrcweir				}
283cdf0e10cSrcweir			}
284cdf0e10cSrcweir		}
285cdf0e10cSrcweir
286cdf0e10cSrcweir		# one new cabinet file for all files added after the final release
287cdf0e10cSrcweir		if (( $installer::globals::updatedatabase ) && ( $installer::globals::pfffileexists ))
288cdf0e10cSrcweir		{
289cdf0e10cSrcweir			my %media = ();
290cdf0e10cSrcweir			$diskid++;
291cdf0e10cSrcweir
292cdf0e10cSrcweir			$media{'DiskId'} = get_media_diskid($diskid) + $installer::globals::mergemodulenumber;  # Adding mergemodulenumber, because this files are included later
293cdf0e10cSrcweir			$media{'LastSequence'} = $installer::globals::updatesequencecounter;
294cdf0e10cSrcweir			$media{'DiskPrompt'} = get_media_diskprompt();
295cdf0e10cSrcweir			$media{'Cabinet'} = get_cabfilename($installer::globals::pffcabfilename);
296cdf0e10cSrcweir			$media{'VolumeLabel'} = get_media_volumelabel();
297cdf0e10cSrcweir			$media{'Source'} = get_media_source();
298cdf0e10cSrcweir
299cdf0e10cSrcweir			my $oneline = $media{'DiskId'} . "\t" . $media{'LastSequence'} . "\t" . $media{'DiskPrompt'} . "\t"
300cdf0e10cSrcweir						. $media{'Cabinet'} . "\t" . $media{'VolumeLabel'} . "\t" . $media{'Source'} . "\n";
301cdf0e10cSrcweir
302cdf0e10cSrcweir			push(@mediatable, $oneline);
303cdf0e10cSrcweir		}
304cdf0e10cSrcweir
305cdf0e10cSrcweir	}
306cdf0e10cSrcweir	elsif ( $installer::globals::cab_file_per_component )
307cdf0e10cSrcweir	{
308cdf0e10cSrcweir		for ( my $i = 0; $i <= $#{$filesref}; $i++ )
309cdf0e10cSrcweir		{
310cdf0e10cSrcweir			my $onefile = ${$filesref}[$i];
311cdf0e10cSrcweir			my $nextfile = ${$filesref}[$i+1];
312cdf0e10cSrcweir
313cdf0e10cSrcweir			my $filecomponent = "";
314cdf0e10cSrcweir			my $nextcomponent = "";
315cdf0e10cSrcweir
316cdf0e10cSrcweir			if ( $onefile->{'componentname'} ) { $filecomponent = $onefile->{'componentname'}; }
317cdf0e10cSrcweir			if ( $nextfile->{'componentname'} ) { $nextcomponent = $nextfile->{'componentname'}; }
318cdf0e10cSrcweir
319cdf0e10cSrcweir			if ( $filecomponent eq $nextcomponent )
320cdf0e10cSrcweir			{
321cdf0e10cSrcweir				next;		# nothing to do, this is not the last file of a component
322cdf0e10cSrcweir			}
323cdf0e10cSrcweir
324cdf0e10cSrcweir			my %media = ();
325cdf0e10cSrcweir			$diskid++;
326cdf0e10cSrcweir
327cdf0e10cSrcweir			$media{'DiskId'} = get_media_diskid($diskid);
328cdf0e10cSrcweir			$media{'LastSequence'} = get_media_lastsequence($onefile);
329cdf0e10cSrcweir			$media{'DiskPrompt'} = get_media_diskprompt();
330cdf0e10cSrcweir			$media{'Cabinet'} = get_media_cabinet($diskid);
331cdf0e10cSrcweir			$media{'VolumeLabel'} = get_media_volumelabel();
332cdf0e10cSrcweir			$media{'Source'} = get_media_source();
333cdf0e10cSrcweir
334cdf0e10cSrcweir			my $oneline = $media{'DiskId'} . "\t" . $media{'LastSequence'} . "\t" . $media{'DiskPrompt'} . "\t"
335cdf0e10cSrcweir					. $media{'Cabinet'} . "\t" . $media{'VolumeLabel'} . "\t" . $media{'Source'} . "\n";
336cdf0e10cSrcweir
337cdf0e10cSrcweir			push(@mediatable, $oneline);
338cdf0e10cSrcweir
339cdf0e10cSrcweir			$media{'Cabinet'} =~ s/^\s*\#//;	# removing leading hash
340cdf0e10cSrcweir			set_cabinetfilename_for_component_in_file_collector($media{'Cabinet'}, $filesref, $filecomponent, $i);
341cdf0e10cSrcweir		}
342cdf0e10cSrcweir	}
343cdf0e10cSrcweir	elsif ( $installer::globals::fix_number_of_cab_files )
344cdf0e10cSrcweir	{
345cdf0e10cSrcweir		# number of cabfiles
346cdf0e10cSrcweir		my $maxcabfilenumber = $installer::globals::number_of_cabfiles;
347cdf0e10cSrcweir		if ( $allvariables->{'CABFILENUMBER'} ) { $maxcabfilenumber = $allvariables->{'CABFILENUMBER'}; }
348cdf0e10cSrcweir		my $allfiles = $#{$filesref} + 1;
349cdf0e10cSrcweir		my $maxfilenumber = get_maximum_filenumber($allfiles, $maxcabfilenumber);
350cdf0e10cSrcweir		# my $maxfilenumber = 1000;	# maximum 1000 files in each cabinet file
351cdf0e10cSrcweir		my $cabfilenumber = 0;
352cdf0e10cSrcweir		my $cabfull = 0;
353cdf0e10cSrcweir		my $counter = 0;
354cdf0e10cSrcweir
355cdf0e10cSrcweir		# Sorting of files collector files required !
356cdf0e10cSrcweir		# Attention: The order in the cab file is not guaranteed (especially in udpate process)
357cdf0e10cSrcweir
358cdf0e10cSrcweir		for ( my $i = 0; $i <= $#{$filesref}; $i++ )
359cdf0e10cSrcweir		{
360cdf0e10cSrcweir			if (( $counter >= $maxfilenumber ) || ( $i == $#{$filesref} )) { $cabfull = 1; }
361cdf0e10cSrcweir
362cdf0e10cSrcweir			$counter++; 	 # counting the files in the cab file
363cdf0e10cSrcweir
364cdf0e10cSrcweir			my $onefile = ${$filesref}[$i];
365cdf0e10cSrcweir			my $nextfile = ${$filesref}[$i+1];
366cdf0e10cSrcweir
367cdf0e10cSrcweir			my $filecomponent = "";
368cdf0e10cSrcweir			my $nextcomponent = "";
369cdf0e10cSrcweir
370cdf0e10cSrcweir			if ( $onefile->{'componentname'} ) { $filecomponent = $onefile->{'componentname'}; }
371cdf0e10cSrcweir			if ( $nextfile->{'componentname'} ) { $nextcomponent = $nextfile->{'componentname'}; }
372cdf0e10cSrcweir
373cdf0e10cSrcweir			if ( $filecomponent eq $nextcomponent )	# all files of one component have to be in one cab file
374cdf0e10cSrcweir			{
375cdf0e10cSrcweir				next;		# nothing to do, this is not the last file of a component
376cdf0e10cSrcweir			}
377cdf0e10cSrcweir
378cdf0e10cSrcweir			if ( $cabfull )
379cdf0e10cSrcweir			{
380cdf0e10cSrcweir				my %media = ();
381cdf0e10cSrcweir				$cabfilenumber++;
382cdf0e10cSrcweir
383cdf0e10cSrcweir				$media{'DiskId'} = get_media_diskid($cabfilenumber);
384cdf0e10cSrcweir				# $media{'LastSequence'} = get_media_lastsequence($onefile);
385cdf0e10cSrcweir				$media{'LastSequence'} = $i + 1;	# This should be correct, also for unsorted files collectors
386cdf0e10cSrcweir				$media{'DiskPrompt'} = get_media_diskprompt();
387cdf0e10cSrcweir				$media{'Cabinet'} = generate_cab_filename_for_some_cabs($allvariables, $cabfilenumber);
388cdf0e10cSrcweir				$media{'VolumeLabel'} = get_media_volumelabel();
389cdf0e10cSrcweir				$media{'Source'} = get_media_source();
390cdf0e10cSrcweir
391cdf0e10cSrcweir				my $oneline = $media{'DiskId'} . "\t" . $media{'LastSequence'} . "\t" . $media{'DiskPrompt'} . "\t"
392cdf0e10cSrcweir						. $media{'Cabinet'} . "\t" . $media{'VolumeLabel'} . "\t" . $media{'Source'} . "\n";
393cdf0e10cSrcweir
394cdf0e10cSrcweir				push(@mediatable, $oneline);
395cdf0e10cSrcweir
396cdf0e10cSrcweir				# Saving the cabinet file name in the file collector
397cdf0e10cSrcweir
398cdf0e10cSrcweir				$media{'Cabinet'} =~ s/^\s*\#//;	# removing leading hash
399cdf0e10cSrcweir
400cdf0e10cSrcweir				for ( my $j = 0; $j <= $i; $j++ )
401cdf0e10cSrcweir				{
402cdf0e10cSrcweir					my $onefile = ${$filesref}[$j];
403cdf0e10cSrcweir					if ( ! $onefile->{'cabinet'} ) { $onefile->{'cabinet'} = $media{'Cabinet'}; }
404cdf0e10cSrcweir				}
405cdf0e10cSrcweir
406cdf0e10cSrcweir				$cabfull = 0;
407cdf0e10cSrcweir				$counter = 0;
408cdf0e10cSrcweir			}
409cdf0e10cSrcweir		}
410cdf0e10cSrcweir	}
411cdf0e10cSrcweir	elsif ( $installer::globals::one_cab_file )
412cdf0e10cSrcweir	{
413cdf0e10cSrcweir		my %media = ();
414cdf0e10cSrcweir		$diskid++;
415cdf0e10cSrcweir
416cdf0e10cSrcweir		my $maximumfile = $#{$filesref};
417cdf0e10cSrcweir
418cdf0e10cSrcweir		$media{'DiskId'} = get_media_diskid($diskid);
419cdf0e10cSrcweir		# $media{'LastSequence'} = ${$filesref}[$maximumfile]->{'sequencenumber'};	# sequence number of the last file
420cdf0e10cSrcweir		$media{'LastSequence'} = $maximumfile + 1; # This works also for unsorted file collector
421cdf0e10cSrcweir		$media{'DiskPrompt'} = get_media_diskprompt();
422cdf0e10cSrcweir		$media{'Cabinet'} = generate_cab_filename($allvariables);
423cdf0e10cSrcweir		$media{'VolumeLabel'} = get_media_volumelabel();
424cdf0e10cSrcweir		$media{'Source'} = get_media_source();
425cdf0e10cSrcweir
426cdf0e10cSrcweir		my $oneline = $media{'DiskId'} . "\t" . $media{'LastSequence'} . "\t" . $media{'DiskPrompt'} . "\t"
427cdf0e10cSrcweir					. $media{'Cabinet'} . "\t" . $media{'VolumeLabel'} . "\t" . $media{'Source'} . "\n";
428cdf0e10cSrcweir
429cdf0e10cSrcweir		push(@mediatable, $oneline);
430cdf0e10cSrcweir
431cdf0e10cSrcweir		# Saving the cabinet file name in the file collector
432cdf0e10cSrcweir
433cdf0e10cSrcweir		$media{'Cabinet'} =~ s/^\s*\#//;	# removing leading hash
434cdf0e10cSrcweir
435cdf0e10cSrcweir		for ( my $i = 0; $i <= $#{$filesref}; $i++ )
436cdf0e10cSrcweir		{
437cdf0e10cSrcweir			my $onefile = ${$filesref}[$i];
438cdf0e10cSrcweir			$onefile->{'cabinet'} = $media{'Cabinet'};
439cdf0e10cSrcweir		}
440cdf0e10cSrcweir	}
441cdf0e10cSrcweir	else
442cdf0e10cSrcweir	{
443cdf0e10cSrcweir		installer::exiter::exit_program("ERROR: No cab file specification in globals.pm !", "create_media_table");
444cdf0e10cSrcweir	}
445cdf0e10cSrcweir
446cdf0e10cSrcweir	# Saving the file
447cdf0e10cSrcweir
448cdf0e10cSrcweir	my $mediatablename = $basedir . $installer::globals::separator . "Media.idt";
449cdf0e10cSrcweir	installer::files::save_file($mediatablename ,\@mediatable);
450cdf0e10cSrcweir	my $infoline = "Created idt file: $mediatablename\n";
451cdf0e10cSrcweir	push(@installer::globals::logfileinfo, $infoline);
452cdf0e10cSrcweir}
453cdf0e10cSrcweir
454cdf0e10cSrcweir1;
455