19780544fSAndrew Rist#************************************************************** 29780544fSAndrew Rist# 39780544fSAndrew Rist# Licensed to the Apache Software Foundation (ASF) under one 49780544fSAndrew Rist# or more contributor license agreements. See the NOTICE file 59780544fSAndrew Rist# distributed with this work for additional information 69780544fSAndrew Rist# regarding copyright ownership. The ASF licenses this file 79780544fSAndrew Rist# to you under the Apache License, Version 2.0 (the 89780544fSAndrew Rist# "License"); you may not use this file except in compliance 99780544fSAndrew Rist# with the License. You may obtain a copy of the License at 109780544fSAndrew Rist# 119780544fSAndrew Rist# http://www.apache.org/licenses/LICENSE-2.0 129780544fSAndrew Rist# 139780544fSAndrew Rist# Unless required by applicable law or agreed to in writing, 149780544fSAndrew Rist# software distributed under the License is distributed on an 159780544fSAndrew Rist# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 169780544fSAndrew Rist# KIND, either express or implied. See the License for the 179780544fSAndrew Rist# specific language governing permissions and limitations 189780544fSAndrew Rist# under the License. 199780544fSAndrew Rist# 209780544fSAndrew Rist#************************************************************** 219780544fSAndrew Rist 229780544fSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweirpackage installer::windows::directory; 25cdf0e10cSrcweir 26cdf0e10cSrcweiruse installer::exiter; 27cdf0e10cSrcweiruse installer::files; 28cdf0e10cSrcweiruse installer::globals; 29cdf0e10cSrcweiruse installer::pathanalyzer; 30cdf0e10cSrcweiruse installer::windows::idtglobal; 3119d58b3aSEike Rathkeuse installer::windows::msiglobal; 32cdf0e10cSrcweir 33cdf0e10cSrcweir############################################################## 34cdf0e10cSrcweir# Collecting all directory trees in global hash 35cdf0e10cSrcweir############################################################## 36cdf0e10cSrcweir 37cdf0e10cSrcweirsub collectdirectorytrees 38cdf0e10cSrcweir{ 39cdf0e10cSrcweir my ( $directoryref ) = @_; 40cdf0e10cSrcweir 41cdf0e10cSrcweir for ( my $i = 0; $i <= $#{$directoryref}; $i++ ) 42cdf0e10cSrcweir { 43cdf0e10cSrcweir my $onedir = ${$directoryref}[$i]; 44cdf0e10cSrcweir my $styles = ""; 45cdf0e10cSrcweir if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; } 46cdf0e10cSrcweir 47cdf0e10cSrcweir if ( $styles ne "" ) 48cdf0e10cSrcweir { 49cdf0e10cSrcweir foreach my $treestyle ( keys %installer::globals::treestyles ) 50cdf0e10cSrcweir { 51cdf0e10cSrcweir if ( $styles =~ /\b$treestyle\b/ ) 52cdf0e10cSrcweir { 53cdf0e10cSrcweir my $hostname = $onedir->{'HostName'}; 54cdf0e10cSrcweir # -> hostname is the key, the style the value! 55cdf0e10cSrcweir $installer::globals::hostnametreestyles{$hostname} = $treestyle; 56cdf0e10cSrcweir } 57cdf0e10cSrcweir } 58cdf0e10cSrcweir } 59cdf0e10cSrcweir } 60cdf0e10cSrcweir} 61cdf0e10cSrcweir 62cdf0e10cSrcweir############################################################## 63cdf0e10cSrcweir# Overwriting global programfilesfolder, if required 64cdf0e10cSrcweir############################################################## 65cdf0e10cSrcweir 66cdf0e10cSrcweirsub overwrite_programfilesfolder 67cdf0e10cSrcweir{ 68cdf0e10cSrcweir my ( $allvariables ) = @_; 69cdf0e10cSrcweir 70cdf0e10cSrcweir if ( $allvariables->{'PROGRAMFILESFOLDERNAME'} ) 71cdf0e10cSrcweir { 72cdf0e10cSrcweir $installer::globals::programfilesfolder = $allvariables->{'PROGRAMFILESFOLDERNAME'}; 73cdf0e10cSrcweir } 74cdf0e10cSrcweir} 75cdf0e10cSrcweir 76cdf0e10cSrcweir############################################################## 77cdf0e10cSrcweir# Maximum length of directory name is 72. 78cdf0e10cSrcweir# Taking care of underlines, which are the separator. 79cdf0e10cSrcweir############################################################## 80cdf0e10cSrcweir 81cdf0e10cSrcweirsub make_short_dir_version 82cdf0e10cSrcweir{ 8319d58b3aSEike Rathke my ($longstring) = @_; 84cdf0e10cSrcweir 85cdf0e10cSrcweir my $shortstring = ""; 8619d58b3aSEike Rathke my $cutlength = 60; 8719d58b3aSEike Rathke my $length = 5; # So the directory can still be recognized 8819d58b3aSEike Rathke my $longstring_save = $longstring; 89cdf0e10cSrcweir 90cdf0e10cSrcweir # Splitting the string at each "underline" and allowing only $length characters per directory name. 91cdf0e10cSrcweir # Checking also uniqueness and length. 92cdf0e10cSrcweir 93cdf0e10cSrcweir my $stringarray = installer::converter::convert_stringlist_into_array_without_newline(\$longstring, "_"); 94cdf0e10cSrcweir 95cdf0e10cSrcweir foreach my $onestring ( @{$stringarray} ) 96cdf0e10cSrcweir { 97cdf0e10cSrcweir my $partstring = ""; 98cdf0e10cSrcweir 99cdf0e10cSrcweir if ( $onestring =~ /\-/ ) 100cdf0e10cSrcweir { 101cdf0e10cSrcweir my $localstringarray = installer::converter::convert_stringlist_into_array_without_newline(\$onestring, "-"); 102cdf0e10cSrcweir foreach my $onelocalstring ( @{$localstringarray} ) 103cdf0e10cSrcweir { 104cdf0e10cSrcweir if ( length($onelocalstring) > $length ) { $onelocalstring = substr($onelocalstring, 0, $length); } 105cdf0e10cSrcweir $partstring = $partstring . "-" . $onelocalstring; 106cdf0e10cSrcweir } 107cdf0e10cSrcweir $partstring =~ s/^\s*\-//; 108cdf0e10cSrcweir } 109cdf0e10cSrcweir else 110cdf0e10cSrcweir { 111cdf0e10cSrcweir if ( length($onestring) > $length ) { $partstring = substr($onestring, 0, $length); } 112cdf0e10cSrcweir else { $partstring = $onestring; } 113cdf0e10cSrcweir } 114cdf0e10cSrcweir 115cdf0e10cSrcweir $shortstring = $shortstring . "_" . $partstring; 116cdf0e10cSrcweir } 117cdf0e10cSrcweir 118cdf0e10cSrcweir $shortstring =~ s/^\s*\_//; 119cdf0e10cSrcweir 12019d58b3aSEike Rathke # Setting unique ID to each directory 12119d58b3aSEike Rathke # No counter allowed, process must be absolute reproducable due to patch creation process. 12219d58b3aSEike Rathke 12319d58b3aSEike Rathke # chomp(my $id = `echo $longstring_save | md5sum | sed -e "s/ .*//g"`); # Very, very slow 12419d58b3aSEike Rathke # my $subid = substr($id, 0, 9); # taking only the first 9 digits 12519d58b3aSEike Rathke 12619d58b3aSEike Rathke my $subid = installer::windows::msiglobal::calculate_id($longstring_save, 9); # taking only the first 9 digits 12719d58b3aSEike Rathke 12819d58b3aSEike Rathke if ( length($shortstring) > $cutlength ) { $shortstring = substr($shortstring, 0, $cutlength); } 12919d58b3aSEike Rathke 13019d58b3aSEike Rathke $shortstring = $shortstring . "_" . $subid; 131cdf0e10cSrcweir 132cdf0e10cSrcweir return $shortstring; 133cdf0e10cSrcweir} 134cdf0e10cSrcweir 135cdf0e10cSrcweir############################################################## 136cdf0e10cSrcweir# Adding unique directory names to the directory collection 137cdf0e10cSrcweir############################################################## 138cdf0e10cSrcweir 139cdf0e10cSrcweirsub create_unique_directorynames 140cdf0e10cSrcweir{ 141cdf0e10cSrcweir my ($directoryref, $allvariables) = @_; 142cdf0e10cSrcweir 143cdf0e10cSrcweir $installer::globals::officeinstalldirectoryset = 0; 14419d58b3aSEike Rathke 14519d58b3aSEike Rathke my %completedirhashstep1 = (); 14619d58b3aSEike Rathke my %shortdirhash = (); 14719d58b3aSEike Rathke my %shortdirhashreverse = (); 148cdf0e10cSrcweir my $infoline = ""; 149cdf0e10cSrcweir my $errorcount = 0; 150cdf0e10cSrcweir 151cdf0e10cSrcweir for ( my $i = 0; $i <= $#{$directoryref}; $i++ ) 152cdf0e10cSrcweir { 153cdf0e10cSrcweir my $onedir = ${$directoryref}[$i]; 15419d58b3aSEike Rathke my $uniquename = $onedir->{'HostName'}; 155cdf0e10cSrcweir 156cdf0e10cSrcweir my $styles = ""; 157cdf0e10cSrcweir if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; } 158cdf0e10cSrcweir 159cdf0e10cSrcweir $uniquename =~ s/^\s*//g; # removing beginning white spaces 160cdf0e10cSrcweir $uniquename =~ s/\s*$//g; # removing ending white spaces 161cdf0e10cSrcweir $uniquename =~ s/\s//g; # removing white spaces 162cdf0e10cSrcweir $uniquename =~ s/\_//g; # removing existing underlines 163cdf0e10cSrcweir $uniquename =~ s/\.//g; # removing dots in directoryname 164cdf0e10cSrcweir $uniquename =~ s/OpenOffice/OO/g; 16519d58b3aSEike Rathke 16619d58b3aSEike Rathke $uniquename =~ s/\Q$installer::globals::separator\E/\_/g; # replacing slash and backslash with underline 16719d58b3aSEike Rathke 168cdf0e10cSrcweir $uniquename =~ s/_registry/_rgy/g; 169cdf0e10cSrcweir $uniquename =~ s/_registration/_rgn/g; 170cdf0e10cSrcweir $uniquename =~ s/_extension/_ext/g; 171cdf0e10cSrcweir $uniquename =~ s/_frame/_frm/g; 172cdf0e10cSrcweir $uniquename =~ s/_table/_tbl/g; 173cdf0e10cSrcweir $uniquename =~ s/_chart/_crt/g; 174cdf0e10cSrcweir 17519d58b3aSEike Rathke # The names after this small changes must still be unique! 17619d58b3aSEike Rathke if ( exists($completedirhashstep1{$uniquename}) ) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 1): \"$uniquename\".", "create_unique_directorynames"); } 17719d58b3aSEike Rathke $completedirhashstep1{$uniquename} = 1; 178cdf0e10cSrcweir 17919d58b3aSEike Rathke # Starting to make unique name for the parent and its directory 18019d58b3aSEike Rathke my $originaluniquename = $uniquename; 18119d58b3aSEike Rathke 18219d58b3aSEike Rathke $uniquename = make_short_dir_version($uniquename); 18319d58b3aSEike Rathke 18419d58b3aSEike Rathke # Checking if the same directory already exists, but has another short version. 18519d58b3aSEike Rathke if (( exists($shortdirhash{$originaluniquename}) ) && ( $shortdirhash{$originaluniquename} ne $uniquename )) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 2A): \"$uniquename\".", "create_unique_directorynames"); } 18619d58b3aSEike Rathke 18719d58b3aSEike Rathke # Also checking vice versa 18819d58b3aSEike Rathke # Checking if the same short directory already exists, but has another long version. 18919d58b3aSEike Rathke if (( exists($shortdirhashreverse{$uniquename}) ) && ( $shortdirhashreverse{$uniquename} ne $originaluniquename )) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 2B): \"$uniquename\".", "create_unique_directorynames"); } 190cdf0e10cSrcweir 19119d58b3aSEike Rathke # Creating assignment from long to short directory names 19219d58b3aSEike Rathke $shortdirhash{$originaluniquename} = $uniquename; 19319d58b3aSEike Rathke $shortdirhashreverse{$uniquename} = $originaluniquename; 194cdf0e10cSrcweir 19519d58b3aSEike Rathke # Important: The unique parent is generated from the string $originaluniquename (with the use of underlines). 196cdf0e10cSrcweir 19719d58b3aSEike Rathke my $uniqueparentname = $originaluniquename; 19819d58b3aSEike Rathke my $keepparent = 1; 199cdf0e10cSrcweir 200cdf0e10cSrcweir if ( $uniqueparentname =~ /^\s*(.*)\_(.*?)\s*$/ ) # the underline is now the separator 201cdf0e10cSrcweir { 202cdf0e10cSrcweir $uniqueparentname = $1; 20319d58b3aSEike Rathke $keepparent = 0; 204cdf0e10cSrcweir } 205cdf0e10cSrcweir else 206cdf0e10cSrcweir { 207cdf0e10cSrcweir $uniqueparentname = $installer::globals::programfilesfolder; 20819d58b3aSEike Rathke $keepparent = 1; 209cdf0e10cSrcweir } 210cdf0e10cSrcweir 21119d58b3aSEike Rathke if ( $styles =~ /\bPROGRAMFILESFOLDER\b/ ) 21219d58b3aSEike Rathke { 21319d58b3aSEike Rathke $uniqueparentname = $installer::globals::programfilesfolder; 21419d58b3aSEike Rathke $keepparent = 1; 21519d58b3aSEike Rathke } 21619d58b3aSEike Rathke if ( $styles =~ /\bCOMMONFILESFOLDER\b/ ) 21719d58b3aSEike Rathke { 21819d58b3aSEike Rathke $uniqueparentname = $installer::globals::commonfilesfolder; 21919d58b3aSEike Rathke $keepparent = 1; 22019d58b3aSEike Rathke } 22119d58b3aSEike Rathke if ( $styles =~ /\bCOMMONAPPDATAFOLDER\b/ ) 22219d58b3aSEike Rathke { 22319d58b3aSEike Rathke $uniqueparentname = $installer::globals::commonappdatafolder; 22419d58b3aSEike Rathke $keepparent = 1; 22519d58b3aSEike Rathke } 22619d58b3aSEike Rathke if ( $styles =~ /\bLOCALAPPDATAFOLDER\b/ ) 22719d58b3aSEike Rathke { 22819d58b3aSEike Rathke $uniqueparentname = $installer::globals::localappdatafolder; 22919d58b3aSEike Rathke $keepparent = 1; 23019d58b3aSEike Rathke } 231cdf0e10cSrcweir 232cdf0e10cSrcweir if ( $styles =~ /\bSHAREPOINTPATH\b/ ) 233cdf0e10cSrcweir { 234cdf0e10cSrcweir $uniqueparentname = "SHAREPOINTPATH"; 235cdf0e10cSrcweir $installer::globals::usesharepointpath = 1; 23619d58b3aSEike Rathke $keepparent = 1; 237cdf0e10cSrcweir } 238cdf0e10cSrcweir 23919d58b3aSEike Rathke # also setting short directory name for the parent 24019d58b3aSEike Rathke 24119d58b3aSEike Rathke my $originaluniqueparentname = $uniqueparentname; 24219d58b3aSEike Rathke 24319d58b3aSEike Rathke if ( ! $keepparent ) 24419d58b3aSEike Rathke { 24519d58b3aSEike Rathke $uniqueparentname = make_short_dir_version($uniqueparentname); 24619d58b3aSEike Rathke } 24719d58b3aSEike Rathke 24819d58b3aSEike Rathke # Again checking if the same directory already exists, but has another short version. 24919d58b3aSEike Rathke if (( exists($shortdirhash{$originaluniqueparentname}) ) && ( $shortdirhash{$originaluniqueparentname} ne $uniqueparentname )) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 3A): \"$uniqueparentname\".", "create_unique_directorynames"); } 25019d58b3aSEike Rathke 25119d58b3aSEike Rathke # Also checking vice versa 25219d58b3aSEike Rathke # Checking if the same short directory already exists, but has another long version. 25319d58b3aSEike Rathke if (( exists($shortdirhashreverse{$uniqueparentname}) ) && ( $shortdirhashreverse{$uniqueparentname} ne $originaluniqueparentname )) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 3B): \"$uniqueparentname\".", "create_unique_directorynames"); } 25419d58b3aSEike Rathke 25519d58b3aSEike Rathke $shortdirhash{$originaluniqueparentname} = $uniqueparentname; 25619d58b3aSEike Rathke $shortdirhashreverse{$uniqueparentname} = $originaluniqueparentname; 25719d58b3aSEike Rathke 25819d58b3aSEike Rathke # Hyphen not allowed in database 259cdf0e10cSrcweir $uniquename =~ s/\-/\_/g; # making "-" to "_" 260cdf0e10cSrcweir $uniqueparentname =~ s/\-/\_/g; # making "-" to "_" 261cdf0e10cSrcweir 26219d58b3aSEike Rathke # And finally setting the values for the directories 263cdf0e10cSrcweir $onedir->{'uniquename'} = $uniquename; 264cdf0e10cSrcweir $onedir->{'uniqueparentname'} = $uniqueparentname; 265cdf0e10cSrcweir 266cdf0e10cSrcweir # setting the installlocation directory 267cdf0e10cSrcweir if ( $styles =~ /\bISINSTALLLOCATION\b/ ) 268cdf0e10cSrcweir { 269cdf0e10cSrcweir if ( $installer::globals::installlocationdirectoryset ) { installer::exiter::exit_program("ERROR: Directory with flag ISINSTALLLOCATION alread set: \"$installer::globals::installlocationdirectory\".", "create_unique_directorynames"); } 270cdf0e10cSrcweir $installer::globals::installlocationdirectory = $uniquename; 271cdf0e10cSrcweir $installer::globals::installlocationdirectoryset = 1; 272cdf0e10cSrcweir } 273cdf0e10cSrcweir 274cdf0e10cSrcweir # setting the sundirectory 275cdf0e10cSrcweir if ( $styles =~ /\bSUNDIRECTORY\b/ ) 276cdf0e10cSrcweir { 277cdf0e10cSrcweir if ( $installer::globals::vendordirectoryset ) { installer::exiter::exit_program("ERROR: Directory with flag SUNDIRECTORY alread set: \"$installer::globals::vendordirectory\".", "create_unique_directorynames"); } 278cdf0e10cSrcweir $installer::globals::vendordirectory = $uniquename; 279cdf0e10cSrcweir $installer::globals::vendordirectoryset = 1; 280cdf0e10cSrcweir } 28119d58b3aSEike Rathke } 282cdf0e10cSrcweir} 283cdf0e10cSrcweir 284cdf0e10cSrcweir##################################################### 285cdf0e10cSrcweir# Adding ":." to selected default directory names 286cdf0e10cSrcweir##################################################### 287cdf0e10cSrcweir 288cdf0e10cSrcweirsub check_sourcedir_addon 289cdf0e10cSrcweir{ 290cdf0e10cSrcweir my ( $onedir, $allvariableshashref ) = @_; 291cdf0e10cSrcweir 292cdf0e10cSrcweir if (($installer::globals::addchildprojects) || 293cdf0e10cSrcweir ($installer::globals::patch) || 294cdf0e10cSrcweir ($installer::globals::languagepack) || 295cdf0e10cSrcweir ($allvariableshashref->{'CHANGETARGETDIR'})) 296cdf0e10cSrcweir { 297cdf0e10cSrcweir my $sourcediraddon = "\:\."; 298cdf0e10cSrcweir $onedir->{'defaultdir'} = $onedir->{'defaultdir'} . $sourcediraddon; 299cdf0e10cSrcweir } 300cdf0e10cSrcweir 301cdf0e10cSrcweir} 302cdf0e10cSrcweir 303cdf0e10cSrcweir##################################################### 304cdf0e10cSrcweir# The directory with the style ISINSTALLLOCATION 305cdf0e10cSrcweir# will be replaced by INSTALLLOCATION 306cdf0e10cSrcweir##################################################### 307cdf0e10cSrcweir 308cdf0e10cSrcweirsub set_installlocation_directory 309cdf0e10cSrcweir{ 310cdf0e10cSrcweir my ( $directoryref, $allvariableshashref ) = @_; 311cdf0e10cSrcweir 312cdf0e10cSrcweir if ( ! $installer::globals::installlocationdirectoryset ) { installer::exiter::exit_program("ERROR: Directory with flag ISINSTALLLOCATION not set!", "set_installlocation_directory"); } 313cdf0e10cSrcweir 314cdf0e10cSrcweir for ( my $i = 0; $i <= $#{$directoryref}; $i++ ) 315cdf0e10cSrcweir { 316cdf0e10cSrcweir my $onedir = ${$directoryref}[$i]; 317cdf0e10cSrcweir 318cdf0e10cSrcweir if ( $onedir->{'uniquename'} eq $installer::globals::installlocationdirectory ) 319cdf0e10cSrcweir { 320cdf0e10cSrcweir $onedir->{'uniquename'} = "INSTALLLOCATION"; 321cdf0e10cSrcweir check_sourcedir_addon($onedir, $allvariableshashref); 322cdf0e10cSrcweir } 323cdf0e10cSrcweir 324cdf0e10cSrcweir if ( $onedir->{'uniquename'} eq $installer::globals::vendordirectory ) 325cdf0e10cSrcweir { 326cdf0e10cSrcweir check_sourcedir_addon($onedir, $allvariableshashref); 327cdf0e10cSrcweir } 328cdf0e10cSrcweir 329cdf0e10cSrcweir if ( $onedir->{'uniqueparentname'} eq $installer::globals::installlocationdirectory ) 330cdf0e10cSrcweir { 331cdf0e10cSrcweir $onedir->{'uniqueparentname'} = "INSTALLLOCATION"; 332cdf0e10cSrcweir } 333cdf0e10cSrcweir } 334cdf0e10cSrcweir} 335cdf0e10cSrcweir 336cdf0e10cSrcweir##################################################### 337cdf0e10cSrcweir# Getting the name of the top level directory. This 338cdf0e10cSrcweir# can have only one letter 339cdf0e10cSrcweir##################################################### 340cdf0e10cSrcweir 341cdf0e10cSrcweirsub get_last_directory_name 342cdf0e10cSrcweir{ 343cdf0e10cSrcweir my ($completepathref) = @_; 344cdf0e10cSrcweir 345cdf0e10cSrcweir if ( $$completepathref =~ /^.*[\/\\](.+?)\s*$/ ) 346cdf0e10cSrcweir { 347cdf0e10cSrcweir $$completepathref = $1; 348cdf0e10cSrcweir } 349cdf0e10cSrcweir} 350cdf0e10cSrcweir 351cdf0e10cSrcweir##################################################### 352cdf0e10cSrcweir# Creating the defaultdir for the file Director.idt 353cdf0e10cSrcweir##################################################### 354cdf0e10cSrcweir 355*dca4887fSAndre Fischersub create_defaultdir_directorynames ($) 356cdf0e10cSrcweir{ 357*dca4887fSAndre Fischer my ($directoryref) = @_; 358cdf0e10cSrcweir 359cdf0e10cSrcweir my @shortnames = (); 360f30bf281SAndre Fischer if ( $installer::globals::prepare_winpatch ) { @shortnames = values(%installer::globals::saved83dirmapping); } 361cdf0e10cSrcweir 362cdf0e10cSrcweir for ( my $i = 0; $i <= $#{$directoryref}; $i++ ) 363cdf0e10cSrcweir { 364cdf0e10cSrcweir my $onedir = ${$directoryref}[$i]; 365cdf0e10cSrcweir my $hostname = $onedir->{'HostName'}; 366cdf0e10cSrcweir 367cdf0e10cSrcweir $hostname =~ s/\Q$installer::globals::separator\E\s*$//; 368cdf0e10cSrcweir get_last_directory_name(\$hostname); 369cdf0e10cSrcweir # installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$hostname); # making program/classes to classes 370cdf0e10cSrcweir my $uniquename = $onedir->{'uniquename'}; 371cdf0e10cSrcweir my $shortstring; 372f30bf281SAndre Fischer if (( $installer::globals::prepare_winpatch ) && ( exists($installer::globals::saved83dirmapping{$uniquename}) )) 373cdf0e10cSrcweir { 374cdf0e10cSrcweir $shortstring = $installer::globals::saved83dirmapping{$uniquename}; 375cdf0e10cSrcweir } 376cdf0e10cSrcweir else 377cdf0e10cSrcweir { 378cdf0e10cSrcweir $shortstring = installer::windows::idtglobal::make_eight_three_conform($hostname, "dir", \@shortnames); 379cdf0e10cSrcweir } 380cdf0e10cSrcweir 381cdf0e10cSrcweir my $defaultdir; 382cdf0e10cSrcweir 383cdf0e10cSrcweir if ( $shortstring eq $hostname ) 384cdf0e10cSrcweir { 385cdf0e10cSrcweir $defaultdir = $hostname; 386cdf0e10cSrcweir } 387cdf0e10cSrcweir else 388cdf0e10cSrcweir { 389cdf0e10cSrcweir $defaultdir = $shortstring . "|" . $hostname; 390cdf0e10cSrcweir } 391cdf0e10cSrcweir 392cdf0e10cSrcweir $onedir->{'defaultdir'} = $defaultdir; 393cdf0e10cSrcweir 394cdf0e10cSrcweir my $fontdir = ""; 395cdf0e10cSrcweir if ( $onedir->{'Dir'} ) { $fontdir = $onedir->{'Dir'}; } 396cdf0e10cSrcweir 397cdf0e10cSrcweir my $fontdefaultdir = ""; 398cdf0e10cSrcweir if ( $onedir->{'defaultdir'} ) { $fontdefaultdir = $onedir->{'defaultdir'}; } 399cdf0e10cSrcweir 400cdf0e10cSrcweir if (( $fontdir eq "PREDEFINED_OSSYSTEMFONTDIR" ) && ( $fontdefaultdir eq $installer::globals::fontsdirhostname )) 401cdf0e10cSrcweir { 402cdf0e10cSrcweir $installer::globals::fontsdirname = $onedir->{'defaultdir'}; 403cdf0e10cSrcweir $installer::globals::fontsdirparent = $onedir->{'uniqueparentname'}; 404cdf0e10cSrcweir } 405cdf0e10cSrcweir } 406cdf0e10cSrcweir} 407cdf0e10cSrcweir 408cdf0e10cSrcweir############################################### 409cdf0e10cSrcweir# Fill content into the directory table 410cdf0e10cSrcweir############################################### 411cdf0e10cSrcweir 412cdf0e10cSrcweirsub create_directorytable_from_collection 413cdf0e10cSrcweir{ 414cdf0e10cSrcweir my ($directorytableref, $directoryref) = @_; 415cdf0e10cSrcweir 416cdf0e10cSrcweir for ( my $i = 0; $i <= $#{$directoryref}; $i++ ) 417cdf0e10cSrcweir { 418cdf0e10cSrcweir my $onedir = ${$directoryref}[$i]; 419cdf0e10cSrcweir my $hostname = $onedir->{'HostName'}; 420cdf0e10cSrcweir my $dir = ""; 421cdf0e10cSrcweir 422cdf0e10cSrcweir if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; } 423cdf0e10cSrcweir 424cdf0e10cSrcweir if (( $dir eq "PREDEFINED_PROGDIR" ) && ( $hostname eq "" )) { next; } # removing files from root directory 425cdf0e10cSrcweir 426cdf0e10cSrcweir my $oneline = $onedir->{'uniquename'} . "\t" . $onedir->{'uniqueparentname'} . "\t" . $onedir->{'defaultdir'} . "\n"; 427cdf0e10cSrcweir 428cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 429cdf0e10cSrcweir } 430cdf0e10cSrcweir} 431cdf0e10cSrcweir 432cdf0e10cSrcweir############################################### 433cdf0e10cSrcweir# Defining the root installation structure 434cdf0e10cSrcweir############################################### 435cdf0e10cSrcweir 436cdf0e10cSrcweirsub add_root_directories 437cdf0e10cSrcweir{ 438cdf0e10cSrcweir my ($directorytableref, $allvariableshashref) = @_; 439cdf0e10cSrcweir 440cdf0e10cSrcweir# my $sourcediraddon = ""; 441cdf0e10cSrcweir# if (($installer::globals::addchildprojects) || 442cdf0e10cSrcweir# ($installer::globals::patch) || 443cdf0e10cSrcweir# ($installer::globals::languagepack) || 444cdf0e10cSrcweir# ($allvariableshashref->{'CHANGETARGETDIR'})) 445cdf0e10cSrcweir# { 446cdf0e10cSrcweir# $sourcediraddon = "\:\."; 447cdf0e10cSrcweir# } 448cdf0e10cSrcweir 449cdf0e10cSrcweir my $oneline = ""; 450cdf0e10cSrcweir 451cdf0e10cSrcweir if (( ! $installer::globals::patch ) && ( ! $installer::globals::languagepack ) && ( ! $allvariableshashref->{'DONTUSESTARTMENUFOLDER'} )) 452cdf0e10cSrcweir { 453cdf0e10cSrcweir my $productname = $allvariableshashref->{'PRODUCTNAME'}; 454cdf0e10cSrcweir my $productversion = $allvariableshashref->{'PRODUCTVERSION'}; 455cdf0e10cSrcweir my $baseproductversion = $productversion; 456cdf0e10cSrcweir 457cdf0e10cSrcweir if (( $installer::globals::prepare_winpatch ) && ( $allvariableshashref->{'BASEPRODUCTVERSION'} )) 458cdf0e10cSrcweir { 459cdf0e10cSrcweir $baseproductversion = $allvariableshashref->{'BASEPRODUCTVERSION'}; # for example "2.0" for OOo 460cdf0e10cSrcweir } 461cdf0e10cSrcweir 462cdf0e10cSrcweir my $realproductkey = $productname . " " . $productversion; 463cdf0e10cSrcweir my $productkey = $productname . " " . $baseproductversion; 464cdf0e10cSrcweir 465cdf0e10cSrcweir if (( $allvariableshashref->{'POSTVERSIONEXTENSION'} ) && ( ! $allvariableshashref->{'DONTUSEEXTENSIONINDEFAULTDIR'} )) 466cdf0e10cSrcweir { 467cdf0e10cSrcweir $productkey = $productkey . " " . $allvariableshashref->{'POSTVERSIONEXTENSION'}; 468cdf0e10cSrcweir $realproductkey = $realproductkey . " " . $allvariableshashref->{'POSTVERSIONEXTENSION'}; 469cdf0e10cSrcweir } 470cdf0e10cSrcweir if ( $allvariableshashref->{'NOSPACEINDIRECTORYNAME'} ) 471cdf0e10cSrcweir { 472cdf0e10cSrcweir $productkey =~ s/\ /\_/g; 473cdf0e10cSrcweir $realproductkey =~ s/\ /\_/g; 474cdf0e10cSrcweir } 475cdf0e10cSrcweir 476cdf0e10cSrcweir my $shortproductkey = installer::windows::idtglobal::make_eight_three_conform($productkey, "dir"); # third parameter not used 477cdf0e10cSrcweir $shortproductkey =~ s/\s/\_/g; # changing empty space to underline 478cdf0e10cSrcweir 479cdf0e10cSrcweir $oneline = "$installer::globals::officemenufolder\t$installer::globals::programmenufolder\t$shortproductkey|$realproductkey\n"; 480cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 481cdf0e10cSrcweir } 482cdf0e10cSrcweir 483cdf0e10cSrcweir $oneline = "TARGETDIR\t\tSourceDir\n"; 484cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 485cdf0e10cSrcweir 486cdf0e10cSrcweir $oneline = "$installer::globals::programfilesfolder\tTARGETDIR\t.\n"; 487cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 488cdf0e10cSrcweir 489cdf0e10cSrcweir $oneline = "$installer::globals::programmenufolder\tTARGETDIR\t.\n"; 490cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 491cdf0e10cSrcweir 492cdf0e10cSrcweir $oneline = "$installer::globals::startupfolder\tTARGETDIR\t.\n"; 493cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 494cdf0e10cSrcweir 495cdf0e10cSrcweir $oneline = "$installer::globals::desktopfolder\tTARGETDIR\t.\n"; 496cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 497cdf0e10cSrcweir 498cdf0e10cSrcweir $oneline = "$installer::globals::startmenufolder\tTARGETDIR\t.\n"; 499cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 500cdf0e10cSrcweir 501cdf0e10cSrcweir $oneline = "$installer::globals::commonfilesfolder\tTARGETDIR\t.\n"; 502cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 503cdf0e10cSrcweir 504cdf0e10cSrcweir $oneline = "$installer::globals::commonappdatafolder\tTARGETDIR\t.\n"; 505cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 506cdf0e10cSrcweir 507cdf0e10cSrcweir $oneline = "$installer::globals::localappdatafolder\tTARGETDIR\t.\n"; 508cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 509cdf0e10cSrcweir 510cdf0e10cSrcweir if ( $installer::globals::usesharepointpath ) 511cdf0e10cSrcweir { 512cdf0e10cSrcweir $oneline = "SHAREPOINTPATH\tTARGETDIR\t.\n"; 513cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 514cdf0e10cSrcweir } 515cdf0e10cSrcweir 516cdf0e10cSrcweir $oneline = "$installer::globals::systemfolder\tTARGETDIR\t.\n"; 517cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 518cdf0e10cSrcweir 519cdf0e10cSrcweir my $localtemplatefoldername = $installer::globals::templatefoldername; 520cdf0e10cSrcweir my $directorytableentry = $localtemplatefoldername; 521cdf0e10cSrcweir my $shorttemplatefoldername = installer::windows::idtglobal::make_eight_three_conform($localtemplatefoldername, "dir"); 522cdf0e10cSrcweir if ( $shorttemplatefoldername ne $localtemplatefoldername ) { $directorytableentry = "$shorttemplatefoldername|$localtemplatefoldername"; } 523cdf0e10cSrcweir $oneline = "$installer::globals::templatefolder\tTARGETDIR\t$directorytableentry\n"; 524cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 525cdf0e10cSrcweir 526cdf0e10cSrcweir if ( $installer::globals::fontsdirname ) 527cdf0e10cSrcweir { 528cdf0e10cSrcweir $oneline = "$installer::globals::fontsfolder\t$installer::globals::fontsdirparent\t$installer::globals::fontsfoldername\:$installer::globals::fontsdirname\n"; 529cdf0e10cSrcweir } 530cdf0e10cSrcweir else 531cdf0e10cSrcweir { 532cdf0e10cSrcweir $oneline = "$installer::globals::fontsfolder\tTARGETDIR\t$installer::globals::fontsfoldername\n"; 533cdf0e10cSrcweir } 534cdf0e10cSrcweir 535cdf0e10cSrcweir push(@{$directorytableref}, $oneline); 536cdf0e10cSrcweir 537cdf0e10cSrcweir} 538cdf0e10cSrcweir 539cdf0e10cSrcweir############################################### 540cdf0e10cSrcweir# Creating the file Director.idt dynamically 541cdf0e10cSrcweir############################################### 542cdf0e10cSrcweir 543*dca4887fSAndre Fischersub create_directory_table ($$$$) 544cdf0e10cSrcweir{ 545*dca4887fSAndre Fischer my ($directoryref, $basedir, $allvariableshashref, $loggingdir) = @_; 546cdf0e10cSrcweir 547cdf0e10cSrcweir # Structure of the directory table: 548cdf0e10cSrcweir # Directory Directory_Parent DefaultDir 549cdf0e10cSrcweir # Directory is a unique identifier 550cdf0e10cSrcweir # Directory_Parent is the unique identifier of the parent 551cdf0e10cSrcweir # DefaultDir is .:APPLIC~1|Application Data with 552cdf0e10cSrcweir # Before ":" : [sourcedir]:[destdir] (not programmed yet) 553cdf0e10cSrcweir # After ":" : 8+3 and not 8+3 the destination directory name 55419d58b3aSEike Rathke 555b274bc22SAndre Fischer $installer::logger::Lang->add_timestamp("Performance Info: Directory Table start"); 556cdf0e10cSrcweir 557cdf0e10cSrcweir my @directorytable = (); 558cdf0e10cSrcweir my $infoline; 559cdf0e10cSrcweir 560cdf0e10cSrcweir overwrite_programfilesfolder($allvariableshashref); 561cdf0e10cSrcweir if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt_local_1.log", $directoryref); } 562cdf0e10cSrcweir create_unique_directorynames($directoryref, $allvariableshashref); 563cdf0e10cSrcweir if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt_local_1a.log", $directoryref); } 564*dca4887fSAndre Fischer create_defaultdir_directorynames($directoryref); # only destdir! 565cdf0e10cSrcweir if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt_local_2.log", $directoryref); } 566cdf0e10cSrcweir set_installlocation_directory($directoryref, $allvariableshashref); 567cdf0e10cSrcweir if ( $installer::globals::globallogging ) { installer::files::save_array_of_hashes($loggingdir . "directoriesforidt_local_3.log", $directoryref); } 568cdf0e10cSrcweir installer::windows::idtglobal::write_idt_header(\@directorytable, "directory"); 569cdf0e10cSrcweir add_root_directories(\@directorytable, $allvariableshashref); 570cdf0e10cSrcweir create_directorytable_from_collection(\@directorytable, $directoryref); 571cdf0e10cSrcweir 572cdf0e10cSrcweir # Saving the file 573cdf0e10cSrcweir 574cdf0e10cSrcweir my $directorytablename = $basedir . $installer::globals::separator . "Director.idt"; 575cdf0e10cSrcweir installer::files::save_file($directorytablename ,\@directorytable); 576b274bc22SAndre Fischer $installer::logger::Lang->printf("Created idt file: %s\n", $directorytablename); 57719d58b3aSEike Rathke 578b274bc22SAndre Fischer $installer::logger::Lang->add_timestamp("Performance Info: Directory Table end"); 579cdf0e10cSrcweir} 580cdf0e10cSrcweir 581cdf0e10cSrcweir1; 582