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::assembly; 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielskiuse installer::files; 27*b1cdbd2cSJim Jagielskiuse installer::globals; 28*b1cdbd2cSJim Jagielskiuse installer::worker; 29*b1cdbd2cSJim Jagielskiuse installer::windows::idtglobal; 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielskiuse strict; 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski############################################################## 34*b1cdbd2cSJim Jagielski# Returning the first module of a file from the 35*b1cdbd2cSJim Jagielski# comma separated list of modules. 36*b1cdbd2cSJim Jagielski############################################################## 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielskisub get_msiassembly_feature 39*b1cdbd2cSJim Jagielski{ 40*b1cdbd2cSJim Jagielski my ( $onefile ) = @_; 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski my $module = ""; 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski if ( $onefile->{'modules'} ) { $module = $onefile->{'modules'}; } 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski # If modules contains a list of modules, only taking the first one. 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski if ( $module =~ /^\s*(.*?)\,/ ) { $module = $1; } 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski # Attention: Maximum feature length is 38! 51*b1cdbd2cSJim Jagielski installer::windows::idtglobal::shorten_feature_gid(\$module); 52*b1cdbd2cSJim Jagielski 53*b1cdbd2cSJim Jagielski return $module; 54*b1cdbd2cSJim Jagielski} 55*b1cdbd2cSJim Jagielski 56*b1cdbd2cSJim Jagielski############################################################## 57*b1cdbd2cSJim Jagielski# Returning the component of a file. 58*b1cdbd2cSJim Jagielski############################################################## 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielskisub get_msiassembly_component 61*b1cdbd2cSJim Jagielski{ 62*b1cdbd2cSJim Jagielski my ( $onefile ) = @_; 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski my $component = ""; 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski $component = $onefile->{'componentname'}; 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielski return $component; 69*b1cdbd2cSJim Jagielski} 70*b1cdbd2cSJim Jagielski 71*b1cdbd2cSJim Jagielski############################################################## 72*b1cdbd2cSJim Jagielski# Returning the file name as manifest file 73*b1cdbd2cSJim Jagielski############################################################## 74*b1cdbd2cSJim Jagielski 75*b1cdbd2cSJim Jagielskisub get_msiassembly_filemanifest 76*b1cdbd2cSJim Jagielski{ 77*b1cdbd2cSJim Jagielski my ( $onefile ) = @_; 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielski my $filemanifest = ""; 80*b1cdbd2cSJim Jagielski 81*b1cdbd2cSJim Jagielski $filemanifest = $onefile->{'uniquename'}; 82*b1cdbd2cSJim Jagielski # $filemanifest = $onefile->{'Name'}; 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski return $filemanifest; 85*b1cdbd2cSJim Jagielski} 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski############################################################## 89*b1cdbd2cSJim Jagielski# Returning the file application 90*b1cdbd2cSJim Jagielski############################################################## 91*b1cdbd2cSJim Jagielski 92*b1cdbd2cSJim Jagielskisub get_msiassembly_fileapplication 93*b1cdbd2cSJim Jagielski{ 94*b1cdbd2cSJim Jagielski my ( $onefile ) = @_; 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski my $fileapplication = ""; 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski return $fileapplication; 99*b1cdbd2cSJim Jagielski} 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski############################################################## 102*b1cdbd2cSJim Jagielski# Returning the file attributes 103*b1cdbd2cSJim Jagielski############################################################## 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielskisub get_msiassembly_attributes 106*b1cdbd2cSJim Jagielski{ 107*b1cdbd2cSJim Jagielski my ( $onefile ) = @_; 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim Jagielski my $fileattributes = ""; 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski if ( $onefile->{'Attributes'} ne "" ) { $fileattributes = $onefile->{'Attributes'}; } 112*b1cdbd2cSJim Jagielski 113*b1cdbd2cSJim Jagielski return $fileattributes; 114*b1cdbd2cSJim Jagielski} 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski############################################################## 117*b1cdbd2cSJim Jagielski# Returning the file object for the msiassembly table. 118*b1cdbd2cSJim Jagielski############################################################## 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielskisub get_msiassembly_file 121*b1cdbd2cSJim Jagielski{ 122*b1cdbd2cSJim Jagielski my ( $filesref, $filename ) = @_; 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski my $foundfile = 0; 125*b1cdbd2cSJim Jagielski my $onefile; 126*b1cdbd2cSJim Jagielski 127*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$filesref}; $i++ ) 128*b1cdbd2cSJim Jagielski { 129*b1cdbd2cSJim Jagielski $onefile = ${$filesref}[$i]; 130*b1cdbd2cSJim Jagielski my $name = $onefile->{'Name'}; 131*b1cdbd2cSJim Jagielski 132*b1cdbd2cSJim Jagielski if ( $name eq $filename ) 133*b1cdbd2cSJim Jagielski { 134*b1cdbd2cSJim Jagielski $foundfile = 1; 135*b1cdbd2cSJim Jagielski last; 136*b1cdbd2cSJim Jagielski } 137*b1cdbd2cSJim Jagielski } 138*b1cdbd2cSJim Jagielski 139*b1cdbd2cSJim Jagielski # It does not need to exist. For example products that do not contain the libraries. 140*b1cdbd2cSJim Jagielski # if (! $foundfile ) { installer::exiter::exit_program("ERROR: No unique file name found for $filename !", "get_selfreg_file"); } 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski if (! $foundfile ) { $onefile = ""; } 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski return $onefile; 145*b1cdbd2cSJim Jagielski} 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski############################################################## 148*b1cdbd2cSJim Jagielski# Returning the file object for the msiassembly table. 149*b1cdbd2cSJim Jagielski############################################################## 150*b1cdbd2cSJim Jagielski 151*b1cdbd2cSJim Jagielskisub get_msiassembly_file_by_gid 152*b1cdbd2cSJim Jagielski{ 153*b1cdbd2cSJim Jagielski my ( $filesref, $gid ) = @_; 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski my $foundfile = 0; 156*b1cdbd2cSJim Jagielski my $onefile; 157*b1cdbd2cSJim Jagielski 158*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$filesref}; $i++ ) 159*b1cdbd2cSJim Jagielski { 160*b1cdbd2cSJim Jagielski $onefile = ${$filesref}[$i]; 161*b1cdbd2cSJim Jagielski my $filegid = $onefile->{'gid'}; 162*b1cdbd2cSJim Jagielski 163*b1cdbd2cSJim Jagielski if ( $filegid eq $gid ) 164*b1cdbd2cSJim Jagielski { 165*b1cdbd2cSJim Jagielski $foundfile = 1; 166*b1cdbd2cSJim Jagielski last; 167*b1cdbd2cSJim Jagielski } 168*b1cdbd2cSJim Jagielski } 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski # It does not need to exist. For example products that do not contain the libraries. 171*b1cdbd2cSJim Jagielski # if (! $foundfile ) { installer::exiter::exit_program("ERROR: No unique file name found for $filename !", "get_selfreg_file"); } 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielski if (! $foundfile ) { $onefile = ""; } 174*b1cdbd2cSJim Jagielski 175*b1cdbd2cSJim Jagielski return $onefile; 176*b1cdbd2cSJim Jagielski} 177*b1cdbd2cSJim Jagielski 178*b1cdbd2cSJim Jagielski#################################################################################### 179*b1cdbd2cSJim Jagielski# Creating the file MsiAssembly.idt dynamically 180*b1cdbd2cSJim Jagielski# Content: 181*b1cdbd2cSJim Jagielski# Component_ Feature_ File_Manifest File_Application Attributes 182*b1cdbd2cSJim Jagielski# s72 s38 S72 S72 I2 183*b1cdbd2cSJim Jagielski# MsiAssembly Component_ 184*b1cdbd2cSJim Jagielski#################################################################################### 185*b1cdbd2cSJim Jagielski 186*b1cdbd2cSJim Jagielskisub create_msiassembly_table 187*b1cdbd2cSJim Jagielski{ 188*b1cdbd2cSJim Jagielski my ($filesref, $basedir) = @_; 189*b1cdbd2cSJim Jagielski 190*b1cdbd2cSJim Jagielski $installer::globals::msiassemblyfiles = installer::worker::collect_all_items_with_special_flag($filesref, "ASSEMBLY"); 191*b1cdbd2cSJim Jagielski 192*b1cdbd2cSJim Jagielski my @msiassemblytable = (); 193*b1cdbd2cSJim Jagielski 194*b1cdbd2cSJim Jagielski installer::windows::idtglobal::write_idt_header(\@msiassemblytable, "msiassembly"); 195*b1cdbd2cSJim Jagielski 196*b1cdbd2cSJim Jagielski # Registering all libraries listed in $installer::globals::msiassemblyfiles 197*b1cdbd2cSJim Jagielski 198*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$installer::globals::msiassemblyfiles}; $i++ ) 199*b1cdbd2cSJim Jagielski { 200*b1cdbd2cSJim Jagielski my $onefile = ${$installer::globals::msiassemblyfiles}[$i]; 201*b1cdbd2cSJim Jagielski 202*b1cdbd2cSJim Jagielski my %msiassembly = (); 203*b1cdbd2cSJim Jagielski 204*b1cdbd2cSJim Jagielski $msiassembly{'Component_'} = get_msiassembly_component($onefile); 205*b1cdbd2cSJim Jagielski $msiassembly{'Feature_'} = get_msiassembly_feature($onefile); 206*b1cdbd2cSJim Jagielski $msiassembly{'File_Manifest'} = get_msiassembly_filemanifest($onefile); 207*b1cdbd2cSJim Jagielski $msiassembly{'File_Application'} = get_msiassembly_fileapplication($onefile); 208*b1cdbd2cSJim Jagielski $msiassembly{'Attributes'} = get_msiassembly_attributes($onefile); 209*b1cdbd2cSJim Jagielski 210*b1cdbd2cSJim Jagielski my $oneline = $msiassembly{'Component_'} . "\t" . $msiassembly{'Feature_'} . "\t" . 211*b1cdbd2cSJim Jagielski $msiassembly{'File_Manifest'} . "\t" . $msiassembly{'File_Application'} . "\t" . 212*b1cdbd2cSJim Jagielski $msiassembly{'Attributes'} . "\n"; 213*b1cdbd2cSJim Jagielski 214*b1cdbd2cSJim Jagielski push(@msiassemblytable, $oneline); 215*b1cdbd2cSJim Jagielski } 216*b1cdbd2cSJim Jagielski 217*b1cdbd2cSJim Jagielski # Saving the file 218*b1cdbd2cSJim Jagielski 219*b1cdbd2cSJim Jagielski my $msiassemblytablename = $basedir . $installer::globals::separator . "MsiAssem.idt"; 220*b1cdbd2cSJim Jagielski installer::files::save_file($msiassemblytablename ,\@msiassemblytable); 221*b1cdbd2cSJim Jagielski my $infoline = "Created idt file: $msiassemblytablename\n"; 222*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 223*b1cdbd2cSJim Jagielski} 224*b1cdbd2cSJim Jagielski 225*b1cdbd2cSJim Jagielski#################################################################################### 226*b1cdbd2cSJim Jagielski# Returning the name for the table MsiAssemblyName 227*b1cdbd2cSJim Jagielski#################################################################################### 228*b1cdbd2cSJim Jagielski 229*b1cdbd2cSJim Jagielskisub get_msiassemblyname_name ($) 230*b1cdbd2cSJim Jagielski{ 231*b1cdbd2cSJim Jagielski my ($number) = @_; 232*b1cdbd2cSJim Jagielski 233*b1cdbd2cSJim Jagielski my $name = ""; 234*b1cdbd2cSJim Jagielski 235*b1cdbd2cSJim Jagielski if ( $number == 1 ) { $name = "name"; } 236*b1cdbd2cSJim Jagielski elsif ( $number == 2 ) { $name = "publicKeyToken"; } 237*b1cdbd2cSJim Jagielski elsif ( $number == 3 ) { $name = "version"; } 238*b1cdbd2cSJim Jagielski elsif ( $number == 4 ) { $name = "culture"; } 239*b1cdbd2cSJim Jagielski 240*b1cdbd2cSJim Jagielski return $name; 241*b1cdbd2cSJim Jagielski} 242*b1cdbd2cSJim Jagielski 243*b1cdbd2cSJim Jagielski#################################################################################### 244*b1cdbd2cSJim Jagielski# Creating the file MsiAssemblyName.idt dynamically 245*b1cdbd2cSJim Jagielski# Content: 246*b1cdbd2cSJim Jagielski# Component_ Name Value 247*b1cdbd2cSJim Jagielski# s72 s255 s255 248*b1cdbd2cSJim Jagielski# MsiAssemblyName Component_ Name 249*b1cdbd2cSJim Jagielski#################################################################################### 250*b1cdbd2cSJim Jagielski 251*b1cdbd2cSJim Jagielskisub create_msiassemblyname_table 252*b1cdbd2cSJim Jagielski{ 253*b1cdbd2cSJim Jagielski my ($filesref, $basedir) = @_; 254*b1cdbd2cSJim Jagielski 255*b1cdbd2cSJim Jagielski my @msiassemblynametable = (); 256*b1cdbd2cSJim Jagielski 257*b1cdbd2cSJim Jagielski installer::windows::idtglobal::write_idt_header(\@msiassemblynametable, "msiassemblyname"); 258*b1cdbd2cSJim Jagielski 259*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$installer::globals::msiassemblyfiles}; $i++ ) 260*b1cdbd2cSJim Jagielski { 261*b1cdbd2cSJim Jagielski my $onefile = ${$installer::globals::msiassemblyfiles}[$i]; 262*b1cdbd2cSJim Jagielski 263*b1cdbd2cSJim Jagielski my $component = get_msiassembly_component($onefile); 264*b1cdbd2cSJim Jagielski my $oneline = ""; 265*b1cdbd2cSJim Jagielski 266*b1cdbd2cSJim Jagielski # Order: (Assembly)name, publicKeyToken, version, culture. 267*b1cdbd2cSJim Jagielski 268*b1cdbd2cSJim Jagielski if ( $onefile->{'Assemblyname'} ) 269*b1cdbd2cSJim Jagielski { 270*b1cdbd2cSJim Jagielski $oneline = $component . "\t" . "name" . "\t" . $onefile->{'Assemblyname'} . "\n"; 271*b1cdbd2cSJim Jagielski push(@msiassemblynametable, $oneline); 272*b1cdbd2cSJim Jagielski } 273*b1cdbd2cSJim Jagielski 274*b1cdbd2cSJim Jagielski if ( $onefile->{'PublicKeyToken'} ) 275*b1cdbd2cSJim Jagielski { 276*b1cdbd2cSJim Jagielski $oneline = $component . "\t" . "publicKeyToken" . "\t" . $onefile->{'PublicKeyToken'} . "\n"; 277*b1cdbd2cSJim Jagielski push(@msiassemblynametable, $oneline); 278*b1cdbd2cSJim Jagielski } 279*b1cdbd2cSJim Jagielski 280*b1cdbd2cSJim Jagielski if ( $onefile->{'Version'} ) 281*b1cdbd2cSJim Jagielski { 282*b1cdbd2cSJim Jagielski $oneline = $component . "\t" . "version" . "\t" . $onefile->{'Version'} . "\n"; 283*b1cdbd2cSJim Jagielski push(@msiassemblynametable, $oneline); 284*b1cdbd2cSJim Jagielski } 285*b1cdbd2cSJim Jagielski 286*b1cdbd2cSJim Jagielski if ( $onefile->{'Culture'} ) 287*b1cdbd2cSJim Jagielski { 288*b1cdbd2cSJim Jagielski $oneline = $component . "\t" . "culture" . "\t" . $onefile->{'Culture'} . "\n"; 289*b1cdbd2cSJim Jagielski push(@msiassemblynametable, $oneline); 290*b1cdbd2cSJim Jagielski } 291*b1cdbd2cSJim Jagielski 292*b1cdbd2cSJim Jagielski if ( $onefile->{'ProcessorArchitecture'} ) 293*b1cdbd2cSJim Jagielski { 294*b1cdbd2cSJim Jagielski $oneline = $component . "\t" . "processorArchitecture" . "\t" . $onefile->{'ProcessorArchitecture'} . "\n"; 295*b1cdbd2cSJim Jagielski push(@msiassemblynametable, $oneline); 296*b1cdbd2cSJim Jagielski } 297*b1cdbd2cSJim Jagielski } 298*b1cdbd2cSJim Jagielski 299*b1cdbd2cSJim Jagielski # Saving the file 300*b1cdbd2cSJim Jagielski 301*b1cdbd2cSJim Jagielski my $msiassemblynametablename = $basedir . $installer::globals::separator . "MsiAsseN.idt"; 302*b1cdbd2cSJim Jagielski installer::files::save_file($msiassemblynametablename ,\@msiassemblynametable); 303*b1cdbd2cSJim Jagielski my $infoline = "Created idt file: $msiassemblynametablename\n"; 304*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 305*b1cdbd2cSJim Jagielski 306*b1cdbd2cSJim Jagielski} 307*b1cdbd2cSJim Jagielski 308*b1cdbd2cSJim Jagielski#################################################################################### 309*b1cdbd2cSJim Jagielski# setting an installation condition for the assembly libraries saved in 310*b1cdbd2cSJim Jagielski# @installer::globals::msiassemblynamecontent 311*b1cdbd2cSJim Jagielski#################################################################################### 312*b1cdbd2cSJim Jagielski 313*b1cdbd2cSJim Jagielskisub add_assembly_condition_into_component_table 314*b1cdbd2cSJim Jagielski{ 315*b1cdbd2cSJim Jagielski my ($filesref, $basedir) = @_; 316*b1cdbd2cSJim Jagielski 317*b1cdbd2cSJim Jagielski my $componenttablename = $basedir . $installer::globals::separator . "Componen.idt"; 318*b1cdbd2cSJim Jagielski my $componenttable = installer::files::read_file($componenttablename); 319*b1cdbd2cSJim Jagielski my $changed = 0; 320*b1cdbd2cSJim Jagielski 321*b1cdbd2cSJim Jagielski foreach my $onefile (@$installer::globals::msiassemblyfiles) 322*b1cdbd2cSJim Jagielski { 323*b1cdbd2cSJim Jagielski my $filecomponent = get_msiassembly_component($onefile); 324*b1cdbd2cSJim Jagielski 325*b1cdbd2cSJim Jagielski for ( my $j = 0; $j <= $#{$componenttable}; $j++ ) 326*b1cdbd2cSJim Jagielski { 327*b1cdbd2cSJim Jagielski my $oneline = ${$componenttable}[$j]; 328*b1cdbd2cSJim Jagielski 329*b1cdbd2cSJim Jagielski if ( $oneline =~ /(.*)\t(.*)\t(.*)\t(.*)\t(.*)\t(.*)/ ) 330*b1cdbd2cSJim Jagielski { 331*b1cdbd2cSJim Jagielski my $component = $1; 332*b1cdbd2cSJim Jagielski my $componentid = $2; 333*b1cdbd2cSJim Jagielski my $directory = $3; 334*b1cdbd2cSJim Jagielski my $attributes = $4; 335*b1cdbd2cSJim Jagielski my $condition = $5; 336*b1cdbd2cSJim Jagielski my $keypath = $6; 337*b1cdbd2cSJim Jagielski 338*b1cdbd2cSJim Jagielski if ( $component eq $filecomponent ) 339*b1cdbd2cSJim Jagielski { 340*b1cdbd2cSJim Jagielski # setting the condition 341*b1cdbd2cSJim Jagielski 342*b1cdbd2cSJim Jagielski # $condition = "MsiNetAssemblySupport"; 343*b1cdbd2cSJim Jagielski $condition = "DOTNET_SUFFICIENT=1"; 344*b1cdbd2cSJim Jagielski $oneline = join("\t", 345*b1cdbd2cSJim Jagielski $component, 346*b1cdbd2cSJim Jagielski $componentid, 347*b1cdbd2cSJim Jagielski $directory, 348*b1cdbd2cSJim Jagielski $attributes, 349*b1cdbd2cSJim Jagielski $condition, 350*b1cdbd2cSJim Jagielski $keypath) . "\n"; 351*b1cdbd2cSJim Jagielski ${$componenttable}[$j] = $oneline; 352*b1cdbd2cSJim Jagielski $changed = 1; 353*b1cdbd2cSJim Jagielski 354*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Changing %s :\n", $componenttablename); 355*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($oneline); 356*b1cdbd2cSJim Jagielski 357*b1cdbd2cSJim Jagielski last; 358*b1cdbd2cSJim Jagielski } 359*b1cdbd2cSJim Jagielski } 360*b1cdbd2cSJim Jagielski } 361*b1cdbd2cSJim Jagielski } 362*b1cdbd2cSJim Jagielski 363*b1cdbd2cSJim Jagielski if ( $changed ) 364*b1cdbd2cSJim Jagielski { 365*b1cdbd2cSJim Jagielski # Saving the file 366*b1cdbd2cSJim Jagielski installer::files::save_file($componenttablename ,$componenttable); 367*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Saved idt file: %s\n", $componenttablename); 368*b1cdbd2cSJim Jagielski } 369*b1cdbd2cSJim Jagielski} 370*b1cdbd2cSJim Jagielski 371*b1cdbd2cSJim Jagielski1; 372