1*b1cdbd2cSJim Jagielski#**************************************************************
2*b1cdbd2cSJim Jagielski#
3*b1cdbd2cSJim Jagielski#  Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski#  or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski#  distributed with this work for additional information
6*b1cdbd2cSJim Jagielski#  regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski#  to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski#  "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski#  with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski#
11*b1cdbd2cSJim Jagielski#    http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski#
13*b1cdbd2cSJim Jagielski#  Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski#  software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski#  KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski#  specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski#  under the License.
19*b1cdbd2cSJim Jagielski#
20*b1cdbd2cSJim Jagielski#**************************************************************
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielskipackage installer::windows::media;
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielskiuse installer::exiter;
27*b1cdbd2cSJim Jagielskiuse installer::files;
28*b1cdbd2cSJim Jagielskiuse installer::globals;
29*b1cdbd2cSJim Jagielskiuse installer::windows::idtglobal;
30*b1cdbd2cSJim Jagielski
31*b1cdbd2cSJim Jagielski##############################################################
32*b1cdbd2cSJim Jagielski# Returning the diskid for the media table.
33*b1cdbd2cSJim Jagielski##############################################################
34*b1cdbd2cSJim Jagielski
35*b1cdbd2cSJim Jagielskisub get_media_diskid
36*b1cdbd2cSJim Jagielski{
37*b1cdbd2cSJim Jagielski	my ($id) = @_;
38*b1cdbd2cSJim Jagielski
39*b1cdbd2cSJim Jagielski	return $id;
40*b1cdbd2cSJim Jagielski}
41*b1cdbd2cSJim Jagielski
42*b1cdbd2cSJim Jagielski##############################################################
43*b1cdbd2cSJim Jagielski# Returning the lastsequence for the media table.
44*b1cdbd2cSJim Jagielski##############################################################
45*b1cdbd2cSJim Jagielski
46*b1cdbd2cSJim Jagielskisub get_media_lastsequence
47*b1cdbd2cSJim Jagielski{
48*b1cdbd2cSJim Jagielski	my ($fileref) = @_;
49*b1cdbd2cSJim Jagielski
50*b1cdbd2cSJim Jagielski	return $fileref->{'sequencenumber'};
51*b1cdbd2cSJim Jagielski}
52*b1cdbd2cSJim Jagielski
53*b1cdbd2cSJim Jagielski##############################################################
54*b1cdbd2cSJim Jagielski# Returning the diskprompt for the media table.
55*b1cdbd2cSJim Jagielski##############################################################
56*b1cdbd2cSJim Jagielski
57*b1cdbd2cSJim Jagielskisub get_media_diskprompt
58*b1cdbd2cSJim Jagielski{
59*b1cdbd2cSJim Jagielski	return 1;
60*b1cdbd2cSJim Jagielski}
61*b1cdbd2cSJim Jagielski
62*b1cdbd2cSJim Jagielski##############################################################
63*b1cdbd2cSJim Jagielski# Returning the cabinet file name for the media table.
64*b1cdbd2cSJim Jagielski##############################################################
65*b1cdbd2cSJim Jagielski
66*b1cdbd2cSJim Jagielskisub get_media_cabinet
67*b1cdbd2cSJim Jagielski{
68*b1cdbd2cSJim Jagielski	my ($id) = @_;
69*b1cdbd2cSJim Jagielski
70*b1cdbd2cSJim Jagielski	my $number = 1000 + $id;
71*b1cdbd2cSJim Jagielski	my $filename = "f_" . $number . ".cab";
72*b1cdbd2cSJim Jagielski
73*b1cdbd2cSJim Jagielski	if ( $installer::globals::include_cab_in_msi ) { $filename = "\#" . $filename; }
74*b1cdbd2cSJim Jagielski
75*b1cdbd2cSJim Jagielski	return $filename;
76*b1cdbd2cSJim Jagielski}
77*b1cdbd2cSJim Jagielski
78*b1cdbd2cSJim Jagielski##############################################################
79*b1cdbd2cSJim Jagielski# Returning the volumelabel for the media table.
80*b1cdbd2cSJim Jagielski##############################################################
81*b1cdbd2cSJim Jagielski
82*b1cdbd2cSJim Jagielskisub get_media_volumelabel
83*b1cdbd2cSJim Jagielski{
84*b1cdbd2cSJim Jagielski	return "DISK1";
85*b1cdbd2cSJim Jagielski}
86*b1cdbd2cSJim Jagielski
87*b1cdbd2cSJim Jagielski##############################################################
88*b1cdbd2cSJim Jagielski# Returning the source for the media table.
89*b1cdbd2cSJim Jagielski##############################################################
90*b1cdbd2cSJim Jagielski
91*b1cdbd2cSJim Jagielskisub get_media_source
92*b1cdbd2cSJim Jagielski{
93*b1cdbd2cSJim Jagielski	return "";
94*b1cdbd2cSJim Jagielski}
95*b1cdbd2cSJim Jagielski
96*b1cdbd2cSJim Jagielski##############################################################
97*b1cdbd2cSJim Jagielski# Saving the cabinet file name in the files collector.
98*b1cdbd2cSJim Jagielski# This is useful for making a list to connect the
99*b1cdbd2cSJim Jagielski# source of each file with the destination cabinet file.
100*b1cdbd2cSJim Jagielski##############################################################
101*b1cdbd2cSJim Jagielski
102*b1cdbd2cSJim Jagielskisub set_cabinetfilename_for_component_in_file_collector
103*b1cdbd2cSJim Jagielski{
104*b1cdbd2cSJim Jagielski	my ($cabinetfilename, $filesref, $componentname, $max) = @_;
105*b1cdbd2cSJim Jagielski
106*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $max; $i++ )
107*b1cdbd2cSJim Jagielski	{
108*b1cdbd2cSJim Jagielski		my $onefile = ${$filesref}[$i];
109*b1cdbd2cSJim Jagielski		my $component = $onefile->{'componentname'};
110*b1cdbd2cSJim Jagielski
111*b1cdbd2cSJim Jagielski		if ( $component eq $componentname )
112*b1cdbd2cSJim Jagielski		{
113*b1cdbd2cSJim Jagielski			my $cabinet = "";
114*b1cdbd2cSJim Jagielski
115*b1cdbd2cSJim Jagielski			if ( $onefile->{'cabinet'} ) { $cabinet = $onefile->{'cabinet'}; }
116*b1cdbd2cSJim Jagielski
117*b1cdbd2cSJim Jagielski			if ( $cabinet eq "" )
118*b1cdbd2cSJim Jagielski			{
119*b1cdbd2cSJim Jagielski				$onefile->{'cabinet'} = $cabinetfilename;
120*b1cdbd2cSJim Jagielski			}
121*b1cdbd2cSJim Jagielski		}
122*b1cdbd2cSJim Jagielski	}
123*b1cdbd2cSJim Jagielski}
124*b1cdbd2cSJim Jagielski
125*b1cdbd2cSJim Jagielski#################################################
126*b1cdbd2cSJim Jagielski# Creating the cab file name dynamically
127*b1cdbd2cSJim Jagielski#################################################
128*b1cdbd2cSJim Jagielski
129*b1cdbd2cSJim Jagielskisub generate_cab_filename_for_some_cabs
130*b1cdbd2cSJim Jagielski{
131*b1cdbd2cSJim Jagielski	my ( $allvariables, $id ) = @_;
132*b1cdbd2cSJim Jagielski
133*b1cdbd2cSJim Jagielski	my $name = $allvariables->{'PRODUCTNAME'};
134*b1cdbd2cSJim Jagielski
135*b1cdbd2cSJim Jagielski	$name = lc($name);
136*b1cdbd2cSJim Jagielski	$name =~ s/\.//g;
137*b1cdbd2cSJim Jagielski	$name =~ s/\s//g;
138*b1cdbd2cSJim Jagielski
139*b1cdbd2cSJim Jagielski	# possibility to overwrite the name with variable CABFILENAME
140*b1cdbd2cSJim Jagielski	if ( $allvariables->{'CABFILENAME'} ) { $name = $allvariables->{'CABFILENAME'}; }
141*b1cdbd2cSJim Jagielski
142*b1cdbd2cSJim Jagielski	$name = $name . $id . ".cab";
143*b1cdbd2cSJim Jagielski
144*b1cdbd2cSJim Jagielski	if ( $installer::globals::include_cab_in_msi ) { $name = "\#" . $name; }
145*b1cdbd2cSJim Jagielski
146*b1cdbd2cSJim Jagielski	return $name;
147*b1cdbd2cSJim Jagielski}
148*b1cdbd2cSJim Jagielski
149*b1cdbd2cSJim Jagielski#################################################
150*b1cdbd2cSJim Jagielski# Creating the cab file name for cab files
151*b1cdbd2cSJim Jagielski# defined in packages.
152*b1cdbd2cSJim Jagielski#################################################
153*b1cdbd2cSJim Jagielski
154*b1cdbd2cSJim Jagielskisub get_cabfilename
155*b1cdbd2cSJim Jagielski{
156*b1cdbd2cSJim Jagielski	my ($name) = @_;
157*b1cdbd2cSJim Jagielski
158*b1cdbd2cSJim Jagielski	if ( $installer::globals::include_cab_in_msi ) { $name = "\#" . $name; }
159*b1cdbd2cSJim Jagielski
160*b1cdbd2cSJim Jagielski	return $name;
161*b1cdbd2cSJim Jagielski}
162*b1cdbd2cSJim Jagielski
163*b1cdbd2cSJim Jagielski#################################################
164*b1cdbd2cSJim Jagielski# Creating the cab file name dynamically
165*b1cdbd2cSJim Jagielski#################################################
166*b1cdbd2cSJim Jagielski
167*b1cdbd2cSJim Jagielskisub generate_cab_filename
168*b1cdbd2cSJim Jagielski{
169*b1cdbd2cSJim Jagielski	my ( $allvariables ) = @_;
170*b1cdbd2cSJim Jagielski
171*b1cdbd2cSJim Jagielski	my $name = $allvariables->{'PRODUCTNAME'};
172*b1cdbd2cSJim Jagielski
173*b1cdbd2cSJim Jagielski	$name = lc($name);
174*b1cdbd2cSJim Jagielski	$name =~ s/\.//g;
175*b1cdbd2cSJim Jagielski	$name =~ s/\s//g;
176*b1cdbd2cSJim Jagielski
177*b1cdbd2cSJim Jagielski	# possibility to overwrite the name with variable CABFILENAME
178*b1cdbd2cSJim Jagielski	if ( $allvariables->{'CABFILENAME'} ) { $name = $allvariables->{'CABFILENAME'}; }
179*b1cdbd2cSJim Jagielski
180*b1cdbd2cSJim Jagielski	$name = $name . ".cab";
181*b1cdbd2cSJim Jagielski
182*b1cdbd2cSJim Jagielski	if ( $installer::globals::include_cab_in_msi ) { $name = "\#" . $name; }
183*b1cdbd2cSJim Jagielski
184*b1cdbd2cSJim Jagielski	return $name;
185*b1cdbd2cSJim Jagielski}
186*b1cdbd2cSJim Jagielski
187*b1cdbd2cSJim Jagielskisub get_maximum_filenumber
188*b1cdbd2cSJim Jagielski{
189*b1cdbd2cSJim Jagielski	my ($allfiles, $maxcabfilenumber) = @_;
190*b1cdbd2cSJim Jagielski
191*b1cdbd2cSJim Jagielski	my $maxfile = 0;
192*b1cdbd2cSJim Jagielski
193*b1cdbd2cSJim Jagielski	while ( ! ( $allfiles%$maxcabfilenumber == 0 ))
194*b1cdbd2cSJim Jagielski	{
195*b1cdbd2cSJim Jagielski		$allfiles++;
196*b1cdbd2cSJim Jagielski	}
197*b1cdbd2cSJim Jagielski
198*b1cdbd2cSJim Jagielski	$maxfile = $allfiles / $maxcabfilenumber;
199*b1cdbd2cSJim Jagielski
200*b1cdbd2cSJim Jagielski	$maxfile++;					# for securitry
201*b1cdbd2cSJim Jagielski
202*b1cdbd2cSJim Jagielski	return $maxfile;
203*b1cdbd2cSJim Jagielski}
204*b1cdbd2cSJim Jagielski
205*b1cdbd2cSJim Jagielski#################################################################################
206*b1cdbd2cSJim Jagielski# Setting the last sequence for the cabinet files
207*b1cdbd2cSJim Jagielski#################################################################################
208*b1cdbd2cSJim Jagielski
209*b1cdbd2cSJim Jagielskisub get_last_sequence
210*b1cdbd2cSJim Jagielski{
211*b1cdbd2cSJim Jagielski	my ( $cabfilename, $alludpatelastsequences ) = @_;
212*b1cdbd2cSJim Jagielski
213*b1cdbd2cSJim Jagielski	my $sequence = $installer::globals::lastsequence{$cabfilename};
214*b1cdbd2cSJim Jagielski
215*b1cdbd2cSJim Jagielski	return $sequence;
216*b1cdbd2cSJim Jagielski}
217*b1cdbd2cSJim Jagielski
218*b1cdbd2cSJim Jagielski#################################################################################
219*b1cdbd2cSJim Jagielski# Creating the file Media.idt dynamically
220*b1cdbd2cSJim Jagielski# Content:
221*b1cdbd2cSJim Jagielski# DiskId LastSequence DiskPrompt Cabinet VolumeLabel Source
222*b1cdbd2cSJim Jagielski# Idea: Every component is packed into each own cab file
223*b1cdbd2cSJim Jagielski#################################################################################
224*b1cdbd2cSJim Jagielski
225*b1cdbd2cSJim Jagielskisub create_media_table
226*b1cdbd2cSJim Jagielski{
227*b1cdbd2cSJim Jagielski	my ($filesref, $basedir, $allvariables) = @_;
228*b1cdbd2cSJim Jagielski
229*b1cdbd2cSJim Jagielski	my @mediatable = ();
230*b1cdbd2cSJim Jagielski
231*b1cdbd2cSJim Jagielski	my $diskid = 0;
232*b1cdbd2cSJim Jagielski
233*b1cdbd2cSJim Jagielski	installer::windows::idtglobal::write_idt_header(\@mediatable, "media");
234*b1cdbd2cSJim Jagielski
235*b1cdbd2cSJim Jagielski	if ( $allvariables->{'INCLUDE_CAB_IN_MSI'} ) { $installer::globals::include_cab_in_msi = 1; }
236*b1cdbd2cSJim Jagielski
237*b1cdbd2cSJim Jagielski	if ( $installer::globals::fix_number_of_cab_files )
238*b1cdbd2cSJim Jagielski	{
239*b1cdbd2cSJim Jagielski		# number of cabfiles
240*b1cdbd2cSJim Jagielski		my $maxcabfilenumber = $installer::globals::number_of_cabfiles;
241*b1cdbd2cSJim Jagielski		if ( $allvariables->{'CABFILENUMBER'} ) { $maxcabfilenumber = $allvariables->{'CABFILENUMBER'}; }
242*b1cdbd2cSJim Jagielski		my $allfiles = $#{$filesref} + 1;
243*b1cdbd2cSJim Jagielski		my $maxfilenumber = get_maximum_filenumber($allfiles, $maxcabfilenumber);
244*b1cdbd2cSJim Jagielski		# my $maxfilenumber = 1000;	# maximum 1000 files in each cabinet file
245*b1cdbd2cSJim Jagielski		my $cabfilenumber = 0;
246*b1cdbd2cSJim Jagielski		my $cabfull = 0;
247*b1cdbd2cSJim Jagielski		my $counter = 0;
248*b1cdbd2cSJim Jagielski
249*b1cdbd2cSJim Jagielski		# Sorting of files collector files required !
250*b1cdbd2cSJim Jagielski		# Attention: The order in the cab file is not guaranteed (especially in udpate process)
251*b1cdbd2cSJim Jagielski
252*b1cdbd2cSJim Jagielski		for ( my $i = 0; $i <= $#{$filesref}; $i++ )
253*b1cdbd2cSJim Jagielski		{
254*b1cdbd2cSJim Jagielski			if (( $counter >= $maxfilenumber ) || ( $i == $#{$filesref} )) { $cabfull = 1; }
255*b1cdbd2cSJim Jagielski
256*b1cdbd2cSJim Jagielski			$counter++; 	 # counting the files in the cab file
257*b1cdbd2cSJim Jagielski
258*b1cdbd2cSJim Jagielski			my $onefile = ${$filesref}[$i];
259*b1cdbd2cSJim Jagielski			my $nextfile = ${$filesref}[$i+1];
260*b1cdbd2cSJim Jagielski
261*b1cdbd2cSJim Jagielski			my $filecomponent = "";
262*b1cdbd2cSJim Jagielski			my $nextcomponent = "";
263*b1cdbd2cSJim Jagielski
264*b1cdbd2cSJim Jagielski			if ( $onefile->{'componentname'} ) { $filecomponent = $onefile->{'componentname'}; }
265*b1cdbd2cSJim Jagielski			if ( $nextfile->{'componentname'} ) { $nextcomponent = $nextfile->{'componentname'}; }
266*b1cdbd2cSJim Jagielski
267*b1cdbd2cSJim Jagielski			if ( $filecomponent eq $nextcomponent )	# all files of one component have to be in one cab file
268*b1cdbd2cSJim Jagielski			{
269*b1cdbd2cSJim Jagielski				next;		# nothing to do, this is not the last file of a component
270*b1cdbd2cSJim Jagielski			}
271*b1cdbd2cSJim Jagielski
272*b1cdbd2cSJim Jagielski			if ( $cabfull )
273*b1cdbd2cSJim Jagielski			{
274*b1cdbd2cSJim Jagielski				my %media = ();
275*b1cdbd2cSJim Jagielski				$cabfilenumber++;
276*b1cdbd2cSJim Jagielski
277*b1cdbd2cSJim Jagielski				$media{'DiskId'} = get_media_diskid($cabfilenumber);
278*b1cdbd2cSJim Jagielski				# $media{'LastSequence'} = get_media_lastsequence($onefile);
279*b1cdbd2cSJim Jagielski				$media{'LastSequence'} = $i + 1;	# This should be correct, also for unsorted files collectors
280*b1cdbd2cSJim Jagielski				$media{'DiskPrompt'} = get_media_diskprompt();
281*b1cdbd2cSJim Jagielski				$media{'Cabinet'} = generate_cab_filename_for_some_cabs($allvariables, $cabfilenumber);
282*b1cdbd2cSJim Jagielski				$media{'VolumeLabel'} = get_media_volumelabel();
283*b1cdbd2cSJim Jagielski				$media{'Source'} = get_media_source();
284*b1cdbd2cSJim Jagielski
285*b1cdbd2cSJim Jagielski				my $oneline = $media{'DiskId'} . "\t" . $media{'LastSequence'} . "\t" . $media{'DiskPrompt'} . "\t"
286*b1cdbd2cSJim Jagielski						. $media{'Cabinet'} . "\t" . $media{'VolumeLabel'} . "\t" . $media{'Source'} . "\n";
287*b1cdbd2cSJim Jagielski
288*b1cdbd2cSJim Jagielski				push(@mediatable, $oneline);
289*b1cdbd2cSJim Jagielski
290*b1cdbd2cSJim Jagielski				# Saving the cabinet file name in the file collector
291*b1cdbd2cSJim Jagielski
292*b1cdbd2cSJim Jagielski				$media{'Cabinet'} =~ s/^\s*\#//;	# removing leading hash
293*b1cdbd2cSJim Jagielski
294*b1cdbd2cSJim Jagielski				for ( my $j = 0; $j <= $i; $j++ )
295*b1cdbd2cSJim Jagielski				{
296*b1cdbd2cSJim Jagielski					my $onefile = ${$filesref}[$j];
297*b1cdbd2cSJim Jagielski					if ( ! $onefile->{'cabinet'} ) { $onefile->{'cabinet'} = $media{'Cabinet'}; }
298*b1cdbd2cSJim Jagielski				}
299*b1cdbd2cSJim Jagielski
300*b1cdbd2cSJim Jagielski				$cabfull = 0;
301*b1cdbd2cSJim Jagielski				$counter = 0;
302*b1cdbd2cSJim Jagielski			}
303*b1cdbd2cSJim Jagielski		}
304*b1cdbd2cSJim Jagielski	}
305*b1cdbd2cSJim Jagielski	else
306*b1cdbd2cSJim Jagielski	{
307*b1cdbd2cSJim Jagielski		installer::exiter::exit_program("ERROR: No cab file specification in globals.pm !", "create_media_table");
308*b1cdbd2cSJim Jagielski	}
309*b1cdbd2cSJim Jagielski
310*b1cdbd2cSJim Jagielski	# Saving the file
311*b1cdbd2cSJim Jagielski
312*b1cdbd2cSJim Jagielski	my $mediatablename = $basedir . $installer::globals::separator . "Media.idt";
313*b1cdbd2cSJim Jagielski	installer::files::save_file($mediatablename ,\@mediatable);
314*b1cdbd2cSJim Jagielski    $installer::logger::Lang->printf("Created idt file: %s\n", $mediatablename);
315*b1cdbd2cSJim Jagielski}
316*b1cdbd2cSJim Jagielski
317*b1cdbd2cSJim Jagielski1;
318