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::idtglobal; 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielskiuse Cwd; 27*b1cdbd2cSJim Jagielskiuse installer::converter; 28*b1cdbd2cSJim Jagielskiuse installer::existence; 29*b1cdbd2cSJim Jagielskiuse installer::exiter; 30*b1cdbd2cSJim Jagielskiuse installer::files; 31*b1cdbd2cSJim Jagielskiuse installer::globals; 32*b1cdbd2cSJim Jagielskiuse installer::pathanalyzer; 33*b1cdbd2cSJim Jagielskiuse installer::remover; 34*b1cdbd2cSJim Jagielskiuse installer::scriptitems; 35*b1cdbd2cSJim Jagielskiuse installer::systemactions; 36*b1cdbd2cSJim Jagielskiuse installer::windows::language; 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielski############################################################## 39*b1cdbd2cSJim Jagielski# Shorten the gid for a feature. 40*b1cdbd2cSJim Jagielski# Attention: Maximum length is 38 41*b1cdbd2cSJim Jagielski############################################################## 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielskisub shorten_feature_gid 44*b1cdbd2cSJim Jagielski{ 45*b1cdbd2cSJim Jagielski my ($stringref) = @_; 46*b1cdbd2cSJim Jagielski 47*b1cdbd2cSJim Jagielski $$stringref =~ s/gid_Module_/gm_/; 48*b1cdbd2cSJim Jagielski $$stringref =~ s/_Extension_/_ex_/; 49*b1cdbd2cSJim Jagielski $$stringref =~ s/_Root_/_r_/; 50*b1cdbd2cSJim Jagielski $$stringref =~ s/_Prg_/_p_/; 51*b1cdbd2cSJim Jagielski $$stringref =~ s/_Optional_/_o_/; 52*b1cdbd2cSJim Jagielski $$stringref =~ s/_Tools_/_tl_/; 53*b1cdbd2cSJim Jagielski $$stringref =~ s/_Wrt_Flt_/_w_f_/; 54*b1cdbd2cSJim Jagielski $$stringref =~ s/_Javafilter_/_jf_/; 55*b1cdbd2cSJim Jagielski $$stringref =~ s/_Productivity_/_pr_/; 56*b1cdbd2cSJim Jagielski $$stringref =~ s/_Replacement_/_rpl_/; 57*b1cdbd2cSJim Jagielski} 58*b1cdbd2cSJim Jagielski 59*b1cdbd2cSJim Jagielski=head2 create_shortend_feature_gid ($feature_name) 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski This is a side effect free version of shorten_feature_gid. 62*b1cdbd2cSJim Jagielski The shortened feature name is returned instead of overwriting the given name. 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski=cut 65*b1cdbd2cSJim Jagielskisub create_shortend_feature_gid ($) 66*b1cdbd2cSJim Jagielski{ 67*b1cdbd2cSJim Jagielski my ($feature_name) = @_; 68*b1cdbd2cSJim Jagielski shorten_feature_gid(\$feature_name); 69*b1cdbd2cSJim Jagielski return $feature_name; 70*b1cdbd2cSJim Jagielski} 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski############################################ 73*b1cdbd2cSJim Jagielski# Getting the next free number, that 74*b1cdbd2cSJim Jagielski# can be added. 75*b1cdbd2cSJim Jagielski# Sample: 01-44-~1.DAT, 01-44-~2.DAT, ... 76*b1cdbd2cSJim Jagielski############################################ 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielskisub get_next_free_number 79*b1cdbd2cSJim Jagielski{ 80*b1cdbd2cSJim Jagielski my ($name, $shortnamesref) = @_; 81*b1cdbd2cSJim Jagielski 82*b1cdbd2cSJim Jagielski my $counter = 0; 83*b1cdbd2cSJim Jagielski my $dontsave = 0; 84*b1cdbd2cSJim Jagielski my $alreadyexists; 85*b1cdbd2cSJim Jagielski my ($newname, $shortname); 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski do 88*b1cdbd2cSJim Jagielski { 89*b1cdbd2cSJim Jagielski $alreadyexists = 0; 90*b1cdbd2cSJim Jagielski $counter++; 91*b1cdbd2cSJim Jagielski $newname = $name . $counter; 92*b1cdbd2cSJim Jagielski 93*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$shortnamesref}; $i++ ) 94*b1cdbd2cSJim Jagielski { 95*b1cdbd2cSJim Jagielski $shortname = ${$shortnamesref}[$i]; 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielski if ( uc($shortname) eq uc($newname) ) # case insensitive 98*b1cdbd2cSJim Jagielski { 99*b1cdbd2cSJim Jagielski $alreadyexists = 1; 100*b1cdbd2cSJim Jagielski last; 101*b1cdbd2cSJim Jagielski } 102*b1cdbd2cSJim Jagielski } 103*b1cdbd2cSJim Jagielski } 104*b1cdbd2cSJim Jagielski until (!($alreadyexists)); 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski if (( $counter > 9 ) && ( length($name) > 6 )) { $dontsave = 1; } 107*b1cdbd2cSJim Jagielski if (( $counter > 99 ) && ( length($name) > 5 )) { $dontsave = 1; } 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim Jagielski if (!($dontsave)) 110*b1cdbd2cSJim Jagielski { 111*b1cdbd2cSJim Jagielski push(@{$shortnamesref}, $newname); # adding the new shortname to the array of shortnames 112*b1cdbd2cSJim Jagielski } 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski return $counter 115*b1cdbd2cSJim Jagielski} 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski############################################ 118*b1cdbd2cSJim Jagielski# Getting the next free number, that 119*b1cdbd2cSJim Jagielski# can be added. 120*b1cdbd2cSJim Jagielski# Sample: 01-44-~1.DAT, 01-44-~2.DAT, ... 121*b1cdbd2cSJim Jagielski############################################ 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielskisub get_next_free_number_with_hash 124*b1cdbd2cSJim Jagielski{ 125*b1cdbd2cSJim Jagielski my ($name, $shortnamesref, $ext) = @_; 126*b1cdbd2cSJim Jagielski 127*b1cdbd2cSJim Jagielski my $counter = 0; 128*b1cdbd2cSJim Jagielski my $dontsave = 0; 129*b1cdbd2cSJim Jagielski my $saved = 0; 130*b1cdbd2cSJim Jagielski my $alreadyexists; 131*b1cdbd2cSJim Jagielski my ($newname, $shortname); 132*b1cdbd2cSJim Jagielski 133*b1cdbd2cSJim Jagielski do 134*b1cdbd2cSJim Jagielski { 135*b1cdbd2cSJim Jagielski $alreadyexists = 0; 136*b1cdbd2cSJim Jagielski $counter++; 137*b1cdbd2cSJim Jagielski $newname = $name . $counter; 138*b1cdbd2cSJim Jagielski $newname = uc($newname); # case insensitive, always upper case 139*b1cdbd2cSJim Jagielski if ( exists($shortnamesref->{$newname}) || 140*b1cdbd2cSJim Jagielski exists($installer::globals::savedrev83mapping{$newname.$ext}) ) 141*b1cdbd2cSJim Jagielski { 142*b1cdbd2cSJim Jagielski $alreadyexists = 1; 143*b1cdbd2cSJim Jagielski } 144*b1cdbd2cSJim Jagielski } 145*b1cdbd2cSJim Jagielski until (!($alreadyexists)); 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski if (( $counter > 9 ) && ( length($name) > 6 )) { $dontsave = 1; } 148*b1cdbd2cSJim Jagielski if (( $counter > 99 ) && ( length($name) > 5 )) { $dontsave = 1; } 149*b1cdbd2cSJim Jagielski 150*b1cdbd2cSJim Jagielski if (!($dontsave)) 151*b1cdbd2cSJim Jagielski { 152*b1cdbd2cSJim Jagielski # push(@{$shortnamesref}, $newname); # adding the new shortname to the array of shortnames 153*b1cdbd2cSJim Jagielski $shortnamesref->{$newname} = 1; # adding the new shortname to the array of shortnames, always uppercase 154*b1cdbd2cSJim Jagielski $saved = 1; 155*b1cdbd2cSJim Jagielski } 156*b1cdbd2cSJim Jagielski 157*b1cdbd2cSJim Jagielski return ( $counter, $saved ) 158*b1cdbd2cSJim Jagielski} 159*b1cdbd2cSJim Jagielski 160*b1cdbd2cSJim Jagielski######################################### 161*b1cdbd2cSJim Jagielski# 8.3 for filenames and directories 162*b1cdbd2cSJim Jagielski######################################### 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielskisub make_eight_three_conform 165*b1cdbd2cSJim Jagielski{ 166*b1cdbd2cSJim Jagielski my ($inputstring, $pattern, $shortnamesref) = @_; 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski # all shortnames are collected in $shortnamesref, because of uniqueness 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski my ($name, $namelength, $number); 171*b1cdbd2cSJim Jagielski my $conformstring = ""; 172*b1cdbd2cSJim Jagielski my $changed = 0; 173*b1cdbd2cSJim Jagielski 174*b1cdbd2cSJim Jagielski if (( $inputstring =~ /^\s*(.*?)\.(.*?)\s*$/ ) && ( $pattern eq "file" )) # files with a dot 175*b1cdbd2cSJim Jagielski { 176*b1cdbd2cSJim Jagielski $name = $1; 177*b1cdbd2cSJim Jagielski my $extension = $2; 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski $namelength = length($name); 180*b1cdbd2cSJim Jagielski my $extensionlength = length($extension); 181*b1cdbd2cSJim Jagielski 182*b1cdbd2cSJim Jagielski if ( $extensionlength > 3 ) 183*b1cdbd2cSJim Jagielski { 184*b1cdbd2cSJim Jagielski # simply taking the first three letters 185*b1cdbd2cSJim Jagielski $extension = substr($extension, 0, 3); # name, offset, length 186*b1cdbd2cSJim Jagielski } 187*b1cdbd2cSJim Jagielski 188*b1cdbd2cSJim Jagielski # Attention: readme.html -> README~1.HTM 189*b1cdbd2cSJim Jagielski 190*b1cdbd2cSJim Jagielski if (( $namelength > 8 ) || ( $extensionlength > 3 )) 191*b1cdbd2cSJim Jagielski { 192*b1cdbd2cSJim Jagielski # taking the first six letters 193*b1cdbd2cSJim Jagielski $name = substr($name, 0, 6); # name, offset, length 194*b1cdbd2cSJim Jagielski $name =~ s/\s*$//; # removing ending whitespaces 195*b1cdbd2cSJim Jagielski $name = $name . "\~"; 196*b1cdbd2cSJim Jagielski $number = get_next_free_number($name, $shortnamesref); 197*b1cdbd2cSJim Jagielski 198*b1cdbd2cSJim Jagielski # if $number>9 the new name would be "abcdef~10.xyz", which is 9+3, and therefore not allowed 199*b1cdbd2cSJim Jagielski 200*b1cdbd2cSJim Jagielski if ( $number > 9 ) 201*b1cdbd2cSJim Jagielski { 202*b1cdbd2cSJim Jagielski $name = substr($name, 0, 5); # name, offset, length 203*b1cdbd2cSJim Jagielski $name =~ s/\s*$//; # removing ending whitespaces 204*b1cdbd2cSJim Jagielski $name = $name . "\~"; 205*b1cdbd2cSJim Jagielski $number = get_next_free_number($name, $shortnamesref); 206*b1cdbd2cSJim Jagielski 207*b1cdbd2cSJim Jagielski if ( $number > 99 ) 208*b1cdbd2cSJim Jagielski { 209*b1cdbd2cSJim Jagielski $name = substr($name, 0, 4); # name, offset, length 210*b1cdbd2cSJim Jagielski $name =~ s/\s*$//; # removing ending whitespaces 211*b1cdbd2cSJim Jagielski $name = $name . "\~"; 212*b1cdbd2cSJim Jagielski $number = get_next_free_number($name, $shortnamesref); 213*b1cdbd2cSJim Jagielski } 214*b1cdbd2cSJim Jagielski } 215*b1cdbd2cSJim Jagielski 216*b1cdbd2cSJim Jagielski $name = $name . "$number"; 217*b1cdbd2cSJim Jagielski 218*b1cdbd2cSJim Jagielski $changed = 1; 219*b1cdbd2cSJim Jagielski } 220*b1cdbd2cSJim Jagielski 221*b1cdbd2cSJim Jagielski $conformstring = $name . "\." . $extension; 222*b1cdbd2cSJim Jagielski 223*b1cdbd2cSJim Jagielski if ( $changed ) { $conformstring= uc($conformstring); } 224*b1cdbd2cSJim Jagielski } 225*b1cdbd2cSJim Jagielski else # no dot in filename or directory (also used for shortcuts) 226*b1cdbd2cSJim Jagielski { 227*b1cdbd2cSJim Jagielski $name = $inputstring; 228*b1cdbd2cSJim Jagielski $namelength = length($name); 229*b1cdbd2cSJim Jagielski 230*b1cdbd2cSJim Jagielski if ( $namelength > 8 ) 231*b1cdbd2cSJim Jagielski { 232*b1cdbd2cSJim Jagielski # taking the first six letters 233*b1cdbd2cSJim Jagielski $name = substr($name, 0, 6); # name, offset, length 234*b1cdbd2cSJim Jagielski $name =~ s/\s*$//; # removing ending whitespaces 235*b1cdbd2cSJim Jagielski $name = $name . "\~"; 236*b1cdbd2cSJim Jagielski $number = get_next_free_number($name, $shortnamesref); 237*b1cdbd2cSJim Jagielski 238*b1cdbd2cSJim Jagielski # if $number>9 the new name would be "abcdef~10.xyz", which is 9+3, and therefore not allowed 239*b1cdbd2cSJim Jagielski 240*b1cdbd2cSJim Jagielski if ( $number > 9 ) 241*b1cdbd2cSJim Jagielski { 242*b1cdbd2cSJim Jagielski $name = substr($name, 0, 5); # name, offset, length 243*b1cdbd2cSJim Jagielski $name =~ s/\s*$//; # removing ending whitespaces 244*b1cdbd2cSJim Jagielski $name = $name . "\~"; 245*b1cdbd2cSJim Jagielski $number = get_next_free_number($name, $shortnamesref); 246*b1cdbd2cSJim Jagielski 247*b1cdbd2cSJim Jagielski if ( $number > 99 ) 248*b1cdbd2cSJim Jagielski { 249*b1cdbd2cSJim Jagielski $name = substr($name, 0, 4); # name, offset, length 250*b1cdbd2cSJim Jagielski $name =~ s/\s*$//; # removing ending whitespaces 251*b1cdbd2cSJim Jagielski $name = $name . "\~"; 252*b1cdbd2cSJim Jagielski $number = get_next_free_number($name, $shortnamesref); 253*b1cdbd2cSJim Jagielski } 254*b1cdbd2cSJim Jagielski } 255*b1cdbd2cSJim Jagielski 256*b1cdbd2cSJim Jagielski $name = $name . "$number"; 257*b1cdbd2cSJim Jagielski $changed = 1; 258*b1cdbd2cSJim Jagielski if ( $pattern eq "dir" ) { $name =~ s/\./\_/g; } # in directories replacing "." with "_" 259*b1cdbd2cSJim Jagielski } 260*b1cdbd2cSJim Jagielski 261*b1cdbd2cSJim Jagielski $conformstring = $name; 262*b1cdbd2cSJim Jagielski 263*b1cdbd2cSJim Jagielski if ( $changed ) { $conformstring = uc($name); } 264*b1cdbd2cSJim Jagielski } 265*b1cdbd2cSJim Jagielski 266*b1cdbd2cSJim Jagielski return $conformstring; 267*b1cdbd2cSJim Jagielski} 268*b1cdbd2cSJim Jagielski 269*b1cdbd2cSJim Jagielski######################################### 270*b1cdbd2cSJim Jagielski# 8.3 for filenames and directories 271*b1cdbd2cSJim Jagielski# $shortnamesref is a hash in this case 272*b1cdbd2cSJim Jagielski# -> performance reasons 273*b1cdbd2cSJim Jagielski######################################### 274*b1cdbd2cSJim Jagielski 275*b1cdbd2cSJim Jagielskisub make_eight_three_conform_with_hash 276*b1cdbd2cSJim Jagielski{ 277*b1cdbd2cSJim Jagielski my ($inputstring, $pattern, $shortnamesref) = @_; 278*b1cdbd2cSJim Jagielski 279*b1cdbd2cSJim Jagielski # all shortnames are collected in $shortnamesref, because of uniqueness (a hash!) 280*b1cdbd2cSJim Jagielski 281*b1cdbd2cSJim Jagielski my ($name, $namelength, $number); 282*b1cdbd2cSJim Jagielski my $conformstring = ""; 283*b1cdbd2cSJim Jagielski my $changed = 0; 284*b1cdbd2cSJim Jagielski my $saved; 285*b1cdbd2cSJim Jagielski 286*b1cdbd2cSJim Jagielski # if (( $inputstring =~ /^\s*(.*?)\.(.*?)\s*$/ ) && ( $pattern eq "file" )) # files with a dot 287*b1cdbd2cSJim Jagielski if (( $inputstring =~ /^\s*(.*)\.(.*?)\s*$/ ) && ( $pattern eq "file" )) # files with a dot 288*b1cdbd2cSJim Jagielski { 289*b1cdbd2cSJim Jagielski # extension has to be non-greedy, but name is. This is important to find the last dot in the filename 290*b1cdbd2cSJim Jagielski $name = $1; 291*b1cdbd2cSJim Jagielski my $extension = $2; 292*b1cdbd2cSJim Jagielski 293*b1cdbd2cSJim Jagielski if ( $name =~ /^\s*(.*?)\s*$/ ) { $name = $1; } # now the name is also non-greedy 294*b1cdbd2cSJim Jagielski $name =~ s/\.//g; # no dots in 8+3 conform filename 295*b1cdbd2cSJim Jagielski 296*b1cdbd2cSJim Jagielski $namelength = length($name); 297*b1cdbd2cSJim Jagielski my $extensionlength = length($extension); 298*b1cdbd2cSJim Jagielski 299*b1cdbd2cSJim Jagielski if ( $extensionlength > 3 ) 300*b1cdbd2cSJim Jagielski { 301*b1cdbd2cSJim Jagielski # simply taking the first three letters 302*b1cdbd2cSJim Jagielski $extension = substr($extension, 0, 3); # name, offset, length 303*b1cdbd2cSJim Jagielski $changed = 1; 304*b1cdbd2cSJim Jagielski } 305*b1cdbd2cSJim Jagielski 306*b1cdbd2cSJim Jagielski # Attention: readme.html -> README~1.HTM 307*b1cdbd2cSJim Jagielski 308*b1cdbd2cSJim Jagielski if (( $namelength > 8 ) || ( $extensionlength > 3 )) 309*b1cdbd2cSJim Jagielski { 310*b1cdbd2cSJim Jagielski # taking the first six letters, if filename is longer than 6 characters 311*b1cdbd2cSJim Jagielski if ( $namelength > 6 ) 312*b1cdbd2cSJim Jagielski { 313*b1cdbd2cSJim Jagielski $name = substr($name, 0, 6); # name, offset, length 314*b1cdbd2cSJim Jagielski $name =~ s/\s*$//; # removing ending whitespaces 315*b1cdbd2cSJim Jagielski $name = $name . "\~"; 316*b1cdbd2cSJim Jagielski ($number, $saved) = get_next_free_number_with_hash($name, $shortnamesref, '.'.uc($extension)); 317*b1cdbd2cSJim Jagielski 318*b1cdbd2cSJim Jagielski # if $number>9 the new name would be "abcdef~10.xyz", which is 9+3, and therefore not allowed 319*b1cdbd2cSJim Jagielski 320*b1cdbd2cSJim Jagielski if ( ! $saved ) 321*b1cdbd2cSJim Jagielski { 322*b1cdbd2cSJim Jagielski $name = substr($name, 0, 5); # name, offset, length 323*b1cdbd2cSJim Jagielski $name =~ s/\s*$//; # removing ending whitespaces 324*b1cdbd2cSJim Jagielski $name = $name . "\~"; 325*b1cdbd2cSJim Jagielski ($number, $saved) = get_next_free_number_with_hash($name, $shortnamesref, '.'.uc($extension)); 326*b1cdbd2cSJim Jagielski 327*b1cdbd2cSJim Jagielski # if $number>99 the new name would be "abcde~100.xyz", which is 9+3, and therefore not allowed 328*b1cdbd2cSJim Jagielski 329*b1cdbd2cSJim Jagielski if ( ! $saved ) 330*b1cdbd2cSJim Jagielski { 331*b1cdbd2cSJim Jagielski $name = substr($name, 0, 4); # name, offset, length 332*b1cdbd2cSJim Jagielski $name =~ s/\s*$//; # removing ending whitespaces 333*b1cdbd2cSJim Jagielski $name = $name . "\~"; 334*b1cdbd2cSJim Jagielski ($number, $saved) = get_next_free_number_with_hash($name, $shortnamesref, '.'.uc($extension)); 335*b1cdbd2cSJim Jagielski 336*b1cdbd2cSJim Jagielski if ( ! $saved ) 337*b1cdbd2cSJim Jagielski { 338*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Could not set 8+3 conform name for $inputstring !", "make_eight_three_conform_with_hash"); 339*b1cdbd2cSJim Jagielski } 340*b1cdbd2cSJim Jagielski } 341*b1cdbd2cSJim Jagielski } 342*b1cdbd2cSJim Jagielski 343*b1cdbd2cSJim Jagielski $name = $name . "$number"; 344*b1cdbd2cSJim Jagielski $changed = 1; 345*b1cdbd2cSJim Jagielski } 346*b1cdbd2cSJim Jagielski } 347*b1cdbd2cSJim Jagielski 348*b1cdbd2cSJim Jagielski $conformstring = $name . "\." . $extension; 349*b1cdbd2cSJim Jagielski 350*b1cdbd2cSJim Jagielski if ( $changed ) { $conformstring= uc($conformstring); } 351*b1cdbd2cSJim Jagielski } 352*b1cdbd2cSJim Jagielski else # no dot in filename or directory (also used for shortcuts) 353*b1cdbd2cSJim Jagielski { 354*b1cdbd2cSJim Jagielski $name = $inputstring; 355*b1cdbd2cSJim Jagielski $namelength = length($name); 356*b1cdbd2cSJim Jagielski 357*b1cdbd2cSJim Jagielski if ( $namelength > 8 ) 358*b1cdbd2cSJim Jagielski { 359*b1cdbd2cSJim Jagielski # taking the first six letters 360*b1cdbd2cSJim Jagielski $name = substr($name, 0, 6); # name, offset, length 361*b1cdbd2cSJim Jagielski $name =~ s/\s*$//; # removing ending whitespaces 362*b1cdbd2cSJim Jagielski $name = $name . "\~"; 363*b1cdbd2cSJim Jagielski ( $number, $saved ) = get_next_free_number_with_hash($name, $shortnamesref, ''); 364*b1cdbd2cSJim Jagielski 365*b1cdbd2cSJim Jagielski # if $number>9 the new name would be "abcdef~10", which is 9+0, and therefore not allowed 366*b1cdbd2cSJim Jagielski 367*b1cdbd2cSJim Jagielski if ( ! $saved ) 368*b1cdbd2cSJim Jagielski { 369*b1cdbd2cSJim Jagielski $name = substr($name, 0, 5); # name, offset, length 370*b1cdbd2cSJim Jagielski $name =~ s/\s*$//; # removing ending whitespaces 371*b1cdbd2cSJim Jagielski $name = $name . "\~"; 372*b1cdbd2cSJim Jagielski ( $number, $saved ) = get_next_free_number_with_hash($name, $shortnamesref, ''); 373*b1cdbd2cSJim Jagielski 374*b1cdbd2cSJim Jagielski # if $number>99 the new name would be "abcde~100", which is 9+0, and therefore not allowed 375*b1cdbd2cSJim Jagielski 376*b1cdbd2cSJim Jagielski if ( ! $saved ) 377*b1cdbd2cSJim Jagielski { 378*b1cdbd2cSJim Jagielski $name = substr($name, 0, 4); # name, offset, length 379*b1cdbd2cSJim Jagielski $name =~ s/\s*$//; # removing ending whitespaces 380*b1cdbd2cSJim Jagielski $name = $name . "\~"; 381*b1cdbd2cSJim Jagielski ( $number, $saved ) = get_next_free_number_with_hash($name, $shortnamesref, ''); 382*b1cdbd2cSJim Jagielski 383*b1cdbd2cSJim Jagielski if ( ! $saved ) { installer::exiter::exit_program("ERROR: Could not set 8+3 conform name for $inputstring !", "make_eight_three_conform_with_hash"); } 384*b1cdbd2cSJim Jagielski } 385*b1cdbd2cSJim Jagielski } 386*b1cdbd2cSJim Jagielski 387*b1cdbd2cSJim Jagielski $name = $name . "$number"; 388*b1cdbd2cSJim Jagielski $changed = 1; 389*b1cdbd2cSJim Jagielski if ( $pattern eq "dir" ) { $name =~ s/\./\_/g; } # in directories replacing "." with "_" 390*b1cdbd2cSJim Jagielski } 391*b1cdbd2cSJim Jagielski 392*b1cdbd2cSJim Jagielski $conformstring = $name; 393*b1cdbd2cSJim Jagielski 394*b1cdbd2cSJim Jagielski if ( $changed ) { $conformstring = uc($name); } 395*b1cdbd2cSJim Jagielski } 396*b1cdbd2cSJim Jagielski 397*b1cdbd2cSJim Jagielski return $conformstring; 398*b1cdbd2cSJim Jagielski} 399*b1cdbd2cSJim Jagielski 400*b1cdbd2cSJim Jagielski######################################### 401*b1cdbd2cSJim Jagielski# Writing the header for idt files 402*b1cdbd2cSJim Jagielski######################################### 403*b1cdbd2cSJim Jagielski 404*b1cdbd2cSJim Jagielskisub write_idt_header 405*b1cdbd2cSJim Jagielski{ 406*b1cdbd2cSJim Jagielski my ($idtref, $definestring) = @_; 407*b1cdbd2cSJim Jagielski 408*b1cdbd2cSJim Jagielski my $oneline; 409*b1cdbd2cSJim Jagielski 410*b1cdbd2cSJim Jagielski if ( $definestring eq "file" ) 411*b1cdbd2cSJim Jagielski { 412*b1cdbd2cSJim Jagielski $oneline = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"; 413*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 414*b1cdbd2cSJim Jagielski $oneline = "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n"; 415*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 416*b1cdbd2cSJim Jagielski $oneline = "File\tFile\n"; 417*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 418*b1cdbd2cSJim Jagielski } 419*b1cdbd2cSJim Jagielski 420*b1cdbd2cSJim Jagielski if ( $definestring eq "filehash" ) 421*b1cdbd2cSJim Jagielski { 422*b1cdbd2cSJim Jagielski $oneline = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n"; 423*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 424*b1cdbd2cSJim Jagielski $oneline = "s72\ti2\ti4\ti4\ti4\ti4\n"; 425*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 426*b1cdbd2cSJim Jagielski $oneline = "MsiFileHash\tFile_\n"; 427*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 428*b1cdbd2cSJim Jagielski } 429*b1cdbd2cSJim Jagielski 430*b1cdbd2cSJim Jagielski if ( $definestring eq "directory" ) 431*b1cdbd2cSJim Jagielski { 432*b1cdbd2cSJim Jagielski $oneline = "Directory\tDirectory_Parent\tDefaultDir\n"; 433*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 434*b1cdbd2cSJim Jagielski $oneline = "s72\tS72\tl255\n"; 435*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 436*b1cdbd2cSJim Jagielski $oneline = "Directory\tDirectory\n"; 437*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 438*b1cdbd2cSJim Jagielski } 439*b1cdbd2cSJim Jagielski 440*b1cdbd2cSJim Jagielski if ( $definestring eq "component" ) 441*b1cdbd2cSJim Jagielski { 442*b1cdbd2cSJim Jagielski $oneline = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"; 443*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 444*b1cdbd2cSJim Jagielski $oneline = "s72\tS38\ts72\ti2\tS255\tS72\n"; 445*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 446*b1cdbd2cSJim Jagielski $oneline = "Component\tComponent\n"; 447*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 448*b1cdbd2cSJim Jagielski } 449*b1cdbd2cSJim Jagielski 450*b1cdbd2cSJim Jagielski if ( $definestring eq "feature" ) 451*b1cdbd2cSJim Jagielski { 452*b1cdbd2cSJim Jagielski $oneline = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"; 453*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 454*b1cdbd2cSJim Jagielski $oneline = "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"; 455*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 456*b1cdbd2cSJim Jagielski $oneline = "WINDOWSENCODINGTEMPLATE\tFeature\tFeature\n"; 457*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 458*b1cdbd2cSJim Jagielski } 459*b1cdbd2cSJim Jagielski 460*b1cdbd2cSJim Jagielski if ( $definestring eq "featurecomponent" ) 461*b1cdbd2cSJim Jagielski { 462*b1cdbd2cSJim Jagielski $oneline = "Feature_\tComponent_\n"; 463*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 464*b1cdbd2cSJim Jagielski $oneline = "s38\ts72\n"; 465*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 466*b1cdbd2cSJim Jagielski $oneline = "FeatureComponents\tFeature_\tComponent_\n"; 467*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 468*b1cdbd2cSJim Jagielski } 469*b1cdbd2cSJim Jagielski 470*b1cdbd2cSJim Jagielski if ( $definestring eq "media" ) 471*b1cdbd2cSJim Jagielski { 472*b1cdbd2cSJim Jagielski $oneline = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"; 473*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 474*b1cdbd2cSJim Jagielski $oneline = "i2\ti2\tL64\tS255\tS32\tS72\n"; 475*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 476*b1cdbd2cSJim Jagielski $oneline = "Media\tDiskId\n"; 477*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 478*b1cdbd2cSJim Jagielski } 479*b1cdbd2cSJim Jagielski 480*b1cdbd2cSJim Jagielski if ( $definestring eq "font" ) 481*b1cdbd2cSJim Jagielski { 482*b1cdbd2cSJim Jagielski $oneline = "File_\tFontTitle\n"; 483*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 484*b1cdbd2cSJim Jagielski $oneline = "s72\tS128\n"; 485*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 486*b1cdbd2cSJim Jagielski $oneline = "Font\tFile_\n"; 487*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 488*b1cdbd2cSJim Jagielski } 489*b1cdbd2cSJim Jagielski 490*b1cdbd2cSJim Jagielski if ( $definestring eq "shortcut" ) 491*b1cdbd2cSJim Jagielski { 492*b1cdbd2cSJim Jagielski $oneline = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n"; 493*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 494*b1cdbd2cSJim Jagielski $oneline = "s72\ts72\tl128\ts72\ts72\tS255\tL255\tI2\tS72\tI2\tI2\tS72\n"; 495*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 496*b1cdbd2cSJim Jagielski $oneline = "WINDOWSENCODINGTEMPLATE\tShortcut\tShortcut\n"; 497*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 498*b1cdbd2cSJim Jagielski } 499*b1cdbd2cSJim Jagielski 500*b1cdbd2cSJim Jagielski if ( $definestring eq "registry" ) 501*b1cdbd2cSJim Jagielski { 502*b1cdbd2cSJim Jagielski $oneline = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"; 503*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 504*b1cdbd2cSJim Jagielski $oneline = "s72\ti2\tl255\tL255\tL0\ts72\n"; 505*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 506*b1cdbd2cSJim Jagielski $oneline = "Registry\tRegistry\n"; 507*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 508*b1cdbd2cSJim Jagielski } 509*b1cdbd2cSJim Jagielski 510*b1cdbd2cSJim Jagielski if ( $definestring eq "reg64" ) 511*b1cdbd2cSJim Jagielski { 512*b1cdbd2cSJim Jagielski $oneline = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"; 513*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 514*b1cdbd2cSJim Jagielski $oneline = "s72\ti2\tl255\tL255\tL0\ts72\n"; 515*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 516*b1cdbd2cSJim Jagielski $oneline = "Reg64\tRegistry\n"; 517*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 518*b1cdbd2cSJim Jagielski } 519*b1cdbd2cSJim Jagielski 520*b1cdbd2cSJim Jagielski if ( $definestring eq "createfolder" ) 521*b1cdbd2cSJim Jagielski { 522*b1cdbd2cSJim Jagielski $oneline = "Directory_\tComponent_\n"; 523*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 524*b1cdbd2cSJim Jagielski $oneline = "s72\ts72\n"; 525*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 526*b1cdbd2cSJim Jagielski $oneline = "CreateFolder\tDirectory_\tComponent_\n"; 527*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 528*b1cdbd2cSJim Jagielski } 529*b1cdbd2cSJim Jagielski 530*b1cdbd2cSJim Jagielski if ( $definestring eq "removefile" ) 531*b1cdbd2cSJim Jagielski { 532*b1cdbd2cSJim Jagielski $oneline = "FileKey\tComponent_\tFileName\tDirProperty\tInstallMode\n"; 533*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 534*b1cdbd2cSJim Jagielski $oneline = "s72\ts72\tL255\ts72\ti2\n"; 535*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 536*b1cdbd2cSJim Jagielski $oneline = "RemoveFile\tFileKey\n"; 537*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 538*b1cdbd2cSJim Jagielski } 539*b1cdbd2cSJim Jagielski 540*b1cdbd2cSJim Jagielski if ( $definestring eq "upgrade" ) 541*b1cdbd2cSJim Jagielski { 542*b1cdbd2cSJim Jagielski $oneline = "UpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\tRemove\tActionProperty\n"; 543*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 544*b1cdbd2cSJim Jagielski $oneline = "s38\tS20\tS20\tS255\ti4\tS255\ts72\n"; 545*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 546*b1cdbd2cSJim Jagielski $oneline = "Upgrade\tUpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\n"; 547*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 548*b1cdbd2cSJim Jagielski } 549*b1cdbd2cSJim Jagielski 550*b1cdbd2cSJim Jagielski if ( $definestring eq "icon" ) 551*b1cdbd2cSJim Jagielski { 552*b1cdbd2cSJim Jagielski $oneline = "Name\tData\n"; 553*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 554*b1cdbd2cSJim Jagielski $oneline = "s72\tv0\n"; 555*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 556*b1cdbd2cSJim Jagielski $oneline = "Icon\tName\n"; 557*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 558*b1cdbd2cSJim Jagielski } 559*b1cdbd2cSJim Jagielski 560*b1cdbd2cSJim Jagielski if ( $definestring eq "inifile" ) 561*b1cdbd2cSJim Jagielski { 562*b1cdbd2cSJim Jagielski $oneline = "IniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n"; 563*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 564*b1cdbd2cSJim Jagielski $oneline = "s72\tl255\tS72\tl96\tl128\tl255\ti2\ts72\n"; 565*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 566*b1cdbd2cSJim Jagielski $oneline = "IniFile\tIniFile\n"; 567*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 568*b1cdbd2cSJim Jagielski } 569*b1cdbd2cSJim Jagielski 570*b1cdbd2cSJim Jagielski if ( $definestring eq "selfreg" ) 571*b1cdbd2cSJim Jagielski { 572*b1cdbd2cSJim Jagielski $oneline = "File_\tCost\n"; 573*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 574*b1cdbd2cSJim Jagielski $oneline = "s72\tI2\n"; 575*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 576*b1cdbd2cSJim Jagielski $oneline = "SelfReg\tFile_\n"; 577*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 578*b1cdbd2cSJim Jagielski } 579*b1cdbd2cSJim Jagielski 580*b1cdbd2cSJim Jagielski if ( $definestring eq "msiassembly" ) 581*b1cdbd2cSJim Jagielski { 582*b1cdbd2cSJim Jagielski $oneline = "Component_\tFeature_\tFile_Manifest\tFile_Application\tAttributes\n"; 583*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 584*b1cdbd2cSJim Jagielski $oneline = "s72\ts38\tS72\tS72\tI2\n"; 585*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 586*b1cdbd2cSJim Jagielski $oneline = "MsiAssembly\tComponent_\n"; 587*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 588*b1cdbd2cSJim Jagielski } 589*b1cdbd2cSJim Jagielski 590*b1cdbd2cSJim Jagielski if ( $definestring eq "msiassemblyname" ) 591*b1cdbd2cSJim Jagielski { 592*b1cdbd2cSJim Jagielski $oneline = "Component_\tName\tValue\n"; 593*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 594*b1cdbd2cSJim Jagielski $oneline = "s72\ts255\ts255\n"; 595*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 596*b1cdbd2cSJim Jagielski $oneline = "MsiAssemblyName\tComponent_\tName\n"; 597*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 598*b1cdbd2cSJim Jagielski } 599*b1cdbd2cSJim Jagielski 600*b1cdbd2cSJim Jagielski if ( $definestring eq "appsearch" ) 601*b1cdbd2cSJim Jagielski { 602*b1cdbd2cSJim Jagielski $oneline = "Property\tSignature_\n"; 603*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 604*b1cdbd2cSJim Jagielski $oneline = "s72\ts72\n"; 605*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 606*b1cdbd2cSJim Jagielski $oneline = "AppSearch\tProperty\tSignature_\n"; 607*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 608*b1cdbd2cSJim Jagielski } 609*b1cdbd2cSJim Jagielski 610*b1cdbd2cSJim Jagielski if ( $definestring eq "reglocat" ) 611*b1cdbd2cSJim Jagielski { 612*b1cdbd2cSJim Jagielski $oneline = "Signature_\tRoot\tKey\tName\tType\n"; 613*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 614*b1cdbd2cSJim Jagielski $oneline = "s72\ti2\ts255\tS255\tI2\n"; 615*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 616*b1cdbd2cSJim Jagielski $oneline = "RegLocator\tSignature_\n"; 617*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 618*b1cdbd2cSJim Jagielski } 619*b1cdbd2cSJim Jagielski 620*b1cdbd2cSJim Jagielski if ( $definestring eq "signatur" ) 621*b1cdbd2cSJim Jagielski { 622*b1cdbd2cSJim Jagielski $oneline = "Signature\tFileName\tMinVersion\tMaxVersion\tMinSize\tMaxSize\tMinDate\tMaxDate\tLanguages\n"; 623*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 624*b1cdbd2cSJim Jagielski $oneline = "s72\ts255\tS20\tS20\tI4\tI4\tI4\tI4\tS255\n"; 625*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 626*b1cdbd2cSJim Jagielski $oneline = "Signature\tSignature\n"; 627*b1cdbd2cSJim Jagielski push(@{$idtref}, $oneline); 628*b1cdbd2cSJim Jagielski } 629*b1cdbd2cSJim Jagielski 630*b1cdbd2cSJim Jagielski} 631*b1cdbd2cSJim Jagielski 632*b1cdbd2cSJim Jagielski############################################################## 633*b1cdbd2cSJim Jagielski# Returning the name of the rranslation file for a 634*b1cdbd2cSJim Jagielski# given language. 635*b1cdbd2cSJim Jagielski# Sample: "01" oder "en-US" -> "1033.txt" 636*b1cdbd2cSJim Jagielski############################################################## 637*b1cdbd2cSJim Jagielski 638*b1cdbd2cSJim Jagielskisub get_languagefilename 639*b1cdbd2cSJim Jagielski{ 640*b1cdbd2cSJim Jagielski my ($idtfilename, $basedir) = @_; 641*b1cdbd2cSJim Jagielski 642*b1cdbd2cSJim Jagielski # $idtfilename =~ s/\.idt/\.ulf/; 643*b1cdbd2cSJim Jagielski $idtfilename =~ s/\.idt/\.mlf/; 644*b1cdbd2cSJim Jagielski 645*b1cdbd2cSJim Jagielski my $languagefilename = $basedir . $installer::globals::separator . $idtfilename; 646*b1cdbd2cSJim Jagielski 647*b1cdbd2cSJim Jagielski return $languagefilename; 648*b1cdbd2cSJim Jagielski} 649*b1cdbd2cSJim Jagielski 650*b1cdbd2cSJim Jagielski############################################################## 651*b1cdbd2cSJim Jagielski# Returning the complete block in all languages 652*b1cdbd2cSJim Jagielski# for a specified string 653*b1cdbd2cSJim Jagielski############################################################## 654*b1cdbd2cSJim Jagielski 655*b1cdbd2cSJim Jagielskisub get_language_block_from_language_file 656*b1cdbd2cSJim Jagielski{ 657*b1cdbd2cSJim Jagielski my ($searchstring, $languagefile) = @_; 658*b1cdbd2cSJim Jagielski 659*b1cdbd2cSJim Jagielski my @language_block = (); 660*b1cdbd2cSJim Jagielski 661*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$languagefile}; $i++ ) 662*b1cdbd2cSJim Jagielski { 663*b1cdbd2cSJim Jagielski if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ ) 664*b1cdbd2cSJim Jagielski { 665*b1cdbd2cSJim Jagielski my $counter = $i; 666*b1cdbd2cSJim Jagielski 667*b1cdbd2cSJim Jagielski push(@language_block, ${$languagefile}[$counter]); 668*b1cdbd2cSJim Jagielski $counter++; 669*b1cdbd2cSJim Jagielski 670*b1cdbd2cSJim Jagielski while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ ))) 671*b1cdbd2cSJim Jagielski { 672*b1cdbd2cSJim Jagielski push(@language_block, ${$languagefile}[$counter]); 673*b1cdbd2cSJim Jagielski $counter++; 674*b1cdbd2cSJim Jagielski } 675*b1cdbd2cSJim Jagielski 676*b1cdbd2cSJim Jagielski last; 677*b1cdbd2cSJim Jagielski } 678*b1cdbd2cSJim Jagielski } 679*b1cdbd2cSJim Jagielski 680*b1cdbd2cSJim Jagielski return \@language_block; 681*b1cdbd2cSJim Jagielski} 682*b1cdbd2cSJim Jagielski 683*b1cdbd2cSJim Jagielski############################################################## 684*b1cdbd2cSJim Jagielski# Returning a specific language string from the block 685*b1cdbd2cSJim Jagielski# of all translations 686*b1cdbd2cSJim Jagielski############################################################## 687*b1cdbd2cSJim Jagielski 688*b1cdbd2cSJim Jagielskisub get_language_string_from_language_block 689*b1cdbd2cSJim Jagielski{ 690*b1cdbd2cSJim Jagielski my ($language_block, $language, $oldstring) = @_; 691*b1cdbd2cSJim Jagielski 692*b1cdbd2cSJim Jagielski my $newstring = ""; 693*b1cdbd2cSJim Jagielski 694*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$language_block}; $i++ ) 695*b1cdbd2cSJim Jagielski { 696*b1cdbd2cSJim Jagielski if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) 697*b1cdbd2cSJim Jagielski { 698*b1cdbd2cSJim Jagielski $newstring = $1; 699*b1cdbd2cSJim Jagielski last; 700*b1cdbd2cSJim Jagielski } 701*b1cdbd2cSJim Jagielski } 702*b1cdbd2cSJim Jagielski 703*b1cdbd2cSJim Jagielski if ( $newstring eq "" ) 704*b1cdbd2cSJim Jagielski { 705*b1cdbd2cSJim Jagielski $language = "en-US"; # defaulting to english 706*b1cdbd2cSJim Jagielski 707*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$language_block}; $i++ ) 708*b1cdbd2cSJim Jagielski { 709*b1cdbd2cSJim Jagielski if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) 710*b1cdbd2cSJim Jagielski { 711*b1cdbd2cSJim Jagielski $newstring = $1; 712*b1cdbd2cSJim Jagielski last; 713*b1cdbd2cSJim Jagielski } 714*b1cdbd2cSJim Jagielski } 715*b1cdbd2cSJim Jagielski } 716*b1cdbd2cSJim Jagielski 717*b1cdbd2cSJim Jagielski return $newstring; 718*b1cdbd2cSJim Jagielski} 719*b1cdbd2cSJim Jagielski 720*b1cdbd2cSJim Jagielski############################################################## 721*b1cdbd2cSJim Jagielski# Returning a specific code from the block 722*b1cdbd2cSJim Jagielski# of all codes. No defaulting to english! 723*b1cdbd2cSJim Jagielski############################################################## 724*b1cdbd2cSJim Jagielski 725*b1cdbd2cSJim Jagielskisub get_code_from_code_block 726*b1cdbd2cSJim Jagielski{ 727*b1cdbd2cSJim Jagielski my ($codeblock, $language) = @_; 728*b1cdbd2cSJim Jagielski 729*b1cdbd2cSJim Jagielski my $newstring = ""; 730*b1cdbd2cSJim Jagielski 731*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$codeblock}; $i++ ) 732*b1cdbd2cSJim Jagielski { 733*b1cdbd2cSJim Jagielski if ( ${$codeblock}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) 734*b1cdbd2cSJim Jagielski { 735*b1cdbd2cSJim Jagielski $newstring = $1; 736*b1cdbd2cSJim Jagielski last; 737*b1cdbd2cSJim Jagielski } 738*b1cdbd2cSJim Jagielski } 739*b1cdbd2cSJim Jagielski 740*b1cdbd2cSJim Jagielski return $newstring; 741*b1cdbd2cSJim Jagielski} 742*b1cdbd2cSJim Jagielski 743*b1cdbd2cSJim Jagielski############################################################## 744*b1cdbd2cSJim Jagielski# Translating an idt file 745*b1cdbd2cSJim Jagielski############################################################## 746*b1cdbd2cSJim Jagielski 747*b1cdbd2cSJim Jagielskisub translate_idtfile 748*b1cdbd2cSJim Jagielski{ 749*b1cdbd2cSJim Jagielski my ($idtfile, $languagefile, $onelanguage) = @_; 750*b1cdbd2cSJim Jagielski 751*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$idtfile}; $i++ ) 752*b1cdbd2cSJim Jagielski { 753*b1cdbd2cSJim Jagielski my @allstrings = (); 754*b1cdbd2cSJim Jagielski 755*b1cdbd2cSJim Jagielski my $oneline = ${$idtfile}[$i]; 756*b1cdbd2cSJim Jagielski 757*b1cdbd2cSJim Jagielski while ( $oneline =~ /\b(OOO_\w+)\b/ ) 758*b1cdbd2cSJim Jagielski { 759*b1cdbd2cSJim Jagielski my $replacestring = $1; 760*b1cdbd2cSJim Jagielski push(@allstrings, $replacestring); 761*b1cdbd2cSJim Jagielski $oneline =~ s/$replacestring//; 762*b1cdbd2cSJim Jagielski } 763*b1cdbd2cSJim Jagielski 764*b1cdbd2cSJim Jagielski my $oldstring; 765*b1cdbd2cSJim Jagielski 766*b1cdbd2cSJim Jagielski foreach $oldstring (@allstrings) 767*b1cdbd2cSJim Jagielski { 768*b1cdbd2cSJim Jagielski my $language_block = get_language_block_from_language_file($oldstring, $languagefile); 769*b1cdbd2cSJim Jagielski my $newstring = get_language_string_from_language_block($language_block, $onelanguage, $oldstring); 770*b1cdbd2cSJim Jagielski 771*b1cdbd2cSJim Jagielski # if (!( $newstring eq "" )) { ${$idtfile}[$i] =~ s/$oldstring/$newstring/; } 772*b1cdbd2cSJim Jagielski ${$idtfile}[$i] =~ s/$oldstring/$newstring/; # always substitute, even if $newstring eq "" (there are empty strings for control.idt) 773*b1cdbd2cSJim Jagielski } 774*b1cdbd2cSJim Jagielski } 775*b1cdbd2cSJim Jagielski} 776*b1cdbd2cSJim Jagielski 777*b1cdbd2cSJim Jagielski############################################################## 778*b1cdbd2cSJim Jagielski# Copying all needed files to create a msi database 779*b1cdbd2cSJim Jagielski# into one language specific directory 780*b1cdbd2cSJim Jagielski############################################################## 781*b1cdbd2cSJim Jagielski 782*b1cdbd2cSJim Jagielskisub prepare_language_idt_directory ($$$$$$$) 783*b1cdbd2cSJim Jagielski{ 784*b1cdbd2cSJim Jagielski my ($destinationdir, $newidtdir, $onelanguage, $filesref, $iconfilecollector, $binarytablefiles, $allvariables) = @_; 785*b1cdbd2cSJim Jagielski 786*b1cdbd2cSJim Jagielski # Copying all idt-files from the source $installer::globals::idttemplatepath to the destination $destinationdir 787*b1cdbd2cSJim Jagielski # Copying all files in the subdirectory "Binary" 788*b1cdbd2cSJim Jagielski # Copying all files in the subdirectory "Icon" 789*b1cdbd2cSJim Jagielski 790*b1cdbd2cSJim Jagielski my $infoline = ""; 791*b1cdbd2cSJim Jagielski 792*b1cdbd2cSJim Jagielski installer::systemactions::copy_directory($installer::globals::idttemplatepath, $destinationdir); 793*b1cdbd2cSJim Jagielski 794*b1cdbd2cSJim Jagielski if ( -d $installer::globals::idttemplatepath . $installer::globals::separator . "Binary") 795*b1cdbd2cSJim Jagielski { 796*b1cdbd2cSJim Jagielski installer::systemactions::create_directory($destinationdir . $installer::globals::separator . "Binary"); 797*b1cdbd2cSJim Jagielski installer::systemactions::copy_directory( 798*b1cdbd2cSJim Jagielski $installer::globals::idttemplatepath . $installer::globals::separator . "Binary", 799*b1cdbd2cSJim Jagielski $destinationdir . $installer::globals::separator . "Binary"); 800*b1cdbd2cSJim Jagielski 801*b1cdbd2cSJim Jagielski if ((( $installer::globals::patch ) && ( $allvariables->{'WINDOWSPATCHBITMAPDIRECTORY'} )) || ( $allvariables->{'WINDOWSBITMAPDIRECTORY'} )) 802*b1cdbd2cSJim Jagielski { 803*b1cdbd2cSJim Jagielski my $bitmapdir = ""; 804*b1cdbd2cSJim Jagielski if ( $allvariables->{'WINDOWSPATCHBITMAPDIRECTORY'} ) 805*b1cdbd2cSJim Jagielski { 806*b1cdbd2cSJim Jagielski $bitmapdir = $allvariables->{'WINDOWSPATCHBITMAPDIRECTORY'}; 807*b1cdbd2cSJim Jagielski } 808*b1cdbd2cSJim Jagielski if ( $allvariables->{'WINDOWSBITMAPDIRECTORY'} ) 809*b1cdbd2cSJim Jagielski { 810*b1cdbd2cSJim Jagielski $bitmapdir = $allvariables->{'WINDOWSBITMAPDIRECTORY'}; 811*b1cdbd2cSJim Jagielski } 812*b1cdbd2cSJim Jagielski 813*b1cdbd2cSJim Jagielski my $newsourcedir = $installer::globals::unpackpath . $installer::globals::separator . $bitmapdir; # path setting in list file dependent from unpackpath !? 814*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("\n"); 815*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf( 816*b1cdbd2cSJim Jagielski "Overwriting files in directory \"%s%sBinary\" with files from directory \"%s\".\n", 817*b1cdbd2cSJim Jagielski $destinationdir, 818*b1cdbd2cSJim Jagielski $installer::globals::separator, 819*b1cdbd2cSJim Jagielski $newsourcedir); 820*b1cdbd2cSJim Jagielski if ( ! -d $newsourcedir ) 821*b1cdbd2cSJim Jagielski { 822*b1cdbd2cSJim Jagielski my $currentdir = cwd(); 823*b1cdbd2cSJim Jagielski installer::exiter::exit_program( 824*b1cdbd2cSJim Jagielski "ERROR: Directory $newsourcedir does not exist! Current directory is: $currentdir", 825*b1cdbd2cSJim Jagielski "prepare_language_idt_directory"); 826*b1cdbd2cSJim Jagielski } 827*b1cdbd2cSJim Jagielski installer::systemactions::copy_directory( 828*b1cdbd2cSJim Jagielski $newsourcedir, 829*b1cdbd2cSJim Jagielski $destinationdir . $installer::globals::separator . "Binary"); 830*b1cdbd2cSJim Jagielski } 831*b1cdbd2cSJim Jagielski } 832*b1cdbd2cSJim Jagielski 833*b1cdbd2cSJim Jagielski installer::systemactions::create_directory($destinationdir . $installer::globals::separator . "Icon"); 834*b1cdbd2cSJim Jagielski 835*b1cdbd2cSJim Jagielski if ( -d $installer::globals::idttemplatepath . $installer::globals::separator . "Icon") 836*b1cdbd2cSJim Jagielski { 837*b1cdbd2cSJim Jagielski installer::systemactions::copy_directory( 838*b1cdbd2cSJim Jagielski $installer::globals::idttemplatepath . $installer::globals::separator . "Icon", 839*b1cdbd2cSJim Jagielski $destinationdir . $installer::globals::separator . "Icon"); 840*b1cdbd2cSJim Jagielski } 841*b1cdbd2cSJim Jagielski 842*b1cdbd2cSJim Jagielski # Copying all files in $iconfilecollector, that describe icons of folderitems 843*b1cdbd2cSJim Jagielski 844*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$iconfilecollector}; $i++ ) 845*b1cdbd2cSJim Jagielski { 846*b1cdbd2cSJim Jagielski my $iconfilename = ${$iconfilecollector}[$i]; 847*b1cdbd2cSJim Jagielski installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$iconfilename); 848*b1cdbd2cSJim Jagielski installer::systemactions::copy_one_file( 849*b1cdbd2cSJim Jagielski ${$iconfilecollector}[$i], 850*b1cdbd2cSJim Jagielski $destinationdir . $installer::globals::separator . "Icon" . $installer::globals::separator . $iconfilename); 851*b1cdbd2cSJim Jagielski } 852*b1cdbd2cSJim Jagielski 853*b1cdbd2cSJim Jagielski # Copying all files in $binarytablefiles in the binary directory 854*b1cdbd2cSJim Jagielski 855*b1cdbd2cSJim Jagielski foreach my $binaryfile (@$binarytablefiles) 856*b1cdbd2cSJim Jagielski { 857*b1cdbd2cSJim Jagielski my $binaryfilepath = $binaryfile->{'sourcepath'}; 858*b1cdbd2cSJim Jagielski my $binaryfilename = $binaryfilepath; 859*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("copying binary file %s to %s\n", 860*b1cdbd2cSJim Jagielski $binaryfilepath, 861*b1cdbd2cSJim Jagielski $binaryfilename); 862*b1cdbd2cSJim Jagielski installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$binaryfilename); 863*b1cdbd2cSJim Jagielski installer::systemactions::copy_one_file( 864*b1cdbd2cSJim Jagielski $binaryfilepath, 865*b1cdbd2cSJim Jagielski $destinationdir . $installer::globals::separator . "Binary" . $installer::globals::separator . $binaryfilename); 866*b1cdbd2cSJim Jagielski } 867*b1cdbd2cSJim Jagielski 868*b1cdbd2cSJim Jagielski # Copying all new created and language independent idt-files to the destination $destinationdir. 869*b1cdbd2cSJim Jagielski # Example: "File.idt" 870*b1cdbd2cSJim Jagielski 871*b1cdbd2cSJim Jagielski installer::systemactions::copy_directory_with_fileextension($newidtdir, $destinationdir, "idt"); 872*b1cdbd2cSJim Jagielski 873*b1cdbd2cSJim Jagielski # Copying all new created and language dependent idt-files to the destination $destinationdir. 874*b1cdbd2cSJim Jagielski # Example: "Feature.idt.01" 875*b1cdbd2cSJim Jagielski 876*b1cdbd2cSJim Jagielski installer::systemactions::copy_directory_with_fileextension($newidtdir, $destinationdir, $onelanguage); 877*b1cdbd2cSJim Jagielski installer::systemactions::rename_files_with_fileextension($destinationdir, $onelanguage); 878*b1cdbd2cSJim Jagielski 879*b1cdbd2cSJim Jagielski} 880*b1cdbd2cSJim Jagielski 881*b1cdbd2cSJim Jagielski############################################################## 882*b1cdbd2cSJim Jagielski# Returning the source path of the rtf licensefile for 883*b1cdbd2cSJim Jagielski# a specified language 884*b1cdbd2cSJim Jagielski############################################################## 885*b1cdbd2cSJim Jagielski 886*b1cdbd2cSJim Jagielskisub get_rtflicensefilesource 887*b1cdbd2cSJim Jagielski{ 888*b1cdbd2cSJim Jagielski my ($language, $includepatharrayref) = @_; 889*b1cdbd2cSJim Jagielski 890*b1cdbd2cSJim Jagielski my $licensefilename = "license_" . $language . ".rtf"; 891*b1cdbd2cSJim Jagielski 892*b1cdbd2cSJim Jagielski my $sourcefileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $includepatharrayref, 1); 893*b1cdbd2cSJim Jagielski 894*b1cdbd2cSJim Jagielski if ($$sourcefileref eq "") { installer::exiter::exit_program("ERROR: Could not find $licensefilename!", "get_rtflicensefilesource"); } 895*b1cdbd2cSJim Jagielski 896*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Using licensefile: %s\n", $$sourcefileref); 897*b1cdbd2cSJim Jagielski 898*b1cdbd2cSJim Jagielski return $$sourcefileref; 899*b1cdbd2cSJim Jagielski} 900*b1cdbd2cSJim Jagielski 901*b1cdbd2cSJim Jagielski############################################################## 902*b1cdbd2cSJim Jagielski# Returning the source path of the licensefile for 903*b1cdbd2cSJim Jagielski# a specified language 904*b1cdbd2cSJim Jagielski############################################################## 905*b1cdbd2cSJim Jagielski 906*b1cdbd2cSJim Jagielskisub get_licensefilesource 907*b1cdbd2cSJim Jagielski{ 908*b1cdbd2cSJim Jagielski my ($language, $filesref) = @_; 909*b1cdbd2cSJim Jagielski 910*b1cdbd2cSJim Jagielski my $licensefilename = "license_" . $language . ".txt"; 911*b1cdbd2cSJim Jagielski my $sourcepath = ""; 912*b1cdbd2cSJim Jagielski my $foundlicensefile = 0; 913*b1cdbd2cSJim Jagielski 914*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$filesref}; $i++ ) 915*b1cdbd2cSJim Jagielski { 916*b1cdbd2cSJim Jagielski my $onefile = ${$filesref}[$i]; 917*b1cdbd2cSJim Jagielski my $filename = $onefile->{'Name'}; 918*b1cdbd2cSJim Jagielski 919*b1cdbd2cSJim Jagielski if ($filename eq $licensefilename) 920*b1cdbd2cSJim Jagielski { 921*b1cdbd2cSJim Jagielski $sourcepath = $onefile->{'sourcepath'}; 922*b1cdbd2cSJim Jagielski $foundlicensefile = 1; 923*b1cdbd2cSJim Jagielski last; 924*b1cdbd2cSJim Jagielski } 925*b1cdbd2cSJim Jagielski } 926*b1cdbd2cSJim Jagielski 927*b1cdbd2cSJim Jagielski if ( ! $foundlicensefile ) { installer::exiter::exit_program("ERROR: Did not find file $licensefilename in file collector!", "get_licensefilesource"); } 928*b1cdbd2cSJim Jagielski 929*b1cdbd2cSJim Jagielski return $sourcepath; 930*b1cdbd2cSJim Jagielski} 931*b1cdbd2cSJim Jagielski 932*b1cdbd2cSJim Jagielski############################################################## 933*b1cdbd2cSJim Jagielski# A simple converter to create the license text 934*b1cdbd2cSJim Jagielski# in rtf format 935*b1cdbd2cSJim Jagielski############################################################## 936*b1cdbd2cSJim Jagielski 937*b1cdbd2cSJim Jagielskisub get_rtf_licensetext 938*b1cdbd2cSJim Jagielski{ 939*b1cdbd2cSJim Jagielski my ($licensefile) = @_; 940*b1cdbd2cSJim Jagielski 941*b1cdbd2cSJim Jagielski # A very simple rtf converter 942*b1cdbd2cSJim Jagielski 943*b1cdbd2cSJim Jagielski # The static header 944*b1cdbd2cSJim Jagielski 945*b1cdbd2cSJim Jagielski my $rtf_licensetext = '{\rtf1\ansi\deff0'; 946*b1cdbd2cSJim Jagielski $rtf_licensetext = $rtf_licensetext . '{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}}'; 947*b1cdbd2cSJim Jagielski $rtf_licensetext = $rtf_licensetext . '{\colortbl\red0\green0\blue0;\red255\green255\blue255;\red128\green128\blue128;}'; 948*b1cdbd2cSJim Jagielski $rtf_licensetext = $rtf_licensetext . '{\stylesheet{\s1\snext1 Standard;}}'; 949*b1cdbd2cSJim Jagielski $rtf_licensetext = $rtf_licensetext . '{\info{\comment StarWriter}{\vern5690}}\deftab709'; 950*b1cdbd2cSJim Jagielski $rtf_licensetext = $rtf_licensetext . '{\*\pgdsctbl'; 951*b1cdbd2cSJim Jagielski $rtf_licensetext = $rtf_licensetext . '{\pgdsc0\pgdscuse195\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}}'; 952*b1cdbd2cSJim Jagielski $rtf_licensetext = $rtf_licensetext . '\paperh16837\paperw11905\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc'; 953*b1cdbd2cSJim Jagielski $rtf_licensetext = $rtf_licensetext . '\pard\plain \s1'; 954*b1cdbd2cSJim Jagielski 955*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$licensefile}; $i++ ) 956*b1cdbd2cSJim Jagielski { 957*b1cdbd2cSJim Jagielski my $oneline = ${$licensefile}[$i]; 958*b1cdbd2cSJim Jagielski # if ( $oneline =~ /^\s*$/ ) { $oneline = '\par'; } # empty lines 959*b1cdbd2cSJim Jagielski 960*b1cdbd2cSJim Jagielski if ( $i == 0 ) { $oneline =~ s/^\W*//; } 961*b1cdbd2cSJim Jagielski 962*b1cdbd2cSJim Jagielski $oneline =~ s/\t/ /g; # no tabs allowed, converting to four spaces 963*b1cdbd2cSJim Jagielski $oneline =~ s/\n$//g; # no newline at line end 964*b1cdbd2cSJim Jagielski 965*b1cdbd2cSJim Jagielski# $oneline =~ s/�/\\\'e4/g; # converting "�" 966*b1cdbd2cSJim Jagielski# $oneline =~ s/�/\\\'f6/g; # converting "�" 967*b1cdbd2cSJim Jagielski# $oneline =~ s/�/\\\'fc/g; # converting "�" 968*b1cdbd2cSJim Jagielski# $oneline =~ s/�/\\\'df/g; # converting "�" 969*b1cdbd2cSJim Jagielski 970*b1cdbd2cSJim Jagielski # german replacements 971*b1cdbd2cSJim Jagielski 972*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'c4/g; # converting "�" 973*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'d6/g; # converting "�" 974*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'dc/g; # converting "�" 975*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'e4/g; # converting "�" 976*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'f6/g; # converting "�" 977*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'fc/g; # converting "�" 978*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'df/g; # converting "�" 979*b1cdbd2cSJim Jagielski 980*b1cdbd2cSJim Jagielski # french replacements 981*b1cdbd2cSJim Jagielski 982*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'c9/g; 983*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'c0/g; 984*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'ab/g; 985*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'bb/g; 986*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'e9/g; 987*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'e8/g; 988*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'e0/g; 989*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'f4/g; 990*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'e7/g; 991*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'ea/g; 992*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'ca/g; 993*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'fb/g; 994*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'f9/g; 995*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\'ee/g; 996*b1cdbd2cSJim Jagielski 997*b1cdbd2cSJim Jagielski # quotation marks 998*b1cdbd2cSJim Jagielski 999*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�\�/\\\'84/g; 1000*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�\�/\\ldblquote/g; 1001*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�\�/\\rquote/g; 1002*b1cdbd2cSJim Jagielski 1003*b1cdbd2cSJim Jagielski 1004*b1cdbd2cSJim Jagielski $oneline =~ s/\�\�/\\\~/g; 1005*b1cdbd2cSJim Jagielski 1006*b1cdbd2cSJim Jagielski $oneline = '\par ' . $oneline; 1007*b1cdbd2cSJim Jagielski 1008*b1cdbd2cSJim Jagielski $rtf_licensetext = $rtf_licensetext . $oneline; 1009*b1cdbd2cSJim Jagielski } 1010*b1cdbd2cSJim Jagielski 1011*b1cdbd2cSJim Jagielski # and the end 1012*b1cdbd2cSJim Jagielski 1013*b1cdbd2cSJim Jagielski $rtf_licensetext = $rtf_licensetext . '\par \par }'; 1014*b1cdbd2cSJim Jagielski 1015*b1cdbd2cSJim Jagielski return $rtf_licensetext; 1016*b1cdbd2cSJim Jagielski} 1017*b1cdbd2cSJim Jagielski 1018*b1cdbd2cSJim Jagielski############################################################## 1019*b1cdbd2cSJim Jagielski# A simple converter to create a license txt string from 1020*b1cdbd2cSJim Jagielski# the rtf format 1021*b1cdbd2cSJim Jagielski############################################################## 1022*b1cdbd2cSJim Jagielski 1023*b1cdbd2cSJim Jagielskisub make_string_licensetext 1024*b1cdbd2cSJim Jagielski{ 1025*b1cdbd2cSJim Jagielski my ($licensefile) = @_; 1026*b1cdbd2cSJim Jagielski 1027*b1cdbd2cSJim Jagielski my $rtf_licensetext = ""; 1028*b1cdbd2cSJim Jagielski 1029*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$licensefile}; $i++ ) 1030*b1cdbd2cSJim Jagielski { 1031*b1cdbd2cSJim Jagielski my $oneline = ${$licensefile}[$i]; 1032*b1cdbd2cSJim Jagielski $oneline =~ s/\s*$//g; # no whitespace at line end 1033*b1cdbd2cSJim Jagielski 1034*b1cdbd2cSJim Jagielski $rtf_licensetext = $rtf_licensetext . $oneline . " "; 1035*b1cdbd2cSJim Jagielski } 1036*b1cdbd2cSJim Jagielski 1037*b1cdbd2cSJim Jagielski return $rtf_licensetext; 1038*b1cdbd2cSJim Jagielski} 1039*b1cdbd2cSJim Jagielski 1040*b1cdbd2cSJim Jagielski############################################################## 1041*b1cdbd2cSJim Jagielski# Setting the path, where the soffice.exe is installed, into 1042*b1cdbd2cSJim Jagielski# the CustomAction table 1043*b1cdbd2cSJim Jagielski############################################################## 1044*b1cdbd2cSJim Jagielski 1045*b1cdbd2cSJim Jagielskisub add_officedir_to_database 1046*b1cdbd2cSJim Jagielski{ 1047*b1cdbd2cSJim Jagielski my ($basedir, $allvariables) = @_; 1048*b1cdbd2cSJim Jagielski 1049*b1cdbd2cSJim Jagielski my $customactionfilename = $basedir . $installer::globals::separator . "CustomAc.idt"; 1050*b1cdbd2cSJim Jagielski 1051*b1cdbd2cSJim Jagielski my $customacfile = installer::files::read_file($customactionfilename); 1052*b1cdbd2cSJim Jagielski 1053*b1cdbd2cSJim Jagielski my $found = 0; 1054*b1cdbd2cSJim Jagielski 1055*b1cdbd2cSJim Jagielski # Updating the values 1056*b1cdbd2cSJim Jagielski 1057*b1cdbd2cSJim Jagielski if ( $installer::globals::officeinstalldirectoryset ) 1058*b1cdbd2cSJim Jagielski { 1059*b1cdbd2cSJim Jagielski $found = 0; 1060*b1cdbd2cSJim Jagielski 1061*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$customacfile}; $i++ ) 1062*b1cdbd2cSJim Jagielski { 1063*b1cdbd2cSJim Jagielski if ( ${$customacfile}[$i] =~ /\bOFFICEDIRECTORYGID\b/ ) 1064*b1cdbd2cSJim Jagielski { 1065*b1cdbd2cSJim Jagielski ${$customacfile}[$i] =~ s/\bOFFICEDIRECTORYGID\b/$installer::globals::officeinstalldirectory/; 1066*b1cdbd2cSJim Jagielski $found = 1; 1067*b1cdbd2cSJim Jagielski } 1068*b1cdbd2cSJim Jagielski } 1069*b1cdbd2cSJim Jagielski 1070*b1cdbd2cSJim Jagielski if (( ! $found ) && ( ! $allvariables->{'IGNOREDIRECTORYLAYER'} )) 1071*b1cdbd2cSJim Jagielski { 1072*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: \"OFFICEDIRECTORYGID\" not found in \"$customactionfilename\" !", "add_officedir_to_database"); 1073*b1cdbd2cSJim Jagielski } 1074*b1cdbd2cSJim Jagielski } 1075*b1cdbd2cSJim Jagielski 1076*b1cdbd2cSJim Jagielski # Saving the file 1077*b1cdbd2cSJim Jagielski 1078*b1cdbd2cSJim Jagielski installer::files::save_file($customactionfilename ,$customacfile); 1079*b1cdbd2cSJim Jagielski my $infoline = "Updated idt file: $customactionfilename\n"; 1080*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1081*b1cdbd2cSJim Jagielski 1082*b1cdbd2cSJim Jagielski} 1083*b1cdbd2cSJim Jagielski 1084*b1cdbd2cSJim Jagielski############################################################## 1085*b1cdbd2cSJim Jagielski# Including the license text into the table control.idt 1086*b1cdbd2cSJim Jagielski############################################################## 1087*b1cdbd2cSJim Jagielski 1088*b1cdbd2cSJim Jagielskisub add_licensefile_to_database 1089*b1cdbd2cSJim Jagielski{ 1090*b1cdbd2cSJim Jagielski my ($licensefile, $controltable) = @_; 1091*b1cdbd2cSJim Jagielski 1092*b1cdbd2cSJim Jagielski # Nine tabs before the license text and two tabs after it 1093*b1cdbd2cSJim Jagielski # The license text has to be included into the dialog 1094*b1cdbd2cSJim Jagielski # LicenseAgreement into the control Memo. 1095*b1cdbd2cSJim Jagielski 1096*b1cdbd2cSJim Jagielski my $foundlicenseline = 0; 1097*b1cdbd2cSJim Jagielski my ($number, $line); 1098*b1cdbd2cSJim Jagielski 1099*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$controltable}; $i++ ) 1100*b1cdbd2cSJim Jagielski { 1101*b1cdbd2cSJim Jagielski $line = ${$controltable}[$i]; 1102*b1cdbd2cSJim Jagielski 1103*b1cdbd2cSJim Jagielski if ( $line =~ /^\s*\bLicenseAgreement\b\t\bMemo\t/ ) 1104*b1cdbd2cSJim Jagielski { 1105*b1cdbd2cSJim Jagielski $foundlicenseline = 1; 1106*b1cdbd2cSJim Jagielski $number = $i; 1107*b1cdbd2cSJim Jagielski last; 1108*b1cdbd2cSJim Jagielski } 1109*b1cdbd2cSJim Jagielski } 1110*b1cdbd2cSJim Jagielski 1111*b1cdbd2cSJim Jagielski if (!($foundlicenseline)) 1112*b1cdbd2cSJim Jagielski { 1113*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Line for license file in Control.idt not found!", "add_licensefile_to_database"); 1114*b1cdbd2cSJim Jagielski } 1115*b1cdbd2cSJim Jagielski else 1116*b1cdbd2cSJim Jagielski { 1117*b1cdbd2cSJim Jagielski my %control = (); 1118*b1cdbd2cSJim Jagielski 1119*b1cdbd2cSJim Jagielski if ( $line =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) 1120*b1cdbd2cSJim Jagielski { 1121*b1cdbd2cSJim Jagielski $control{'Dialog_'} = $1; 1122*b1cdbd2cSJim Jagielski $control{'Control'} = $2; 1123*b1cdbd2cSJim Jagielski $control{'Type'} = $3; 1124*b1cdbd2cSJim Jagielski $control{'X'} = $4; 1125*b1cdbd2cSJim Jagielski $control{'Y'} = $5; 1126*b1cdbd2cSJim Jagielski $control{'Width'} = $6; 1127*b1cdbd2cSJim Jagielski $control{'Height'} = $7; 1128*b1cdbd2cSJim Jagielski $control{'Attributes'} = $8; 1129*b1cdbd2cSJim Jagielski $control{'Property'} = $9; 1130*b1cdbd2cSJim Jagielski $control{'Text'} = $10; 1131*b1cdbd2cSJim Jagielski $control{'Control_Next'} = $11; 1132*b1cdbd2cSJim Jagielski $control{'Help'} = $12; 1133*b1cdbd2cSJim Jagielski } 1134*b1cdbd2cSJim Jagielski else 1135*b1cdbd2cSJim Jagielski { 1136*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Could not split line correctly!", "add_licensefile_to_database"); 1137*b1cdbd2cSJim Jagielski } 1138*b1cdbd2cSJim Jagielski 1139*b1cdbd2cSJim Jagielski # my $licensetext = get_rtf_licensetext($licensefile); 1140*b1cdbd2cSJim Jagielski my $licensetext = make_string_licensetext($licensefile); 1141*b1cdbd2cSJim Jagielski 1142*b1cdbd2cSJim Jagielski $control{'Text'} = $licensetext; 1143*b1cdbd2cSJim Jagielski 1144*b1cdbd2cSJim Jagielski my $newline = $control{'Dialog_'} . "\t" . $control{'Control'} . "\t" . $control{'Type'} . "\t" . 1145*b1cdbd2cSJim Jagielski $control{'X'} . "\t" . $control{'Y'} . "\t" . $control{'Width'} . "\t" . 1146*b1cdbd2cSJim Jagielski $control{'Height'} . "\t" . $control{'Attributes'} . "\t" . $control{'Property'} . "\t" . 1147*b1cdbd2cSJim Jagielski $control{'Text'} . "\t" . $control{'Control_Next'} . "\t" . $control{'Help'} . "\n"; 1148*b1cdbd2cSJim Jagielski 1149*b1cdbd2cSJim Jagielski ${$controltable}[$number] = $newline 1150*b1cdbd2cSJim Jagielski } 1151*b1cdbd2cSJim Jagielski} 1152*b1cdbd2cSJim Jagielski 1153*b1cdbd2cSJim Jagielski################################################################################################ 1154*b1cdbd2cSJim Jagielski# Including the checkboxes for the language selection dialog 1155*b1cdbd2cSJim Jagielski# into the table control.idt . This is only relevant for 1156*b1cdbd2cSJim Jagielski# multilingual installation sets. 1157*b1cdbd2cSJim Jagielski# 1158*b1cdbd2cSJim Jagielski# old: 1159*b1cdbd2cSJim Jagielski# LanguageSelection CheckBox1 CheckBox 22 60 15 24 3 IS1033 CheckBox2 1160*b1cdbd2cSJim Jagielski# LanguageSelection Text1 Text 40 60 70 15 65539 OOO_CONTROL_LANG_1033 1161*b1cdbd2cSJim Jagielski# LanguageSelection CheckBox2 CheckBox 22 90 15 24 3 IS1031 Next 1162*b1cdbd2cSJim Jagielski# LanguageSelection Text2 Text 40 90 70 15 65539 OOO_CONTROL_LANG_1031 1163*b1cdbd2cSJim Jagielski# new: 1164*b1cdbd2cSJim Jagielski# LanguageSelection CheckBox1 CheckBox 22 60 15 24 3 IS1033 Text CheckBox2 1165*b1cdbd2cSJim Jagielski# LanguageSelection CheckBox2 CheckBox 22 90 15 24 3 IS1031 Text Next 1166*b1cdbd2cSJim Jagielski################################################################################################ 1167*b1cdbd2cSJim Jagielski 1168*b1cdbd2cSJim Jagielskisub add_language_checkboxes_to_database 1169*b1cdbd2cSJim Jagielski{ 1170*b1cdbd2cSJim Jagielski my ($controltable, $languagesarrayref) = @_; 1171*b1cdbd2cSJim Jagielski 1172*b1cdbd2cSJim Jagielski # for each language, two lines have to be inserted 1173*b1cdbd2cSJim Jagielski 1174*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$languagesarrayref}; $i++ ) 1175*b1cdbd2cSJim Jagielski { 1176*b1cdbd2cSJim Jagielski my $last = 0; 1177*b1cdbd2cSJim Jagielski if ( $i == $#{$languagesarrayref} ) { $last = 1; } # special handling for the last 1178*b1cdbd2cSJim Jagielski 1179*b1cdbd2cSJim Jagielski my $onelanguage = ${$languagesarrayref}[$i]; 1180*b1cdbd2cSJim Jagielski my $windowslanguage = installer::windows::language::get_windows_language($onelanguage); 1181*b1cdbd2cSJim Jagielski 1182*b1cdbd2cSJim Jagielski # my $is_english = 0; 1183*b1cdbd2cSJim Jagielski # if ( $windowslanguage eq "1033" ) { $is_english = 1; } 1184*b1cdbd2cSJim Jagielski 1185*b1cdbd2cSJim Jagielski my $checkboxattribute = "3"; 1186*b1cdbd2cSJim Jagielski # if ( $is_english ) { $checkboxattribute = "1"; } # english is not deselectable 1187*b1cdbd2cSJim Jagielski 1188*b1cdbd2cSJim Jagielski my $count = $i + 1; 1189*b1cdbd2cSJim Jagielski my $nextcount = $i + 2; 1190*b1cdbd2cSJim Jagielski my $checkboxcount = "CheckBox" . $count; 1191*b1cdbd2cSJim Jagielski 1192*b1cdbd2cSJim Jagielski my $multiplier = 20; 1193*b1cdbd2cSJim Jagielski my $offset = 60; 1194*b1cdbd2cSJim Jagielski if ( $#{$languagesarrayref} > 7 ) 1195*b1cdbd2cSJim Jagielski { 1196*b1cdbd2cSJim Jagielski $multiplier = 15; # smaller differences for more than 7 languages 1197*b1cdbd2cSJim Jagielski $offset = 50; # smaller offset for more than 7 languages 1198*b1cdbd2cSJim Jagielski } 1199*b1cdbd2cSJim Jagielski 1200*b1cdbd2cSJim Jagielski my $yvalue = $offset + $i * $multiplier; 1201*b1cdbd2cSJim Jagielski 1202*b1cdbd2cSJim Jagielski my $property = "IS" . $windowslanguage; 1203*b1cdbd2cSJim Jagielski # if ( ! exists($installer::globals::languageproperties{$property}) ) { installer::exiter::exit_program("ERROR: Could not find property \"$property\" in the list of language properties!", "add_language_checkboxes_to_database"); } 1204*b1cdbd2cSJim Jagielski 1205*b1cdbd2cSJim Jagielski my $controlnext = ""; 1206*b1cdbd2cSJim Jagielski if ( $last ) { $controlnext = "Next"; } 1207*b1cdbd2cSJim Jagielski else { $controlnext = "CheckBox" . $nextcount; } 1208*b1cdbd2cSJim Jagielski 1209*b1cdbd2cSJim Jagielski my $stringname = "OOO_CONTROL_LANG_" . $windowslanguage; 1210*b1cdbd2cSJim Jagielski 1211*b1cdbd2cSJim Jagielski my $line1 = "LanguageSelection" . "\t" . $checkboxcount . "\t" . "CheckBox" . "\t" . 1212*b1cdbd2cSJim Jagielski "22" . "\t" . $yvalue . "\t" . "200" . "\t" . "15" . "\t" . $checkboxattribute . "\t" . 1213*b1cdbd2cSJim Jagielski $property . "\t" . $stringname . "\t" . $controlnext . "\t" . "\n"; 1214*b1cdbd2cSJim Jagielski 1215*b1cdbd2cSJim Jagielski push(@{$controltable}, $line1); 1216*b1cdbd2cSJim Jagielski 1217*b1cdbd2cSJim Jagielski # my $textcount = "Text" . $count; 1218*b1cdbd2cSJim Jagielski # my $stringname = "OOO_CONTROL_LANG_" . $windowslanguage; 1219*b1cdbd2cSJim Jagielski # 1220*b1cdbd2cSJim Jagielski # $yvalue = $yvalue + 2; # text 2 pixel lower than checkbox 1221*b1cdbd2cSJim Jagielski # 1222*b1cdbd2cSJim Jagielski # my $line2 = "LanguageSelection" . "\t" . $textcount . "\t" . "Text" . "\t" . 1223*b1cdbd2cSJim Jagielski # "40" . "\t" . $yvalue . "\t" . "70" . "\t" . "15" . "\t" . "65539" . "\t" . 1224*b1cdbd2cSJim Jagielski # "\t" . $stringname . "\t" . "\t" . "\n"; 1225*b1cdbd2cSJim Jagielski # 1226*b1cdbd2cSJim Jagielski # push(@{$controltable}, $line2); 1227*b1cdbd2cSJim Jagielski } 1228*b1cdbd2cSJim Jagielski} 1229*b1cdbd2cSJim Jagielski 1230*b1cdbd2cSJim Jagielski################################################################### 1231*b1cdbd2cSJim Jagielski# Determining the last position in a sequencetable 1232*b1cdbd2cSJim Jagielski# into the tables CustomAc.idt and InstallE.idt. 1233*b1cdbd2cSJim Jagielski################################################################### 1234*b1cdbd2cSJim Jagielski 1235*b1cdbd2cSJim Jagielskisub get_last_position_in_sequencetable 1236*b1cdbd2cSJim Jagielski{ 1237*b1cdbd2cSJim Jagielski my ($sequencetable) = @_; 1238*b1cdbd2cSJim Jagielski 1239*b1cdbd2cSJim Jagielski my $position = 0; 1240*b1cdbd2cSJim Jagielski 1241*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) 1242*b1cdbd2cSJim Jagielski { 1243*b1cdbd2cSJim Jagielski my $line = ${$sequencetable}[$i]; 1244*b1cdbd2cSJim Jagielski 1245*b1cdbd2cSJim Jagielski if ( $line =~ /^\s*\w+\t.*\t\s*(\d+)\s$/ ) 1246*b1cdbd2cSJim Jagielski { 1247*b1cdbd2cSJim Jagielski my $newposition = $1; 1248*b1cdbd2cSJim Jagielski if ( $newposition > $position ) { $position = $newposition; } 1249*b1cdbd2cSJim Jagielski } 1250*b1cdbd2cSJim Jagielski } 1251*b1cdbd2cSJim Jagielski 1252*b1cdbd2cSJim Jagielski return $position; 1253*b1cdbd2cSJim Jagielski} 1254*b1cdbd2cSJim Jagielski 1255*b1cdbd2cSJim Jagielski######################################################################### 1256*b1cdbd2cSJim Jagielski# Determining the position of a specified Action in the sequencetable 1257*b1cdbd2cSJim Jagielski######################################################################### 1258*b1cdbd2cSJim Jagielski 1259*b1cdbd2cSJim Jagielskisub get_position_in_sequencetable 1260*b1cdbd2cSJim Jagielski{ 1261*b1cdbd2cSJim Jagielski my ($action, $sequencetable) = @_; 1262*b1cdbd2cSJim Jagielski 1263*b1cdbd2cSJim Jagielski my $position = 0; 1264*b1cdbd2cSJim Jagielski 1265*b1cdbd2cSJim Jagielski $action =~ s/^\s*behind_//; 1266*b1cdbd2cSJim Jagielski 1267*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) 1268*b1cdbd2cSJim Jagielski { 1269*b1cdbd2cSJim Jagielski my $line = ${$sequencetable}[$i]; 1270*b1cdbd2cSJim Jagielski 1271*b1cdbd2cSJim Jagielski if ( $line =~ /^\s*(\w+)\t.*\t\s*(\d+)\s$/ ) 1272*b1cdbd2cSJim Jagielski { 1273*b1cdbd2cSJim Jagielski my $compareaction = $1; 1274*b1cdbd2cSJim Jagielski $position = $2; 1275*b1cdbd2cSJim Jagielski if ( $compareaction eq $action ) { last; } 1276*b1cdbd2cSJim Jagielski } 1277*b1cdbd2cSJim Jagielski } 1278*b1cdbd2cSJim Jagielski 1279*b1cdbd2cSJim Jagielski return $position; 1280*b1cdbd2cSJim Jagielski} 1281*b1cdbd2cSJim Jagielski 1282*b1cdbd2cSJim Jagielski################################################################################################ 1283*b1cdbd2cSJim Jagielski# Including the CustomAction for the configuration 1284*b1cdbd2cSJim Jagielski# into the tables CustomAc.idt and InstallE.idt. 1285*b1cdbd2cSJim Jagielski# 1286*b1cdbd2cSJim Jagielski# CustomAc.idt: ExecutePkgchk 82 pkgchk.exe -s 1287*b1cdbd2cSJim Jagielski# InstallE.idt: ExecutePkgchk Not REMOVE="ALL" 3175 1288*b1cdbd2cSJim Jagielski# 1289*b1cdbd2cSJim Jagielski# CustomAc.idt: ExecuteQuickstart 82 install_quickstart.exe 1290*b1cdbd2cSJim Jagielski# InstallE.idt: ExecuteQuickstart &gm_o_Quickstart=3 3200 1291*b1cdbd2cSJim Jagielski# 1292*b1cdbd2cSJim Jagielski# CustomAc.idt: ExecuteInstallRegsvrex 82 regsvrex.exe shlxthdl.dll 1293*b1cdbd2cSJim Jagielski# InstallE.idt: ExecuteInstallRegsvrex Not REMOVE="ALL" 3225 1294*b1cdbd2cSJim Jagielski# 1295*b1cdbd2cSJim Jagielski# CustomAc.idt: ExecuteUninstallRegsvrex 82 regsvrex.exe /u shlxthdl.dll 1296*b1cdbd2cSJim Jagielski# InstallE.idt: ExecuteUninstallRegsvrex REMOVE="ALL" 690 1297*b1cdbd2cSJim Jagielski# 1298*b1cdbd2cSJim Jagielski# CustomAc.idt: Regmsdocmsidll1 1 reg4msdocmsidll Reg4MsDocEntry 1299*b1cdbd2cSJim Jagielski# InstallU.idt: Regmsdocmsidll1 Not REMOVE="ALL" 610 1300*b1cdbd2cSJim Jagielski# 1301*b1cdbd2cSJim Jagielski# CustomAc.idt: Regmsdocmsidll2 1 reg4msdocmsidll Reg4MsDocEntry 1302*b1cdbd2cSJim Jagielski# InstallE.idt: Regmsdocmsidll2 Not REMOVE="ALL" 3160 1303*b1cdbd2cSJim Jagielski################################################################################################ 1304*b1cdbd2cSJim Jagielski 1305*b1cdbd2cSJim Jagielskisub set_custom_action 1306*b1cdbd2cSJim Jagielski{ 1307*b1cdbd2cSJim Jagielski my ($customactionidttable, $actionname, $actionflags, $exefilename, $actionparameter, $inbinarytable, $filesref, $customactionidttablename, $styles) = @_; 1308*b1cdbd2cSJim Jagielski 1309*b1cdbd2cSJim Jagielski my $included_customaction = 0; 1310*b1cdbd2cSJim Jagielski my $infoline = ""; 1311*b1cdbd2cSJim Jagielski my $customaction_exefilename = $exefilename; 1312*b1cdbd2cSJim Jagielski my $uniquename = ""; 1313*b1cdbd2cSJim Jagielski 1314*b1cdbd2cSJim Jagielski # when the style NO_FILE is set, no searching for the file is needed, no filtering is done, we can add that custom action 1315*b1cdbd2cSJim Jagielski if ( $styles =~ /\bNO_FILE\b/ ) 1316*b1cdbd2cSJim Jagielski { 1317*b1cdbd2cSJim Jagielski my $line = $actionname . "\t" . $actionflags . "\t" . $customaction_exefilename . "\t" . $actionparameter . "\n"; 1318*b1cdbd2cSJim Jagielski push(@{$customactionidttable}, $line); 1319*b1cdbd2cSJim Jagielski 1320*b1cdbd2cSJim Jagielski $infoline = "Added $actionname CustomAction into table $customactionidttablename (NO_FILE has been set)\n"; 1321*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1322*b1cdbd2cSJim Jagielski 1323*b1cdbd2cSJim Jagielski $included_customaction = 1; 1324*b1cdbd2cSJim Jagielski return $included_customaction; 1325*b1cdbd2cSJim Jagielski } 1326*b1cdbd2cSJim Jagielski 1327*b1cdbd2cSJim Jagielski # is the $exefilename a library that is included into the binary table 1328*b1cdbd2cSJim Jagielski 1329*b1cdbd2cSJim Jagielski if ( $inbinarytable ) { $customaction_exefilename =~ s/\.//; } # this is the entry in the binary table ("abc.dll" -> "abcdll") 1330*b1cdbd2cSJim Jagielski 1331*b1cdbd2cSJim Jagielski # is the $exefilename included into the product? 1332*b1cdbd2cSJim Jagielski 1333*b1cdbd2cSJim Jagielski my $contains_file = 0; 1334*b1cdbd2cSJim Jagielski 1335*b1cdbd2cSJim Jagielski # All files are located in $filesref and in @installer::globals::binarytableonlyfiles. 1336*b1cdbd2cSJim Jagielski # Both must be added together 1337*b1cdbd2cSJim Jagielski my $localfilesref = installer::converter::combine_arrays_from_references(\@installer::globals::binarytableonlyfiles, $filesref); 1338*b1cdbd2cSJim Jagielski 1339*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$localfilesref}; $i++ ) 1340*b1cdbd2cSJim Jagielski { 1341*b1cdbd2cSJim Jagielski my $onefile = ${$localfilesref}[$i]; 1342*b1cdbd2cSJim Jagielski my $filename = ""; 1343*b1cdbd2cSJim Jagielski if ( exists($onefile->{'Name'}) ) 1344*b1cdbd2cSJim Jagielski { 1345*b1cdbd2cSJim Jagielski $filename = $onefile->{'Name'}; 1346*b1cdbd2cSJim Jagielski 1347*b1cdbd2cSJim Jagielski if ( $filename eq $exefilename ) 1348*b1cdbd2cSJim Jagielski { 1349*b1cdbd2cSJim Jagielski $contains_file = 1; 1350*b1cdbd2cSJim Jagielski $uniquename = ${$localfilesref}[$i]->{'uniquename'}; 1351*b1cdbd2cSJim Jagielski last; 1352*b1cdbd2cSJim Jagielski } 1353*b1cdbd2cSJim Jagielski } 1354*b1cdbd2cSJim Jagielski else 1355*b1cdbd2cSJim Jagielski { 1356*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: Did not find \"Name\" for file \"$onefile->{'uniquename'}\" ($onefile->{'gid'})!", "set_custom_action"); 1357*b1cdbd2cSJim Jagielski } 1358*b1cdbd2cSJim Jagielski } 1359*b1cdbd2cSJim Jagielski 1360*b1cdbd2cSJim Jagielski if ( $contains_file ) 1361*b1cdbd2cSJim Jagielski { 1362*b1cdbd2cSJim Jagielski # Now the CustomAction can be included into the CustomAc.idt 1363*b1cdbd2cSJim Jagielski 1364*b1cdbd2cSJim Jagielski if ( ! $inbinarytable ) { $customaction_exefilename = $uniquename; } # the unique file name has to be added to the custom action table 1365*b1cdbd2cSJim Jagielski 1366*b1cdbd2cSJim Jagielski my $line = $actionname . "\t" . $actionflags . "\t" . $customaction_exefilename . "\t" . $actionparameter . "\n"; 1367*b1cdbd2cSJim Jagielski push(@{$customactionidttable}, $line); 1368*b1cdbd2cSJim Jagielski 1369*b1cdbd2cSJim Jagielski $included_customaction = 1; 1370*b1cdbd2cSJim Jagielski } 1371*b1cdbd2cSJim Jagielski 1372*b1cdbd2cSJim Jagielski if ( $included_customaction ) { $infoline = "Added $actionname CustomAction into table $customactionidttablename\n"; } 1373*b1cdbd2cSJim Jagielski else { $infoline = "Did not add $actionname CustomAction into table $customactionidttablename\n"; } 1374*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1375*b1cdbd2cSJim Jagielski 1376*b1cdbd2cSJim Jagielski return $included_customaction; 1377*b1cdbd2cSJim Jagielski} 1378*b1cdbd2cSJim Jagielski 1379*b1cdbd2cSJim Jagielski#################################################################### 1380*b1cdbd2cSJim Jagielski# Adding a Custom Action to InstallExecuteTable or InstallUITable 1381*b1cdbd2cSJim Jagielski#################################################################### 1382*b1cdbd2cSJim Jagielski 1383*b1cdbd2cSJim Jagielskisub add_custom_action_to_install_table 1384*b1cdbd2cSJim Jagielski{ 1385*b1cdbd2cSJim Jagielski my ($installtable, $exefilename, $actionname, $actioncondition, $position, $filesref, $installtablename, $styles) = @_; 1386*b1cdbd2cSJim Jagielski 1387*b1cdbd2cSJim Jagielski my $included_customaction = 0; 1388*b1cdbd2cSJim Jagielski my $feature = ""; 1389*b1cdbd2cSJim Jagielski my $infoline = ""; 1390*b1cdbd2cSJim Jagielski 1391*b1cdbd2cSJim Jagielski # when the style NO_FILE is set, no searching for the file is needed, no filtering is done, we can add that custom action 1392*b1cdbd2cSJim Jagielski if ( $styles =~ /\bNO_FILE\b/ ) 1393*b1cdbd2cSJim Jagielski { 1394*b1cdbd2cSJim Jagielski # then the InstallE.idt.idt or InstallU.idt.idt 1395*b1cdbd2cSJim Jagielski $actioncondition =~ s/FEATURETEMPLATE/$feature/g; # only execute Custom Action, if feature of the file is installed 1396*b1cdbd2cSJim Jagielski 1397*b1cdbd2cSJim Jagielski my $actionposition = 0; 1398*b1cdbd2cSJim Jagielski 1399*b1cdbd2cSJim Jagielski if ( $position eq "end" ) { $actionposition = get_last_position_in_sequencetable($installtable) + 25; } 1400*b1cdbd2cSJim Jagielski elsif ( $position =~ /^\s*behind_/ ) { $actionposition = get_position_in_sequencetable($position, $installtable) + 2; } 1401*b1cdbd2cSJim Jagielski else { $actionposition = get_position_in_sequencetable($position, $installtable) - 2; } 1402*b1cdbd2cSJim Jagielski 1403*b1cdbd2cSJim Jagielski my $line = $actionname . "\t" . $actioncondition . "\t" . $actionposition . "\n"; 1404*b1cdbd2cSJim Jagielski push(@{$installtable}, $line); 1405*b1cdbd2cSJim Jagielski 1406*b1cdbd2cSJim Jagielski $infoline = "Added $actionname CustomAction into table $installtablename (NO_FILE has been set)\n"; 1407*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1408*b1cdbd2cSJim Jagielski return; 1409*b1cdbd2cSJim Jagielski } 1410*b1cdbd2cSJim Jagielski 1411*b1cdbd2cSJim Jagielski my $contains_file = 0; 1412*b1cdbd2cSJim Jagielski 1413*b1cdbd2cSJim Jagielski # All files are located in $filesref and in @installer::globals::binarytableonlyfiles. 1414*b1cdbd2cSJim Jagielski # Both must be added together 1415*b1cdbd2cSJim Jagielski my $localfilesref = installer::converter::combine_arrays_from_references(\@installer::globals::binarytableonlyfiles, $filesref); 1416*b1cdbd2cSJim Jagielski 1417*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$localfilesref}; $i++ ) 1418*b1cdbd2cSJim Jagielski { 1419*b1cdbd2cSJim Jagielski my $filename = ${$localfilesref}[$i]->{'Name'}; 1420*b1cdbd2cSJim Jagielski 1421*b1cdbd2cSJim Jagielski if ( $filename eq $exefilename ) 1422*b1cdbd2cSJim Jagielski { 1423*b1cdbd2cSJim Jagielski $contains_file = 1; 1424*b1cdbd2cSJim Jagielski 1425*b1cdbd2cSJim Jagielski # Determining the feature of the file 1426*b1cdbd2cSJim Jagielski 1427*b1cdbd2cSJim Jagielski if ( ${$localfilesref}[$i] ) { $feature = ${$localfilesref}[$i]->{'modules'}; } 1428*b1cdbd2cSJim Jagielski 1429*b1cdbd2cSJim Jagielski # If modules contains a list of modules, only taking the first one. 1430*b1cdbd2cSJim Jagielski if ( $feature =~ /^\s*(.*?)\,/ ) { $feature = $1; } 1431*b1cdbd2cSJim Jagielski # Attention: Maximum feature length is 38! 1432*b1cdbd2cSJim Jagielski shorten_feature_gid(\$feature); 1433*b1cdbd2cSJim Jagielski 1434*b1cdbd2cSJim Jagielski last; 1435*b1cdbd2cSJim Jagielski } 1436*b1cdbd2cSJim Jagielski } 1437*b1cdbd2cSJim Jagielski 1438*b1cdbd2cSJim Jagielski if ( $contains_file ) 1439*b1cdbd2cSJim Jagielski { 1440*b1cdbd2cSJim Jagielski # then the InstallE.idt.idt or InstallU.idt.idt 1441*b1cdbd2cSJim Jagielski 1442*b1cdbd2cSJim Jagielski $actioncondition =~ s/FEATURETEMPLATE/$feature/g; # only execute Custom Action, if feature of the file is installed 1443*b1cdbd2cSJim Jagielski 1444*b1cdbd2cSJim Jagielski# my $actionposition = 0; 1445*b1cdbd2cSJim Jagielski# if ( $position eq "end" ) { $actionposition = get_last_position_in_sequencetable($installtable) + 25; } 1446*b1cdbd2cSJim Jagielski# elsif ( $position =~ /^\s*behind_/ ) { $actionposition = get_position_in_sequencetable($position, $installtable) + 2; } 1447*b1cdbd2cSJim Jagielski# else { $actionposition = get_position_in_sequencetable($position, $installtable) - 2; } 1448*b1cdbd2cSJim Jagielski# my $line = $actionname . "\t" . $actioncondition . "\t" . $actionposition . "\n"; 1449*b1cdbd2cSJim Jagielski 1450*b1cdbd2cSJim Jagielski my $positiontemplate = ""; 1451*b1cdbd2cSJim Jagielski if ( $position =~ /^\s*\d+\s*$/ ) { $positiontemplate = $position; } # setting the position directly, number defined in scp2 1452*b1cdbd2cSJim Jagielski else { $positiontemplate = "POSITIONTEMPLATE_" . $position; } 1453*b1cdbd2cSJim Jagielski 1454*b1cdbd2cSJim Jagielski my $line = $actionname . "\t" . $actioncondition . "\t" . $positiontemplate . "\n"; 1455*b1cdbd2cSJim Jagielski push(@{$installtable}, $line); 1456*b1cdbd2cSJim Jagielski 1457*b1cdbd2cSJim Jagielski $included_customaction = 1; 1458*b1cdbd2cSJim Jagielski } 1459*b1cdbd2cSJim Jagielski 1460*b1cdbd2cSJim Jagielski if ( $included_customaction ) { $infoline = "Added $actionname CustomAction into table $installtablename\n"; } 1461*b1cdbd2cSJim Jagielski else { $infoline = "Did not add $actionname CustomAction into table $installtablename\n"; } 1462*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1463*b1cdbd2cSJim Jagielski 1464*b1cdbd2cSJim Jagielski} 1465*b1cdbd2cSJim Jagielski 1466*b1cdbd2cSJim Jagielski################################################################## 1467*b1cdbd2cSJim Jagielski# A line in the table ControlEvent connects a Control 1468*b1cdbd2cSJim Jagielski# with a Custom Action 1469*b1cdbd2cSJim Jagielski################################################################# 1470*b1cdbd2cSJim Jagielski 1471*b1cdbd2cSJim Jagielskisub connect_custom_action_to_control 1472*b1cdbd2cSJim Jagielski{ 1473*b1cdbd2cSJim Jagielski my ( $table, $tablename, $dialog, $control, $event, $argument, $condition, $ordering) = @_; 1474*b1cdbd2cSJim Jagielski 1475*b1cdbd2cSJim Jagielski my $line = $dialog . "\t" . $control. "\t" . $event. "\t" . $argument. "\t" . $condition. "\t" . $ordering . "\n"; 1476*b1cdbd2cSJim Jagielski 1477*b1cdbd2cSJim Jagielski push(@{$table}, $line); 1478*b1cdbd2cSJim Jagielski 1479*b1cdbd2cSJim Jagielski $line =~ s/\s*$//g; 1480*b1cdbd2cSJim Jagielski 1481*b1cdbd2cSJim Jagielski $infoline = "Added line \"$line\" into table $tablename\n"; 1482*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1483*b1cdbd2cSJim Jagielski} 1484*b1cdbd2cSJim Jagielski 1485*b1cdbd2cSJim Jagielski################################################################## 1486*b1cdbd2cSJim Jagielski# A line in the table ControlCondition connects a Control state 1487*b1cdbd2cSJim Jagielski# with a condition 1488*b1cdbd2cSJim Jagielski################################################################## 1489*b1cdbd2cSJim Jagielski 1490*b1cdbd2cSJim Jagielskisub connect_condition_to_control 1491*b1cdbd2cSJim Jagielski{ 1492*b1cdbd2cSJim Jagielski my ( $table, $tablename, $dialog, $control, $event, $condition) = @_; 1493*b1cdbd2cSJim Jagielski 1494*b1cdbd2cSJim Jagielski my $line = $dialog . "\t" . $control. "\t" . $event. "\t" . $condition. "\n"; 1495*b1cdbd2cSJim Jagielski 1496*b1cdbd2cSJim Jagielski push(@{$table}, $line); 1497*b1cdbd2cSJim Jagielski 1498*b1cdbd2cSJim Jagielski $line =~ s/\s*$//g; 1499*b1cdbd2cSJim Jagielski 1500*b1cdbd2cSJim Jagielski $infoline = "Added line \"$line\" into table $tablename\n"; 1501*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1502*b1cdbd2cSJim Jagielski} 1503*b1cdbd2cSJim Jagielski 1504*b1cdbd2cSJim Jagielski################################################################## 1505*b1cdbd2cSJim Jagielski# Searching for a sequencenumber in InstallUISequence table 1506*b1cdbd2cSJim Jagielski# "ExecuteAction" must be the last action 1507*b1cdbd2cSJim Jagielski################################################################## 1508*b1cdbd2cSJim Jagielski 1509*b1cdbd2cSJim Jagielskisub get_free_number_in_uisequence_table 1510*b1cdbd2cSJim Jagielski{ 1511*b1cdbd2cSJim Jagielski my ( $installuitable ) = @_; 1512*b1cdbd2cSJim Jagielski 1513*b1cdbd2cSJim Jagielski # determining the sequence of "ExecuteAction" 1514*b1cdbd2cSJim Jagielski 1515*b1cdbd2cSJim Jagielski my $executeactionnumber = 0; 1516*b1cdbd2cSJim Jagielski 1517*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$installuitable}; $i++ ) 1518*b1cdbd2cSJim Jagielski { 1519*b1cdbd2cSJim Jagielski if ( ${$installuitable}[$i] =~ /^\s*(\w+)\t\w*\t(\d+)\s*$/ ) 1520*b1cdbd2cSJim Jagielski { 1521*b1cdbd2cSJim Jagielski my $actionname = $1; 1522*b1cdbd2cSJim Jagielski my $actionnumber = $2; 1523*b1cdbd2cSJim Jagielski 1524*b1cdbd2cSJim Jagielski if ( $actionname eq "ExecuteAction" ) 1525*b1cdbd2cSJim Jagielski { 1526*b1cdbd2cSJim Jagielski $executeactionnumber = $actionnumber; 1527*b1cdbd2cSJim Jagielski last; 1528*b1cdbd2cSJim Jagielski } 1529*b1cdbd2cSJim Jagielski } 1530*b1cdbd2cSJim Jagielski } 1531*b1cdbd2cSJim Jagielski 1532*b1cdbd2cSJim Jagielski if ( $executeactionnumber == 0 ) { installer::exiter::exit_program("ERROR: Did not find \"ExecuteAction\" in InstallUISequence table!", "get_free_number_in_uisequence_table"); } 1533*b1cdbd2cSJim Jagielski 1534*b1cdbd2cSJim Jagielski # determining the sequence of the action before "ExecuteAction" 1535*b1cdbd2cSJim Jagielski 1536*b1cdbd2cSJim Jagielski my $lastactionnumber = 0; 1537*b1cdbd2cSJim Jagielski 1538*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$installuitable}; $i++ ) 1539*b1cdbd2cSJim Jagielski { 1540*b1cdbd2cSJim Jagielski if ( ${$installuitable}[$i] =~ /^\s*\w+\t\w*\t(\d+)\s*$/ ) 1541*b1cdbd2cSJim Jagielski { 1542*b1cdbd2cSJim Jagielski my $actionnumber = $1; 1543*b1cdbd2cSJim Jagielski 1544*b1cdbd2cSJim Jagielski if (( $actionnumber > $lastactionnumber ) && ( $actionnumber != $executeactionnumber )) 1545*b1cdbd2cSJim Jagielski { 1546*b1cdbd2cSJim Jagielski $lastactionnumber = $actionnumber; 1547*b1cdbd2cSJim Jagielski } 1548*b1cdbd2cSJim Jagielski } 1549*b1cdbd2cSJim Jagielski } 1550*b1cdbd2cSJim Jagielski 1551*b1cdbd2cSJim Jagielski # the new number can now be calculated 1552*b1cdbd2cSJim Jagielski 1553*b1cdbd2cSJim Jagielski my $newnumber = 0; 1554*b1cdbd2cSJim Jagielski 1555*b1cdbd2cSJim Jagielski if ((( $lastactionnumber + $executeactionnumber ) % 2 ) == 0 ) { $newnumber = ( $lastactionnumber + $executeactionnumber ) / 2; } 1556*b1cdbd2cSJim Jagielski else { $newnumber = ( $lastactionnumber + $executeactionnumber -1 ) / 2; } 1557*b1cdbd2cSJim Jagielski 1558*b1cdbd2cSJim Jagielski return $newnumber; 1559*b1cdbd2cSJim Jagielski} 1560*b1cdbd2cSJim Jagielski 1561*b1cdbd2cSJim Jagielski################################################################## 1562*b1cdbd2cSJim Jagielski# Searching for a specified string in the feature table 1563*b1cdbd2cSJim Jagielski################################################################## 1564*b1cdbd2cSJim Jagielski 1565*b1cdbd2cSJim Jagielskisub get_feature_name 1566*b1cdbd2cSJim Jagielski{ 1567*b1cdbd2cSJim Jagielski my ( $string, $featuretable ) = @_; 1568*b1cdbd2cSJim Jagielski 1569*b1cdbd2cSJim Jagielski my $featurename = ""; 1570*b1cdbd2cSJim Jagielski 1571*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$featuretable}; $i++ ) 1572*b1cdbd2cSJim Jagielski { 1573*b1cdbd2cSJim Jagielski if ( ${$featuretable}[$i] =~ /^\s*(\w+$string)\t/ ) 1574*b1cdbd2cSJim Jagielski { 1575*b1cdbd2cSJim Jagielski $featurename = $1; 1576*b1cdbd2cSJim Jagielski last; 1577*b1cdbd2cSJim Jagielski } 1578*b1cdbd2cSJim Jagielski } 1579*b1cdbd2cSJim Jagielski 1580*b1cdbd2cSJim Jagielski return $featurename; 1581*b1cdbd2cSJim Jagielski} 1582*b1cdbd2cSJim Jagielski 1583*b1cdbd2cSJim Jagielski###################################################################### 1584*b1cdbd2cSJim Jagielski# Returning the toplevel directory name of one specific file 1585*b1cdbd2cSJim Jagielski###################################################################### 1586*b1cdbd2cSJim Jagielski 1587*b1cdbd2cSJim Jagielskisub get_directory_name_from_file 1588*b1cdbd2cSJim Jagielski{ 1589*b1cdbd2cSJim Jagielski my ($onefile) = @_; 1590*b1cdbd2cSJim Jagielski 1591*b1cdbd2cSJim Jagielski my $destination = $onefile->{'destination'}; 1592*b1cdbd2cSJim Jagielski my $name = $onefile->{'Name'}; 1593*b1cdbd2cSJim Jagielski 1594*b1cdbd2cSJim Jagielski $destination =~ s/\Q$name\E\s*$//; 1595*b1cdbd2cSJim Jagielski $destination =~ s/\Q$installer::globals::separator\E\s*$//; 1596*b1cdbd2cSJim Jagielski 1597*b1cdbd2cSJim Jagielski my $path = ""; 1598*b1cdbd2cSJim Jagielski 1599*b1cdbd2cSJim Jagielski if ( $destination =~ /\Q$installer::globals::separator\E/ ) 1600*b1cdbd2cSJim Jagielski { 1601*b1cdbd2cSJim Jagielski if ( $destination =~ /^\s*(\S.*\S\Q$installer::globals::separator\E)(\S.+\S?)/ ) 1602*b1cdbd2cSJim Jagielski { 1603*b1cdbd2cSJim Jagielski $path = $2; 1604*b1cdbd2cSJim Jagielski } 1605*b1cdbd2cSJim Jagielski } 1606*b1cdbd2cSJim Jagielski else 1607*b1cdbd2cSJim Jagielski { 1608*b1cdbd2cSJim Jagielski $path = $destination; 1609*b1cdbd2cSJim Jagielski } 1610*b1cdbd2cSJim Jagielski 1611*b1cdbd2cSJim Jagielski return $path; 1612*b1cdbd2cSJim Jagielski} 1613*b1cdbd2cSJim Jagielski 1614*b1cdbd2cSJim Jagielski############################################################# 1615*b1cdbd2cSJim Jagielski# Including the new subdir into the directory table 1616*b1cdbd2cSJim Jagielski############################################################# 1617*b1cdbd2cSJim Jagielski 1618*b1cdbd2cSJim Jagielskisub include_subdirname_into_directory_table 1619*b1cdbd2cSJim Jagielski{ 1620*b1cdbd2cSJim Jagielski my ($dirname, $directorytable, $directorytablename, $onefile) = @_; 1621*b1cdbd2cSJim Jagielski 1622*b1cdbd2cSJim Jagielski my $subdir = ""; 1623*b1cdbd2cSJim Jagielski if ( $onefile->{'Subdir'} ) { $subdir = $onefile->{'Subdir'}; } 1624*b1cdbd2cSJim Jagielski if ( $subdir eq "" ) { installer::exiter::exit_program("ERROR: No \"Subdir\" defined for $onefile->{'Name'}", "include_subdirname_into_directory_table"); } 1625*b1cdbd2cSJim Jagielski 1626*b1cdbd2cSJim Jagielski # program INSTALLLOCATION program -> subjava INSTALLLOCATION program:java 1627*b1cdbd2cSJim Jagielski 1628*b1cdbd2cSJim Jagielski my $uniquename = ""; 1629*b1cdbd2cSJim Jagielski my $parent = ""; 1630*b1cdbd2cSJim Jagielski my $name = ""; 1631*b1cdbd2cSJim Jagielski 1632*b1cdbd2cSJim Jagielski my $includedline = 0; 1633*b1cdbd2cSJim Jagielski 1634*b1cdbd2cSJim Jagielski my $newdir = ""; 1635*b1cdbd2cSJim Jagielski 1636*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$directorytable}; $i++ ) 1637*b1cdbd2cSJim Jagielski { 1638*b1cdbd2cSJim Jagielski 1639*b1cdbd2cSJim Jagielski if ( ${$directorytable}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\s*$/ ) 1640*b1cdbd2cSJim Jagielski { 1641*b1cdbd2cSJim Jagielski $uniquename = $1; 1642*b1cdbd2cSJim Jagielski $parent = $2; 1643*b1cdbd2cSJim Jagielski $name = $3; 1644*b1cdbd2cSJim Jagielski 1645*b1cdbd2cSJim Jagielski if ( $dirname eq $name ) 1646*b1cdbd2cSJim Jagielski { 1647*b1cdbd2cSJim Jagielski my $newuniquename = "sub" . $subdir; 1648*b1cdbd2cSJim Jagielski $newdir = $newuniquename; 1649*b1cdbd2cSJim Jagielski # my $newparent = $parent; 1650*b1cdbd2cSJim Jagielski my $newparent = "INSTALLLOCATION"; 1651*b1cdbd2cSJim Jagielski my $newname = $name . "\:" . $subdir; 1652*b1cdbd2cSJim Jagielski my $newline = 1653*b1cdbd2cSJim Jagielski $line = "$newuniquename\t$newparent\t$newname\n"; 1654*b1cdbd2cSJim Jagielski push(@{$directorytable}, $line); 1655*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$line); 1656*b1cdbd2cSJim Jagielski $infoline = "Added $line into directory table $directorytablename\n"; 1657*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1658*b1cdbd2cSJim Jagielski 1659*b1cdbd2cSJim Jagielski $includedline = 1; 1660*b1cdbd2cSJim Jagielski last; 1661*b1cdbd2cSJim Jagielski } 1662*b1cdbd2cSJim Jagielski } 1663*b1cdbd2cSJim Jagielski } 1664*b1cdbd2cSJim Jagielski 1665*b1cdbd2cSJim Jagielski if ( ! $includedline ) { installer::exiter::exit_program("ERROR: Could not include new subdirectory into directory table for file $onefile->{'Name'}!", "include_subdirname_into_directory_table"); } 1666*b1cdbd2cSJim Jagielski 1667*b1cdbd2cSJim Jagielski return $newdir; 1668*b1cdbd2cSJim Jagielski} 1669*b1cdbd2cSJim Jagielski 1670*b1cdbd2cSJim Jagielski################################################################## 1671*b1cdbd2cSJim Jagielski# Including the new sub directory into the component table 1672*b1cdbd2cSJim Jagielski################################################################## 1673*b1cdbd2cSJim Jagielski 1674*b1cdbd2cSJim Jagielskisub include_subdir_into_componenttable 1675*b1cdbd2cSJim Jagielski{ 1676*b1cdbd2cSJim Jagielski my ($subdir, $onefile, $componenttable) = @_; 1677*b1cdbd2cSJim Jagielski 1678*b1cdbd2cSJim Jagielski my $componentname = $onefile->{'componentname'}; 1679*b1cdbd2cSJim Jagielski 1680*b1cdbd2cSJim Jagielski my $changeddirectory = 0; 1681*b1cdbd2cSJim Jagielski 1682*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$componenttable}; $i++ ) 1683*b1cdbd2cSJim Jagielski { 1684*b1cdbd2cSJim Jagielski if ( ${$componenttable}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) 1685*b1cdbd2cSJim Jagielski { 1686*b1cdbd2cSJim Jagielski my $localcomponentname = $1; 1687*b1cdbd2cSJim Jagielski my $directory = $3; 1688*b1cdbd2cSJim Jagielski 1689*b1cdbd2cSJim Jagielski if ( $componentname eq $localcomponentname ) 1690*b1cdbd2cSJim Jagielski { 1691*b1cdbd2cSJim Jagielski my $oldvalue = ${$componenttable}[$i]; 1692*b1cdbd2cSJim Jagielski ${$componenttable}[$i] =~ s/\b\Q$directory\E\b/$subdir/; 1693*b1cdbd2cSJim Jagielski my $newvalue = ${$componenttable}[$i]; 1694*b1cdbd2cSJim Jagielski 1695*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$oldvalue); 1696*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$newvalue); 1697*b1cdbd2cSJim Jagielski $infoline = "Change in Component table: From \"$oldvalue\" to \"$newvalue\"\n"; 1698*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1699*b1cdbd2cSJim Jagielski 1700*b1cdbd2cSJim Jagielski $changeddirectory = 1; 1701*b1cdbd2cSJim Jagielski last; 1702*b1cdbd2cSJim Jagielski } 1703*b1cdbd2cSJim Jagielski } 1704*b1cdbd2cSJim Jagielski } 1705*b1cdbd2cSJim Jagielski 1706*b1cdbd2cSJim Jagielski if ( ! $changeddirectory ) { installer::exiter::exit_program("ERROR: Could not change directory for component: $onefile->{'Name'}!", "include_subdir_into_componenttable"); } 1707*b1cdbd2cSJim Jagielski 1708*b1cdbd2cSJim Jagielski} 1709*b1cdbd2cSJim Jagielski 1710*b1cdbd2cSJim Jagielski################################################################################################ 1711*b1cdbd2cSJim Jagielski# Including the content for the child installations 1712*b1cdbd2cSJim Jagielski# into the tables: 1713*b1cdbd2cSJim Jagielski# CustomAc.idt, InstallU.idt, Feature.idt 1714*b1cdbd2cSJim Jagielski################################################################################################ 1715*b1cdbd2cSJim Jagielski 1716*b1cdbd2cSJim Jagielskisub add_childprojects 1717*b1cdbd2cSJim Jagielski{ 1718*b1cdbd2cSJim Jagielski my ($languageidtdir, $filesref, $allvariables) = @_; 1719*b1cdbd2cSJim Jagielski 1720*b1cdbd2cSJim Jagielski my $customactiontablename = $languageidtdir . $installer::globals::separator . "CustomAc.idt"; 1721*b1cdbd2cSJim Jagielski my $customactiontable = installer::files::read_file($customactiontablename); 1722*b1cdbd2cSJim Jagielski my $installuitablename = $languageidtdir . $installer::globals::separator . "InstallU.idt"; 1723*b1cdbd2cSJim Jagielski my $installuitable = installer::files::read_file($installuitablename); 1724*b1cdbd2cSJim Jagielski my $featuretablename = $languageidtdir . $installer::globals::separator . "Feature.idt"; 1725*b1cdbd2cSJim Jagielski my $featuretable = installer::files::read_file($featuretablename); 1726*b1cdbd2cSJim Jagielski my $directorytablename = $languageidtdir . $installer::globals::separator . "Director.idt"; 1727*b1cdbd2cSJim Jagielski my $directorytable = installer::files::read_file($directorytablename); 1728*b1cdbd2cSJim Jagielski my $componenttablename = $languageidtdir . $installer::globals::separator . "Componen.idt"; 1729*b1cdbd2cSJim Jagielski my $componenttable = installer::files::read_file($componenttablename); 1730*b1cdbd2cSJim Jagielski 1731*b1cdbd2cSJim Jagielski my $infoline = ""; 1732*b1cdbd2cSJim Jagielski my $line = ""; 1733*b1cdbd2cSJim Jagielski 1734*b1cdbd2cSJim Jagielski $installer::globals::javafile = installer::worker::return_first_item_with_special_flag($filesref ,"JAVAFILE"); 1735*b1cdbd2cSJim Jagielski $installer::globals::urefile = installer::worker::return_first_item_with_special_flag($filesref ,"UREFILE"); 1736*b1cdbd2cSJim Jagielski 1737*b1cdbd2cSJim Jagielski if (( $installer::globals::javafile eq "" ) && ( $allvariables->{'JAVAPRODUCT'} )) { installer::exiter::exit_program("ERROR: No JAVAFILE found in files collector!", "add_childprojects"); } 1738*b1cdbd2cSJim Jagielski if (( $installer::globals::urefile eq "" ) && ( $allvariables->{'UREPRODUCT'} )) { installer::exiter::exit_program("ERROR: No UREFILE found in files collector!", "add_childprojects"); } 1739*b1cdbd2cSJim Jagielski 1740*b1cdbd2cSJim Jagielski # Content for Directory table 1741*b1cdbd2cSJim Jagielski # SystemFolder TARGETDIR . 1742*b1cdbd2cSJim Jagielski 1743*b1cdbd2cSJim Jagielski my $contains_systemfolder = 0; 1744*b1cdbd2cSJim Jagielski 1745*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$directorytable}; $i++ ) 1746*b1cdbd2cSJim Jagielski { 1747*b1cdbd2cSJim Jagielski if ( ${$directorytable}[$i] =~ /^\s*SystemFolder\t/ ) 1748*b1cdbd2cSJim Jagielski { 1749*b1cdbd2cSJim Jagielski $contains_systemfolder = 1; 1750*b1cdbd2cSJim Jagielski last; 1751*b1cdbd2cSJim Jagielski } 1752*b1cdbd2cSJim Jagielski } 1753*b1cdbd2cSJim Jagielski 1754*b1cdbd2cSJim Jagielski if ( ! $contains_systemfolder ) 1755*b1cdbd2cSJim Jagielski { 1756*b1cdbd2cSJim Jagielski $line = "SystemFolder\tTARGETDIR\t\.\n"; 1757*b1cdbd2cSJim Jagielski push(@{$directorytable}, $line); 1758*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$line); 1759*b1cdbd2cSJim Jagielski $infoline = "Added $line into table $directorytablename\n"; 1760*b1cdbd2cSJim Jagielski } 1761*b1cdbd2cSJim Jagielski else 1762*b1cdbd2cSJim Jagielski { 1763*b1cdbd2cSJim Jagielski $infoline = "SystemFolder already exists in table $directorytablename\n"; 1764*b1cdbd2cSJim Jagielski } 1765*b1cdbd2cSJim Jagielski 1766*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1767*b1cdbd2cSJim Jagielski 1768*b1cdbd2cSJim Jagielski # Additional content for the directory table 1769*b1cdbd2cSJim Jagielski # subjava INSTALLLOCATION program:java 1770*b1cdbd2cSJim Jagielski # subure INSTALLLOCATION program:ure 1771*b1cdbd2cSJim Jagielski 1772*b1cdbd2cSJim Jagielski my $dirname = ""; 1773*b1cdbd2cSJim Jagielski my $subjavadir = ""; 1774*b1cdbd2cSJim Jagielski my $suburedir = ""; 1775*b1cdbd2cSJim Jagielski 1776*b1cdbd2cSJim Jagielski if ( $allvariables->{'JAVAPRODUCT'} ) 1777*b1cdbd2cSJim Jagielski { 1778*b1cdbd2cSJim Jagielski $dirname = get_directory_name_from_file($installer::globals::javafile); 1779*b1cdbd2cSJim Jagielski $subjavadir = include_subdirname_into_directory_table($dirname, $directorytable, $directorytablename, $installer::globals::javafile); 1780*b1cdbd2cSJim Jagielski } 1781*b1cdbd2cSJim Jagielski 1782*b1cdbd2cSJim Jagielski if ( $allvariables->{'UREPRODUCT'} ) 1783*b1cdbd2cSJim Jagielski { 1784*b1cdbd2cSJim Jagielski $dirname = get_directory_name_from_file($installer::globals::urefile); 1785*b1cdbd2cSJim Jagielski $suburedir = include_subdirname_into_directory_table($dirname, $directorytable, $directorytablename, $installer::globals::urefile); 1786*b1cdbd2cSJim Jagielski } 1787*b1cdbd2cSJim Jagielski 1788*b1cdbd2cSJim Jagielski # Content for the Component table 1789*b1cdbd2cSJim Jagielski # The Java and Ada components have new directories 1790*b1cdbd2cSJim Jagielski 1791*b1cdbd2cSJim Jagielski if ( $allvariables->{'JAVAPRODUCT'} ) { include_subdir_into_componenttable($subjavadir, $installer::globals::javafile, $componenttable); } 1792*b1cdbd2cSJim Jagielski if ( $allvariables->{'UREPRODUCT'} ) { include_subdir_into_componenttable($suburedir, $installer::globals::urefile, $componenttable); } 1793*b1cdbd2cSJim Jagielski 1794*b1cdbd2cSJim Jagielski # Content for CustomAction table 1795*b1cdbd2cSJim Jagielski 1796*b1cdbd2cSJim Jagielski if ( $allvariables->{'JAVAPRODUCT'} ) 1797*b1cdbd2cSJim Jagielski { 1798*b1cdbd2cSJim Jagielski $line = "InstallJava\t98\tSystemFolder\t[SourceDir]$installer::globals::javafile->{'Subdir'}\\$installer::globals::javafile->{'Name'} \/qb REBOOT=Suppress SPONSORS=0 DISABLEAD=1\n"; 1799*b1cdbd2cSJim Jagielski push(@{$customactiontable} ,$line); 1800*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$line); 1801*b1cdbd2cSJim Jagielski $infoline = "Added $line into table $customactiontablename\n"; 1802*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1803*b1cdbd2cSJim Jagielski } 1804*b1cdbd2cSJim Jagielski 1805*b1cdbd2cSJim Jagielski if ( $allvariables->{'UREPRODUCT'} ) 1806*b1cdbd2cSJim Jagielski { 1807*b1cdbd2cSJim Jagielski $line = "InstallUre\t98\tSystemFolder\t$installer::globals::urefile->{'Subdir'}\\$installer::globals::urefile->{'Name'} /S\n"; 1808*b1cdbd2cSJim Jagielski push(@{$customactiontable} ,$line); 1809*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$line); 1810*b1cdbd2cSJim Jagielski $infoline = "Added $line into table $customactiontablename\n"; 1811*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1812*b1cdbd2cSJim Jagielski } 1813*b1cdbd2cSJim Jagielski 1814*b1cdbd2cSJim Jagielski if ( $allvariables->{'JAVAPRODUCT'} ) 1815*b1cdbd2cSJim Jagielski { 1816*b1cdbd2cSJim Jagielski $line = "MaintenanceJava\t82\t$installer::globals::javafile->{'uniquename'}\t\/qb REBOOT=Suppress SPONSORS=0 DISABLEAD=1\n"; 1817*b1cdbd2cSJim Jagielski push(@{$customactiontable} ,$line); 1818*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$line); 1819*b1cdbd2cSJim Jagielski $infoline = "Added $line into table $customactiontablename\n"; 1820*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1821*b1cdbd2cSJim Jagielski } 1822*b1cdbd2cSJim Jagielski 1823*b1cdbd2cSJim Jagielski if ( $allvariables->{'UREPRODUCT'} ) 1824*b1cdbd2cSJim Jagielski { 1825*b1cdbd2cSJim Jagielski $line = "MaintenanceUre\t82\t$installer::globals::urefile->{'uniquename'}\t\/S\n"; 1826*b1cdbd2cSJim Jagielski push(@{$customactiontable} ,$line); 1827*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$line); 1828*b1cdbd2cSJim Jagielski $infoline = "Added $line into table $customactiontablename\n"; 1829*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1830*b1cdbd2cSJim Jagielski } 1831*b1cdbd2cSJim Jagielski 1832*b1cdbd2cSJim Jagielski # Content for InstallUISequence table 1833*b1cdbd2cSJim Jagielski # InstallAdabas &gm_o_Adabas=3 825 1834*b1cdbd2cSJim Jagielski # InstallJava &gm_o_Java=3 827 1835*b1cdbd2cSJim Jagielski 1836*b1cdbd2cSJim Jagielski my $number = ""; 1837*b1cdbd2cSJim Jagielski my $featurename = ""; 1838*b1cdbd2cSJim Jagielski 1839*b1cdbd2cSJim Jagielski if ( $allvariables->{'ADAPRODUCT'} ) 1840*b1cdbd2cSJim Jagielski { 1841*b1cdbd2cSJim Jagielski $number = get_free_number_in_uisequence_table($installuitable); 1842*b1cdbd2cSJim Jagielski $featurename = get_feature_name("_Adabas", $featuretable); 1843*b1cdbd2cSJim Jagielski $line = "InstallAdabas\t\&$featurename\=3 And Not Installed And Not PATCH\t$number\n"; 1844*b1cdbd2cSJim Jagielski push(@{$installuitable} ,$line); 1845*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$line); 1846*b1cdbd2cSJim Jagielski $infoline = "Added $line into table $installuitablename\n"; 1847*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1848*b1cdbd2cSJim Jagielski } 1849*b1cdbd2cSJim Jagielski 1850*b1cdbd2cSJim Jagielski if ( $allvariables->{'JAVAPRODUCT'} ) 1851*b1cdbd2cSJim Jagielski { 1852*b1cdbd2cSJim Jagielski $number = get_free_number_in_uisequence_table($installuitable) + 2; 1853*b1cdbd2cSJim Jagielski $featurename = get_feature_name("_Java", $featuretable); 1854*b1cdbd2cSJim Jagielski if ( $featurename ) { $line = "InstallJava\t\&$featurename\=3 And Not Installed And JAVAPATH\=\"\" And Not PATCH\t$number\n"; } 1855*b1cdbd2cSJim Jagielski else { $line = "InstallJava\tNot Installed And JAVAPATH\=\"\" And Not PATCH\t$number\n"; } # feature belongs to root 1856*b1cdbd2cSJim Jagielski push(@{$installuitable} ,$line); 1857*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$line); 1858*b1cdbd2cSJim Jagielski $infoline = "Added $line into table $installuitablename\n"; 1859*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1860*b1cdbd2cSJim Jagielski } 1861*b1cdbd2cSJim Jagielski 1862*b1cdbd2cSJim Jagielski if ( $allvariables->{'ADAPRODUCT'} ) 1863*b1cdbd2cSJim Jagielski { 1864*b1cdbd2cSJim Jagielski $number = get_free_number_in_uisequence_table($installuitable) + 4; 1865*b1cdbd2cSJim Jagielski $featurename = get_feature_name("_Adabas", $featuretable); 1866*b1cdbd2cSJim Jagielski $line = "MaintenanceAdabas\t\&$featurename\=3 And Installed And Not PATCH\t$number\n"; 1867*b1cdbd2cSJim Jagielski push(@{$installuitable} ,$line); 1868*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$line); 1869*b1cdbd2cSJim Jagielski $infoline = "Added $line into table $installuitablename\n"; 1870*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1871*b1cdbd2cSJim Jagielski } 1872*b1cdbd2cSJim Jagielski 1873*b1cdbd2cSJim Jagielski if ( $allvariables->{'JAVAPRODUCT'} ) 1874*b1cdbd2cSJim Jagielski { 1875*b1cdbd2cSJim Jagielski $number = get_free_number_in_uisequence_table($installuitable) + 6; 1876*b1cdbd2cSJim Jagielski $featurename = get_feature_name("_Java", $featuretable); 1877*b1cdbd2cSJim Jagielski if ( $featurename ) { $line = "MaintenanceJava\t\&$featurename\=3 And Installed And JAVAPATH\=\"\" And Not PATCH\t$number\n"; } 1878*b1cdbd2cSJim Jagielski else { $line = "MaintenanceJava\tInstalled And JAVAPATH\=\"\" And Not PATCH\t$number\n"; } # feature belongs to root 1879*b1cdbd2cSJim Jagielski push(@{$installuitable} ,$line); 1880*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$line); 1881*b1cdbd2cSJim Jagielski $infoline = "Added $line into table $installuitablename\n"; 1882*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1883*b1cdbd2cSJim Jagielski } 1884*b1cdbd2cSJim Jagielski 1885*b1cdbd2cSJim Jagielski if ( $allvariables->{'UREPRODUCT'} ) 1886*b1cdbd2cSJim Jagielski { 1887*b1cdbd2cSJim Jagielski $number = get_free_number_in_uisequence_table($installuitable) + 8; 1888*b1cdbd2cSJim Jagielski $featurename = get_feature_name("_Ure", $featuretable); 1889*b1cdbd2cSJim Jagielski if ( $featurename ) { $line = "InstallUre\t\&$featurename\=3 And Not Installed\t$number\n"; } 1890*b1cdbd2cSJim Jagielski else { $line = "InstallUre\tNot Installed\t$number\n"; } # feature belongs to root 1891*b1cdbd2cSJim Jagielski push(@{$installuitable} ,$line); 1892*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$line); 1893*b1cdbd2cSJim Jagielski $infoline = "Added $line into table $installuitablename\n"; 1894*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1895*b1cdbd2cSJim Jagielski } 1896*b1cdbd2cSJim Jagielski 1897*b1cdbd2cSJim Jagielski if ( $allvariables->{'UREPRODUCT'} ) 1898*b1cdbd2cSJim Jagielski { 1899*b1cdbd2cSJim Jagielski $number = get_free_number_in_uisequence_table($installuitable) + 10; 1900*b1cdbd2cSJim Jagielski $featurename = get_feature_name("_Ure", $featuretable); 1901*b1cdbd2cSJim Jagielski if ( $featurename ) { $line = "MaintenanceUre\t\&$featurename\=3 And Installed\t$number\n"; } 1902*b1cdbd2cSJim Jagielski else { $line = "MaintenanceUre\tInstalled\t$number\n"; } # feature belongs to root 1903*b1cdbd2cSJim Jagielski push(@{$installuitable} ,$line); 1904*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_whitespaces(\$line); 1905*b1cdbd2cSJim Jagielski $infoline = "Added $line into table $installuitablename\n"; 1906*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 1907*b1cdbd2cSJim Jagielski } 1908*b1cdbd2cSJim Jagielski 1909*b1cdbd2cSJim Jagielski # Content for Feature table, better from scp (translation) 1910*b1cdbd2cSJim Jagielski # gm_o_java gm_optional Java 1.4.2 Description 2 200 1911*b1cdbd2cSJim Jagielski 1912*b1cdbd2cSJim Jagielski installer::files::save_file($customactiontablename, $customactiontable); 1913*b1cdbd2cSJim Jagielski installer::files::save_file($installuitablename, $installuitable); 1914*b1cdbd2cSJim Jagielski installer::files::save_file($featuretablename, $featuretable); 1915*b1cdbd2cSJim Jagielski installer::files::save_file($directorytablename, $directorytable); 1916*b1cdbd2cSJim Jagielski installer::files::save_file($componenttablename, $componenttable); 1917*b1cdbd2cSJim Jagielski} 1918*b1cdbd2cSJim Jagielski 1919*b1cdbd2cSJim Jagielski################################################################## 1920*b1cdbd2cSJim Jagielski# Setting the encoding in all idt files. Replacing the 1921*b1cdbd2cSJim Jagielski# variable WINDOWSENCODINGTEMPLATE 1922*b1cdbd2cSJim Jagielski################################################################## 1923*b1cdbd2cSJim Jagielski 1924*b1cdbd2cSJim Jagielskisub setencoding 1925*b1cdbd2cSJim Jagielski{ 1926*b1cdbd2cSJim Jagielski my ( $languageidtdir, $onelanguage ) = @_; 1927*b1cdbd2cSJim Jagielski 1928*b1cdbd2cSJim Jagielski my $encoding = installer::windows::language::get_windows_encoding($onelanguage); 1929*b1cdbd2cSJim Jagielski 1930*b1cdbd2cSJim Jagielski # collecting all idt files in the directory $languageidtdir and substituting the string 1931*b1cdbd2cSJim Jagielski 1932*b1cdbd2cSJim Jagielski my $idtfiles = installer::systemactions::find_file_with_file_extension("idt", $languageidtdir); 1933*b1cdbd2cSJim Jagielski 1934*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$idtfiles}; $i++ ) 1935*b1cdbd2cSJim Jagielski { 1936*b1cdbd2cSJim Jagielski my $onefilename = $languageidtdir . $installer::globals::separator . ${$idtfiles}[$i]; 1937*b1cdbd2cSJim Jagielski my $onefile = installer::files::read_file($onefilename); 1938*b1cdbd2cSJim Jagielski 1939*b1cdbd2cSJim Jagielski for ( my $j = 0; $j <= $#{$onefile}; $j++ ) 1940*b1cdbd2cSJim Jagielski { 1941*b1cdbd2cSJim Jagielski ${$onefile}[$j] =~ s/WINDOWSENCODINGTEMPLATE/$encoding/g; 1942*b1cdbd2cSJim Jagielski } 1943*b1cdbd2cSJim Jagielski 1944*b1cdbd2cSJim Jagielski installer::files::save_file($onefilename, $onefile); 1945*b1cdbd2cSJim Jagielski } 1946*b1cdbd2cSJim Jagielski} 1947*b1cdbd2cSJim Jagielski 1948*b1cdbd2cSJim Jagielski################################################################## 1949*b1cdbd2cSJim Jagielski# Setting the condition, that at least one module is selected. 1950*b1cdbd2cSJim Jagielski# All modules with flag SHOW_MULTILINGUAL_ONLY were already 1951*b1cdbd2cSJim Jagielski# collected. In table ControlE.idt, the string 1952*b1cdbd2cSJim Jagielski# LANGUAGECONDITIONINSTALL needs to be replaced. 1953*b1cdbd2cSJim Jagielski# Also for APPLICATIONCONDITIONINSTALL for the applications 1954*b1cdbd2cSJim Jagielski# with flag APPLICATIONMODULE. 1955*b1cdbd2cSJim Jagielski################################################################## 1956*b1cdbd2cSJim Jagielski 1957*b1cdbd2cSJim Jagielskisub set_multilanguageonly_condition 1958*b1cdbd2cSJim Jagielski{ 1959*b1cdbd2cSJim Jagielski my ( $languageidtdir ) = @_; 1960*b1cdbd2cSJim Jagielski 1961*b1cdbd2cSJim Jagielski my $onefilename = $languageidtdir . $installer::globals::separator . "ControlE.idt"; 1962*b1cdbd2cSJim Jagielski my $onefile = installer::files::read_file($onefilename); 1963*b1cdbd2cSJim Jagielski 1964*b1cdbd2cSJim Jagielski # Language modules 1965*b1cdbd2cSJim Jagielski 1966*b1cdbd2cSJim Jagielski my $condition = ""; 1967*b1cdbd2cSJim Jagielski 1968*b1cdbd2cSJim Jagielski foreach my $module ( sort keys %installer::globals::multilingual_only_modules ) 1969*b1cdbd2cSJim Jagielski { 1970*b1cdbd2cSJim Jagielski $condition = $condition . " &$module=3 Or"; 1971*b1cdbd2cSJim Jagielski } 1972*b1cdbd2cSJim Jagielski 1973*b1cdbd2cSJim Jagielski $condition =~ s/^\s*//; 1974*b1cdbd2cSJim Jagielski $condition =~ s/\s*Or\s*$//; # removing the ending "Or" 1975*b1cdbd2cSJim Jagielski 1976*b1cdbd2cSJim Jagielski if ( $condition eq "" ) { $condition = "1"; } 1977*b1cdbd2cSJim Jagielski 1978*b1cdbd2cSJim Jagielski for ( my $j = 0; $j <= $#{$onefile}; $j++ ) 1979*b1cdbd2cSJim Jagielski { 1980*b1cdbd2cSJim Jagielski ${$onefile}[$j] =~ s/LANGUAGECONDITIONINSTALL/$condition/; 1981*b1cdbd2cSJim Jagielski } 1982*b1cdbd2cSJim Jagielski 1983*b1cdbd2cSJim Jagielski # Application modules 1984*b1cdbd2cSJim Jagielski 1985*b1cdbd2cSJim Jagielski $condition = ""; 1986*b1cdbd2cSJim Jagielski 1987*b1cdbd2cSJim Jagielski foreach my $module ( sort keys %installer::globals::application_modules ) 1988*b1cdbd2cSJim Jagielski { 1989*b1cdbd2cSJim Jagielski $condition = $condition . " &$module=3 Or"; 1990*b1cdbd2cSJim Jagielski } 1991*b1cdbd2cSJim Jagielski 1992*b1cdbd2cSJim Jagielski $condition =~ s/^\s*//; 1993*b1cdbd2cSJim Jagielski $condition =~ s/\s*Or\s*$//; # removing the ending "Or" 1994*b1cdbd2cSJim Jagielski 1995*b1cdbd2cSJim Jagielski if ( $condition eq "" ) { $condition = "1"; } 1996*b1cdbd2cSJim Jagielski 1997*b1cdbd2cSJim Jagielski for ( my $j = 0; $j <= $#{$onefile}; $j++ ) 1998*b1cdbd2cSJim Jagielski { 1999*b1cdbd2cSJim Jagielski ${$onefile}[$j] =~ s/APPLICATIONCONDITIONINSTALL/$condition/; 2000*b1cdbd2cSJim Jagielski } 2001*b1cdbd2cSJim Jagielski 2002*b1cdbd2cSJim Jagielski installer::files::save_file($onefilename, $onefile); 2003*b1cdbd2cSJim Jagielski} 2004*b1cdbd2cSJim Jagielski 2005*b1cdbd2cSJim Jagielski############################################# 2006*b1cdbd2cSJim Jagielski# Putting array values into hash 2007*b1cdbd2cSJim Jagielski############################################# 2008*b1cdbd2cSJim Jagielski 2009*b1cdbd2cSJim Jagielskisub fill_assignment_hash 2010*b1cdbd2cSJim Jagielski{ 2011*b1cdbd2cSJim Jagielski my ($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray) = @_; 2012*b1cdbd2cSJim Jagielski 2013*b1cdbd2cSJim Jagielski my $max = $parameter - 1; 2014*b1cdbd2cSJim Jagielski 2015*b1cdbd2cSJim Jagielski if ( $max != $#{$assignmentarray} ) 2016*b1cdbd2cSJim Jagielski { 2017*b1cdbd2cSJim Jagielski my $definedparameter = $#{$assignmentarray} + 1; 2018*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: gid: $gid, key: $key ! Wrong parameter in scp. For table $tablename $parameter parameter are required ! You defined: $definedparameter", "fill_assignment_hash"); 2019*b1cdbd2cSJim Jagielski } 2020*b1cdbd2cSJim Jagielski 2021*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$assignmentarray}; $i++ ) 2022*b1cdbd2cSJim Jagielski { 2023*b1cdbd2cSJim Jagielski my $counter = $i + 1; 2024*b1cdbd2cSJim Jagielski my $key = "parameter". $counter; 2025*b1cdbd2cSJim Jagielski 2026*b1cdbd2cSJim Jagielski my $localvalue = ${$assignmentarray}[$i]; 2027*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_quotationmarks(\$localvalue); 2028*b1cdbd2cSJim Jagielski $localvalue =~ s/\\\"/\"/g; 2029*b1cdbd2cSJim Jagielski $localvalue =~ s/\\\!/\!/g; 2030*b1cdbd2cSJim Jagielski $localvalue =~ s/\\\&/\&/g; 2031*b1cdbd2cSJim Jagielski $localvalue =~ s/\\\</\</g; 2032*b1cdbd2cSJim Jagielski $localvalue =~ s/\\\>/\>/g; 2033*b1cdbd2cSJim Jagielski $assignmenthashref->{$key} = $localvalue; 2034*b1cdbd2cSJim Jagielski } 2035*b1cdbd2cSJim Jagielski} 2036*b1cdbd2cSJim Jagielski 2037*b1cdbd2cSJim Jagielski########################################################################## 2038*b1cdbd2cSJim Jagielski# Checking the assignment of a Windows CustomAction and putting it 2039*b1cdbd2cSJim Jagielski# into a hash 2040*b1cdbd2cSJim Jagielski########################################################################## 2041*b1cdbd2cSJim Jagielski 2042*b1cdbd2cSJim Jagielskisub create_customaction_assignment_hash 2043*b1cdbd2cSJim Jagielski{ 2044*b1cdbd2cSJim Jagielski my ($gid, $name, $key, $assignmentarray) = @_; 2045*b1cdbd2cSJim Jagielski 2046*b1cdbd2cSJim Jagielski my %assignment = (); 2047*b1cdbd2cSJim Jagielski my $assignmenthashref = \%assignment; 2048*b1cdbd2cSJim Jagielski 2049*b1cdbd2cSJim Jagielski my $tablename = ${$assignmentarray}[0]; 2050*b1cdbd2cSJim Jagielski installer::remover::remove_leading_and_ending_quotationmarks(\$tablename); 2051*b1cdbd2cSJim Jagielski 2052*b1cdbd2cSJim Jagielski my $tablename_defined = 0; 2053*b1cdbd2cSJim Jagielski my $parameter = 0; 2054*b1cdbd2cSJim Jagielski 2055*b1cdbd2cSJim Jagielski if ( $tablename eq "InstallUISequence" ) 2056*b1cdbd2cSJim Jagielski { 2057*b1cdbd2cSJim Jagielski $tablename_defined = 1; 2058*b1cdbd2cSJim Jagielski $parameter = 3; 2059*b1cdbd2cSJim Jagielski fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); 2060*b1cdbd2cSJim Jagielski } 2061*b1cdbd2cSJim Jagielski 2062*b1cdbd2cSJim Jagielski if ( $tablename eq "InstallExecuteSequence" ) 2063*b1cdbd2cSJim Jagielski { 2064*b1cdbd2cSJim Jagielski $tablename_defined = 1; 2065*b1cdbd2cSJim Jagielski $parameter = 3; 2066*b1cdbd2cSJim Jagielski fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); 2067*b1cdbd2cSJim Jagielski } 2068*b1cdbd2cSJim Jagielski 2069*b1cdbd2cSJim Jagielski if ( $tablename eq "AdminExecuteSequence" ) 2070*b1cdbd2cSJim Jagielski { 2071*b1cdbd2cSJim Jagielski $tablename_defined = 1; 2072*b1cdbd2cSJim Jagielski $parameter = 3; 2073*b1cdbd2cSJim Jagielski fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); 2074*b1cdbd2cSJim Jagielski } 2075*b1cdbd2cSJim Jagielski 2076*b1cdbd2cSJim Jagielski if ( $tablename eq "ControlEvent" ) 2077*b1cdbd2cSJim Jagielski { 2078*b1cdbd2cSJim Jagielski $tablename_defined = 1; 2079*b1cdbd2cSJim Jagielski $parameter = 7; 2080*b1cdbd2cSJim Jagielski fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); 2081*b1cdbd2cSJim Jagielski } 2082*b1cdbd2cSJim Jagielski 2083*b1cdbd2cSJim Jagielski if ( $tablename eq "ControlCondition" ) 2084*b1cdbd2cSJim Jagielski { 2085*b1cdbd2cSJim Jagielski $tablename_defined = 1; 2086*b1cdbd2cSJim Jagielski $parameter = 5; 2087*b1cdbd2cSJim Jagielski fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); 2088*b1cdbd2cSJim Jagielski } 2089*b1cdbd2cSJim Jagielski 2090*b1cdbd2cSJim Jagielski if ( ! $tablename_defined ) 2091*b1cdbd2cSJim Jagielski { 2092*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: gid: $gid, key: $key ! Unknown Windows CustomAction table: $tablename ! Currently supported: InstallUISequence, InstallExecuteSequence, ControlEvent, ControlCondition", "create_customaction_assignment_hash"); 2093*b1cdbd2cSJim Jagielski } 2094*b1cdbd2cSJim Jagielski 2095*b1cdbd2cSJim Jagielski return $assignmenthashref; 2096*b1cdbd2cSJim Jagielski} 2097*b1cdbd2cSJim Jagielski 2098*b1cdbd2cSJim Jagielski########################################################################## 2099*b1cdbd2cSJim Jagielski# Finding the position of a specified CustomAction. 2100*b1cdbd2cSJim Jagielski# If the CustomAction is not found, the return value is "-1". 2101*b1cdbd2cSJim Jagielski# If the CustomAction position is not defined yet, 2102*b1cdbd2cSJim Jagielski# the return value is also "-1". 2103*b1cdbd2cSJim Jagielski########################################################################## 2104*b1cdbd2cSJim Jagielski 2105*b1cdbd2cSJim Jagielskisub get_customaction_position 2106*b1cdbd2cSJim Jagielski{ 2107*b1cdbd2cSJim Jagielski my ($action, $sequencetable) = @_; 2108*b1cdbd2cSJim Jagielski 2109*b1cdbd2cSJim Jagielski my $position = -1; 2110*b1cdbd2cSJim Jagielski 2111*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) 2112*b1cdbd2cSJim Jagielski { 2113*b1cdbd2cSJim Jagielski my $line = ${$sequencetable}[$i]; 2114*b1cdbd2cSJim Jagielski 2115*b1cdbd2cSJim Jagielski if ( $line =~ /^\s*([\w\.]+)\t.*\t\s*(\d+)\s$/ ) # matching only, if position is a number! 2116*b1cdbd2cSJim Jagielski { 2117*b1cdbd2cSJim Jagielski my $compareaction = $1; 2118*b1cdbd2cSJim Jagielski my $localposition = $2; 2119*b1cdbd2cSJim Jagielski 2120*b1cdbd2cSJim Jagielski if ( $compareaction eq $action ) 2121*b1cdbd2cSJim Jagielski { 2122*b1cdbd2cSJim Jagielski $position = $localposition; 2123*b1cdbd2cSJim Jagielski last; 2124*b1cdbd2cSJim Jagielski } 2125*b1cdbd2cSJim Jagielski } 2126*b1cdbd2cSJim Jagielski } 2127*b1cdbd2cSJim Jagielski 2128*b1cdbd2cSJim Jagielski return $position; 2129*b1cdbd2cSJim Jagielski} 2130*b1cdbd2cSJim Jagielski 2131*b1cdbd2cSJim Jagielski########################################################################## 2132*b1cdbd2cSJim Jagielski# Setting the position of CustomActions in sequence tables. 2133*b1cdbd2cSJim Jagielski# Replacing all occurences of "POSITIONTEMPLATE_" 2134*b1cdbd2cSJim Jagielski########################################################################## 2135*b1cdbd2cSJim Jagielski 2136*b1cdbd2cSJim Jagielskisub set_positions_in_table 2137*b1cdbd2cSJim Jagielski{ 2138*b1cdbd2cSJim Jagielski my ( $sequencetable, $tablename ) = @_; 2139*b1cdbd2cSJim Jagielski 2140*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 2141*b1cdbd2cSJim Jagielski $installer::logger::Lang->printf("Setting positions in table \"%s\".\n", $tablename); 2142*b1cdbd2cSJim Jagielski 2143*b1cdbd2cSJim Jagielski # Step 1: Resolving all occurences of "POSITIONTEMPLATE_end" 2144*b1cdbd2cSJim Jagielski 2145*b1cdbd2cSJim Jagielski my $lastposition = get_last_position_in_sequencetable($sequencetable); 2146*b1cdbd2cSJim Jagielski 2147*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) 2148*b1cdbd2cSJim Jagielski { 2149*b1cdbd2cSJim Jagielski if ( ${$sequencetable}[$i] =~ /^\s*([\w\.]+)\t.*\t\s*POSITIONTEMPLATE_end\s*$/ ) 2150*b1cdbd2cSJim Jagielski { 2151*b1cdbd2cSJim Jagielski my $customaction = $1; 2152*b1cdbd2cSJim Jagielski $lastposition = $lastposition + 25; 2153*b1cdbd2cSJim Jagielski ${$sequencetable}[$i] =~ s/POSITIONTEMPLATE_end/$lastposition/; 2154*b1cdbd2cSJim Jagielski $infoline = "Setting position \"$lastposition\" for custom action \"$customaction\".\n"; 2155*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 2156*b1cdbd2cSJim Jagielski } 2157*b1cdbd2cSJim Jagielski } 2158*b1cdbd2cSJim Jagielski 2159*b1cdbd2cSJim Jagielski # Step 2: Resolving all occurences of "POSITIONTEMPLATE_abc" or "POSITIONTEMPLATE_behind_abc" 2160*b1cdbd2cSJim Jagielski # where abc is the name of the reference Custom Action. 2161*b1cdbd2cSJim Jagielski # This has to be done, until there is no more occurence of POSITIONTEMPLATE (success) 2162*b1cdbd2cSJim Jagielski # or there is no replacement in one circle (failure). 2163*b1cdbd2cSJim Jagielski 2164*b1cdbd2cSJim Jagielski my $template_exists = 0; 2165*b1cdbd2cSJim Jagielski my $template_replaced = 0; 2166*b1cdbd2cSJim Jagielski my $counter = 0; 2167*b1cdbd2cSJim Jagielski 2168*b1cdbd2cSJim Jagielski do 2169*b1cdbd2cSJim Jagielski { 2170*b1cdbd2cSJim Jagielski $template_exists = 0; 2171*b1cdbd2cSJim Jagielski $template_replaced = 0; 2172*b1cdbd2cSJim Jagielski $counter++; 2173*b1cdbd2cSJim Jagielski 2174*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) 2175*b1cdbd2cSJim Jagielski { 2176*b1cdbd2cSJim Jagielski if ( ${$sequencetable}[$i] =~ /^\s*([\w\.]+)\t.*\t\s*(POSITIONTEMPLATE_.*?)\s*$/ ) 2177*b1cdbd2cSJim Jagielski { 2178*b1cdbd2cSJim Jagielski my $onename = $1; 2179*b1cdbd2cSJim Jagielski my $templatename = $2; 2180*b1cdbd2cSJim Jagielski my $positionname = $templatename; 2181*b1cdbd2cSJim Jagielski my $customaction = $templatename; 2182*b1cdbd2cSJim Jagielski $customaction =~ s/POSITIONTEMPLATE_//; 2183*b1cdbd2cSJim Jagielski $template_exists = 1; 2184*b1cdbd2cSJim Jagielski 2185*b1cdbd2cSJim Jagielski # Trying to find the correct number. 2186*b1cdbd2cSJim Jagielski # This can fail, if the custom action has no number 2187*b1cdbd2cSJim Jagielski 2188*b1cdbd2cSJim Jagielski my $setbehind = 0; 2189*b1cdbd2cSJim Jagielski if ( $customaction =~ /^\s*behind_(.*?)\s*$/ ) 2190*b1cdbd2cSJim Jagielski { 2191*b1cdbd2cSJim Jagielski $customaction = $1; 2192*b1cdbd2cSJim Jagielski $setbehind = 1; 2193*b1cdbd2cSJim Jagielski } 2194*b1cdbd2cSJim Jagielski 2195*b1cdbd2cSJim Jagielski my $position = get_customaction_position($customaction, $sequencetable); 2196*b1cdbd2cSJim Jagielski 2197*b1cdbd2cSJim Jagielski if ( $position >= 0 ) # Found CustomAction and is has a position. Otherwise return value is "-1". 2198*b1cdbd2cSJim Jagielski { 2199*b1cdbd2cSJim Jagielski my $newposition = 0; 2200*b1cdbd2cSJim Jagielski if ( $setbehind ) { $newposition = $position + 2; } 2201*b1cdbd2cSJim Jagielski else { $newposition = $position - 2; } 2202*b1cdbd2cSJim Jagielski ${$sequencetable}[$i] =~ s/$templatename/$newposition/; 2203*b1cdbd2cSJim Jagielski $template_replaced = 1; 2204*b1cdbd2cSJim Jagielski $infoline = "Setting position \"$newposition\" for custom action \"$onename\" (scp: \"$positionname\" at position $position).\n"; 2205*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 2206*b1cdbd2cSJim Jagielski } 2207*b1cdbd2cSJim Jagielski else 2208*b1cdbd2cSJim Jagielski { 2209*b1cdbd2cSJim Jagielski $infoline = "Could not assign position for custom action \"$onename\" yet (scp: \"$positionname\").\n"; 2210*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 2211*b1cdbd2cSJim Jagielski } 2212*b1cdbd2cSJim Jagielski } 2213*b1cdbd2cSJim Jagielski } 2214*b1cdbd2cSJim Jagielski } while (( $template_exists ) && ( $template_replaced )); 2215*b1cdbd2cSJim Jagielski 2216*b1cdbd2cSJim Jagielski # An error occured, because templates still exist, but could not be replaced. 2217*b1cdbd2cSJim Jagielski # Reason: 2218*b1cdbd2cSJim Jagielski # 1. Wrong name of CustomAction in scp2 (typo?) 2219*b1cdbd2cSJim Jagielski # 2. Circular dependencies of CustomActions (A after B and B after A) 2220*b1cdbd2cSJim Jagielski 2221*b1cdbd2cSJim Jagielski # Problem: It is allowed, that a CustomAction is defined in scp2 in a library that is 2222*b1cdbd2cSJim Jagielski # part of product ABC, but this CustomAction is not used in this product 2223*b1cdbd2cSJim Jagielski # and the reference CustomAction is not part of this product. 2224*b1cdbd2cSJim Jagielski # Therefore this cannot be an error, but only produce a warning. The assigned number 2225*b1cdbd2cSJim Jagielski # must be the last sequence number. 2226*b1cdbd2cSJim Jagielski 2227*b1cdbd2cSJim Jagielski if (( $template_exists ) && ( ! $template_replaced )) 2228*b1cdbd2cSJim Jagielski { 2229*b1cdbd2cSJim Jagielski # Giving a precise error message, collecting all unresolved templates 2230*b1cdbd2cSJim Jagielski # my $templatestring = ""; 2231*b1cdbd2cSJim Jagielski 2232*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) 2233*b1cdbd2cSJim Jagielski { 2234*b1cdbd2cSJim Jagielski if ( ${$sequencetable}[$i] =~ /^\s*([\w\.]+)\t.*\t\s*(POSITIONTEMPLATE_.*?)\s*$/ ) 2235*b1cdbd2cSJim Jagielski { 2236*b1cdbd2cSJim Jagielski my $customactionname = $1; 2237*b1cdbd2cSJim Jagielski my $fulltemplate = $2; 2238*b1cdbd2cSJim Jagielski my $template = $fulltemplate; 2239*b1cdbd2cSJim Jagielski $template =~ s/POSITIONTEMPLATE_//; 2240*b1cdbd2cSJim Jagielski # my $newstring = $customactionname . " (" . $template . ")"; 2241*b1cdbd2cSJim Jagielski # $templatestring = $templatestring . $newstring . ", "; 2242*b1cdbd2cSJim Jagielski # Setting at the end! 2243*b1cdbd2cSJim Jagielski $lastposition = $lastposition + 25; 2244*b1cdbd2cSJim Jagielski ${$sequencetable}[$i] =~ s/$fulltemplate/$lastposition/; 2245*b1cdbd2cSJim Jagielski $infoline = "WARNING: Setting position \"$lastposition\" for custom action \"$customactionname\". Could not find CustomAction \"$template\".\n"; 2246*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 2247*b1cdbd2cSJim Jagielski } 2248*b1cdbd2cSJim Jagielski } 2249*b1cdbd2cSJim Jagielski # $templatestring =~ s/,\s*$//; 2250*b1cdbd2cSJim Jagielski 2251*b1cdbd2cSJim Jagielski # $infoline = "Error: Saving table \"$tablename\"\n"; 2252*b1cdbd2cSJim Jagielski # $installer::logger::Lang->print($infoline); 2253*b1cdbd2cSJim Jagielski # print $infoline; 2254*b1cdbd2cSJim Jagielski # installer::files::save_file($tablename, $sequencetable); 2255*b1cdbd2cSJim Jagielski # installer::exiter::exit_program("ERROR: Unresolved positions in CustomActions in scp2: $templatestring", "set_positions_in_table"); 2256*b1cdbd2cSJim Jagielski } 2257*b1cdbd2cSJim Jagielski} 2258*b1cdbd2cSJim Jagielski 2259*b1cdbd2cSJim Jagielski########################################################################## 2260*b1cdbd2cSJim Jagielski# Setting the Windows custom actions into different tables 2261*b1cdbd2cSJim Jagielski# CustomAc.idt, InstallE.idt, InstallU.idt, ControlE.idt, ControlC.idt 2262*b1cdbd2cSJim Jagielski########################################################################## 2263*b1cdbd2cSJim Jagielski 2264*b1cdbd2cSJim Jagielskisub addcustomactions 2265*b1cdbd2cSJim Jagielski{ 2266*b1cdbd2cSJim Jagielski my ($languageidtdir, $customactions, $filesarray) = @_; 2267*b1cdbd2cSJim Jagielski 2268*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 2269*b1cdbd2cSJim Jagielski $installer::logger::Lang->add_timestamp("Performance Info: addcustomactions start\n"); 2270*b1cdbd2cSJim Jagielski 2271*b1cdbd2cSJim Jagielski my $customactionidttablename = $languageidtdir . $installer::globals::separator . "CustomAc.idt"; 2272*b1cdbd2cSJim Jagielski my $customactionidttable = installer::files::read_file($customactionidttablename); 2273*b1cdbd2cSJim Jagielski my $installexecutetablename = $languageidtdir . $installer::globals::separator . "InstallE.idt"; 2274*b1cdbd2cSJim Jagielski my $installexecutetable = installer::files::read_file($installexecutetablename); 2275*b1cdbd2cSJim Jagielski my $adminexecutetablename = $languageidtdir . $installer::globals::separator . "AdminExe.idt"; 2276*b1cdbd2cSJim Jagielski my $adminexecutetable = installer::files::read_file($adminexecutetablename); 2277*b1cdbd2cSJim Jagielski my $installuitablename = $languageidtdir . $installer::globals::separator . "InstallU.idt"; 2278*b1cdbd2cSJim Jagielski my $installuitable = installer::files::read_file($installuitablename); 2279*b1cdbd2cSJim Jagielski my $controleventtablename = $languageidtdir . $installer::globals::separator . "ControlE.idt"; 2280*b1cdbd2cSJim Jagielski my $controleventtable = installer::files::read_file($controleventtablename); 2281*b1cdbd2cSJim Jagielski my $controlconditiontablename = $languageidtdir . $installer::globals::separator . "ControlC.idt"; 2282*b1cdbd2cSJim Jagielski my $controlconditiontable = installer::files::read_file($controlconditiontablename); 2283*b1cdbd2cSJim Jagielski 2284*b1cdbd2cSJim Jagielski # Iterating over all Windows custom actions 2285*b1cdbd2cSJim Jagielski 2286*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$customactions}; $i++ ) 2287*b1cdbd2cSJim Jagielski { 2288*b1cdbd2cSJim Jagielski my $customaction = ${$customactions}[$i]; 2289*b1cdbd2cSJim Jagielski my $name = $customaction->{'Name'}; 2290*b1cdbd2cSJim Jagielski my $typ = $customaction->{'Typ'}; 2291*b1cdbd2cSJim Jagielski my $source = $customaction->{'Source'}; 2292*b1cdbd2cSJim Jagielski my $target = $customaction->{'Target'}; 2293*b1cdbd2cSJim Jagielski my $inbinarytable = $customaction->{'Inbinarytable'}; 2294*b1cdbd2cSJim Jagielski my $gid = $customaction->{'gid'}; 2295*b1cdbd2cSJim Jagielski 2296*b1cdbd2cSJim Jagielski my $styles = ""; 2297*b1cdbd2cSJim Jagielski if ( $customaction->{'Styles'} ) { $styles = $customaction->{'Styles'}; } 2298*b1cdbd2cSJim Jagielski 2299*b1cdbd2cSJim Jagielski my $added_customaction = set_custom_action($customactionidttable, $name, $typ, $source, $target, $inbinarytable, $filesarray, $customactionidttablename, $styles); 2300*b1cdbd2cSJim Jagielski 2301*b1cdbd2cSJim Jagielski if ( $added_customaction ) 2302*b1cdbd2cSJim Jagielski { 2303*b1cdbd2cSJim Jagielski # If the CustomAction was added into the CustomAc.idt, it can be connected to the installation. 2304*b1cdbd2cSJim Jagielski # There are currently two different ways for doing this: 2305*b1cdbd2cSJim Jagielski # 1. Using "add_custom_action_to_install_table", which adds the CustomAction to the install sequences, 2306*b1cdbd2cSJim Jagielski # which are saved in InstallE.idt and InstallU.idt 2307*b1cdbd2cSJim Jagielski # 2. Using "connect_custom_action_to_control" and "connect_custom_action_to_control". The first method 2308*b1cdbd2cSJim Jagielski # connects a CustomAction to a control in ControlE.idt. The second method sets a condition for a control, 2309*b1cdbd2cSJim Jagielski # which might be influenced by the CustomAction. This happens in ControlC.idt. 2310*b1cdbd2cSJim Jagielski 2311*b1cdbd2cSJim Jagielski # Any Windows CustomAction can have a lot of different assignments. 2312*b1cdbd2cSJim Jagielski 2313*b1cdbd2cSJim Jagielski for ( my $j = 1; $j <= 50; $j++ ) 2314*b1cdbd2cSJim Jagielski { 2315*b1cdbd2cSJim Jagielski my $key = "Assignment" . $j; 2316*b1cdbd2cSJim Jagielski my $value = ""; 2317*b1cdbd2cSJim Jagielski if ( $customaction->{$key} ) 2318*b1cdbd2cSJim Jagielski { 2319*b1cdbd2cSJim Jagielski $value = $customaction->{$key}; 2320*b1cdbd2cSJim Jagielski 2321*b1cdbd2cSJim Jagielski # in a patch the Assignment can be overwritten by a PatchAssignment 2322*b1cdbd2cSJim Jagielski if ( $installer::globals::patch ) 2323*b1cdbd2cSJim Jagielski { 2324*b1cdbd2cSJim Jagielski $patchkey = "PatchAssignment" . $j; 2325*b1cdbd2cSJim Jagielski if ( $customaction->{$patchkey} ) 2326*b1cdbd2cSJim Jagielski { 2327*b1cdbd2cSJim Jagielski $value = $customaction->{$patchkey}; 2328*b1cdbd2cSJim Jagielski $key = $patchkey; 2329*b1cdbd2cSJim Jagielski } 2330*b1cdbd2cSJim Jagielski } 2331*b1cdbd2cSJim Jagielski 2332*b1cdbd2cSJim Jagielski } 2333*b1cdbd2cSJim Jagielski else { last; } 2334*b1cdbd2cSJim Jagielski 2335*b1cdbd2cSJim Jagielski # $value is now a comma separated list 2336*b1cdbd2cSJim Jagielski if ( $value =~ /^\s*\(\s*(.*)\s*\);?\s*$/ ) { $value = $1; } 2337*b1cdbd2cSJim Jagielski my $assignmentarray = installer::converter::convert_stringlist_into_array(\$value, ","); 2338*b1cdbd2cSJim Jagielski my $assignment = create_customaction_assignment_hash($gid, $name, $key, $assignmentarray); 2339*b1cdbd2cSJim Jagielski 2340*b1cdbd2cSJim Jagielski if ( $assignment->{'parameter1'} eq "InstallExecuteSequence" ) 2341*b1cdbd2cSJim Jagielski { 2342*b1cdbd2cSJim Jagielski add_custom_action_to_install_table($installexecutetable, $source, $name, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $filesarray, $installexecutetablename, $styles); 2343*b1cdbd2cSJim Jagielski } 2344*b1cdbd2cSJim Jagielski elsif ( $assignment->{'parameter1'} eq "AdminExecuteSequence" ) 2345*b1cdbd2cSJim Jagielski { 2346*b1cdbd2cSJim Jagielski add_custom_action_to_install_table($adminexecutetable, $source, $name, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $filesarray, $adminexecutetablename, $styles); 2347*b1cdbd2cSJim Jagielski } 2348*b1cdbd2cSJim Jagielski elsif ( $assignment->{'parameter1'} eq "InstallUISequence" ) 2349*b1cdbd2cSJim Jagielski { 2350*b1cdbd2cSJim Jagielski add_custom_action_to_install_table($installuitable, $source, $name, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $filesarray, $installuitablename, $styles); 2351*b1cdbd2cSJim Jagielski } 2352*b1cdbd2cSJim Jagielski elsif ( $assignment->{'parameter1'} eq "ControlEvent" ) 2353*b1cdbd2cSJim Jagielski { 2354*b1cdbd2cSJim Jagielski connect_custom_action_to_control($controleventtable, $controleventtablename, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $assignment->{'parameter4'}, $assignment->{'parameter5'}, $assignment->{'parameter6'}, $assignment->{'parameter7'}); 2355*b1cdbd2cSJim Jagielski } 2356*b1cdbd2cSJim Jagielski elsif ( $assignment->{'parameter1'} eq "ControlCondition" ) 2357*b1cdbd2cSJim Jagielski { 2358*b1cdbd2cSJim Jagielski connect_condition_to_control($controlconditiontable, $controlconditiontablename, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $assignment->{'parameter4'}, $assignment->{'parameter5'}); 2359*b1cdbd2cSJim Jagielski } 2360*b1cdbd2cSJim Jagielski else 2361*b1cdbd2cSJim Jagielski { 2362*b1cdbd2cSJim Jagielski installer::exiter::exit_program("ERROR: gid: $gid, key: $key ! Unknown Windows CustomAction table: $assignmenthashref->{'parameter1'} ! Currently supported: InstallUISequence, InstallESequence, ControlEvent, ControlCondition", "addcustomactions"); 2363*b1cdbd2cSJim Jagielski } 2364*b1cdbd2cSJim Jagielski } 2365*b1cdbd2cSJim Jagielski } 2366*b1cdbd2cSJim Jagielski } 2367*b1cdbd2cSJim Jagielski 2368*b1cdbd2cSJim Jagielski # Setting the positions in the tables 2369*b1cdbd2cSJim Jagielski 2370*b1cdbd2cSJim Jagielski set_positions_in_table($installexecutetable, $installexecutetablename); 2371*b1cdbd2cSJim Jagielski set_positions_in_table($installuitable, $installuitablename); 2372*b1cdbd2cSJim Jagielski set_positions_in_table($adminexecutetable, $adminexecutetablename); 2373*b1cdbd2cSJim Jagielski 2374*b1cdbd2cSJim Jagielski # Saving the files 2375*b1cdbd2cSJim Jagielski 2376*b1cdbd2cSJim Jagielski installer::files::save_file($customactionidttablename, $customactionidttable); 2377*b1cdbd2cSJim Jagielski installer::files::save_file($installexecutetablename, $installexecutetable); 2378*b1cdbd2cSJim Jagielski installer::files::save_file($adminexecutetablename, $adminexecutetable); 2379*b1cdbd2cSJim Jagielski installer::files::save_file($installuitablename, $installuitable); 2380*b1cdbd2cSJim Jagielski installer::files::save_file($controleventtablename, $controleventtable); 2381*b1cdbd2cSJim Jagielski installer::files::save_file($controlconditiontablename, $controlconditiontable); 2382*b1cdbd2cSJim Jagielski 2383*b1cdbd2cSJim Jagielski my $infoline = "Updated idt file: $customactionidttablename\n"; 2384*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 2385*b1cdbd2cSJim Jagielski $infoline = "Updated idt file: $installexecutetablename\n"; 2386*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 2387*b1cdbd2cSJim Jagielski $infoline = "Updated idt file: $adminexecutetablename\n"; 2388*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 2389*b1cdbd2cSJim Jagielski $infoline = "Updated idt file: $installuitablename\n"; 2390*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 2391*b1cdbd2cSJim Jagielski $infoline = "Updated idt file: $controleventtablename\n"; 2392*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 2393*b1cdbd2cSJim Jagielski $infoline = "Updated idt file: $controlconditiontablename\n"; 2394*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 2395*b1cdbd2cSJim Jagielski 2396*b1cdbd2cSJim Jagielski $installer::logger::Lang->print("\n"); 2397*b1cdbd2cSJim Jagielski $installer::logger::Lang->add_timestamp("Performance Info: addcustomactions end\n"); 2398*b1cdbd2cSJim Jagielski} 2399*b1cdbd2cSJim Jagielski 2400*b1cdbd2cSJim Jagielski########################################################################## 2401*b1cdbd2cSJim Jagielski# Setting bidi attributes in idt tables 2402*b1cdbd2cSJim Jagielski########################################################################## 2403*b1cdbd2cSJim Jagielski 2404*b1cdbd2cSJim Jagielskisub setbidiattributes 2405*b1cdbd2cSJim Jagielski{ 2406*b1cdbd2cSJim Jagielski my ($languageidtdir, $onelanguage) = @_; 2407*b1cdbd2cSJim Jagielski 2408*b1cdbd2cSJim Jagielski # Editing the files Dialog.idt and Control.idt 2409*b1cdbd2cSJim Jagielski 2410*b1cdbd2cSJim Jagielski my $dialogfilename = $languageidtdir . $installer::globals::separator . "Dialog.idt"; 2411*b1cdbd2cSJim Jagielski my $controlfilename = $languageidtdir . $installer::globals::separator . "Control.idt"; 2412*b1cdbd2cSJim Jagielski 2413*b1cdbd2cSJim Jagielski my $dialogfile = installer::files::read_file($dialogfilename); 2414*b1cdbd2cSJim Jagielski my $controlfile = installer::files::read_file($controlfilename); 2415*b1cdbd2cSJim Jagielski 2416*b1cdbd2cSJim Jagielski # Searching attributes in Dialog.idt and adding "896". 2417*b1cdbd2cSJim Jagielski # Attributes are in column 6 (from 10). 2418*b1cdbd2cSJim Jagielski 2419*b1cdbd2cSJim Jagielski my $bidiattribute = 896; 2420*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$dialogfile}; $i++ ) 2421*b1cdbd2cSJim Jagielski { 2422*b1cdbd2cSJim Jagielski if ( $i < 3 ) { next; } 2423*b1cdbd2cSJim Jagielski if ( ${$dialogfile}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) 2424*b1cdbd2cSJim Jagielski { 2425*b1cdbd2cSJim Jagielski my $one = $1; 2426*b1cdbd2cSJim Jagielski my $two = $2; 2427*b1cdbd2cSJim Jagielski my $three = $3; 2428*b1cdbd2cSJim Jagielski my $four = $4; 2429*b1cdbd2cSJim Jagielski my $five = $5; 2430*b1cdbd2cSJim Jagielski my $attribute = $6; 2431*b1cdbd2cSJim Jagielski my $seven = $7; 2432*b1cdbd2cSJim Jagielski my $eight = $8; 2433*b1cdbd2cSJim Jagielski $attribute = $attribute + $bidiattribute; 2434*b1cdbd2cSJim Jagielski ${$dialogfile}[$i] = "$one\t$two\t$three\t$four\t$five\t$attribute\t$seven\t$eight\n"; 2435*b1cdbd2cSJim Jagielski } 2436*b1cdbd2cSJim Jagielski } 2437*b1cdbd2cSJim Jagielski 2438*b1cdbd2cSJim Jagielski # Searching attributes in Control.idt and adding "224". 2439*b1cdbd2cSJim Jagielski # Attributes are in column 8 (from 12). 2440*b1cdbd2cSJim Jagielski 2441*b1cdbd2cSJim Jagielski $bidiattribute = 224; 2442*b1cdbd2cSJim Jagielski for ( my $i = 0; $i <= $#{$controlfile}; $i++ ) 2443*b1cdbd2cSJim Jagielski { 2444*b1cdbd2cSJim Jagielski if ( $i < 3 ) { next; } 2445*b1cdbd2cSJim Jagielski if ( ${$controlfile}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) 2446*b1cdbd2cSJim Jagielski { 2447*b1cdbd2cSJim Jagielski my $one = $1; 2448*b1cdbd2cSJim Jagielski my $two = $2; 2449*b1cdbd2cSJim Jagielski my $three = $3; 2450*b1cdbd2cSJim Jagielski my $four = $4; 2451*b1cdbd2cSJim Jagielski my $five = $5; 2452*b1cdbd2cSJim Jagielski my $six = $6; 2453*b1cdbd2cSJim Jagielski my $seven = $7; 2454*b1cdbd2cSJim Jagielski my $attribute = $8; 2455*b1cdbd2cSJim Jagielski my $nine = $9; 2456*b1cdbd2cSJim Jagielski my $ten = $10; 2457*b1cdbd2cSJim Jagielski my $eleven = $11; 2458*b1cdbd2cSJim Jagielski my $twelve = $12; 2459*b1cdbd2cSJim Jagielski $attribute = $attribute + $bidiattribute; 2460*b1cdbd2cSJim Jagielski ${$controlfile}[$i] = "$one\t$two\t$three\t$four\t$five\t$six\t$seven\t$attribute\t$nine\t$ten\t$eleven\t$twelve\n"; 2461*b1cdbd2cSJim Jagielski } 2462*b1cdbd2cSJim Jagielski } 2463*b1cdbd2cSJim Jagielski 2464*b1cdbd2cSJim Jagielski # Saving the file 2465*b1cdbd2cSJim Jagielski 2466*b1cdbd2cSJim Jagielski installer::files::save_file($dialogfilename, $dialogfile); 2467*b1cdbd2cSJim Jagielski $infoline = "Set bidi support in idt file \"$dialogfilename\" for language $onelanguage\n"; 2468*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 2469*b1cdbd2cSJim Jagielski 2470*b1cdbd2cSJim Jagielski installer::files::save_file($controlfilename, $controlfile); 2471*b1cdbd2cSJim Jagielski $infoline = "Set bidi support in idt file \"$controlfilename\" for language $onelanguage\n"; 2472*b1cdbd2cSJim Jagielski $installer::logger::Lang->print($infoline); 2473*b1cdbd2cSJim Jagielski} 2474*b1cdbd2cSJim Jagielski 2475*b1cdbd2cSJim Jagielski1; 2476