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