xref: /AOO41X/main/solenv/bin/modules/installer/windows/directory.pm (revision 4374bebb95a2d9ab3ab2c35944ea766a8b746b81)
19780544fSAndrew Rist#**************************************************************
2cdf0e10cSrcweir#
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
10cdf0e10cSrcweir#
119780544fSAndrew Rist#    http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir#
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.
19cdf0e10cSrcweir#
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;
329f91b7e3SAndre Fischeruse installer::scriptitems;
33cdf0e10cSrcweir
341ba1fd99SAndre Fischeruse strict;
351ba1fd99SAndre Fischer
36cdf0e10cSrcweir##############################################################
37cdf0e10cSrcweir# Collecting all directory trees in global hash
38cdf0e10cSrcweir##############################################################
39cdf0e10cSrcweir
40cdf0e10cSrcweirsub collectdirectorytrees
41cdf0e10cSrcweir{
42cdf0e10cSrcweir    my ( $directoryref ) = @_;
43cdf0e10cSrcweir
44cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$directoryref}; $i++ )
45cdf0e10cSrcweir    {
46cdf0e10cSrcweir        my $onedir = ${$directoryref}[$i];
47cdf0e10cSrcweir        my $styles = "";
48cdf0e10cSrcweir        if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
49cdf0e10cSrcweir
50cdf0e10cSrcweir        if ( $styles ne "" )
51cdf0e10cSrcweir        {
52cdf0e10cSrcweir            foreach my $treestyle ( keys %installer::globals::treestyles )
53cdf0e10cSrcweir            {
54cdf0e10cSrcweir                if ( $styles =~ /\b$treestyle\b/ )
55cdf0e10cSrcweir                {
56cdf0e10cSrcweir                    my $hostname = $onedir->{'HostName'};
57cdf0e10cSrcweir                    # -> hostname is the key, the style the value!
58cdf0e10cSrcweir                    $installer::globals::hostnametreestyles{$hostname} = $treestyle;
59cdf0e10cSrcweir                }
60cdf0e10cSrcweir            }
61cdf0e10cSrcweir        }
62cdf0e10cSrcweir    }
63cdf0e10cSrcweir}
64cdf0e10cSrcweir
65cdf0e10cSrcweir##############################################################
66cdf0e10cSrcweir# Overwriting global programfilesfolder, if required
67cdf0e10cSrcweir##############################################################
68cdf0e10cSrcweir
69cdf0e10cSrcweirsub overwrite_programfilesfolder
70cdf0e10cSrcweir{
71cdf0e10cSrcweir    my ( $allvariables ) = @_;
72cdf0e10cSrcweir
73cdf0e10cSrcweir    if ( $allvariables->{'PROGRAMFILESFOLDERNAME'} )
74cdf0e10cSrcweir    {
75cdf0e10cSrcweir        $installer::globals::programfilesfolder = $allvariables->{'PROGRAMFILESFOLDERNAME'};
76cdf0e10cSrcweir    }
77cdf0e10cSrcweir}
78cdf0e10cSrcweir
79cdf0e10cSrcweir
801ba1fd99SAndre Fischer
811ba1fd99SAndre Fischer
821ba1fd99SAndre Fischer=head2 make_short_dir_version($longstring)
831ba1fd99SAndre Fischer
841ba1fd99SAndre Fischer    Transform the given string into one that is at most 70 characters long.
851ba1fd99SAndre Fischer    That is done in two steps:
861ba1fd99SAndre Fischer    - Cut all parts separated by '_' or '-' down to a length of 5.
871ba1fd99SAndre Fischer    - Cut down the result to a length of 60 and fill it up to length 70
881ba1fd99SAndre Fischer      with the MD5 checksum.
891ba1fd99SAndre Fischer
901ba1fd99SAndre Fischer    This transform always returns the same result for the same string.
911ba1fd99SAndre Fischer    There is no counter and reference to a global set of names to make the string unique.
921ba1fd99SAndre Fischer
931ba1fd99SAndre Fischer=cut
941ba1fd99SAndre Fischersub make_short_dir_version ($)
95cdf0e10cSrcweir{
9619d58b3aSEike Rathke    my ($longstring) = @_;
97cdf0e10cSrcweir
98cdf0e10cSrcweir    my $shortstring = "";
9919d58b3aSEike Rathke    my $cutlength = 60;
10019d58b3aSEike Rathke    my $length = 5; # So the directory can still be recognized
10119d58b3aSEike Rathke    my $longstring_save = $longstring;
102cdf0e10cSrcweir
103cdf0e10cSrcweir    # Splitting the string at each "underline" and allowing only $length characters per directory name.
104cdf0e10cSrcweir    # Checking also uniqueness and length.
105cdf0e10cSrcweir
1061ba1fd99SAndre Fischer    my @outer_parts = split(/_/, $longstring);
1071ba1fd99SAndre Fischer    foreach my $onestring (@outer_parts)
108cdf0e10cSrcweir    {
109cdf0e10cSrcweir        my $partstring = "";
110cdf0e10cSrcweir
111cdf0e10cSrcweir        if ( $onestring =~ /\-/ )
112cdf0e10cSrcweir        {
1131ba1fd99SAndre Fischer            my @inner_parts = split(/-/, $onestring);
1141ba1fd99SAndre Fischer            @inner_parts = map {substr($_,0,$length)} @inner_parts;
1151ba1fd99SAndre Fischer            $partstring = join("-", @inner_parts);
116cdf0e10cSrcweir            $partstring =~ s/^\s*\-//;
117cdf0e10cSrcweir        }
118cdf0e10cSrcweir        else
119cdf0e10cSrcweir        {
1201ba1fd99SAndre Fischer            $partstring = substr($onestring, 0, $length);
121cdf0e10cSrcweir        }
122cdf0e10cSrcweir
1231ba1fd99SAndre Fischer        $shortstring .= "_" . $partstring;
124cdf0e10cSrcweir    }
125cdf0e10cSrcweir
126cdf0e10cSrcweir    $shortstring =~ s/^\s*\_//;
127cdf0e10cSrcweir
12819d58b3aSEike Rathke    # Setting unique ID to each directory
12919d58b3aSEike Rathke    # No counter allowed, process must be absolute reproducable due to patch creation process.
13019d58b3aSEike Rathke
13119d58b3aSEike Rathke    my $subid = installer::windows::msiglobal::calculate_id($longstring_save, 9); # taking only the first 9 digits
1321ba1fd99SAndre Fischer    $shortstring = substr($shortstring, 0, $cutlength) . "_" . $subid;
133cdf0e10cSrcweir
134cdf0e10cSrcweir    return $shortstring;
135cdf0e10cSrcweir}
136cdf0e10cSrcweir
137cdf0e10cSrcweir
1389f91b7e3SAndre Fischer
1399f91b7e3SAndre Fischer
1409f91b7e3SAndre Fischer=head2 get_unique_name ($hostname, $unique_map, $shortdirhash, $shortdirhashreverse)
1419f91b7e3SAndre Fischer
1429f91b7e3SAndre Fischer    Return a long and a short unique name for the given $hostname.
1439f91b7e3SAndre Fischer    Despite the function name and unlike the generation of unique
1449f91b7e3SAndre Fischer    names for files, the returned names are not really unique.  Quite
1459f91b7e3SAndre Fischer    the opposite.  The returned names are quaranteed to return the
1469f91b7e3SAndre Fischer    same result for the same input.
1479f91b7e3SAndre Fischer
1489f91b7e3SAndre Fischer    The returned short name has at most length 70.
1499f91b7e3SAndre Fischer
1509f91b7e3SAndre Fischer=cut
1519f91b7e3SAndre Fischersub get_unique_name ($$)
152cdf0e10cSrcweir{
1539f91b7e3SAndre Fischer    my ($hostname, $hostnamehash) = @_;
154cdf0e10cSrcweir
1559f91b7e3SAndre Fischer    # Make sure that we where not called for this hostname before.  Otherwise the other test would be triggered.
1569f91b7e3SAndre Fischer    if (defined $hostnamehash->{$hostname})
157cdf0e10cSrcweir    {
1589f91b7e3SAndre Fischer        installer::exiter::exit_program(
1599f91b7e3SAndre Fischer            "ERROR: get_unique_name was already called for hostname ".$hostname,
1609f91b7e3SAndre Fischer            "get_unique_name");
1619f91b7e3SAndre Fischer    }
1629f91b7e3SAndre Fischer    $hostnamehash->{$hostname} = 1;
163cdf0e10cSrcweir
1649f91b7e3SAndre Fischer    my $uniquename = $hostname;
165cdf0e10cSrcweir
166cdf0e10cSrcweir    $uniquename =~ s/^\s*//g;               # removing beginning white spaces
167cdf0e10cSrcweir    $uniquename =~ s/\s*$//g;               # removing ending white spaces
168cdf0e10cSrcweir    $uniquename =~ s/\s//g;                 # removing white spaces
169cdf0e10cSrcweir    $uniquename =~ s/\_//g;                 # removing existing underlines
170cdf0e10cSrcweir    $uniquename =~ s/\.//g;                 # removing dots in directoryname
171cdf0e10cSrcweir    $uniquename =~ s/OpenOffice/OO/g;
17219d58b3aSEike Rathke
17319d58b3aSEike Rathke    $uniquename =~ s/\Q$installer::globals::separator\E/\_/g;   # replacing slash and backslash with underline
17419d58b3aSEike Rathke
175cdf0e10cSrcweir    $uniquename =~ s/_registry/_rgy/g;
176cdf0e10cSrcweir    $uniquename =~ s/_registration/_rgn/g;
177cdf0e10cSrcweir    $uniquename =~ s/_extension/_ext/g;
178cdf0e10cSrcweir    $uniquename =~ s/_frame/_frm/g;
179cdf0e10cSrcweir    $uniquename =~ s/_table/_tbl/g;
180cdf0e10cSrcweir    $uniquename =~ s/_chart/_crt/g;
181cdf0e10cSrcweir
1829f91b7e3SAndre Fischer    my $short_uniquename = make_short_dir_version($uniquename);
1839f91b7e3SAndre Fischer
1849f91b7e3SAndre Fischer    return ($uniquename, $short_uniquename);
1859f91b7e3SAndre Fischer}
1869f91b7e3SAndre Fischer
1879f91b7e3SAndre Fischer
1889f91b7e3SAndre Fischer
1899f91b7e3SAndre Fischer
1909f91b7e3SAndre Fischer=head2 check_unique_directorynames($directories)
1919f91b7e3SAndre Fischer
1929f91b7e3SAndre Fischer    The one really important check is made in get_unique_name().  It
1939f91b7e3SAndre Fischer    checks that get_unique_name() is not called twice for the same
1949f91b7e3SAndre Fischer    directory host name.  The tests in this function contain the
1959f91b7e3SAndre Fischer    legacy tests that basically only check if there where a collision
1969f91b7e3SAndre Fischer    of the partial MD5 sum that is used to make the short unique names
1979f91b7e3SAndre Fischer    unique.
1989f91b7e3SAndre Fischer
1999f91b7e3SAndre Fischer    The maps $unique_map, $shortdirhash, $shortdirhashreverse are used
2009f91b7e3SAndre Fischer    only to check that _different_ input names are mapped to different
2019f91b7e3SAndre Fischer    results.  They are not used to influence the result.  That assumes
2029f91b7e3SAndre Fischer    that this function is called only once for every directory
2039f91b7e3SAndre Fischer    hostname.
2049f91b7e3SAndre Fischer=cut
2059f91b7e3SAndre Fischersub check_unique_directorynames ($)
2069f91b7e3SAndre Fischer{
2079f91b7e3SAndre Fischer    my ($directories) = @_;
2089f91b7e3SAndre Fischer
2099f91b7e3SAndre Fischer    my %completedirhashstep1 = ();
2109f91b7e3SAndre Fischer    my %shortdirhash = ();
2119f91b7e3SAndre Fischer    my %shortdirhashreverse = ();
2129f91b7e3SAndre Fischer
2139f91b7e3SAndre Fischer    # Check unique name of directories.
2149f91b7e3SAndre Fischer    foreach my $directory (@$directories)
2159f91b7e3SAndre Fischer    {
2169f91b7e3SAndre Fischer        my ($long_uniquename, $short_uniquename) = ($directory->{'long_uniquename'}, $directory->{'uniquename'});
2179f91b7e3SAndre Fischer
21819d58b3aSEike Rathke        # The names after this small changes must still be unique!
2199f91b7e3SAndre Fischer        if (exists($completedirhashstep1{$long_uniquename}))
2209f91b7e3SAndre Fischer        {
2219f91b7e3SAndre Fischer            installer::exiter::exit_program(
2229f91b7e3SAndre Fischer                sprintf("ERROR: Unallowed modification of directory name, not unique (step 1): \"%s\".",
2239f91b7e3SAndre Fischer                    $short_uniquename),
2249f91b7e3SAndre Fischer                "check_unique_directorynames");
2259f91b7e3SAndre Fischer        }
2269f91b7e3SAndre Fischer        $completedirhashstep1{$long_uniquename} = 1;
227cdf0e10cSrcweir
228cdf0e10cSrcweir
22919d58b3aSEike Rathke        # Checking if the same directory already exists, but has another short version.
2309f91b7e3SAndre Fischer        if (exists($shortdirhash{$long_uniquename})
2319f91b7e3SAndre Fischer            && ( $shortdirhash{$long_uniquename} ne $short_uniquename ))
2329f91b7e3SAndre Fischer        {
2339f91b7e3SAndre Fischer            installer::exiter::exit_program(
2349f91b7e3SAndre Fischer                sprintf(
2359f91b7e3SAndre Fischer                    "ERROR: Unallowed modification of directory name, not unique (step 2A): \"%s\".",
2369f91b7e3SAndre Fischer                    $short_uniquename),
2379f91b7e3SAndre Fischer                "check_unique_directorynames");
2389f91b7e3SAndre Fischer        }
2399f91b7e3SAndre Fischer        $shortdirhash{$long_uniquename} = $short_uniquename;
240cdf0e10cSrcweir
24119d58b3aSEike Rathke        # Also checking vice versa
24219d58b3aSEike Rathke        # Checking if the same short directory already exists, but has another long version.
2439f91b7e3SAndre Fischer        if (exists($shortdirhashreverse{$short_uniquename})
2449f91b7e3SAndre Fischer            && ( $shortdirhashreverse{$short_uniquename} ne $long_uniquename ))
2459f91b7e3SAndre Fischer        {
2469f91b7e3SAndre Fischer            installer::exiter::exit_program(
2479f91b7e3SAndre Fischer                sprintf(
2489f91b7e3SAndre Fischer                    "ERROR: Unallowed modification of directory name, not unique (step 2B): \"%s\".",
2499f91b7e3SAndre Fischer                    $short_uniquename),
2509f91b7e3SAndre Fischer                "check_unique_directorynames");
2519f91b7e3SAndre Fischer        }
2529f91b7e3SAndre Fischer        $shortdirhashreverse{$short_uniquename} = $long_uniquename;
2539f91b7e3SAndre Fischer    }
254cdf0e10cSrcweir
2559f91b7e3SAndre Fischer    # Check unique name of parents
2569f91b7e3SAndre Fischer    foreach my $directory (@$directories)
2579f91b7e3SAndre Fischer    {
2589f91b7e3SAndre Fischer        my ($long_uniquename, $short_uniquename)
2599f91b7e3SAndre Fischer            = ($directory->{'long_uniqueparentname'}, $directory->{'uniqueparentname'});
260cdf0e10cSrcweir
2619f91b7e3SAndre Fischer        # Again checking if the same directory already exists, but has another short version.
2629f91b7e3SAndre Fischer        if (exists($shortdirhash{$long_uniquename})
2639f91b7e3SAndre Fischer            && ( $shortdirhash{$long_uniquename} ne $short_uniquename ))
2649f91b7e3SAndre Fischer        {
2659f91b7e3SAndre Fischer            installer::exiter::exit_program(
2669f91b7e3SAndre Fischer                sprintf(
2679f91b7e3SAndre Fischer                    "ERROR: Unallowed modification of directory name, not unique (step 3A): \"%s\".",
2689f91b7e3SAndre Fischer                    $short_uniquename),
2699f91b7e3SAndre Fischer                "check_unique_directorynames");
2709f91b7e3SAndre Fischer        }
2719f91b7e3SAndre Fischer        $shortdirhash{$long_uniquename} = $short_uniquename;
272cdf0e10cSrcweir
2739f91b7e3SAndre Fischer        # Also checking vice versa
2749f91b7e3SAndre Fischer        # Checking if the same short directory already exists, but has another long version.
2759f91b7e3SAndre Fischer        if (exists($shortdirhashreverse{$short_uniquename})
2769f91b7e3SAndre Fischer            && ( $shortdirhashreverse{$short_uniquename} ne $long_uniquename ))
2779f91b7e3SAndre Fischer        {
2789f91b7e3SAndre Fischer            installer::exiter::exit_program(
2799f91b7e3SAndre Fischer                sprintf(
2809f91b7e3SAndre Fischer                    "ERROR: Unallowed modification of directory name, not unique (step 3B): \"%s\".",
2819f91b7e3SAndre Fischer                    $short_uniquename),
2829f91b7e3SAndre Fischer                "check_unique_directorynames");
2839f91b7e3SAndre Fischer        }
2849f91b7e3SAndre Fischer        $shortdirhashreverse{$short_uniquename} = $long_uniquename;
2859f91b7e3SAndre Fischer    }
2869f91b7e3SAndre Fischer}
2879f91b7e3SAndre Fischer
2889f91b7e3SAndre Fischer
2899f91b7e3SAndre Fischer
2909f91b7e3SAndre Fischer
2919f91b7e3SAndre Fischersub get_unique_parent_name ($$)
2929f91b7e3SAndre Fischer{
2939f91b7e3SAndre Fischer    my ($uniqueparentname, $styles) = @_;
2949f91b7e3SAndre Fischer
29519d58b3aSEike Rathke    my $keepparent = 1;
296cdf0e10cSrcweir
297cdf0e10cSrcweir    if ( $uniqueparentname =~ /^\s*(.*)\_(.*?)\s*$/ )   # the underline is now the separator
298cdf0e10cSrcweir    {
299cdf0e10cSrcweir        $uniqueparentname = $1;
30019d58b3aSEike Rathke        $keepparent = 0;
301cdf0e10cSrcweir    }
302cdf0e10cSrcweir    else
303cdf0e10cSrcweir    {
304cdf0e10cSrcweir        $uniqueparentname = $installer::globals::programfilesfolder;
30519d58b3aSEike Rathke        $keepparent = 1;
306cdf0e10cSrcweir    }
307cdf0e10cSrcweir
30819d58b3aSEike Rathke    if ( $styles =~ /\bPROGRAMFILESFOLDER\b/ )
30919d58b3aSEike Rathke    {
31019d58b3aSEike Rathke        $uniqueparentname = $installer::globals::programfilesfolder;
31119d58b3aSEike Rathke        $keepparent = 1;
31219d58b3aSEike Rathke    }
31319d58b3aSEike Rathke    if ( $styles =~ /\bCOMMONFILESFOLDER\b/ )
31419d58b3aSEike Rathke    {
31519d58b3aSEike Rathke        $uniqueparentname = $installer::globals::commonfilesfolder;
31619d58b3aSEike Rathke        $keepparent = 1;
31719d58b3aSEike Rathke    }
31819d58b3aSEike Rathke    if ( $styles =~ /\bCOMMONAPPDATAFOLDER\b/ )
31919d58b3aSEike Rathke    {
32019d58b3aSEike Rathke        $uniqueparentname = $installer::globals::commonappdatafolder;
32119d58b3aSEike Rathke        $keepparent = 1;
32219d58b3aSEike Rathke    }
32319d58b3aSEike Rathke    if ( $styles =~ /\bLOCALAPPDATAFOLDER\b/ )
32419d58b3aSEike Rathke    {
32519d58b3aSEike Rathke        $uniqueparentname = $installer::globals::localappdatafolder;
32619d58b3aSEike Rathke        $keepparent = 1;
32719d58b3aSEike Rathke    }
328cdf0e10cSrcweir
329cdf0e10cSrcweir    if ( $styles =~ /\bSHAREPOINTPATH\b/ )
330cdf0e10cSrcweir    {
331cdf0e10cSrcweir        $uniqueparentname = "SHAREPOINTPATH";
332cdf0e10cSrcweir        $installer::globals::usesharepointpath = 1;
33319d58b3aSEike Rathke        $keepparent = 1;
334cdf0e10cSrcweir    }
335cdf0e10cSrcweir
33619d58b3aSEike Rathke    # also setting short directory name for the parent
33719d58b3aSEike Rathke
33819d58b3aSEike Rathke    my $originaluniqueparentname = $uniqueparentname;
33919d58b3aSEike Rathke
34019d58b3aSEike Rathke    if ( ! $keepparent )
34119d58b3aSEike Rathke    {
34219d58b3aSEike Rathke        $uniqueparentname = make_short_dir_version($uniqueparentname);
34319d58b3aSEike Rathke    }
34419d58b3aSEike Rathke
3459f91b7e3SAndre Fischer    return ($originaluniqueparentname, $uniqueparentname);
3469f91b7e3SAndre Fischer}
34719d58b3aSEike Rathke
34819d58b3aSEike Rathke
3499f91b7e3SAndre Fischer
3509f91b7e3SAndre Fischer
3519f91b7e3SAndre Fischer##############################################################
3529f91b7e3SAndre Fischer# Adding unique directory names to the directory collection
3539f91b7e3SAndre Fischer##############################################################
3549f91b7e3SAndre Fischer
3559f91b7e3SAndre Fischersub create_unique_directorynames ($)
3569f91b7e3SAndre Fischer{
3579f91b7e3SAndre Fischer    my ($directories) = @_;
3589f91b7e3SAndre Fischer
3599f91b7e3SAndre Fischer    $installer::globals::officeinstalldirectoryset = 0;
3609f91b7e3SAndre Fischer
3619f91b7e3SAndre Fischer    my %hostnamehash = ();
3629f91b7e3SAndre Fischer    my $infoline = "";
3639f91b7e3SAndre Fischer    my $errorcount = 0;
3649f91b7e3SAndre Fischer
3659f91b7e3SAndre Fischer    foreach my $directory (@$directories)
3669f91b7e3SAndre Fischer    {
3679f91b7e3SAndre Fischer        next if defined $directory->{'uniquename'};
3689f91b7e3SAndre Fischer
369d62abd1aSAndre Fischer        my $styles = $directory->{'Styles'};
370d62abd1aSAndre Fischer        $styles = "" unless defined $styles;
3719f91b7e3SAndre Fischer
3729f91b7e3SAndre Fischer        my ($originaluniquename, $uniquename) = get_unique_name(
3739f91b7e3SAndre Fischer            $directory->{'HostName'},
3749f91b7e3SAndre Fischer            \%hostnamehash);
3759f91b7e3SAndre Fischer
3769f91b7e3SAndre Fischer        my ($originaluniqueparentname, $uniqueparentname) = get_unique_parent_name(
3779f91b7e3SAndre Fischer            $originaluniquename,
3789f91b7e3SAndre Fischer            $styles);
3799f91b7e3SAndre Fischer
38019d58b3aSEike Rathke
38119d58b3aSEike Rathke        # Hyphen not allowed in database
382cdf0e10cSrcweir        $uniquename =~ s/\-/\_/g;           # making "-" to "_"
383cdf0e10cSrcweir        $uniqueparentname =~ s/\-/\_/g;     # making "-" to "_"
384cdf0e10cSrcweir
38519d58b3aSEike Rathke        # And finally setting the values for the directories
3869f91b7e3SAndre Fischer        $directory->{'uniquename'} = $uniquename;
3879f91b7e3SAndre Fischer        $directory->{'uniqueparentname'} = $uniqueparentname;
3889f91b7e3SAndre Fischer        $directory->{'long_uniquename'} = $originaluniquename;
3899f91b7e3SAndre Fischer        $directory->{'long_uniqueparentname'} = $originaluniqueparentname;
3909f91b7e3SAndre Fischer    }
3919f91b7e3SAndre Fischer
3929f91b7e3SAndre Fischer    # Find the installation directory.
3939f91b7e3SAndre Fischer    foreach my $directory (@$directories)
3949f91b7e3SAndre Fischer    {
3959f91b7e3SAndre Fischer        next unless defined $directory->{'Styles'};
396cdf0e10cSrcweir
397cdf0e10cSrcweir        # setting the installlocation directory
3989f91b7e3SAndre Fischer        next unless $directory->{'Styles'} =~ /\bISINSTALLLOCATION\b/;
3999f91b7e3SAndre Fischer
4009f91b7e3SAndre Fischer        if ( $installer::globals::installlocationdirectoryset )
401cdf0e10cSrcweir        {
4029f91b7e3SAndre Fischer            installer::exiter::exit_program(
4039f91b7e3SAndre Fischer                sprintf(
4049f91b7e3SAndre Fischer                    "ERROR: Directory with flag ISINSTALLLOCATION alread set: \"%s\".",
4059f91b7e3SAndre Fischer                    $installer::globals::installlocationdirectory),
4069f91b7e3SAndre Fischer                "create_unique_directorynames");
407cdf0e10cSrcweir        }
408cdf0e10cSrcweir
4099f91b7e3SAndre Fischer        $installer::globals::installlocationdirectory = $directory->{'uniquename'};
4109f91b7e3SAndre Fischer        $installer::globals::installlocationdirectoryset = 1;
411cdf0e10cSrcweir    }
412cdf0e10cSrcweir}
4139f91b7e3SAndre Fischer
4149f91b7e3SAndre Fischer
4159f91b7e3SAndre Fischer
416cdf0e10cSrcweir
417cdf0e10cSrcweir#####################################################
418cdf0e10cSrcweir# Adding ":." to selected default directory names
419cdf0e10cSrcweir#####################################################
420cdf0e10cSrcweir
4219f91b7e3SAndre Fischersub update_defaultdir ($$)
422cdf0e10cSrcweir{
423cdf0e10cSrcweir    my ( $onedir, $allvariableshashref ) = @_;
424cdf0e10cSrcweir
4259f91b7e3SAndre Fischer    if ($installer::globals::addchildprojects
4269f91b7e3SAndre Fischer        || $installer::globals::patch
4279f91b7e3SAndre Fischer        || $installer::globals::languagepack
4289f91b7e3SAndre Fischer        || $allvariableshashref->{'CHANGETARGETDIR'})
429cdf0e10cSrcweir    {
430cdf0e10cSrcweir        my $sourcediraddon = "\:\.";
4319f91b7e3SAndre Fischer        return $onedir->{'defaultdir'} . $sourcediraddon;
432cdf0e10cSrcweir    }
4339f91b7e3SAndre Fischer    else
4349f91b7e3SAndre Fischer    {
4359f91b7e3SAndre Fischer        return $onedir->{'defaultdir'};
4369f91b7e3SAndre Fischer    }
437cdf0e10cSrcweir}
438cdf0e10cSrcweir
439cdf0e10cSrcweir#####################################################
440cdf0e10cSrcweir# The directory with the style ISINSTALLLOCATION
441cdf0e10cSrcweir# will be replaced by INSTALLLOCATION
442cdf0e10cSrcweir#####################################################
443cdf0e10cSrcweir
444cdf0e10cSrcweirsub set_installlocation_directory
445cdf0e10cSrcweir{
446cdf0e10cSrcweir    my ( $directoryref, $allvariableshashref ) = @_;
447cdf0e10cSrcweir
4489f91b7e3SAndre Fischer    if ( ! $installer::globals::installlocationdirectoryset )
4499f91b7e3SAndre Fischer    {
4509f91b7e3SAndre Fischer        installer::exiter::exit_program(
4519f91b7e3SAndre Fischer            "ERROR: Directory with flag ISINSTALLLOCATION not set!",
4529f91b7e3SAndre Fischer            "set_installlocation_directory");
4539f91b7e3SAndre Fischer    }
454cdf0e10cSrcweir
455cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$directoryref}; $i++ )
456cdf0e10cSrcweir    {
457cdf0e10cSrcweir        my $onedir = ${$directoryref}[$i];
458cdf0e10cSrcweir
459cdf0e10cSrcweir        if ( $onedir->{'uniquename'} eq $installer::globals::installlocationdirectory )
460cdf0e10cSrcweir        {
461cdf0e10cSrcweir            $onedir->{'uniquename'} = "INSTALLLOCATION";
4629f91b7e3SAndre Fischer            $onedir->{'defaultdir'} = update_defaultdir($onedir, $allvariableshashref);
463cdf0e10cSrcweir        }
464cdf0e10cSrcweir
465cdf0e10cSrcweir        if ( $onedir->{'uniquename'} eq $installer::globals::vendordirectory )
466cdf0e10cSrcweir        {
4679f91b7e3SAndre Fischer            $onedir->{'defaultdir'} = update_defaultdir($onedir, $allvariableshashref);
468cdf0e10cSrcweir        }
469cdf0e10cSrcweir
470cdf0e10cSrcweir        if ( $onedir->{'uniqueparentname'} eq $installer::globals::installlocationdirectory )
471cdf0e10cSrcweir        {
472cdf0e10cSrcweir            $onedir->{'uniqueparentname'} = "INSTALLLOCATION";
473cdf0e10cSrcweir        }
474cdf0e10cSrcweir    }
475cdf0e10cSrcweir}
476cdf0e10cSrcweir
477cdf0e10cSrcweir#####################################################
478cdf0e10cSrcweir# Getting the name of the top level directory. This
479cdf0e10cSrcweir# can have only one letter
480cdf0e10cSrcweir#####################################################
481cdf0e10cSrcweir
482cdf0e10cSrcweirsub get_last_directory_name
483cdf0e10cSrcweir{
484cdf0e10cSrcweir    my ($completepathref) = @_;
485cdf0e10cSrcweir
486cdf0e10cSrcweir    if ( $$completepathref =~ /^.*[\/\\](.+?)\s*$/ )
487cdf0e10cSrcweir    {
488cdf0e10cSrcweir        $$completepathref = $1;
489cdf0e10cSrcweir    }
490cdf0e10cSrcweir}
491cdf0e10cSrcweir
4929f91b7e3SAndre Fischersub setup_global_font_directory_name ($)
4939f91b7e3SAndre Fischer{
4949f91b7e3SAndre Fischer    my ($directories) = @_;
4959f91b7e3SAndre Fischer
496*4374bebbSAndre Fischer    $installer::logger::Info->printf("setup_global_font_directory_name, checking %d entries\n",
497*4374bebbSAndre Fischer        scalar @$directories);
498*4374bebbSAndre Fischer    $installer::logger::Info->printf(" fontsdirhostname is %s\n",
499*4374bebbSAndre Fischer        $installer::globals::fontsdirhostname);
500*4374bebbSAndre Fischer    $installer::logger::Info->printf(" fontsdirname is %s\n",
501*4374bebbSAndre Fischer        $installer::globals::fontsdirname);
5029f91b7e3SAndre Fischer    foreach my $directory (@$directories)
5039f91b7e3SAndre Fischer    {
5049f91b7e3SAndre Fischer        next unless defined $directory->{'Dir'};
5059f91b7e3SAndre Fischer        next unless defined $directory->{'defaultdir'};
5069f91b7e3SAndre Fischer
507*4374bebbSAndre Fischer        $installer::logger::Info->printf("    Dir is %s\n", $directory->{'Dir'});
508*4374bebbSAndre Fischer        $installer::logger::Info->printf("    defaultdir is %s\n", $directory->{'defaultdir'});
5099f91b7e3SAndre Fischer        next if $directory->{'Dir'} ne "PREDEFINED_OSSYSTEMFONTDIR";
5109f91b7e3SAndre Fischer        next if $directory->{'defaultdir'} ne $installer::globals::fontsdirhostname;
5119f91b7e3SAndre Fischer
5129f91b7e3SAndre Fischer        $installer::globals::fontsdirname = $installer::globals::fontsdirhostname;
5139f91b7e3SAndre Fischer        $installer::globals::fontsdirparent = $directory->{'uniqueparentname'};
5149f91b7e3SAndre Fischer
5159f91b7e3SAndre Fischer        $installer::logger::Info->printf("%s, fdhn %s, dd %s, ipn %s, HN %s\n",
5169f91b7e3SAndre Fischer            "PREDEFINED_OSSYSTEMFONTDIR",
5179f91b7e3SAndre Fischer            $installer::globals::fontsdirhostname,
5189f91b7e3SAndre Fischer            $directory->{'defaultdir'},
5199f91b7e3SAndre Fischer            $directory->{'uniqueparentname'},
5209f91b7e3SAndre Fischer            $directory->{'HostName'});
5219f91b7e3SAndre Fischer        installer::scriptitems::print_script_item($directory);
5229f91b7e3SAndre Fischer    }
523*4374bebbSAndre Fischer    foreach my $onedir (@$directories)
524*4374bebbSAndre Fischer    {
525*4374bebbSAndre Fischer        my $fontdir = "";
526*4374bebbSAndre Fischer        if ( $onedir->{'Dir'} ) { $fontdir = $onedir->{'Dir'}; }
527*4374bebbSAndre Fischer
528*4374bebbSAndre Fischer        my $fontdefaultdir = "";
529*4374bebbSAndre Fischer        if ( $onedir->{'defaultdir'} ) { $fontdefaultdir = $onedir->{'defaultdir'}; }
530*4374bebbSAndre Fischer
531*4374bebbSAndre Fischer        if (( $fontdir eq "PREDEFINED_OSSYSTEMFONTDIR" ) && ( $fontdefaultdir eq $installer::globals::fontsdirhostname ))
532*4374bebbSAndre Fischer        {
533*4374bebbSAndre Fischer            $installer::logger::Info->printf("fontsdirname   = %s\n", $onedir->{'defaultdir'});
534*4374bebbSAndre Fischer            $installer::logger::Info->printf("              is %s\n", $installer::globals::fontsdirname);
535*4374bebbSAndre Fischer            $installer::logger::Info->printf("fontsdirparent = %s\n", $onedir->{'uniqueparentname'});
536*4374bebbSAndre Fischer            $installer::logger::Info->printf("              is %s\n", $installer::globals::fontsdirparent);
537*4374bebbSAndre Fischer        }
538*4374bebbSAndre Fischer    }
5399f91b7e3SAndre Fischer}
5409f91b7e3SAndre Fischer
541cdf0e10cSrcweir#####################################################
542cdf0e10cSrcweir# Creating the defaultdir for the file Director.idt
543cdf0e10cSrcweir#####################################################
544cdf0e10cSrcweir
545dca4887fSAndre Fischersub create_defaultdir_directorynames ($)
546cdf0e10cSrcweir{
547dca4887fSAndre Fischer    my ($directoryref) = @_;
548cdf0e10cSrcweir
549cdf0e10cSrcweir    my @shortnames = ();
550f30bf281SAndre Fischer    if ( $installer::globals::prepare_winpatch ) { @shortnames = values(%installer::globals::saved83dirmapping); }
551cdf0e10cSrcweir
552cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$directoryref}; $i++ )
553cdf0e10cSrcweir    {
554cdf0e10cSrcweir        my $onedir = ${$directoryref}[$i];
555cdf0e10cSrcweir        my $hostname = $onedir->{'HostName'};
556cdf0e10cSrcweir
557cdf0e10cSrcweir        $hostname =~ s/\Q$installer::globals::separator\E\s*$//;
558cdf0e10cSrcweir        get_last_directory_name(\$hostname);
559cdf0e10cSrcweir        # installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$hostname); # making program/classes to classes
560cdf0e10cSrcweir        my $uniquename = $onedir->{'uniquename'};
561cdf0e10cSrcweir        my $shortstring;
562f30bf281SAndre Fischer        if (( $installer::globals::prepare_winpatch ) && ( exists($installer::globals::saved83dirmapping{$uniquename}) ))
563cdf0e10cSrcweir        {
564cdf0e10cSrcweir            $shortstring = $installer::globals::saved83dirmapping{$uniquename};
565cdf0e10cSrcweir        }
566cdf0e10cSrcweir        else
567cdf0e10cSrcweir        {
568cdf0e10cSrcweir            $shortstring = installer::windows::idtglobal::make_eight_three_conform($hostname, "dir", \@shortnames);
569cdf0e10cSrcweir        }
570cdf0e10cSrcweir
571cdf0e10cSrcweir        my $defaultdir;
572cdf0e10cSrcweir
573cdf0e10cSrcweir        if ( $shortstring eq $hostname )
574cdf0e10cSrcweir        {
575cdf0e10cSrcweir            $defaultdir = $hostname;
576cdf0e10cSrcweir        }
577cdf0e10cSrcweir        else
578cdf0e10cSrcweir        {
579cdf0e10cSrcweir            $defaultdir = $shortstring . "|" . $hostname;
580cdf0e10cSrcweir        }
581cdf0e10cSrcweir
582cdf0e10cSrcweir        $onedir->{'defaultdir'} = $defaultdir;
583cdf0e10cSrcweir    }
584cdf0e10cSrcweir}
585cdf0e10cSrcweir
586cdf0e10cSrcweir###############################################
587cdf0e10cSrcweir# Fill content into the directory table
588cdf0e10cSrcweir###############################################
589cdf0e10cSrcweir
5909f91b7e3SAndre Fischersub create_directorytable_from_collection ($$)
591cdf0e10cSrcweir{
592cdf0e10cSrcweir    my ($directorytableref, $directoryref) = @_;
593cdf0e10cSrcweir
5949f91b7e3SAndre Fischer    foreach my $onedir (@$directoryref)
595cdf0e10cSrcweir    {
5969f91b7e3SAndre Fischer        # Remove entries for special directories.
5979f91b7e3SAndre Fischer        if (defined $onedir->{'HostName'}
5989f91b7e3SAndre Fischer            && $onedir->{'HostName'} eq ""
5999f91b7e3SAndre Fischer            && defined $onedir->{'Dir'}
6009f91b7e3SAndre Fischer            && $onedir->{'Dir'} eq "PREDEFINED_PROGDIR")
6019f91b7e3SAndre Fischer        {
6029f91b7e3SAndre Fischer            next;
6039f91b7e3SAndre Fischer        }
604cdf0e10cSrcweir
6059f91b7e3SAndre Fischer        my $oneline = sprintf(
6069f91b7e3SAndre Fischer            "%s\t%s\t%s\n",
6079f91b7e3SAndre Fischer            $onedir->{'uniquename'},
6089f91b7e3SAndre Fischer            $onedir->{'uniqueparentname'},
6099f91b7e3SAndre Fischer            $onedir->{'defaultdir'});
610cdf0e10cSrcweir
6119f91b7e3SAndre Fischer        push @{$directorytableref}, $oneline;
612cdf0e10cSrcweir    }
613cdf0e10cSrcweir}
614cdf0e10cSrcweir
615cdf0e10cSrcweir###############################################
616cdf0e10cSrcweir# Defining the root installation structure
617cdf0e10cSrcweir###############################################
618cdf0e10cSrcweir
6199f91b7e3SAndre Fischersub process_root_directories ($$)
620cdf0e10cSrcweir{
6219f91b7e3SAndre Fischer    my ($allvariableshashref, $functor) = @_;
622cdf0e10cSrcweir
623cdf0e10cSrcweir    my $oneline = "";
624cdf0e10cSrcweir
625cdf0e10cSrcweir    if (( ! $installer::globals::patch ) && ( ! $installer::globals::languagepack ) && ( ! $allvariableshashref->{'DONTUSESTARTMENUFOLDER'} ))
626cdf0e10cSrcweir    {
627cdf0e10cSrcweir        my $productname = $allvariableshashref->{'PRODUCTNAME'};
628cdf0e10cSrcweir        my $productversion = $allvariableshashref->{'PRODUCTVERSION'};
629cdf0e10cSrcweir        my $baseproductversion = $productversion;
630cdf0e10cSrcweir
631cdf0e10cSrcweir        if (( $installer::globals::prepare_winpatch ) && ( $allvariableshashref->{'BASEPRODUCTVERSION'} ))
632cdf0e10cSrcweir        {
633cdf0e10cSrcweir            $baseproductversion = $allvariableshashref->{'BASEPRODUCTVERSION'};  # for example "2.0" for OOo
634cdf0e10cSrcweir        }
635cdf0e10cSrcweir
636cdf0e10cSrcweir        my $realproductkey = $productname . " " . $productversion;
637cdf0e10cSrcweir        my $productkey = $productname . " " . $baseproductversion;
638cdf0e10cSrcweir
639cdf0e10cSrcweir        if (( $allvariableshashref->{'POSTVERSIONEXTENSION'} ) && ( ! $allvariableshashref->{'DONTUSEEXTENSIONINDEFAULTDIR'} ))
640cdf0e10cSrcweir        {
641cdf0e10cSrcweir            $productkey = $productkey . " " . $allvariableshashref->{'POSTVERSIONEXTENSION'};
642cdf0e10cSrcweir            $realproductkey = $realproductkey . " " . $allvariableshashref->{'POSTVERSIONEXTENSION'};
643cdf0e10cSrcweir        }
644cdf0e10cSrcweir        if ( $allvariableshashref->{'NOSPACEINDIRECTORYNAME'} )
645cdf0e10cSrcweir        {
646cdf0e10cSrcweir            $productkey =~ s/\ /\_/g;
647cdf0e10cSrcweir            $realproductkey =~ s/\ /\_/g;
648cdf0e10cSrcweir        }
649cdf0e10cSrcweir
6509f91b7e3SAndre Fischer        my $shortproductkey = installer::windows::idtglobal::make_eight_three_conform($productkey, "dir", undef);
651cdf0e10cSrcweir        $shortproductkey =~ s/\s/\_/g;                                  # changing empty space to underline
652cdf0e10cSrcweir
6539f91b7e3SAndre Fischer        &$functor(
6549f91b7e3SAndre Fischer            $installer::globals::officemenufolder,
6559f91b7e3SAndre Fischer            $installer::globals::programmenufolder,
6569f91b7e3SAndre Fischer            $shortproductkey . "|". $realproductkey);
657cdf0e10cSrcweir    }
658cdf0e10cSrcweir
6599f91b7e3SAndre Fischer    &$functor("TARGETDIR", "", "SourceDir");
6609f91b7e3SAndre Fischer    &$functor($installer::globals::programfilesfolder, "TARGETDIR", ".");
6619f91b7e3SAndre Fischer    &$functor($installer::globals::programmenufolder, "TARGETDIR", ".");
6629f91b7e3SAndre Fischer    &$functor($installer::globals::startupfolder, "TARGETDIR", ".");
6639f91b7e3SAndre Fischer    &$functor($installer::globals::desktopfolder, "TARGETDIR", ".");
6649f91b7e3SAndre Fischer    &$functor($installer::globals::startmenufolder, "TARGETDIR", ".");
6659f91b7e3SAndre Fischer    &$functor($installer::globals::commonfilesfolder, "TARGETDIR", ".");
6669f91b7e3SAndre Fischer    &$functor($installer::globals::commonappdatafolder, "TARGETDIR", ".");
6679f91b7e3SAndre Fischer    &$functor($installer::globals::localappdatafolder, "TARGETDIR", ".");
668cdf0e10cSrcweir
669cdf0e10cSrcweir    if ( $installer::globals::usesharepointpath )
670cdf0e10cSrcweir    {
6719f91b7e3SAndre Fischer        &$functor("SHAREPOINTPATH", "TARGETDIR", ".");
672cdf0e10cSrcweir    }
673cdf0e10cSrcweir
6749f91b7e3SAndre Fischer    &$functor($installer::globals::systemfolder, "TARGETDIR", ".");
675cdf0e10cSrcweir
676cdf0e10cSrcweir    my $localtemplatefoldername = $installer::globals::templatefoldername;
677cdf0e10cSrcweir    my $directorytableentry = $localtemplatefoldername;
678cdf0e10cSrcweir    my $shorttemplatefoldername = installer::windows::idtglobal::make_eight_three_conform($localtemplatefoldername, "dir");
6799f91b7e3SAndre Fischer    if ( $shorttemplatefoldername ne $localtemplatefoldername )
6809f91b7e3SAndre Fischer    {
6819f91b7e3SAndre Fischer        $directorytableentry = $shorttemplatefoldername . "|" . $localtemplatefoldername;
6829f91b7e3SAndre Fischer    }
6839f91b7e3SAndre Fischer    &$functor($installer::globals::templatefolder, "TARGETDIR", $directorytableentry);
684cdf0e10cSrcweir
685*4374bebbSAndre Fischer    $installer::logger::Info->printf("process_root_directories: fontsdirname=%s, fontsfoldername=%s\n",
686*4374bebbSAndre Fischer        $installer::globals::fontsdirname,
687*4374bebbSAndre Fischer        $installer::globals::fontsfoldername);
688cdf0e10cSrcweir    if ( $installer::globals::fontsdirname )
689cdf0e10cSrcweir    {
6909f91b7e3SAndre Fischer        &$functor(
6919f91b7e3SAndre Fischer             $installer::globals::fontsfolder,
6929f91b7e3SAndre Fischer             $installer::globals::fontsdirparent,
6939f91b7e3SAndre Fischer             $installer::globals::fontsfoldername . ":" . $installer::globals::fontsdirname);
694cdf0e10cSrcweir    }
695cdf0e10cSrcweir    else
696cdf0e10cSrcweir    {
6979f91b7e3SAndre Fischer        &$functor(
6989f91b7e3SAndre Fischer             $installer::globals::fontsfolder,
6999f91b7e3SAndre Fischer             "TARGETDIR",
7009f91b7e3SAndre Fischer             $installer::globals::fontsfoldername);
7019f91b7e3SAndre Fischer    }
702cdf0e10cSrcweir}
703cdf0e10cSrcweir
704cdf0e10cSrcweir
7059f91b7e3SAndre Fischer
7069f91b7e3SAndre Fischer
7079f91b7e3SAndre Fischersub find_missing_directories ($$)
7089f91b7e3SAndre Fischer{
7099f91b7e3SAndre Fischer    my ($directories, $allvariableshashref) = @_;
7109f91b7e3SAndre Fischer
7119f91b7e3SAndre Fischer    # Set up the list of target directories.
7129f91b7e3SAndre Fischer    my %target_directories = map {$_->{'uniquename'} => 1} @$directories;
7139f91b7e3SAndre Fischer    # Add special directories.
7149f91b7e3SAndre Fischer    process_root_directories(
7159f91b7e3SAndre Fischer        $allvariableshashref,
7169f91b7e3SAndre Fischer        sub($$$){
7179f91b7e3SAndre Fischer            my ($uniquename, $parentname, $defaultdir) = @_;
7189f91b7e3SAndre Fischer            $target_directories{$uniquename} = 1;
719cdf0e10cSrcweir        }
7209f91b7e3SAndre Fischer    );
7219f91b7e3SAndre Fischer
7229f91b7e3SAndre Fischer    # Set up the list of source directories.
7239f91b7e3SAndre Fischer    my $source_directory_map = $installer::globals::source_msi->GetDirectoryMap();
7249f91b7e3SAndre Fischer    my $source_file_map = $installer::globals::source_msi->GetFileMap();
7259f91b7e3SAndre Fischer    my %source_directories = map {$_->{'unique_name'} => $_} values %$source_directory_map;
7269f91b7e3SAndre Fischer
7279f91b7e3SAndre Fischer    # Find the missing source directories.
7289f91b7e3SAndre Fischer    my @missing_directories = ();
7299f91b7e3SAndre Fischer    foreach my $source_uniquename (keys %source_directories)
7309f91b7e3SAndre Fischer    {
7319f91b7e3SAndre Fischer        if ( ! $target_directories{$source_uniquename})
7329f91b7e3SAndre Fischer        {
7339f91b7e3SAndre Fischer            push @missing_directories, $source_directories{$source_uniquename};
7349f91b7e3SAndre Fischer        }
7359f91b7e3SAndre Fischer    }
7369f91b7e3SAndre Fischer
7379f91b7e3SAndre Fischer    # Report the missing directories.
7389f91b7e3SAndre Fischer    $installer::logger::Info->printf("found %d missing directories\n", scalar @missing_directories);
7399f91b7e3SAndre Fischer    my $index = 0;
7409f91b7e3SAndre Fischer    foreach my $directory_item (@missing_directories)
7419f91b7e3SAndre Fischer    {
7429f91b7e3SAndre Fischer        # Print information about the directory.
7439f91b7e3SAndre Fischer        $installer::logger::Info->printf("missing directory %d: %s\n",
7449f91b7e3SAndre Fischer            ++$index,
7459f91b7e3SAndre Fischer            $directory_item->{'full_target_long_name'});
7469f91b7e3SAndre Fischer        while (my($key,$value) = each %$directory_item)
7479f91b7e3SAndre Fischer        {
7489f91b7e3SAndre Fischer            $installer::logger::Info->printf("    %s -> %s\n", $key, $value);
7499f91b7e3SAndre Fischer        }
7509f91b7e3SAndre Fischer
7519f91b7e3SAndre Fischer        # Print the referencing files.
7529f91b7e3SAndre Fischer        my @filenames = ();
7539f91b7e3SAndre Fischer        while (my ($key,$value) = each %$source_file_map)
7549f91b7e3SAndre Fischer        {
7559f91b7e3SAndre Fischer            if ($value->{'directory'}->{'unique_name'} eq $directory_item->{'unique_name'})
7569f91b7e3SAndre Fischer            {
7579f91b7e3SAndre Fischer                push @filenames, $key;
7589f91b7e3SAndre Fischer            }
7599f91b7e3SAndre Fischer        }
7609f91b7e3SAndre Fischer        $installer::logger::Info->printf("  referencing files are %s\n", join(", ", @filenames));
7619f91b7e3SAndre Fischer    }
7629f91b7e3SAndre Fischer
7639f91b7e3SAndre Fischer    foreach my $directory (@$directories)
7649f91b7e3SAndre Fischer    {
7659f91b7e3SAndre Fischer        $installer::logger::Lang->printf("target directory %s -> HN %s\n",
7669f91b7e3SAndre Fischer            $directory->{'uniquename'},
7679f91b7e3SAndre Fischer            $directory->{'HostName'});
7689f91b7e3SAndre Fischer        installer::scriptitems::print_script_item($directory);
7699f91b7e3SAndre Fischer    }
7709f91b7e3SAndre Fischer
7719f91b7e3SAndre Fischer    # Setup a map of directory uniquenames to verify that the new
7729f91b7e3SAndre Fischer    # entries don't use unique names that are already in use.
7739f91b7e3SAndre Fischer    my %unique_names = map {$_->{'uniquename'} => $_} @$directories;
7749f91b7e3SAndre Fischer
7759f91b7e3SAndre Fischer    # Create script items for the missing directories.
7769f91b7e3SAndre Fischer    my @new_source_directories = ();
7779f91b7e3SAndre Fischer    foreach my $source_directory_item (@missing_directories)
7789f91b7e3SAndre Fischer    {
7799f91b7e3SAndre Fischer        my $new_directory_item = {
7809f91b7e3SAndre Fischer            'uniquename' => $source_directory_item->{'unique_name'},
781677600b0SAndre Fischer            'uniqueparentname' => $source_directory_item->{'parent_name'},
7829f91b7e3SAndre Fischer            'defaultdir' => $source_directory_item->{'default_dir'},
7839f91b7e3SAndre Fischer            'HostName' => $source_directory_item->{'full_target_long_name'},
7849f91b7e3SAndre Fischer            'componentname' => $source_directory_item->{'component_name'},
7859f91b7e3SAndre Fischer        };
7869f91b7e3SAndre Fischer
7879f91b7e3SAndre Fischer        if (defined $unique_names{$new_directory_item->{'uniquename'}})
7889f91b7e3SAndre Fischer        {
7899f91b7e3SAndre Fischer            installer::logger::PrintError("newly created directory entry collides with existing directory");
7909f91b7e3SAndre Fischer            last;
7919f91b7e3SAndre Fischer        }
7929f91b7e3SAndre Fischer
7939f91b7e3SAndre Fischer        push @new_source_directories, $new_directory_item;
7949f91b7e3SAndre Fischer    }
7959f91b7e3SAndre Fischer
7969f91b7e3SAndre Fischer    return @new_source_directories;
7979f91b7e3SAndre Fischer}
7989f91b7e3SAndre Fischer
7999f91b7e3SAndre Fischer
8009f91b7e3SAndre Fischer
8019f91b7e3SAndre Fischer
8029f91b7e3SAndre Fischersub prepare_directory_table_creation ($$)
8039f91b7e3SAndre Fischer{
8049f91b7e3SAndre Fischer    my ($directories, $allvariableshashref) = @_;
8059f91b7e3SAndre Fischer
8069f91b7e3SAndre Fischer    foreach my $directory (@$directories)
8079f91b7e3SAndre Fischer    {
8089f91b7e3SAndre Fischer        delete $directory->{'uniquename'};
8099f91b7e3SAndre Fischer    }
8109f91b7e3SAndre Fischer
8119f91b7e3SAndre Fischer    overwrite_programfilesfolder($allvariableshashref);
8129f91b7e3SAndre Fischer    create_unique_directorynames($directories);
8139f91b7e3SAndre Fischer    check_unique_directorynames($directories);
8149f91b7e3SAndre Fischer    create_defaultdir_directorynames($directories); # only destdir!
8159f91b7e3SAndre Fischer    setup_global_font_directory_name($directories);
8169f91b7e3SAndre Fischer    set_installlocation_directory($directories, $allvariableshashref);
8179f91b7e3SAndre Fischer
8189f91b7e3SAndre Fischer    if ($installer::globals::is_release)
8199f91b7e3SAndre Fischer    {
8209f91b7e3SAndre Fischer        my @new_directories = find_missing_directories($directories, $allvariableshashref);
8219f91b7e3SAndre Fischer        push @$directories, @new_directories;
8229f91b7e3SAndre Fischer    }
8239f91b7e3SAndre Fischer}
8249f91b7e3SAndre Fischer
8259f91b7e3SAndre Fischer
8269f91b7e3SAndre Fischer
827cdf0e10cSrcweir
828cdf0e10cSrcweir###############################################
829cdf0e10cSrcweir# Creating the file Director.idt dynamically
830cdf0e10cSrcweir###############################################
831cdf0e10cSrcweir
8329f91b7e3SAndre Fischersub create_directory_table ($$$)
833cdf0e10cSrcweir{
8349f91b7e3SAndre Fischer    my ($directoryref, $basedir, $allvariableshashref) = @_;
835cdf0e10cSrcweir
836cdf0e10cSrcweir    # Structure of the directory table:
837cdf0e10cSrcweir    # Directory Directory_Parent DefaultDir
838cdf0e10cSrcweir    # Directory is a unique identifier
839cdf0e10cSrcweir    # Directory_Parent is the unique identifier of the parent
840cdf0e10cSrcweir    # DefaultDir is .:APPLIC~1|Application Data with
841cdf0e10cSrcweir    # Before ":" : [sourcedir]:[destdir] (not programmed yet)
842cdf0e10cSrcweir    # After ":" : 8+3 and not 8+3 the destination directory name
843cdf0e10cSrcweir
844b274bc22SAndre Fischer    $installer::logger::Lang->add_timestamp("Performance Info: Directory Table start");
84519d58b3aSEike Rathke
846cdf0e10cSrcweir    my @directorytable = ();
847cdf0e10cSrcweir    installer::windows::idtglobal::write_idt_header(\@directorytable, "directory");
8489f91b7e3SAndre Fischer
8499f91b7e3SAndre Fischer    # Add entries for the root directories (and a few special directories like that for fonts).
8509f91b7e3SAndre Fischer    process_root_directories(
8519f91b7e3SAndre Fischer        $allvariableshashref,
8529f91b7e3SAndre Fischer        sub($$$){
8539f91b7e3SAndre Fischer            push(@directorytable, join("\t", @_)."\n");
8549f91b7e3SAndre Fischer        }
8559f91b7e3SAndre Fischer    );
8569f91b7e3SAndre Fischer
8579f91b7e3SAndre Fischer    # Add entries for the non-root directories.
858cdf0e10cSrcweir    create_directorytable_from_collection(\@directorytable, $directoryref);
859cdf0e10cSrcweir
860cdf0e10cSrcweir    # Saving the file
861cdf0e10cSrcweir
862cdf0e10cSrcweir    my $directorytablename = $basedir . $installer::globals::separator . "Director.idt";
863cdf0e10cSrcweir    installer::files::save_file($directorytablename ,\@directorytable);
864b274bc22SAndre Fischer    $installer::logger::Lang->printf("Created idt file: %s\n", $directorytablename);
865cdf0e10cSrcweir
866b274bc22SAndre Fischer    $installer::logger::Lang->add_timestamp("Performance Info: Directory Table end");
867cdf0e10cSrcweir}
868cdf0e10cSrcweir
8699f91b7e3SAndre Fischer
870cdf0e10cSrcweir1;
871