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::component; 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielskiuse installer::converter; 27*b1cdbd2cSJim Jagielskiuse installer::existence; 28*b1cdbd2cSJim Jagielskiuse installer::exiter; 29*b1cdbd2cSJim Jagielskiuse installer::files; 30*b1cdbd2cSJim Jagielskiuse installer::globals; 31*b1cdbd2cSJim Jagielskiuse installer::windows::idtglobal; 32*b1cdbd2cSJim Jagielskiuse installer::windows::language; 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielskiuse strict; 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski############################################################## 37*b1cdbd2cSJim Jagielski# Returning a globally unique ID (GUID) for a component 38*b1cdbd2cSJim Jagielski# If the component is new, a unique guid has to be created. 39*b1cdbd2cSJim Jagielski# If the component already exists, the guid has to be 40*b1cdbd2cSJim Jagielski# taken from a list component <-> guid 41*b1cdbd2cSJim Jagielski# Sample for a guid: {B68FD953-3CEF-4489-8269-8726848056E8} 42*b1cdbd2cSJim Jagielski############################################################## 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielskisub get_component_guid ($) 45*b1cdbd2cSJim Jagielski{ 46*b1cdbd2cSJim Jagielski my ($componentname) = @_; 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski # At this time only a template 49*b1cdbd2cSJim Jagielski my $returnvalue = "\{COMPONENTGUID\}"; 50*b1cdbd2cSJim Jagielski 51*b1cdbd2cSJim Jagielski # Returning a ComponentID, that is assigned in scp project 52*b1cdbd2cSJim Jagielski if ( exists($installer::globals::componentid{$componentname}) ) 53*b1cdbd2cSJim Jagielski { 54*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("reusing guid %s for component %s\n", 55*b1cdbd2cSJim Jagielski $installer::globals::componentid{$componentname}, 56*b1cdbd2cSJim Jagielski $componentname); 57*b1cdbd2cSJim Jagielski $returnvalue = "\{" . $installer::globals::componentid{$componentname} . "\}"; 58*b1cdbd2cSJim Jagielski } 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski return $returnvalue; 61*b1cdbd2cSJim Jagielski} 62*b1cdbd2cSJim Jagielski 63*b1cdbd2cSJim Jagielski############################################################## 64*b1cdbd2cSJim Jagielski# Returning the directory for a file component. 65*b1cdbd2cSJim Jagielski############################################################## 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielskisub get_file_component_directory ($$$) 68*b1cdbd2cSJim Jagielski{ 69*b1cdbd2cSJim Jagielski my ($componentname, $filesref, $dirref) = @_; 70*b1cdbd2cSJim Jagielski 71*b1cdbd2cSJim Jagielski my ($component, $uniquedir); 72*b1cdbd2cSJim Jagielski 73*b1cdbd2cSJim Jagielski foreach my $onefile (@$filesref) 74*b1cdbd2cSJim Jagielski { 75*b1cdbd2cSJim Jagielski if ($onefile->{'componentname'} eq $componentname) 76*b1cdbd2cSJim Jagielski { 77*b1cdbd2cSJim Jagielski return get_file_component_directory_for_file($onefile, $dirref); 78*b1cdbd2cSJim Jagielski } 79*b1cdbd2cSJim Jagielski } 80*b1cdbd2cSJim Jagielski 81*b1cdbd2cSJim Jagielski # This component can be ignored, if it exists in a version with 82*b1cdbd2cSJim Jagielski # extension "_pff" (this was renamed in file::get_sequence_for_file() ) 83*b1cdbd2cSJim Jagielski my $ignore_this_component = 0; 84*b1cdbd2cSJim Jagielski my $origcomponentname = $componentname; 85*b1cdbd2cSJim Jagielski my $componentname_pff = $componentname . "_pff"; 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski foreach my $onefile (@$filesref) 88*b1cdbd2cSJim Jagielski { 89*b1cdbd2cSJim Jagielski if ($onefile->{'componentname'} eq $componentname_pff) 90*b1cdbd2cSJim Jagielski { 91*b1cdbd2cSJim Jagielski return "IGNORE_COMP"; 92*b1cdbd2cSJim Jagielski } 93*b1cdbd2cSJim Jagielski } 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski installer::exiter::exit_program( 96*b1cdbd2cSJim Jagielski "ERROR: Did not find component \"$origcomponentname\" in file collection", 97*b1cdbd2cSJim Jagielski "get_file_component_directory"); 98*b1cdbd2cSJim Jagielski} 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski 103*b1cdbd2cSJim Jagielskisub get_file_component_directory_for_file ($$) 104*b1cdbd2cSJim Jagielski{ 105*b1cdbd2cSJim Jagielski my ($onefile, $dirref) = @_; 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski my $localstyles = $onefile->{'Styles'}; 108*b1cdbd2cSJim Jagielski $localstyles = "" unless defined $localstyles; 109*b1cdbd2cSJim Jagielski 110*b1cdbd2cSJim Jagielski if ( $localstyles =~ /\bFONT\b/ ) # special handling for font files 111*b1cdbd2cSJim Jagielski { 112*b1cdbd2cSJim Jagielski return $installer::globals::fontsfolder; 113*b1cdbd2cSJim Jagielski } 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski my $destdir = ""; 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski if ( $onefile->{'Dir'} ) { $destdir = $onefile->{'Dir'}; } 118*b1cdbd2cSJim Jagielski 119*b1cdbd2cSJim Jagielski if ( $destdir =~ /\bPREDEFINED_OSSHELLNEWDIR\b/ ) # special handling for shellnew files 120*b1cdbd2cSJim Jagielski { 121*b1cdbd2cSJim Jagielski return $installer::globals::templatefolder; 122*b1cdbd2cSJim Jagielski } 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski my $destination = $onefile->{'destination'}; 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski installer::pathanalyzer::get_path_from_fullqualifiedname(\$destination); 127*b1cdbd2cSJim Jagielski 128*b1cdbd2cSJim Jagielski $destination =~ s/\Q$installer::globals::separator\E\s*$//; 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski # This path has to be defined in the directory collection at "HostName" 131*b1cdbd2cSJim Jagielski 132*b1cdbd2cSJim Jagielski my $uniquedir = undef; 133*b1cdbd2cSJim Jagielski if ($destination eq "") # files in the installation root 134*b1cdbd2cSJim Jagielski { 135*b1cdbd2cSJim Jagielski $uniquedir = "INSTALLLOCATION"; 136*b1cdbd2cSJim Jagielski } 137*b1cdbd2cSJim Jagielski else 138*b1cdbd2cSJim Jagielski { 139*b1cdbd2cSJim Jagielski my $found = 0; 140*b1cdbd2cSJim Jagielski foreach my $directory (@$dirref) 141*b1cdbd2cSJim Jagielski { 142*b1cdbd2cSJim Jagielski if ($directory->{'HostName'} eq $destination) 143*b1cdbd2cSJim Jagielski { 144*b1cdbd2cSJim Jagielski $found = 1; 145*b1cdbd2cSJim Jagielski $uniquedir = $directory->{'uniquename'}; 146*b1cdbd2cSJim Jagielski last; 147*b1cdbd2cSJim Jagielski } 148*b1cdbd2cSJim Jagielski } 149*b1cdbd2cSJim Jagielski 150*b1cdbd2cSJim Jagielski if ( ! $found) 151*b1cdbd2cSJim Jagielski { 152*b1cdbd2cSJim Jagielski installer::exiter::exit_program( 153*b1cdbd2cSJim Jagielski "ERROR: Did not find destination $destination in directory collection", 154*b1cdbd2cSJim Jagielski "get_file_component_directory"); 155*b1cdbd2cSJim Jagielski } 156*b1cdbd2cSJim Jagielski 157*b1cdbd2cSJim Jagielski if ( $uniquedir eq $installer::globals::officeinstalldirectory ) 158*b1cdbd2cSJim Jagielski { 159*b1cdbd2cSJim Jagielski $uniquedir = "INSTALLLOCATION"; 160*b1cdbd2cSJim Jagielski } 161*b1cdbd2cSJim Jagielski } 162*b1cdbd2cSJim Jagielski 163*b1cdbd2cSJim Jagielski $onefile->{'uniquedirname'} = $uniquedir; # saving it in the file collection 164*b1cdbd2cSJim Jagielski 165*b1cdbd2cSJim Jagielski return $uniquedir 166*b1cdbd2cSJim Jagielski} 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski############################################################## 169*b1cdbd2cSJim Jagielski# Returning the directory for a registry component. 170*b1cdbd2cSJim Jagielski# This cannot be a useful value 171*b1cdbd2cSJim Jagielski############################################################## 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielskisub get_registry_component_directory 174*b1cdbd2cSJim Jagielski{ 175*b1cdbd2cSJim Jagielski my $componentdir = "INSTALLLOCATION"; 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski return $componentdir; 178*b1cdbd2cSJim Jagielski} 179*b1cdbd2cSJim Jagielski 180*b1cdbd2cSJim Jagielski############################################################## 181*b1cdbd2cSJim Jagielski# Returning the attributes for a file component. 182*b1cdbd2cSJim Jagielski# Always 8 in this first try? 183*b1cdbd2cSJim Jagielski############################################################## 184*b1cdbd2cSJim Jagielski 185*b1cdbd2cSJim Jagielskisub get_file_component_attributes 186*b1cdbd2cSJim Jagielski{ 187*b1cdbd2cSJim Jagielski my ($componentname, $filesref, $allvariables) = @_; 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielski my $attributes; 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski $attributes = 2; 192*b1cdbd2cSJim Jagielski 193*b1cdbd2cSJim Jagielski # special handling for font files 194*b1cdbd2cSJim Jagielski 195*b1cdbd2cSJim Jagielski my $onefile; 196*b1cdbd2cSJim Jagielski my $found = 0; 197*b1cdbd2cSJim Jagielski 198*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$filesref}; $i++ ) 199*b1cdbd2cSJim Jagielski { 200*b1cdbd2cSJim Jagielski $onefile = ${$filesref}[$i]; 201*b1cdbd2cSJim Jagielski my $component = $onefile->{'componentname'}; 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski if ( $component eq $componentname ) 204*b1cdbd2cSJim Jagielski { 205*b1cdbd2cSJim Jagielski $found = 1; 206*b1cdbd2cSJim Jagielski last; 207*b1cdbd2cSJim Jagielski } 208*b1cdbd2cSJim Jagielski } 209*b1cdbd2cSJim Jagielski 210*b1cdbd2cSJim Jagielski if (!($found)) 211*b1cdbd2cSJim Jagielski { 212*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Did not find component in file collection", "get_file_component_attributes"); 213*b1cdbd2cSJim Jagielski } 214*b1cdbd2cSJim Jagielski 215*b1cdbd2cSJim Jagielski my $localstyles = ""; 216*b1cdbd2cSJim Jagielski 217*b1cdbd2cSJim Jagielski if ( $onefile->{'Styles'} ) { $localstyles = $onefile->{'Styles'}; } 218*b1cdbd2cSJim Jagielski 219*b1cdbd2cSJim Jagielski if ( $localstyles =~ /\bFONT\b/ ) 220*b1cdbd2cSJim Jagielski { 221*b1cdbd2cSJim Jagielski $attributes = 8; # font files will be deinstalled if the ref count is 0 222*b1cdbd2cSJim Jagielski } 223*b1cdbd2cSJim Jagielski 224*b1cdbd2cSJim Jagielski if ( $localstyles =~ /\bASSEMBLY\b/ ) 225*b1cdbd2cSJim Jagielski { 226*b1cdbd2cSJim Jagielski $attributes = 0; # Assembly files cannot run from source 227*b1cdbd2cSJim Jagielski } 228*b1cdbd2cSJim Jagielski 229*b1cdbd2cSJim Jagielski if ((defined $onefile->{'Dir'} && $onefile->{'Dir'} =~ /\bPREDEFINED_OSSHELLNEWDIR\b/) 230*b1cdbd2cSJim Jagielski || $onefile->{'needs_user_registry_key'}) 231*b1cdbd2cSJim Jagielski { 232*b1cdbd2cSJim Jagielski $attributes = 4; # Files in shellnew dir and in non advertised startmenu entries must have user registry key as KeyPath 233*b1cdbd2cSJim Jagielski } 234*b1cdbd2cSJim Jagielski 235*b1cdbd2cSJim Jagielski # Adding 256, if this is a 64 bit installation set. 236*b1cdbd2cSJim Jagielski if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) { $attributes = $attributes + 256; } 237*b1cdbd2cSJim Jagielski 238*b1cdbd2cSJim Jagielski return $attributes 239*b1cdbd2cSJim Jagielski} 240*b1cdbd2cSJim Jagielski 241*b1cdbd2cSJim Jagielski############################################################## 242*b1cdbd2cSJim Jagielski# Returning the attributes for a registry component. 243*b1cdbd2cSJim Jagielski# Always 4, indicating, the keypath is a defined in 244*b1cdbd2cSJim Jagielski# table registry 245*b1cdbd2cSJim Jagielski############################################################## 246*b1cdbd2cSJim Jagielski 247*b1cdbd2cSJim Jagielskisub get_registry_component_attributes 248*b1cdbd2cSJim Jagielski{ 249*b1cdbd2cSJim Jagielski my ($componentname, $allvariables) = @_; 250*b1cdbd2cSJim Jagielski 251*b1cdbd2cSJim Jagielski my $attributes; 252*b1cdbd2cSJim Jagielski 253*b1cdbd2cSJim Jagielski $attributes = 4; 254*b1cdbd2cSJim Jagielski 255*b1cdbd2cSJim Jagielski # Adding 256, if this is a 64 bit installation set. 256*b1cdbd2cSJim Jagielski if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) { $attributes = $attributes + 256; } 257*b1cdbd2cSJim Jagielski 258*b1cdbd2cSJim Jagielski if ( exists($installer::globals::dontdeletecomponents{$componentname}) ) { $attributes = $attributes + 16; } 259*b1cdbd2cSJim Jagielski 260*b1cdbd2cSJim Jagielski return $attributes 261*b1cdbd2cSJim Jagielski} 262*b1cdbd2cSJim Jagielski 263*b1cdbd2cSJim Jagielski############################################################## 264*b1cdbd2cSJim Jagielski# Returning the conditions for a component. 265*b1cdbd2cSJim Jagielski# This is important for language dependent components 266*b1cdbd2cSJim Jagielski# in multilingual installation sets. 267*b1cdbd2cSJim Jagielski############################################################## 268*b1cdbd2cSJim Jagielski 269*b1cdbd2cSJim Jagielskisub get_file_component_condition 270*b1cdbd2cSJim Jagielski{ 271*b1cdbd2cSJim Jagielski my ($componentname, $filesref) = @_; 272*b1cdbd2cSJim Jagielski 273*b1cdbd2cSJim Jagielski my $condition = ""; 274*b1cdbd2cSJim Jagielski 275*b1cdbd2cSJim Jagielski if (exists($installer::globals::componentcondition{$componentname})) 276*b1cdbd2cSJim Jagielski { 277*b1cdbd2cSJim Jagielski $condition = $installer::globals::componentcondition{$componentname}; 278*b1cdbd2cSJim Jagielski } 279*b1cdbd2cSJim Jagielski 280*b1cdbd2cSJim Jagielski # there can be also tree conditions for multilayer products 281*b1cdbd2cSJim Jagielski if (exists($installer::globals::treeconditions{$componentname})) 282*b1cdbd2cSJim Jagielski { 283*b1cdbd2cSJim Jagielski if ( $condition eq "" ) 284*b1cdbd2cSJim Jagielski { 285*b1cdbd2cSJim Jagielski $condition = $installer::globals::treeconditions{$componentname}; 286*b1cdbd2cSJim Jagielski } 287*b1cdbd2cSJim Jagielski else 288*b1cdbd2cSJim Jagielski { 289*b1cdbd2cSJim Jagielski $condition = "($condition) And ($installer::globals::treeconditions{$componentname})"; 290*b1cdbd2cSJim Jagielski } 291*b1cdbd2cSJim Jagielski } 292*b1cdbd2cSJim Jagielski 293*b1cdbd2cSJim Jagielski return $condition 294*b1cdbd2cSJim Jagielski} 295*b1cdbd2cSJim Jagielski 296*b1cdbd2cSJim Jagielski############################################################## 297*b1cdbd2cSJim Jagielski# Returning the conditions for a registry component. 298*b1cdbd2cSJim Jagielski############################################################## 299*b1cdbd2cSJim Jagielski 300*b1cdbd2cSJim Jagielskisub get_component_condition 301*b1cdbd2cSJim Jagielski{ 302*b1cdbd2cSJim Jagielski my ($componentname) = @_; 303*b1cdbd2cSJim Jagielski 304*b1cdbd2cSJim Jagielski my $condition; 305*b1cdbd2cSJim Jagielski 306*b1cdbd2cSJim Jagielski $condition = ""; # Always ? 307*b1cdbd2cSJim Jagielski 308*b1cdbd2cSJim Jagielski if (exists($installer::globals::componentcondition{$componentname})) 309*b1cdbd2cSJim Jagielski { 310*b1cdbd2cSJim Jagielski $condition = $installer::globals::componentcondition{$componentname}; 311*b1cdbd2cSJim Jagielski } 312*b1cdbd2cSJim Jagielski 313*b1cdbd2cSJim Jagielski return $condition 314*b1cdbd2cSJim Jagielski} 315*b1cdbd2cSJim Jagielski 316*b1cdbd2cSJim Jagielski#################################################################### 317*b1cdbd2cSJim Jagielski# Returning the keypath for a component. 318*b1cdbd2cSJim Jagielski# This will be the name of the first file/registry, found in the 319*b1cdbd2cSJim Jagielski# collection $itemsref 320*b1cdbd2cSJim Jagielski# Attention: This has to be the unique (file)name, not the 321*b1cdbd2cSJim Jagielski# real filename! 322*b1cdbd2cSJim Jagielski#################################################################### 323*b1cdbd2cSJim Jagielski 324*b1cdbd2cSJim Jagielskisub get_component_keypath ($$) 325*b1cdbd2cSJim Jagielski{ 326*b1cdbd2cSJim Jagielski my ($componentname, $itemsref) = @_; 327*b1cdbd2cSJim Jagielski 328*b1cdbd2cSJim Jagielski foreach my $oneitem (@$itemsref) 329*b1cdbd2cSJim Jagielski { 330*b1cdbd2cSJim Jagielski my $component = $oneitem->{'componentname'}; 331*b1cdbd2cSJim Jagielski 332*b1cdbd2cSJim Jagielski if ( ! defined $component) 333*b1cdbd2cSJim Jagielski { 334*b1cdbd2cSJim Jagielski installer::scriptitems::print_script_item($oneitem); 335*b1cdbd2cSJim Jagielski installer::logger::PrintError("item in get_component_keypath has no 'componentname'\n"); 336*b1cdbd2cSJim Jagielski return ""; 337*b1cdbd2cSJim Jagielski } 338*b1cdbd2cSJim Jagielski if ( $component eq $componentname ) 339*b1cdbd2cSJim Jagielski { 340*b1cdbd2cSJim Jagielski my $keypath = $oneitem->{'uniquename'}; # "uniquename", not "Name" 341*b1cdbd2cSJim Jagielski 342*b1cdbd2cSJim Jagielski # Special handling for components in 343*b1cdbd2cSJim Jagielski # PREDEFINED_OSSHELLNEWDIR. These components need as 344*b1cdbd2cSJim Jagielski # KeyPath a RegistryItem in HKCU 345*b1cdbd2cSJim Jagielski if ($oneitem->{'userregkeypath'}) 346*b1cdbd2cSJim Jagielski { 347*b1cdbd2cSJim Jagielski $keypath = $oneitem->{'userregkeypath'}; 348*b1cdbd2cSJim Jagielski } 349*b1cdbd2cSJim Jagielski 350*b1cdbd2cSJim Jagielski # saving it in the file and registry collection 351*b1cdbd2cSJim Jagielski $oneitem->{'keypath'} = $keypath; 352*b1cdbd2cSJim Jagielski 353*b1cdbd2cSJim Jagielski return $keypath 354*b1cdbd2cSJim Jagielski } 355*b1cdbd2cSJim Jagielski } 356*b1cdbd2cSJim Jagielski 357*b1cdbd2cSJim Jagielski installer::exiter::exit_program( 358*b1cdbd2cSJim Jagielski "ERROR: Did not find component in file/registry collection, function get_component_keypath", 359*b1cdbd2cSJim Jagielski "get_component_keypath"); 360*b1cdbd2cSJim Jagielski} 361*b1cdbd2cSJim Jagielski 362*b1cdbd2cSJim Jagielski 363*b1cdbd2cSJim Jagielski 364*b1cdbd2cSJim Jagielski 365*b1cdbd2cSJim Jagielskisub remove_ooversion_from_component_name($) 366*b1cdbd2cSJim Jagielski{ 367*b1cdbd2cSJim Jagielski my ($component_name) = @_; 368*b1cdbd2cSJim Jagielski 369*b1cdbd2cSJim Jagielski $component_name =~ s/_openoffice\d+//; 370*b1cdbd2cSJim Jagielski 371*b1cdbd2cSJim Jagielski return $component_name; 372*b1cdbd2cSJim Jagielski} 373*b1cdbd2cSJim Jagielski 374*b1cdbd2cSJim Jagielski 375*b1cdbd2cSJim Jagielski 376*b1cdbd2cSJim Jagielski 377*b1cdbd2cSJim Jagielskisub prepare_component_table_creation ($$$) 378*b1cdbd2cSJim Jagielski{ 379*b1cdbd2cSJim Jagielski my ($file_components, $registry_components, $variables) = @_; 380*b1cdbd2cSJim Jagielski 381*b1cdbd2cSJim Jagielski if ($installer::globals::is_release) 382*b1cdbd2cSJim Jagielski { 383*b1cdbd2cSJim Jagielski my %source_component_data = (); 384*b1cdbd2cSJim Jagielski 385*b1cdbd2cSJim Jagielski # Collect the components that are used in the source release. 386*b1cdbd2cSJim Jagielski my $component_table = $installer::globals::source_msi->GetTable("Component"); 387*b1cdbd2cSJim Jagielski foreach my $row (@{$component_table->GetAllRows()}) 388*b1cdbd2cSJim Jagielski { 389*b1cdbd2cSJim Jagielski $source_component_data{$row->GetValue("Component")} = $row; 390*b1cdbd2cSJim Jagielski } 391*b1cdbd2cSJim Jagielski 392*b1cdbd2cSJim Jagielski # Find source components that do not exist in the target components, ie have been removed. 393*b1cdbd2cSJim Jagielski 394*b1cdbd2cSJim Jagielski # Process file components. 395*b1cdbd2cSJim Jagielski my @missing_source_component_names = (); 396*b1cdbd2cSJim Jagielski my %file_component_hash = map {$_ => 1} @$file_components; 397*b1cdbd2cSJim Jagielski foreach my $source_component_name (keys %source_component_data) 398*b1cdbd2cSJim Jagielski { 399*b1cdbd2cSJim Jagielski # In this loop we only process components for files and ignore those for registry entries. 400*b1cdbd2cSJim Jagielski next if $source_component_name =~ /^registry_/; 401*b1cdbd2cSJim Jagielski 402*b1cdbd2cSJim Jagielski if ( ! defined $file_component_hash{$source_component_name}) 403*b1cdbd2cSJim Jagielski { 404*b1cdbd2cSJim Jagielski push @missing_source_component_names, [$source_component_name, $source_component_name]; 405*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("missing file component %s\n", $source_component_name); 406*b1cdbd2cSJim Jagielski } 407*b1cdbd2cSJim Jagielski } 408*b1cdbd2cSJim Jagielski 409*b1cdbd2cSJim Jagielski # Process registry components. 410*b1cdbd2cSJim Jagielski my %registry_component_hash = map {$_ => 1} @$registry_components; 411*b1cdbd2cSJim Jagielski my %registry_component_hash_normalized = map {remove_ooversion_from_component_name($_) => $_} @$registry_components; 412*b1cdbd2cSJim Jagielski my %target_registry_component_translation = (); 413*b1cdbd2cSJim Jagielski foreach my $source_component_name (keys %source_component_data) 414*b1cdbd2cSJim Jagielski { 415*b1cdbd2cSJim Jagielski # In this loop we only process components for registry entries and ignore those for files. 416*b1cdbd2cSJim Jagielski next if $source_component_name !~ /^registry_/; 417*b1cdbd2cSJim Jagielski 418*b1cdbd2cSJim Jagielski if (defined $registry_component_hash{$source_component_name}) 419*b1cdbd2cSJim Jagielski { 420*b1cdbd2cSJim Jagielski # Found the non-normalized name. 421*b1cdbd2cSJim Jagielski } 422*b1cdbd2cSJim Jagielski elsif (defined $registry_component_hash_normalized{ 423*b1cdbd2cSJim Jagielski remove_ooversion_from_component_name($source_component_name)}) 424*b1cdbd2cSJim Jagielski { 425*b1cdbd2cSJim Jagielski # Found the normalized name. 426*b1cdbd2cSJim Jagielski my $target_component_name = $registry_component_hash_normalized{ 427*b1cdbd2cSJim Jagielski remove_ooversion_from_component_name($source_component_name)}; 428*b1cdbd2cSJim Jagielski $target_registry_component_translation{$target_component_name} = $source_component_name; 429*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("found normalized component name %s\n", $source_component_name); 430*b1cdbd2cSJim Jagielski $installer::logger::Info->printf(" %s -> %s\n", $target_component_name, $source_component_name); 431*b1cdbd2cSJim Jagielski } 432*b1cdbd2cSJim Jagielski else 433*b1cdbd2cSJim Jagielski { 434*b1cdbd2cSJim Jagielski # Source component was not found. 435*b1cdbd2cSJim Jagielski push @missing_source_component_names, $source_component_name; 436*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("missing component %s\n", $source_component_name); 437*b1cdbd2cSJim Jagielski } 438*b1cdbd2cSJim Jagielski } 439*b1cdbd2cSJim Jagielski 440*b1cdbd2cSJim Jagielski if (scalar @missing_source_component_names > 0) 441*b1cdbd2cSJim Jagielski { 442*b1cdbd2cSJim Jagielski $installer::logger::Info->printf("Error: there are %d missing components\n", 443*b1cdbd2cSJim Jagielski scalar @missing_source_component_names); 444*b1cdbd2cSJim Jagielski return {}; 445*b1cdbd2cSJim Jagielski } 446*b1cdbd2cSJim Jagielski else 447*b1cdbd2cSJim Jagielski { 448*b1cdbd2cSJim Jagielski return \%target_registry_component_translation; 449*b1cdbd2cSJim Jagielski } 450*b1cdbd2cSJim Jagielski } 451*b1cdbd2cSJim Jagielski 452*b1cdbd2cSJim Jagielski return {}; 453*b1cdbd2cSJim Jagielski} 454*b1cdbd2cSJim Jagielski 455*b1cdbd2cSJim Jagielski 456*b1cdbd2cSJim Jagielski 457*b1cdbd2cSJim Jagielski 458*b1cdbd2cSJim Jagielskisub get_component_data ($$$$) 459*b1cdbd2cSJim Jagielski{ 460*b1cdbd2cSJim Jagielski my ($file_component_names, 461*b1cdbd2cSJim Jagielski $registry_component_names, 462*b1cdbd2cSJim Jagielski $files, 463*b1cdbd2cSJim Jagielski $registry_entries) = @_; 464*b1cdbd2cSJim Jagielski 465*b1cdbd2cSJim Jagielski # When we are building a release then prepare building a patch by looking up some data 466*b1cdbd2cSJim Jagielski # from the previous release. 467*b1cdbd2cSJim Jagielski my %source_data = (); 468*b1cdbd2cSJim Jagielski if ($installer::globals::is_release) 469*b1cdbd2cSJim Jagielski { 470*b1cdbd2cSJim Jagielski my $source_component_table = $installer::globals::source_msi->GetTable("Component"); 471*b1cdbd2cSJim Jagielski my $component_column_index = $source_component_table->GetColumnIndex("Component"); 472*b1cdbd2cSJim Jagielski my $component_id_column_index = $source_component_table->GetColumnIndex("ComponentId"); 473*b1cdbd2cSJim Jagielski my $key_path_column_index = $source_component_table->GetColumnIndex("KeyPath"); 474*b1cdbd2cSJim Jagielski foreach my $source_row (@{$source_component_table->GetAllRows()}) 475*b1cdbd2cSJim Jagielski { 476*b1cdbd2cSJim Jagielski my $component_name = $source_row->GetValue($component_column_index); 477*b1cdbd2cSJim Jagielski my $component_id = $source_row->GetValue($component_id_column_index); 478*b1cdbd2cSJim Jagielski my $key_path = $source_row->GetValue($key_path_column_index); 479*b1cdbd2cSJim Jagielski 480*b1cdbd2cSJim Jagielski $source_data{$component_name} = { 481*b1cdbd2cSJim Jagielski 'component_id' => $component_id, 482*b1cdbd2cSJim Jagielski 'key_path' => $key_path 483*b1cdbd2cSJim Jagielski }; 484*b1cdbd2cSJim Jagielski } 485*b1cdbd2cSJim Jagielski } 486*b1cdbd2cSJim Jagielski 487*b1cdbd2cSJim Jagielski # Set up data for the target release. 488*b1cdbd2cSJim Jagielski # Use data from the source version where possible. 489*b1cdbd2cSJim Jagielski # Create missind data where necessary. 490*b1cdbd2cSJim Jagielski 491*b1cdbd2cSJim Jagielski # Set up the target data with flags that remember whether a 492*b1cdbd2cSJim Jagielski # component contains files or registry entries. 493*b1cdbd2cSJim Jagielski my %target_data = (); 494*b1cdbd2cSJim Jagielski foreach my $name (@$file_component_names) 495*b1cdbd2cSJim Jagielski { 496*b1cdbd2cSJim Jagielski $target_data{$name} = {'is_file' => 1}; 497*b1cdbd2cSJim Jagielski } 498*b1cdbd2cSJim Jagielski foreach my $name (@$registry_component_names) 499*b1cdbd2cSJim Jagielski { 500*b1cdbd2cSJim Jagielski $target_data{$name} = {'is_file' => 0}; 501*b1cdbd2cSJim Jagielski } 502*b1cdbd2cSJim Jagielski 503*b1cdbd2cSJim Jagielski # Add values for the ComponentId column. 504*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("preparing Component->ComponentId values\n"); 505*b1cdbd2cSJim Jagielski foreach my $name (@$file_component_names,@$registry_component_names) 506*b1cdbd2cSJim Jagielski { 507*b1cdbd2cSJim Jagielski # Determine the component id. 508*b1cdbd2cSJim Jagielski my $guid = $installer::globals::is_release 509*b1cdbd2cSJim Jagielski ? $source_data{$name}->{'component_id'} 510*b1cdbd2cSJim Jagielski : undef; 511*b1cdbd2cSJim Jagielski if (defined $guid) 512*b1cdbd2cSJim Jagielski { 513*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf(" reusing guid %s\n", $guid); 514*b1cdbd2cSJim Jagielski } 515*b1cdbd2cSJim Jagielski else 516*b1cdbd2cSJim Jagielski { 517*b1cdbd2cSJim Jagielski $guid = "{" . installer::windows::msiglobal::create_guid() . "}"; 518*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf(" creating new guid %s\n", $guid); 519*b1cdbd2cSJim Jagielski } 520*b1cdbd2cSJim Jagielski $target_data{$name}->{'component_id'} = $guid; 521*b1cdbd2cSJim Jagielski } 522*b1cdbd2cSJim Jagielski 523*b1cdbd2cSJim Jagielski # Add values for the KeyPath column. 524*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("preparing Component->KeyPath values\n"); 525*b1cdbd2cSJim Jagielski foreach my $component_name (@$file_component_names,@$registry_component_names) 526*b1cdbd2cSJim Jagielski { 527*b1cdbd2cSJim Jagielski # Determine the key path. 528*b1cdbd2cSJim Jagielski my $key_path = $installer::globals::is_release 529*b1cdbd2cSJim Jagielski ? $source_data{$component_name}->{'key_path'} 530*b1cdbd2cSJim Jagielski : undef; 531*b1cdbd2cSJim Jagielski if (defined $key_path) 532*b1cdbd2cSJim Jagielski { 533*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf(" reusing key path %s for component %s\n", 534*b1cdbd2cSJim Jagielski $key_path, 535*b1cdbd2cSJim Jagielski $component_name); 536*b1cdbd2cSJim Jagielski } 537*b1cdbd2cSJim Jagielski else 538*b1cdbd2cSJim Jagielski { 539*b1cdbd2cSJim Jagielski if ($target_data{$component_name}->{'is_file'}) 540*b1cdbd2cSJim Jagielski { 541*b1cdbd2cSJim Jagielski $key_path = get_component_keypath($component_name, $files); 542*b1cdbd2cSJim Jagielski } 543*b1cdbd2cSJim Jagielski else 544*b1cdbd2cSJim Jagielski { 545*b1cdbd2cSJim Jagielski $key_path = get_component_keypath($component_name, $registry_entries); 546*b1cdbd2cSJim Jagielski } 547*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf(" created key path %s for component %s\n", 548*b1cdbd2cSJim Jagielski $key_path, 549*b1cdbd2cSJim Jagielski $component_name); 550*b1cdbd2cSJim Jagielski } 551*b1cdbd2cSJim Jagielski $target_data{$component_name}->{'key_path'} = $key_path; 552*b1cdbd2cSJim Jagielski } 553*b1cdbd2cSJim Jagielski 554*b1cdbd2cSJim Jagielski return \%target_data; 555*b1cdbd2cSJim Jagielski} 556*b1cdbd2cSJim Jagielski 557*b1cdbd2cSJim Jagielski 558*b1cdbd2cSJim Jagielski 559*b1cdbd2cSJim Jagielski 560*b1cdbd2cSJim Jagielskisub create_component_table_data ($$$$$$) 561*b1cdbd2cSJim Jagielski{ 562*b1cdbd2cSJim Jagielski my ($filesref, $registryref, $dirref, $allfilecomponentsref, $allregistrycomponents, $allvariables) = @_; 563*b1cdbd2cSJim Jagielski 564*b1cdbd2cSJim Jagielski my $target_data = get_component_data($allfilecomponentsref, $allregistrycomponents, $filesref, $registryref); 565*b1cdbd2cSJim Jagielski 566*b1cdbd2cSJim Jagielski my @table_data = (); 567*b1cdbd2cSJim Jagielski 568*b1cdbd2cSJim Jagielski # File components 569*b1cdbd2cSJim Jagielski foreach my $name (@$allfilecomponentsref) 570*b1cdbd2cSJim Jagielski { 571*b1cdbd2cSJim Jagielski my %onecomponent = (); 572*b1cdbd2cSJim Jagielski 573*b1cdbd2cSJim Jagielski $onecomponent{'name'} = $name; 574*b1cdbd2cSJim Jagielski $onecomponent{'guid'} = $target_data->{$name}->{'component_id'}; 575*b1cdbd2cSJim Jagielski $onecomponent{'directory'} = get_file_component_directory($name, $filesref, $dirref); 576*b1cdbd2cSJim Jagielski if ( $onecomponent{'directory'} eq "IGNORE_COMP" ) { next; } 577*b1cdbd2cSJim Jagielski $onecomponent{'attributes'} = get_file_component_attributes($name, $filesref, $allvariables); 578*b1cdbd2cSJim Jagielski $onecomponent{'condition'} = get_file_component_condition($name, $filesref); 579*b1cdbd2cSJim Jagielski $onecomponent{'keypath'} = $target_data->{$name}->{'key_path'}; 580*b1cdbd2cSJim Jagielski 581*b1cdbd2cSJim Jagielski push @table_data, \%onecomponent; 582*b1cdbd2cSJim Jagielski } 583*b1cdbd2cSJim Jagielski 584*b1cdbd2cSJim Jagielski # Registry components 585*b1cdbd2cSJim Jagielski foreach my $name (@$allregistrycomponents) 586*b1cdbd2cSJim Jagielski { 587*b1cdbd2cSJim Jagielski my %onecomponent = (); 588*b1cdbd2cSJim Jagielski 589*b1cdbd2cSJim Jagielski $onecomponent{'name'} = $name; 590*b1cdbd2cSJim Jagielski $onecomponent{'guid'} = $target_data->{$name}->{'component_id'}; 591*b1cdbd2cSJim Jagielski $onecomponent{'directory'} = get_registry_component_directory(); 592*b1cdbd2cSJim Jagielski $onecomponent{'attributes'} = get_registry_component_attributes($name, $allvariables); 593*b1cdbd2cSJim Jagielski $onecomponent{'condition'} = get_component_condition($name); 594*b1cdbd2cSJim Jagielski $onecomponent{'keypath'} = $target_data->{$name}->{'key_path'}; 595*b1cdbd2cSJim Jagielski 596*b1cdbd2cSJim Jagielski push(@table_data, \%onecomponent); 597*b1cdbd2cSJim Jagielski } 598*b1cdbd2cSJim Jagielski 599*b1cdbd2cSJim Jagielski return \@table_data; 600*b1cdbd2cSJim Jagielski} 601*b1cdbd2cSJim Jagielski 602*b1cdbd2cSJim Jagielski 603*b1cdbd2cSJim Jagielski 604*b1cdbd2cSJim Jagielski 605*b1cdbd2cSJim Jagielski################################################################### 606*b1cdbd2cSJim Jagielski# Creating the file Componen.idt dynamically 607*b1cdbd2cSJim Jagielski# Content: 608*b1cdbd2cSJim Jagielski# Component ComponentId Directory_ Attributes Condition KeyPath 609*b1cdbd2cSJim Jagielski################################################################### 610*b1cdbd2cSJim Jagielski 611*b1cdbd2cSJim Jagielski 612*b1cdbd2cSJim Jagielskisub create_component_table ($$) 613*b1cdbd2cSJim Jagielski{ 614*b1cdbd2cSJim Jagielski my ($table_data, $basedir) = @_; 615*b1cdbd2cSJim Jagielski 616*b1cdbd2cSJim Jagielski my @componenttable = (); 617*b1cdbd2cSJim Jagielski 618*b1cdbd2cSJim Jagielski my ($oneline, $infoline); 619*b1cdbd2cSJim Jagielski 620*b1cdbd2cSJim Jagielski installer::windows::idtglobal::write_idt_header(\@componenttable, "component"); 621*b1cdbd2cSJim Jagielski 622*b1cdbd2cSJim Jagielski foreach my $item (@$table_data) 623*b1cdbd2cSJim Jagielski { 624*b1cdbd2cSJim Jagielski $oneline = sprintf("%s\t%s\t%s\t%s\t%s\t%s\n", 625*b1cdbd2cSJim Jagielski $item->{'name'}, 626*b1cdbd2cSJim Jagielski $item->{'guid'}, 627*b1cdbd2cSJim Jagielski $item->{'directory'}, 628*b1cdbd2cSJim Jagielski $item->{'attributes'}, 629*b1cdbd2cSJim Jagielski $item->{'condition'}, 630*b1cdbd2cSJim Jagielski $item->{'keypath'}); 631*b1cdbd2cSJim Jagielski push(@componenttable, $oneline); 632*b1cdbd2cSJim Jagielski } 633*b1cdbd2cSJim Jagielski 634*b1cdbd2cSJim Jagielski # Saving the file 635*b1cdbd2cSJim Jagielski 636*b1cdbd2cSJim Jagielski my $componenttablename = $basedir . $installer::globals::separator . "Componen.idt"; 637*b1cdbd2cSJim Jagielski installer::files::save_file($componenttablename ,\@componenttable); 638*b1cdbd2cSJim Jagielski $infoline = "Created idt file: $componenttablename\n"; 639*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 640*b1cdbd2cSJim Jagielski} 641*b1cdbd2cSJim Jagielski 642*b1cdbd2cSJim Jagielski 643*b1cdbd2cSJim Jagielski 644*b1cdbd2cSJim Jagielski 645*b1cdbd2cSJim Jagielski#################################################################################### 646*b1cdbd2cSJim Jagielski# Returning a component for a scp module gid. 647*b1cdbd2cSJim Jagielski# Pairs are saved in the files collector. 648*b1cdbd2cSJim Jagielski#################################################################################### 649*b1cdbd2cSJim Jagielski 650*b1cdbd2cSJim Jagielskisub get_component_name_from_modulegid 651*b1cdbd2cSJim Jagielski{ 652*b1cdbd2cSJim Jagielski my ($modulegid, $filesref) = @_; 653*b1cdbd2cSJim Jagielski 654*b1cdbd2cSJim Jagielski my $componentname = ""; 655*b1cdbd2cSJim Jagielski 656*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$filesref}; $i++ ) 657*b1cdbd2cSJim Jagielski { 658*b1cdbd2cSJim Jagielski my $onefile = ${$filesref}[$i]; 659*b1cdbd2cSJim Jagielski 660*b1cdbd2cSJim Jagielski if ( $onefile->{'modules'} ) 661*b1cdbd2cSJim Jagielski { 662*b1cdbd2cSJim Jagielski my $filemodules = $onefile->{'modules'}; 663*b1cdbd2cSJim Jagielski my $filemodulesarrayref = installer::converter::convert_stringlist_into_array_without_newline(\$filemodules, ","); 664*b1cdbd2cSJim Jagielski 665*b1cdbd2cSJim Jagielski if (installer::existence::exists_in_array($modulegid, $filemodulesarrayref)) 666*b1cdbd2cSJim Jagielski { 667*b1cdbd2cSJim Jagielski $componentname = $onefile->{'componentname'}; 668*b1cdbd2cSJim Jagielski last; 669*b1cdbd2cSJim Jagielski } 670*b1cdbd2cSJim Jagielski } 671*b1cdbd2cSJim Jagielski } 672*b1cdbd2cSJim Jagielski 673*b1cdbd2cSJim Jagielski return $componentname; 674*b1cdbd2cSJim Jagielski} 675*b1cdbd2cSJim Jagielski 676*b1cdbd2cSJim Jagielski#################################################################################### 677*b1cdbd2cSJim Jagielski# Updating the file Environm.idt dynamically 678*b1cdbd2cSJim Jagielski# Content: 679*b1cdbd2cSJim Jagielski# Environment Name Value Component_ 680*b1cdbd2cSJim Jagielski#################################################################################### 681*b1cdbd2cSJim Jagielski 682*b1cdbd2cSJim Jagielskisub set_component_in_environment_table 683*b1cdbd2cSJim Jagielski{ 684*b1cdbd2cSJim Jagielski my ($basedir, $filesref) = @_; 685*b1cdbd2cSJim Jagielski 686*b1cdbd2cSJim Jagielski my $infoline = ""; 687*b1cdbd2cSJim Jagielski 688*b1cdbd2cSJim Jagielski my $environmentfilename = $basedir . $installer::globals::separator . "Environm.idt"; 689*b1cdbd2cSJim Jagielski 690*b1cdbd2cSJim Jagielski if ( -f $environmentfilename ) # only do something, if file exists 691*b1cdbd2cSJim Jagielski { 692*b1cdbd2cSJim Jagielski my $environmentfile = installer::files::read_file($environmentfilename); 693*b1cdbd2cSJim Jagielski 694*b1cdbd2cSJim Jagielski for ( my $i = 3; $i <= $#{$environmentfile}; $i++ ) # starting in line 4 of Environm.idt 695*b1cdbd2cSJim Jagielski { 696*b1cdbd2cSJim Jagielski if ( ${$environmentfile}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) 697*b1cdbd2cSJim Jagielski { 698*b1cdbd2cSJim Jagielski my $modulegid = $4; # in Environment table a scp module gid can be used as component replacement 699*b1cdbd2cSJim Jagielski 700*b1cdbd2cSJim Jagielski my $componentname = get_component_name_from_modulegid($modulegid, $filesref); 701*b1cdbd2cSJim Jagielski 702*b1cdbd2cSJim Jagielski if ( $componentname ) # only do something if a component could be found 703*b1cdbd2cSJim Jagielski { 704*b1cdbd2cSJim Jagielski $infoline = "Updated Environment table:\n"; 705*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 706*b1cdbd2cSJim Jagielski $infoline = "Old line: ${$environmentfile}[$i]\n"; 707*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 708*b1cdbd2cSJim Jagielski 709*b1cdbd2cSJim Jagielski ${$environmentfile}[$i] =~ s/$modulegid/$componentname/; 710*b1cdbd2cSJim Jagielski 711*b1cdbd2cSJim Jagielski $infoline = "New line: ${$environmentfile}[$i]\n"; 712*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 713*b1cdbd2cSJim Jagielski 714*b1cdbd2cSJim Jagielski } 715*b1cdbd2cSJim Jagielski } 716*b1cdbd2cSJim Jagielski } 717*b1cdbd2cSJim Jagielski 718*b1cdbd2cSJim Jagielski # Saving the file 719*b1cdbd2cSJim Jagielski 720*b1cdbd2cSJim Jagielski installer::files::save_file($environmentfilename ,$environmentfile); 721*b1cdbd2cSJim Jagielski $infoline = "Updated idt file: $environmentfilename\n"; 722*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 723*b1cdbd2cSJim Jagielski 724*b1cdbd2cSJim Jagielski } 725*b1cdbd2cSJim Jagielski} 726*b1cdbd2cSJim Jagielski 727*b1cdbd2cSJim Jagielski 728*b1cdbd2cSJim Jagielski 729*b1cdbd2cSJim Jagielski 730*b1cdbd2cSJim Jagielskisub apply_component_translation ($@) 731*b1cdbd2cSJim Jagielski{ 732*b1cdbd2cSJim Jagielski my ($translation_map, @component_names) = @_; 733*b1cdbd2cSJim Jagielski 734*b1cdbd2cSJim Jagielski my @translated_names = (); 735*b1cdbd2cSJim Jagielski foreach my $component_name (@component_names) 736*b1cdbd2cSJim Jagielski { 737*b1cdbd2cSJim Jagielski my $translated_name = $translation_map->{$component_name}; 738*b1cdbd2cSJim Jagielski if (defined $translated_name) 739*b1cdbd2cSJim Jagielski { 740*b1cdbd2cSJim Jagielski push @translated_names, $translated_name; 741*b1cdbd2cSJim Jagielski } 742*b1cdbd2cSJim Jagielski else 743*b1cdbd2cSJim Jagielski { 744*b1cdbd2cSJim Jagielski push @translated_names, $component_name; 745*b1cdbd2cSJim Jagielski } 746*b1cdbd2cSJim Jagielski } 747*b1cdbd2cSJim Jagielski 748*b1cdbd2cSJim Jagielski return @translated_names; 749*b1cdbd2cSJim Jagielski} 750*b1cdbd2cSJim Jagielski 751*b1cdbd2cSJim Jagielski 752*b1cdbd2cSJim Jagielski1; 753