xref: /trunk/main/solenv/bin/modules/installer/scriptitems.pm (revision c97fd792a9a453fec839fe1bccb49ef32b23694c)
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::scriptitems;
25cdf0e10cSrcweir
26cdf0e10cSrcweiruse installer::converter;
27cdf0e10cSrcweiruse installer::existence;
28cdf0e10cSrcweiruse installer::exiter;
29cdf0e10cSrcweiruse installer::globals;
30cdf0e10cSrcweiruse installer::languages;
31cdf0e10cSrcweiruse installer::logger;
32cdf0e10cSrcweiruse installer::pathanalyzer;
33cdf0e10cSrcweiruse installer::remover;
34cdf0e10cSrcweiruse installer::systemactions;
35cdf0e10cSrcweir
368bd5297cSJürgen Schmidtuse File::Spec;
37f8d20be8SJim Jagielskiuse RepoRevision;
38c6dedb65SAndre Fischeruse ExtensionsLst;
398bd5297cSJürgen Schmidt
40dba1a2e4SAndre Fischeruse strict;
41dba1a2e4SAndre Fischer
42cdf0e10cSrcweir################################################################
43cdf0e10cSrcweir# Resolving the GID for the directories defined in setup script
44cdf0e10cSrcweir################################################################
45cdf0e10cSrcweir
46cdf0e10cSrcweirsub resolve_all_directory_names
47cdf0e10cSrcweir{
48cdf0e10cSrcweir    my ($directoryarrayref) = @_;
49cdf0e10cSrcweir
50cdf0e10cSrcweir    # After this procedure the hash shall contain the complete language
51cdf0e10cSrcweir    # dependent path, not only the language dependent HostName.
52cdf0e10cSrcweir
53cdf0e10cSrcweir    my ($key, $value, $parentvalue, $parentgid, $parentdirectoryhashref);
54cdf0e10cSrcweir
55cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$directoryarrayref}; $i++ )
56cdf0e10cSrcweir    {
57cdf0e10cSrcweir        my $directoryhashref = ${$directoryarrayref}[$i];
58cdf0e10cSrcweir        my $gid = $directoryhashref-> {'gid'};
59cdf0e10cSrcweir        my $parentid = $directoryhashref-> {'ParentID'};
60cdf0e10cSrcweir
61cdf0e10cSrcweir        if ( $parentid ne "PREDEFINED_PROGDIR" )
62cdf0e10cSrcweir        {
63cdf0e10cSrcweir            # find the array of the parentid, which has to be defined before in setup script
64cdf0e10cSrcweir            # and is therefore listed before in this array
65cdf0e10cSrcweir
66cdf0e10cSrcweir            for ( my $j = 0; $j <= $i; $j++ )
67cdf0e10cSrcweir            {
68cdf0e10cSrcweir                $parentdirectoryhashref = ${$directoryarrayref}[$j];
69cdf0e10cSrcweir                $parentgid = $parentdirectoryhashref->{'gid'};
70cdf0e10cSrcweir
71cdf0e10cSrcweir                if ( $parentid eq $parentgid)
72cdf0e10cSrcweir                {
73cdf0e10cSrcweir                    last;
74cdf0e10cSrcweir                }
75cdf0e10cSrcweir            }
76cdf0e10cSrcweir
77cdf0e10cSrcweir            # and now we can put the path together
78cdf0e10cSrcweir            # But take care of the languages!
79cdf0e10cSrcweir
80cdf0e10cSrcweir            my $dirismultilingual = $directoryhashref->{'ismultilingual'};
81cdf0e10cSrcweir            my $parentismultilingual = $parentdirectoryhashref->{'ismultilingual'};
82cdf0e10cSrcweir
83cdf0e10cSrcweir            # First: Both directories are language independent or both directories are language dependent
84cdf0e10cSrcweir
85cdf0e10cSrcweir            if ((( ! $dirismultilingual ) && ( ! $parentismultilingual )) ||
86cdf0e10cSrcweir                (( $dirismultilingual ) && ( $parentismultilingual )))
87cdf0e10cSrcweir            {
88cdf0e10cSrcweir                foreach $key (keys %{$directoryhashref})
89cdf0e10cSrcweir                {
90cdf0e10cSrcweir                    # the key ("HostName (en-US)") must be usable for both hashes
91cdf0e10cSrcweir
92cdf0e10cSrcweir                    if ( $key =~ /\bHostName\b/ )
93cdf0e10cSrcweir                    {
94cdf0e10cSrcweir                        $parentvalue = "";
95cdf0e10cSrcweir                        $value = $directoryhashref->{$key};
96cdf0e10cSrcweir                        if ( $parentdirectoryhashref->{$key} ) { $parentvalue = $parentdirectoryhashref->{$key}; }
97cdf0e10cSrcweir
98cdf0e10cSrcweir                        # It is possible, that in scp project, a directory is defined in more languages than
99cdf0e10cSrcweir                        # the directory parent (happened after automatic generation of macros.inc).
100cdf0e10cSrcweir                        # Therefore this is checked now and written with a warning into the logfile.
101*c97fd792Smseidel                        # This is no error, because (in most cases) the concerned language is not built.
102cdf0e10cSrcweir
103cdf0e10cSrcweir                        if ($parentvalue eq "")
104cdf0e10cSrcweir                        {
105cdf0e10cSrcweir                            $directoryhashref->{$key} = "FAILURE";
106b274bc22SAndre Fischer                            $installer::logger::Global->printf("WARNING: No hostname for %s with \"%s\". Needed by child directory %s !\n",
107b274bc22SAndre Fischer                                $parentid, $key, $gid);
108cdf0e10cSrcweir                        }
109cdf0e10cSrcweir                        else
110cdf0e10cSrcweir                        {
111cdf0e10cSrcweir                            $directoryhashref->{$key} = $parentvalue . $installer::globals::separator . $value;
112cdf0e10cSrcweir                        }
113cdf0e10cSrcweir                    }
114cdf0e10cSrcweir                }
115cdf0e10cSrcweir            }
116cdf0e10cSrcweir
117cdf0e10cSrcweir            # Second: The directory is language dependent, the parent not
118cdf0e10cSrcweir
119cdf0e10cSrcweir            if (( $dirismultilingual ) && ( ! $parentismultilingual ))
120cdf0e10cSrcweir            {
121cdf0e10cSrcweir                $parentvalue = $parentdirectoryhashref->{'HostName'};       # there is only one
122cdf0e10cSrcweir
123cdf0e10cSrcweir                foreach $key (keys %{$directoryhashref})        # the current directory
124cdf0e10cSrcweir                {
125cdf0e10cSrcweir                    if ( $key =~ /\bHostName\b/ )
126cdf0e10cSrcweir                    {
127cdf0e10cSrcweir                        $value = $directoryhashref->{$key};
128cdf0e10cSrcweir                        $directoryhashref->{$key} = $parentvalue . $installer::globals::separator . $value;
129cdf0e10cSrcweir                    }
130cdf0e10cSrcweir                }
131cdf0e10cSrcweir            }
132cdf0e10cSrcweir
133cdf0e10cSrcweir            # Third: The directory is not language dependent, the parent is language dependent
134cdf0e10cSrcweir
135cdf0e10cSrcweir            if (( ! $dirismultilingual ) && ( $parentismultilingual ))
136cdf0e10cSrcweir            {
137cdf0e10cSrcweir                $value = $directoryhashref->{'HostName'};       # there is only one
138cdf0e10cSrcweir                delete($directoryhashref->{'HostName'});
139cdf0e10cSrcweir
140cdf0e10cSrcweir                foreach $key (keys %{$parentdirectoryhashref})      # the parent directory
141cdf0e10cSrcweir                {
142cdf0e10cSrcweir                    if ( $key =~ /\bHostName\b/ )
143cdf0e10cSrcweir                    {
144cdf0e10cSrcweir                        $parentvalue = $parentdirectoryhashref->{$key};     # there is only one
145cdf0e10cSrcweir                        $directoryhashref->{$key} = $parentvalue . $installer::globals::separator . $value;
146cdf0e10cSrcweir                    }
147cdf0e10cSrcweir                }
148cdf0e10cSrcweir
149cdf0e10cSrcweir                $directoryhashref->{'ismultilingual'} = 1;  # now this directory is also language dependent
150cdf0e10cSrcweir            }
151cdf0e10cSrcweir        }
152cdf0e10cSrcweir    }
153cdf0e10cSrcweir}
154cdf0e10cSrcweir
155cdf0e10cSrcweir#############################################################################
156cdf0e10cSrcweir# Files with flag DELETE_ONLY do not need to be packed into installation set
157cdf0e10cSrcweir#############################################################################
158cdf0e10cSrcweir
159cdf0e10cSrcweirsub remove_delete_only_files_from_productlists
160cdf0e10cSrcweir{
161cdf0e10cSrcweir    my ($productarrayref) = @_;
162cdf0e10cSrcweir
163cdf0e10cSrcweir    my @newitems = ();
164cdf0e10cSrcweir
165cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$productarrayref}; $i++ )
166cdf0e10cSrcweir    {
167cdf0e10cSrcweir        my $oneitem = ${$productarrayref}[$i];
168cdf0e10cSrcweir        my $styles = "";
169cdf0e10cSrcweir
170cdf0e10cSrcweir        if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
171cdf0e10cSrcweir
172cdf0e10cSrcweir        if (!($styles =~ /\bDELETE_ONLY\b/))
173cdf0e10cSrcweir        {
174cdf0e10cSrcweir            push(@newitems, $oneitem);
175cdf0e10cSrcweir        }
176cdf0e10cSrcweir    }
177cdf0e10cSrcweir
178cdf0e10cSrcweir    return \@newitems;
179cdf0e10cSrcweir}
180cdf0e10cSrcweir
181cdf0e10cSrcweir#############################################################################
182cdf0e10cSrcweir# Files with flag NOT_IN_SUITE do not need to be packed into
183cdf0e10cSrcweir# Suite installation sets
184cdf0e10cSrcweir#############################################################################
185cdf0e10cSrcweir
186cdf0e10cSrcweirsub remove_notinsuite_files_from_productlists
187cdf0e10cSrcweir{
188cdf0e10cSrcweir    my ($productarrayref) = @_;
189cdf0e10cSrcweir
190cdf0e10cSrcweir    my @newitems = ();
191cdf0e10cSrcweir
192cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$productarrayref}; $i++ )
193cdf0e10cSrcweir    {
194cdf0e10cSrcweir        my $oneitem = ${$productarrayref}[$i];
195cdf0e10cSrcweir        my $styles = "";
196cdf0e10cSrcweir
197cdf0e10cSrcweir        if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
198cdf0e10cSrcweir
199cdf0e10cSrcweir        if (!($styles =~ /\bNOT_IN_SUITE\b/))
200cdf0e10cSrcweir        {
201cdf0e10cSrcweir            push(@newitems, $oneitem);
202cdf0e10cSrcweir        }
203cdf0e10cSrcweir        else
204cdf0e10cSrcweir        {
205b274bc22SAndre Fischer            $installer::logger::Global->printf("INFO: Flag NOT_IN_SUITE \-\> Removing %s from file list.\n",
206b274bc22SAndre Fischer                $oneitem->{'gid'});
207cdf0e10cSrcweir        }
208cdf0e10cSrcweir    }
209cdf0e10cSrcweir
210cdf0e10cSrcweir    return \@newitems;
211cdf0e10cSrcweir}
212cdf0e10cSrcweir
213cdf0e10cSrcweir#############################################################################
214cdf0e10cSrcweir# Files with flag NOT_IN_SUITE do not need to be packed into
215cdf0e10cSrcweir# Suite installation sets
216cdf0e10cSrcweir#############################################################################
217cdf0e10cSrcweir
218cdf0e10cSrcweirsub remove_office_start_language_files
219cdf0e10cSrcweir{
220cdf0e10cSrcweir    my ($productarrayref) = @_;
221cdf0e10cSrcweir
222cdf0e10cSrcweir    my @newitems = ();
223cdf0e10cSrcweir
224cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$productarrayref}; $i++ )
225cdf0e10cSrcweir    {
226cdf0e10cSrcweir        my $oneitem = ${$productarrayref}[$i];
227cdf0e10cSrcweir        my $styles = "";
228cdf0e10cSrcweir
229cdf0e10cSrcweir        if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
230cdf0e10cSrcweir
231cdf0e10cSrcweir        if (!($styles =~ /\bSET_OFFICE_LANGUAGE\b/))
232cdf0e10cSrcweir        {
233cdf0e10cSrcweir            push(@newitems, $oneitem);
234cdf0e10cSrcweir        }
235cdf0e10cSrcweir        else
236cdf0e10cSrcweir        {
237b274bc22SAndre Fischer            $installer::logger::Lang->printf(
238b274bc22SAndre Fischer                "INFO: Flag SET_OFFICE_LANGUAGE \-\> Removing %s from file list.\n",
239b274bc22SAndre Fischer                $oneitem->{'gid'});
240cdf0e10cSrcweir        }
241cdf0e10cSrcweir    }
242cdf0e10cSrcweir
243cdf0e10cSrcweir    return \@newitems;
244cdf0e10cSrcweir}
245cdf0e10cSrcweir
246cdf0e10cSrcweir#############################################################################
247cdf0e10cSrcweir# Registryitems for Uninstall have to be removed
248cdf0e10cSrcweir#############################################################################
249cdf0e10cSrcweir
250cdf0e10cSrcweirsub remove_uninstall_regitems_from_script
251cdf0e10cSrcweir{
252cdf0e10cSrcweir    my ($registryarrayref) = @_;
253cdf0e10cSrcweir
254cdf0e10cSrcweir    my @newitems = ();
255cdf0e10cSrcweir
256cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$registryarrayref}; $i++ )
257cdf0e10cSrcweir    {
258cdf0e10cSrcweir        my $oneitem = ${$registryarrayref}[$i];
259cdf0e10cSrcweir        my $subkey = "";
260cdf0e10cSrcweir
261cdf0e10cSrcweir        if ( $oneitem->{'Subkey'} ) { $subkey = $oneitem->{'Subkey'}; }
262cdf0e10cSrcweir
263cdf0e10cSrcweir        if ( $subkey =~ /Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall/ ) { next; }
264cdf0e10cSrcweir
265cdf0e10cSrcweir        push(@newitems, $oneitem);
266cdf0e10cSrcweir    }
267cdf0e10cSrcweir
268cdf0e10cSrcweir    return \@newitems;
269cdf0e10cSrcweir}
270cdf0e10cSrcweir
271cdf0e10cSrcweir##############################################################################
272cdf0e10cSrcweir# Searching the language module for a specified language
273cdf0e10cSrcweir##############################################################################
274cdf0e10cSrcweir
275cdf0e10cSrcweirsub get_languagespecific_module
276cdf0e10cSrcweir{
277cdf0e10cSrcweir    my ( $lang, $modulestring ) = @_;
278cdf0e10cSrcweir
279cdf0e10cSrcweir    my $langmodulestring = "";
280cdf0e10cSrcweir
281cdf0e10cSrcweir    my $module;
282cdf0e10cSrcweir    foreach $module ( keys %installer::globals::alllangmodules )
283cdf0e10cSrcweir    {
284cdf0e10cSrcweir        if (( $installer::globals::alllangmodules{$module} eq $lang ) && ( $modulestring =~ /\b$module\b/ ))
285cdf0e10cSrcweir        {
286cdf0e10cSrcweir            $langmodulestring = "$langmodulestring,$module";
287cdf0e10cSrcweir        }
288cdf0e10cSrcweir    }
289cdf0e10cSrcweir
290cdf0e10cSrcweir    $langmodulestring =~ s/^\s*,//;
291cdf0e10cSrcweir
292cdf0e10cSrcweir    if ( $langmodulestring eq "" ) { installer::exiter::exit_program("ERROR: No language pack module found for language $lang in string \"$modulestring\"!", "get_languagespecific_module");  }
293cdf0e10cSrcweir
294cdf0e10cSrcweir    return $langmodulestring;
295cdf0e10cSrcweir}
296cdf0e10cSrcweir
297cdf0e10cSrcweir##############################################################################
298cdf0e10cSrcweir# Removing all items in product lists which do not have the correct languages
299cdf0e10cSrcweir##############################################################################
300cdf0e10cSrcweir
301cdf0e10cSrcweirsub resolving_all_languages_in_productlists
302cdf0e10cSrcweir{
303cdf0e10cSrcweir    my ($productarrayref, $languagesarrayref) = @_;
304cdf0e10cSrcweir
305cdf0e10cSrcweir    my @itemsinalllanguages = ();
306cdf0e10cSrcweir
307cdf0e10cSrcweir    my ($key, $value);
308cdf0e10cSrcweir
309cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$productarrayref}; $i++ )
310cdf0e10cSrcweir    {
311cdf0e10cSrcweir        my $oneitem = ${$productarrayref}[$i];
312cdf0e10cSrcweir
313cdf0e10cSrcweir        my $ismultilingual = $oneitem->{'ismultilingual'};
314cdf0e10cSrcweir
315cdf0e10cSrcweir        if (!($ismultilingual)) # nothing to do with single language items
316cdf0e10cSrcweir        {
317cdf0e10cSrcweir            $oneitem->{'specificlanguage'} = "";
318cdf0e10cSrcweir            push(@itemsinalllanguages, $oneitem);
319cdf0e10cSrcweir        }
320cdf0e10cSrcweir        else    #all language dependent files
321cdf0e10cSrcweir        {
322cdf0e10cSrcweir            for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ )   # iterating over all languages
323cdf0e10cSrcweir            {
324cdf0e10cSrcweir                my $onelanguage = ${$languagesarrayref}[$j];
325cdf0e10cSrcweir
326cdf0e10cSrcweir                my %oneitemhash = ();
327cdf0e10cSrcweir
328cdf0e10cSrcweir                foreach $key (keys %{$oneitem})
329cdf0e10cSrcweir                {
330cdf0e10cSrcweir                    if ( $key =~ /\(\S+\)/ )    # this are the language dependent keys
331cdf0e10cSrcweir                    {
332cdf0e10cSrcweir                        if ( $key =~ /\(\Q$onelanguage\E\)/ )
333cdf0e10cSrcweir                        {
334cdf0e10cSrcweir                            $value = $oneitem->{$key};
335cdf0e10cSrcweir                            $oneitemhash{$key} = $value;
336cdf0e10cSrcweir                        }
337cdf0e10cSrcweir                    }
338cdf0e10cSrcweir                    else
339cdf0e10cSrcweir                    {
340cdf0e10cSrcweir                        $value = $oneitem->{$key};
341cdf0e10cSrcweir                        $oneitemhash{$key} = $value;
342cdf0e10cSrcweir                    }
343cdf0e10cSrcweir                }
344cdf0e10cSrcweir
345cdf0e10cSrcweir                $oneitemhash{'specificlanguage'} = $onelanguage;
346cdf0e10cSrcweir
347cdf0e10cSrcweir                if ( $oneitemhash{'haslanguagemodule'} )
348cdf0e10cSrcweir                {
349cdf0e10cSrcweir                    my $langmodulestring = get_languagespecific_module($onelanguage, $oneitemhash{'modules'});
350cdf0e10cSrcweir                    $oneitemhash{'modules'} = $langmodulestring;
351cdf0e10cSrcweir                }
352cdf0e10cSrcweir
353cdf0e10cSrcweir                push(@itemsinalllanguages, \%oneitemhash);
354cdf0e10cSrcweir            }
355cdf0e10cSrcweir        }
356cdf0e10cSrcweir    }
357cdf0e10cSrcweir
358cdf0e10cSrcweir    return \@itemsinalllanguages;
359cdf0e10cSrcweir}
360cdf0e10cSrcweir
361cdf0e10cSrcweir################################################################################
362cdf0e10cSrcweir# Removing all modules, that have the flag LANGUAGEMODULE, but do not
363cdf0e10cSrcweir# have the correct language
364cdf0e10cSrcweir################################################################################
365cdf0e10cSrcweir
366cdf0e10cSrcweirsub remove_not_required_language_modules
367cdf0e10cSrcweir{
368cdf0e10cSrcweir    my ($modulesarrayref, $languagesarrayref) = @_;
369cdf0e10cSrcweir
370cdf0e10cSrcweir    my @allmodules = ();
371cdf0e10cSrcweir
372cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ )
373cdf0e10cSrcweir    {
374cdf0e10cSrcweir        my $module = ${$modulesarrayref}[$i];
375cdf0e10cSrcweir        my $styles = "";
376cdf0e10cSrcweir        if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; }
377cdf0e10cSrcweir
378cdf0e10cSrcweir        if ( $styles =~ /\bLANGUAGEMODULE\b/ )
379cdf0e10cSrcweir        {
380cdf0e10cSrcweir            if ( ! exists($module->{'Language'}) ) { installer::exiter::exit_program("ERROR: \"$module->{'gid'}\" has flag LANGUAGEMODULE, but does not know its language!", "remove_not_required_language_modules"); }
381cdf0e10cSrcweir            my $modulelanguage = $module->{'Language'};
382cdf0e10cSrcweir            # checking, if language is required
383cdf0e10cSrcweir            my $doinclude = 0;
384cdf0e10cSrcweir            for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ )
385cdf0e10cSrcweir            {
386cdf0e10cSrcweir                my $onelanguage = ${$languagesarrayref}[$j];
387cdf0e10cSrcweir                if ( $onelanguage eq $modulelanguage )
388cdf0e10cSrcweir                {
389cdf0e10cSrcweir                    $doinclude = 1;
390cdf0e10cSrcweir                    last;
391cdf0e10cSrcweir                }
392cdf0e10cSrcweir            }
393cdf0e10cSrcweir
394cdf0e10cSrcweir            if ( $doinclude ) { push(@allmodules, $module); }
395cdf0e10cSrcweir        }
396cdf0e10cSrcweir        else
397cdf0e10cSrcweir        {
398cdf0e10cSrcweir            push(@allmodules, $module);
399cdf0e10cSrcweir        }
400cdf0e10cSrcweir    }
401cdf0e10cSrcweir
402cdf0e10cSrcweir    return \@allmodules;
403cdf0e10cSrcweir}
404cdf0e10cSrcweir
405cdf0e10cSrcweir################################################################################
406cdf0e10cSrcweir# Removing all modules, that have a spellchecker language that is not
407cdf0e10cSrcweir# required for this product (spellchecker selection).
408cdf0e10cSrcweir# All required spellchecker languages are stored in
409cdf0e10cSrcweir# %installer::globals::spellcheckerlanguagehash
410cdf0e10cSrcweir################################################################################
411cdf0e10cSrcweir
412cdf0e10cSrcweirsub remove_not_required_spellcheckerlanguage_modules
413cdf0e10cSrcweir{
414cdf0e10cSrcweir    my ($modulesarrayref) = @_;
415cdf0e10cSrcweir
416cdf0e10cSrcweir    my $infoline = "";
417cdf0e10cSrcweir    my @allmodules = ();
418cdf0e10cSrcweir
419cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ )
420cdf0e10cSrcweir    {
421cdf0e10cSrcweir        my $module = ${$modulesarrayref}[$i];
422cdf0e10cSrcweir        if ( $module->{'Spellcheckerlanguage'} )    # selecting modules with Spellcheckerlanguage
423cdf0e10cSrcweir        {
424cdf0e10cSrcweir            if ( exists($installer::globals::spellcheckerlanguagehash{$module->{'Spellcheckerlanguage'}}) )
425cdf0e10cSrcweir            {
426cdf0e10cSrcweir                push(@allmodules, $module);
427cdf0e10cSrcweir            }
428cdf0e10cSrcweir            else
429cdf0e10cSrcweir            {
430b274bc22SAndre Fischer                $installer::logger::Lang->printf("Spellchecker selection: Removing module %s\n", $module->{'gid'});
431cdf0e10cSrcweir
432cdf0e10cSrcweir                # Collecting all files at modules that are removed
433cdf0e10cSrcweir
434cdf0e10cSrcweir                if ( $module->{'Files'} )
435cdf0e10cSrcweir                {
436cdf0e10cSrcweir                    if ( $module->{'Files'} =~ /^\s*\((.*?)\)\s*$/ )
437cdf0e10cSrcweir                    {
438cdf0e10cSrcweir                        my $filelist = $1;
439cdf0e10cSrcweir
440cdf0e10cSrcweir                        my $filelisthash = installer::converter::convert_stringlist_into_hash(\$filelist, ",");
441cdf0e10cSrcweir                        foreach my $onefile ( keys %{$filelisthash} ) { $installer::globals::spellcheckerfilehash{$onefile} = 1; }
442cdf0e10cSrcweir                    }
443cdf0e10cSrcweir                }
444cdf0e10cSrcweir            }
445cdf0e10cSrcweir        }
446cdf0e10cSrcweir        else
447cdf0e10cSrcweir        {
448cdf0e10cSrcweir            push(@allmodules, $module);
449cdf0e10cSrcweir        }
450cdf0e10cSrcweir    }
451cdf0e10cSrcweir
452cdf0e10cSrcweir    return \@allmodules;
453cdf0e10cSrcweir}
454cdf0e10cSrcweir
455cdf0e10cSrcweir################################################################################
456cdf0e10cSrcweir# Removing all modules, that belong to a module that was removed
457cdf0e10cSrcweir# in "remove_not_required_spellcheckerlanguage_modules" because of the
458cdf0e10cSrcweir# spellchecker language. The files belonging to the modules are collected
459cdf0e10cSrcweir# in %installer::globals::spellcheckerfilehash.
460cdf0e10cSrcweir################################################################################
461cdf0e10cSrcweir
462cdf0e10cSrcweirsub remove_not_required_spellcheckerlanguage_files
463cdf0e10cSrcweir{
464cdf0e10cSrcweir    my ($filesarrayref) = @_;
465cdf0e10cSrcweir
466cdf0e10cSrcweir    my @filesarray = ();
467cdf0e10cSrcweir    my $infoline = "";
468cdf0e10cSrcweir
469cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
470cdf0e10cSrcweir    {
471cdf0e10cSrcweir        my $onefile = ${$filesarrayref}[$i];
472cdf0e10cSrcweir        if ( exists($installer::globals::spellcheckerfilehash{$onefile->{'gid'}}) )
473cdf0e10cSrcweir        {
474b274bc22SAndre Fischer            $installer::logger::Lang->printf("Spellchecker selection: Removing file %s\n",
475b274bc22SAndre Fischer                $onefile->{'gid'});
476cdf0e10cSrcweir            next;
477cdf0e10cSrcweir        }
478cdf0e10cSrcweir        push(@filesarray, $onefile);
479cdf0e10cSrcweir    }
480cdf0e10cSrcweir
481cdf0e10cSrcweir    return \@filesarray;
482cdf0e10cSrcweir}
483cdf0e10cSrcweir
4849568fc44SAndre Fischer=head3 add_bundled_extension_blobs(@filelist)
4859568fc44SAndre Fischer
486c6dedb65SAndre Fischer    Add entries for extension blobs to the global file list.
487c6dedb65SAndre Fischer    Extension blobs, unlike preregistered extensions, are not
488c6dedb65SAndre Fischer    extracted before included into a pack set.
489c6dedb65SAndre Fischer
490c6dedb65SAndre Fischer    The set of extensions to include is taken from the BUNDLED_EXTENSION_BLOBS
491c6dedb65SAndre Fischer    environment variable (typically set in configure.)
492c6dedb65SAndre Fischer
493c6dedb65SAndre Fischer    If that variable is not defined then the content of main/extensions.lst defines
494c6dedb65SAndre Fischer    the default set.
495c6dedb65SAndre Fischer
496c6dedb65SAndre Fischer    Extension blobs are placed in gid_Brand_Dir_Share_Extensions_Install.
4979568fc44SAndre Fischer
498c6dedb65SAndre Fischer=cut
499010ec03aSHerbert Dürrsub add_bundled_extension_blobs
500010ec03aSHerbert Dürr{
501010ec03aSHerbert Dürr    my @filelist = @{$_[0]};
502010ec03aSHerbert Dürr
503c6dedb65SAndre Fischer    my @bundle_files = ();
504010ec03aSHerbert Dürr    my $bundleenv = $ENV{'BUNDLED_EXTENSION_BLOBS'};
5059568fc44SAndre Fischer    my $bundlehttpsrc = $ENV{'TARFILE_LOCATION'} . $installer::globals::separator;
5069568fc44SAndre Fischer    my $bundlefilesrc = $ENV{SOLARVERSION}
5079568fc44SAndre Fischer        . $installer::globals::separator . $ENV{INPATH}
5089568fc44SAndre Fischer        . $installer::globals::separator . "bin"
5099568fc44SAndre Fischer        . $installer::globals::separator;
510c6dedb65SAndre Fischer
511c6dedb65SAndre Fischer    if ($installer::globals::product =~ /(SDK|URE)/i )
512c6dedb65SAndre Fischer    {
513c6dedb65SAndre Fischer        # No extensions for the SDK.
514c6dedb65SAndre Fischer    }
515c6dedb65SAndre Fischer    elsif (defined $bundleenv)
516c6dedb65SAndre Fischer    {
517c6dedb65SAndre Fischer        # Use the list of extensions that was explicitly given to configure.
5189568fc44SAndre Fischer        for my $name (split(/\s+/, $bundleenv, -1))
5199568fc44SAndre Fischer        {
5209568fc44SAndre Fischer            push @bundle_files, $bundlehttpsrc . $name;
5219568fc44SAndre Fischer        }
522c6dedb65SAndre Fischer    }
523c6dedb65SAndre Fischer    else
524c6dedb65SAndre Fischer    {
5259568fc44SAndre Fischer        # Add the default extensions for the current language set.
5269568fc44SAndre Fischer        # http:// extensions are taken from ext_sources/.
52701a01bd6SAndre Fischer        for my $name (ExtensionsLst::GetExtensionList("http|https", ($installer::globals::languageproduct)))
5289568fc44SAndre Fischer        {
5299568fc44SAndre Fischer            push @bundle_files, $bundlehttpsrc . $name;
5309568fc44SAndre Fischer        }
53109f957bfSAndre Fischer        # file:// extensions are added as pre-registered in add_bundled_prereg_extension().
532c6dedb65SAndre Fischer    }
533c6dedb65SAndre Fischer
534b274bc22SAndre Fischer    $installer::logger::Info->printf(
53501a01bd6SAndre Fischer        "preparing %d extension blob%s for language %s:\n",
536c6dedb65SAndre Fischer        $#bundle_files + 1,
537c6dedb65SAndre Fischer        $#bundle_files!=0 ? "s" : "",
53801a01bd6SAndre Fischer        $installer::globals::languageproduct);
539c6dedb65SAndre Fischer
540c6dedb65SAndre Fischer    foreach my $filename ( @bundle_files)
541c6dedb65SAndre Fischer    {
542010ec03aSHerbert Dürr        my $basename = File::Basename::basename( $filename);
543010ec03aSHerbert Dürr        my $onefile = {
544010ec03aSHerbert Dürr            'Dir' => 'gid_Brand_Dir_Share_Extensions_Install',
545010ec03aSHerbert Dürr            'Name' => $basename,
546010ec03aSHerbert Dürr            'Styles' => '(PACKED)',
547010ec03aSHerbert Dürr            'UnixRights' => '444',
5489568fc44SAndre Fischer            'sourcepath' => $filename,
549c6dedb65SAndre Fischer            'modules' => "gid_Module_Dictionaries",
550c6dedb65SAndre Fischer            'gid' => "gid_File_Extension_".$basename
551010ec03aSHerbert Dürr        };
552010ec03aSHerbert Dürr        push( @filelist, $onefile);
553b274bc22SAndre Fischer        $installer::logger::Lang->printf("\tbundling \"%s\" extension\n", $filename);
5549568fc44SAndre Fischer
555b274bc22SAndre Fischer        $installer::logger::Info->printf("    %s\n", $basename);
556010ec03aSHerbert Dürr    }
557010ec03aSHerbert Dürr
558010ec03aSHerbert Dürr    return \@filelist;
559010ec03aSHerbert Dürr}
560010ec03aSHerbert Dürr
5619568fc44SAndre Fischer=head3 add_bundled_prereg_extensions(@filelist)
5629568fc44SAndre Fischer
563c6dedb65SAndre Fischer    Add entries for preregistered extensions to the global file list.
564c6dedb65SAndre Fischer
565c6dedb65SAndre Fischer    The set of extensions to include is taken from the BUNDLED_PREREG_EXTENSIONS
566c6dedb65SAndre Fischer    environment variable (typically set in configure.)
567c6dedb65SAndre Fischer
568c6dedb65SAndre Fischer    If that variable is not defined then the content of main/extensions.lst defines
569c6dedb65SAndre Fischer    the default set.
570c6dedb65SAndre Fischer
571c6dedb65SAndre Fischer    Preregistered extensions are placed in subdirectories of gid_Brand_Dir_Share_Prereg_Bundled.
5729568fc44SAndre Fischer
573c6dedb65SAndre Fischer=cut
574010ec03aSHerbert Dürrsub add_bundled_prereg_extensions
575010ec03aSHerbert Dürr{
576010ec03aSHerbert Dürr    my @filelist = @{$_[0]};
577c6dedb65SAndre Fischer    my $dirsref = $_[1];
578010ec03aSHerbert Dürr
579c6dedb65SAndre Fischer    my @bundle_files = ();
580010ec03aSHerbert Dürr    my $bundleenv = $ENV{'BUNDLED_PREREG_EXTENSIONS'};
581c6dedb65SAndre Fischer
582c6dedb65SAndre Fischer    if ($installer::globals::product =~ /(SDK|URE)/i )
583c6dedb65SAndre Fischer    {
584c6dedb65SAndre Fischer        # No extensions for the SDK.
585c6dedb65SAndre Fischer    }
586c6dedb65SAndre Fischer    elsif (defined $bundleenv)
587c6dedb65SAndre Fischer    {
588c6dedb65SAndre Fischer        # Use the list of extensions that was explicitly given to configure.
589c6dedb65SAndre Fischer        @bundle_files = split(/\s+/, $bundleenv, -1);
590c6dedb65SAndre Fischer    }
591c6dedb65SAndre Fischer    else
592c6dedb65SAndre Fischer    {
59309f957bfSAndre Fischer        # Add extensions from file:// URLs.
59401a01bd6SAndre Fischer        for my $name (ExtensionsLst::GetExtensionList("file", ($installer::globals::languageproduct)))
59509f957bfSAndre Fischer        {
59609f957bfSAndre Fischer            push @bundle_files, $name;
59709f957bfSAndre Fischer        }
598c6dedb65SAndre Fischer    }
599c6dedb65SAndre Fischer
600b274bc22SAndre Fischer    $installer::logger::Info->printf(
60101a01bd6SAndre Fischer        "preparing %d bundled extension%s for language %s:\n",
602c6dedb65SAndre Fischer        $#bundle_files + 1,
603c6dedb65SAndre Fischer        $#bundle_files!=0 ? "s" : "",
60401a01bd6SAndre Fischer        $installer::globals::languageproduct);
605b274bc22SAndre Fischer    foreach my $filename (@bundle_files)
606b274bc22SAndre Fischer    {
607b274bc22SAndre Fischer        $installer::logger::Info->printf("    %s\n", $filename);
608b274bc22SAndre Fischer    }
609c6dedb65SAndre Fischer
610c6dedb65SAndre Fischer    # Find the prereg directory entry so that we can create a new sub-directory.
611c6dedb65SAndre Fischer    my $parentdir_gid = "gid_Brand_Dir_Share_Prereg_Bundled";
612c6dedb65SAndre Fischer    my $parentdir = undef;
613c6dedb65SAndre Fischer    foreach my $dir (@{$dirsref})
614c6dedb65SAndre Fischer    {
615c6dedb65SAndre Fischer        if ($dir->{'gid'} eq $parentdir_gid)
616c6dedb65SAndre Fischer        {
617c6dedb65SAndre Fischer            $parentdir = $dir;
618c6dedb65SAndre Fischer            last;
619c6dedb65SAndre Fischer        }
620c6dedb65SAndre Fischer    }
621c6dedb65SAndre Fischer
622c6dedb65SAndre Fischer    foreach my $filename ( @bundle_files)
623c6dedb65SAndre Fischer    {
624010ec03aSHerbert Dürr        my $basename = File::Basename::basename( $filename);
625c6dedb65SAndre Fischer
626c6dedb65SAndre Fischer        # Create a new directory into which the extension will be installed.
627c6dedb65SAndre Fischer        my $dirgid = $parentdir_gid . "_" . $basename;
628c6dedb65SAndre Fischer        my $onedir = {
629c6dedb65SAndre Fischer            'modules' => 'gid_Module_Root_Brand',
630c6dedb65SAndre Fischer            'ismultilingual' => 0,
631c6dedb65SAndre Fischer            'Styles' => '(CREATE)',
632c6dedb65SAndre Fischer            'ParentID' => $parentdir_gid,
633c6dedb65SAndre Fischer            'specificlanguage' => "",
634c6dedb65SAndre Fischer            'haslanguagemodule' => 0,
635c6dedb65SAndre Fischer            'gid' => $dirgid,
636c6dedb65SAndre Fischer            'HostName' => $parentdir->{'HostName'} . $installer::globals::separator . $basename
637c6dedb65SAndre Fischer        };
638c6dedb65SAndre Fischer        push (@{$dirsref}, $onedir);
639c6dedb65SAndre Fischer
640c6dedb65SAndre Fischer        # Create a new file entry for the extension.
641010ec03aSHerbert Dürr        my $onefile = {
642c6dedb65SAndre Fischer            'Dir' => $dirgid,
643010ec03aSHerbert Dürr            'Name' => $basename,
644010ec03aSHerbert Dürr            'Styles' => '(PACKED,ARCHIVE)',
645010ec03aSHerbert Dürr            'UnixRights' => '444',
646c6dedb65SAndre Fischer            'sourcepath' => File::Spec->catfile($ENV{'OUTDIR'}, "bin", $filename),
647c6dedb65SAndre Fischer            'specificlanguage' => "",
648c6dedb65SAndre Fischer            'modules' => "gid_Module_Dictionaries",
649c6dedb65SAndre Fischer            'gid' => "gid_File_Extension_".$basename
650010ec03aSHerbert Dürr        };
651010ec03aSHerbert Dürr        push( @filelist, $onefile);
652b274bc22SAndre Fischer        $installer::logger::Lang->printf("\tbundling \"%s\" extension\n", $filename);
653010ec03aSHerbert Dürr    }
654010ec03aSHerbert Dürr
655c6dedb65SAndre Fischer    return (\@filelist, $dirsref);
656010ec03aSHerbert Dürr}
657010ec03aSHerbert Dürr
658cdf0e10cSrcweir################################################################################
659cdf0e10cSrcweir# Looking for directories without correct HostName
660cdf0e10cSrcweir################################################################################
661cdf0e10cSrcweir
662cdf0e10cSrcweirsub checking_directories_with_corrupt_hostname
663cdf0e10cSrcweir{
664cdf0e10cSrcweir    my ($dirsref, $languagesarrayref) = @_;
665cdf0e10cSrcweir
666cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
667cdf0e10cSrcweir    {
668cdf0e10cSrcweir        my $onedir = ${$dirsref}[$i];
669cdf0e10cSrcweir
670cdf0e10cSrcweir        my $hostname = "";
671cdf0e10cSrcweir
672cdf0e10cSrcweir        if ( $onedir->{'HostName'} ) { $hostname = $onedir->{'HostName'}; }
673cdf0e10cSrcweir
674cdf0e10cSrcweir        if ( $hostname eq "" )
675cdf0e10cSrcweir        {
676cdf0e10cSrcweir            my $langstring = "";
677cdf0e10cSrcweir            for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ ) { $langstring .= ${$languagesarrayref}[$j] . " "; }
678cdf0e10cSrcweir            installer::exiter::exit_program("ERROR: HostName not defined for $onedir->{'gid'} for specified language. Probably you wanted to create an installation set, in a language not defined in scp2 project. You selected the following language(s): $langstring", "checking_directories_with_corrupt_hostname");
679cdf0e10cSrcweir        }
680cdf0e10cSrcweir
681cdf0e10cSrcweir        if ( $hostname eq "FAILURE" )
682cdf0e10cSrcweir        {
683cdf0e10cSrcweir            installer::exiter::exit_program("ERROR: Could not create HostName for $onedir->{'gid'} (missing language at parent). See logfile warning for more info!", "checking_directories_with_corrupt_hostname");
684cdf0e10cSrcweir        }
685cdf0e10cSrcweir    }
686cdf0e10cSrcweir}
687cdf0e10cSrcweir
688cdf0e10cSrcweir################################################################################
689cdf0e10cSrcweir# Setting global properties
690cdf0e10cSrcweir################################################################################
691cdf0e10cSrcweir
692cdf0e10cSrcweirsub set_global_directory_hostnames
693cdf0e10cSrcweir{
694cdf0e10cSrcweir    my ($dirsref, $allvariables) = @_;
695cdf0e10cSrcweir
696cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
697cdf0e10cSrcweir    {
698cdf0e10cSrcweir        my $onedir = ${$dirsref}[$i];
699cdf0e10cSrcweir        my $styles = "";
700cdf0e10cSrcweir        if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
701cdf0e10cSrcweir
702cdf0e10cSrcweir        if ( $styles =~ /\bOFFICEDIRECTORY\b/ )
703cdf0e10cSrcweir        {
704cdf0e10cSrcweir            $installer::globals::officedirhostname = $onedir->{'HostName'};
705cdf0e10cSrcweir            $installer::globals::officedirgid = $onedir->{'gid'};
706cdf0e10cSrcweir            $allvariables->{'OFFICEDIRECTORYHOSTNAME'} = $installer::globals::officedirhostname;
707cdf0e10cSrcweir        }
708cdf0e10cSrcweir    }
709cdf0e10cSrcweir}
710cdf0e10cSrcweir
711cdf0e10cSrcweir########################################################
712cdf0e10cSrcweir# Recursively defined procedure to order
713cdf0e10cSrcweir# modules and directories
714cdf0e10cSrcweir########################################################
715cdf0e10cSrcweir
716cdf0e10cSrcweirsub get_children
717cdf0e10cSrcweir{
718cdf0e10cSrcweir    my ($allitems, $startparent, $newitemorder) = @_;
719cdf0e10cSrcweir
720cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$allitems}; $i++ )
721cdf0e10cSrcweir    {
722cdf0e10cSrcweir        my $gid = ${$allitems}[$i]->{'gid'};
723cdf0e10cSrcweir        my $parent = "";
724cdf0e10cSrcweir        if ( ${$allitems}[$i]->{'ParentID'} ) { $parent = ${$allitems}[$i]->{'ParentID'}; }
725cdf0e10cSrcweir
726cdf0e10cSrcweir        if ( $parent eq $startparent )
727cdf0e10cSrcweir        {
728cdf0e10cSrcweir            push(@{$newitemorder}, ${$allitems}[$i]);
729cdf0e10cSrcweir            my $parent = $gid;
730cdf0e10cSrcweir            get_children($allitems, $parent, $newitemorder);    # recursive!
731cdf0e10cSrcweir        }
732cdf0e10cSrcweir    }
733cdf0e10cSrcweir}
734cdf0e10cSrcweir
735cdf0e10cSrcweir################################################################################
736cdf0e10cSrcweir# Using different HostName for language packs
737cdf0e10cSrcweir################################################################################
738cdf0e10cSrcweir
739cdf0e10cSrcweirsub use_langpack_hostname
740cdf0e10cSrcweir{
741cdf0e10cSrcweir    my ($dirsref) = @_;
742cdf0e10cSrcweir
743cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
744cdf0e10cSrcweir    {
745cdf0e10cSrcweir        my $onedir = ${$dirsref}[$i];
746cdf0e10cSrcweir        if (( $onedir->{'LangPackHostName'} ) && ( $onedir->{'LangPackHostName'} ne "" )) { $onedir->{'HostName'} = $onedir->{'LangPackHostName'}; }
747cdf0e10cSrcweir    }
748cdf0e10cSrcweir}
749cdf0e10cSrcweir
750cdf0e10cSrcweir################################################################################
751*c97fd792Smseidel# Using different HostName for patches
752cdf0e10cSrcweir################################################################################
753cdf0e10cSrcweir
754cdf0e10cSrcweirsub use_patch_hostname
755cdf0e10cSrcweir{
756cdf0e10cSrcweir    my ($dirsref) = @_;
757cdf0e10cSrcweir
758cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
759cdf0e10cSrcweir    {
760cdf0e10cSrcweir        my $onedir = ${$dirsref}[$i];
761cdf0e10cSrcweir        if (( $onedir->{'PatchHostName'} ) && ( $onedir->{'PatchHostName'} ne "" )) { $onedir->{'HostName'} = $onedir->{'PatchHostName'}; }
762cdf0e10cSrcweir    }
763cdf0e10cSrcweir}
764cdf0e10cSrcweir
765cdf0e10cSrcweir################################################################################
76643cf7aa4SJürgen Schmidt# Using beta copy action for beta builds
76743cf7aa4SJürgen Schmidt################################################################################
76843cf7aa4SJürgen Schmidt
76943cf7aa4SJürgen Schmidtsub use_beta_copy_scpaction
77043cf7aa4SJürgen Schmidt{
77143cf7aa4SJürgen Schmidt    my ($scpactionsref) = @_;
77243cf7aa4SJürgen Schmidt
77343cf7aa4SJürgen Schmidt    for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ )
77443cf7aa4SJürgen Schmidt    {
77543cf7aa4SJürgen Schmidt        my $onescpaction = ${$scpactionsref}[$i];
77643cf7aa4SJürgen Schmidt        if (( $onescpaction->{'BetaCopy'} ) && ( $onescpaction->{'BetaCopy'} ne "" )) { $onescpaction->{'Copy'} = $onescpaction->{'BetaCopy'}; }
77743cf7aa4SJürgen Schmidt    }
77843cf7aa4SJürgen Schmidt}
77943cf7aa4SJürgen Schmidt
78043cf7aa4SJürgen Schmidt################################################################################
78143cf7aa4SJürgen Schmidt# Using langpack beta copy action for language packs
78243cf7aa4SJürgen Schmidt################################################################################
78343cf7aa4SJürgen Schmidt
78443cf7aa4SJürgen Schmidtsub use_langbeta_copy_scpaction
78543cf7aa4SJürgen Schmidt{
78643cf7aa4SJürgen Schmidt    my ($scpactionsref) = @_;
78743cf7aa4SJürgen Schmidt
78843cf7aa4SJürgen Schmidt    for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ )
78943cf7aa4SJürgen Schmidt    {
79043cf7aa4SJürgen Schmidt        my $onescpaction = ${$scpactionsref}[$i];
79143cf7aa4SJürgen Schmidt        if (( $onescpaction->{'LangBetaCopy'} ) && ( $onescpaction->{'LangBetaCopy'} ne "" )) { $onescpaction->{'Copy'} = $onescpaction->{'LangBetaCopy'}; }
79243cf7aa4SJürgen Schmidt    }
79343cf7aa4SJürgen Schmidt}
79443cf7aa4SJürgen Schmidt
79543cf7aa4SJürgen Schmidt################################################################################
7961ed5bd48SJürgen Schmidt# Using langpack copy action for language packs
797cdf0e10cSrcweir################################################################################
798cdf0e10cSrcweir
799cdf0e10cSrcweirsub use_langpack_copy_scpaction
800cdf0e10cSrcweir{
801cdf0e10cSrcweir    my ($scpactionsref) = @_;
802cdf0e10cSrcweir
803cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ )
804cdf0e10cSrcweir    {
805cdf0e10cSrcweir        my $onescpaction = ${$scpactionsref}[$i];
806cdf0e10cSrcweir        if (( $onescpaction->{'LangPackCopy'} ) && ( $onescpaction->{'LangPackCopy'} ne "" )) { $onescpaction->{'Copy'} = $onescpaction->{'LangPackCopy'}; }
807cdf0e10cSrcweir    }
808cdf0e10cSrcweir}
809cdf0e10cSrcweir
810cdf0e10cSrcweir################################################################################
8111ed5bd48SJürgen Schmidt# Using copy patch action
812cdf0e10cSrcweir################################################################################
813cdf0e10cSrcweir
814cdf0e10cSrcweirsub use_patch_copy_scpaction
815cdf0e10cSrcweir{
816cdf0e10cSrcweir    my ($scpactionsref) = @_;
817cdf0e10cSrcweir
818cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ )
819cdf0e10cSrcweir    {
820cdf0e10cSrcweir        my $onescpaction = ${$scpactionsref}[$i];
821cdf0e10cSrcweir        if (( $onescpaction->{'PatchCopy'} ) && ( $onescpaction->{'PatchCopy'} ne "" )) { $onescpaction->{'Copy'} = $onescpaction->{'PatchCopy'}; }
822cdf0e10cSrcweir    }
823cdf0e10cSrcweir}
824cdf0e10cSrcweir
825cdf0e10cSrcweir################################################################################
8261ed5bd48SJürgen Schmidt# Using dev copy patch action for developer snapshot builds
8271ed5bd48SJürgen Schmidt################################################################################
8281ed5bd48SJürgen Schmidt
8291ed5bd48SJürgen Schmidtsub use_dev_copy_scpaction
8301ed5bd48SJürgen Schmidt{
8311ed5bd48SJürgen Schmidt    my ($scpactionsref) = @_;
8321ed5bd48SJürgen Schmidt
8331ed5bd48SJürgen Schmidt    for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ )
8341ed5bd48SJürgen Schmidt    {
8351ed5bd48SJürgen Schmidt        my $onescpaction = ${$scpactionsref}[$i];
8361ed5bd48SJürgen Schmidt        if (( $onescpaction->{'DevCopy'} ) && ( $onescpaction->{'DevCopy'} ne "" )) { $onescpaction->{'Copy'} = $onescpaction->{'DevCopy'}; }
8371ed5bd48SJürgen Schmidt    }
8381ed5bd48SJürgen Schmidt}
8391ed5bd48SJürgen Schmidt
8401ed5bd48SJürgen Schmidt################################################################################
841cdf0e10cSrcweir# Shifting parent directories of URE and Basis layer, so that
842cdf0e10cSrcweir# these directories are located below the Brand layer.
843cdf0e10cSrcweir# Style: SHIFT_BASIS_INTO_BRAND_LAYER
844cdf0e10cSrcweir################################################################################
845cdf0e10cSrcweir
846cdf0e10cSrcweirsub shift_basis_directory_parents
847cdf0e10cSrcweir{
848cdf0e10cSrcweir    my ($dirsref) = @_;
849cdf0e10cSrcweir
850cdf0e10cSrcweir    my @alldirs = ();
851cdf0e10cSrcweir    my @savedirs = ();
852cdf0e10cSrcweir    my @shifteddirs = ();
853cdf0e10cSrcweir
854cdf0e10cSrcweir    my $officedirgid = "";
855cdf0e10cSrcweir
856cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
857cdf0e10cSrcweir    {
858cdf0e10cSrcweir        my $onedir = ${$dirsref}[$i];
859cdf0e10cSrcweir        my $styles = "";
860cdf0e10cSrcweir        if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
861cdf0e10cSrcweir
862cdf0e10cSrcweir        if ( $styles =~ /\bOFFICEDIRECTORY\b/ ) { $officedirgid = $onedir->{'gid'}; }
863cdf0e10cSrcweir    }
864cdf0e10cSrcweir
865cdf0e10cSrcweir    if ( $officedirgid ne "" )
866cdf0e10cSrcweir    {
867cdf0e10cSrcweir        for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
868cdf0e10cSrcweir        {
869cdf0e10cSrcweir            my $onedir = ${$dirsref}[$i];
870cdf0e10cSrcweir            my $styles = "";
871cdf0e10cSrcweir            if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
872cdf0e10cSrcweir
873cdf0e10cSrcweir            if (( $styles =~ /\bBASISDIRECTORY\b/ ) || ( $styles =~ /\bUREDIRECTORY\b/ ))
874cdf0e10cSrcweir            {
875cdf0e10cSrcweir                $onedir->{'ParentID'} = $officedirgid;
876cdf0e10cSrcweir            }
877cdf0e10cSrcweir        }
878cdf0e10cSrcweir
879cdf0e10cSrcweir        # Sorting directories
880cdf0e10cSrcweir        my $startgid = "PREDEFINED_PROGDIR";
881cdf0e10cSrcweir        get_children($dirsref, $startgid, \@alldirs);
882cdf0e10cSrcweir    }
883cdf0e10cSrcweir
884cdf0e10cSrcweir    return \@alldirs;
885cdf0e10cSrcweir}
886cdf0e10cSrcweir
887cdf0e10cSrcweir################################################################################
888cdf0e10cSrcweir# Setting the name of the directory with style OFFICEDIRECTORY.
889cdf0e10cSrcweir# The name can be defined in property OFFICEDIRECTORYNAME.
890cdf0e10cSrcweir################################################################################
891cdf0e10cSrcweir
892cdf0e10cSrcweirsub set_officedirectory_name
893cdf0e10cSrcweir{
894cdf0e10cSrcweir    my ($dirsref, $officedirname) = @_;
895cdf0e10cSrcweir
896cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
897cdf0e10cSrcweir    {
898cdf0e10cSrcweir        my $onedir = ${$dirsref}[$i];
899cdf0e10cSrcweir        my $styles = "";
900cdf0e10cSrcweir        if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
901cdf0e10cSrcweir        if ( $styles =~ /\bOFFICEDIRECTORY\b/ )
902cdf0e10cSrcweir        {
903cdf0e10cSrcweir            $onedir->{'HostName'} = $officedirname;
904cdf0e10cSrcweir            last;
905cdf0e10cSrcweir        }
906cdf0e10cSrcweir    }
907cdf0e10cSrcweir}
908cdf0e10cSrcweir
909cdf0e10cSrcweir################################################################################
910cdf0e10cSrcweir# Simplifying the name for language dependent items from "Name (xy)" to "Name"
911cdf0e10cSrcweir################################################################################
912cdf0e10cSrcweir
913cdf0e10cSrcweirsub changing_name_of_language_dependent_keys
914cdf0e10cSrcweir{
915cdf0e10cSrcweir    my ($itemsarrayref) = @_;
916cdf0e10cSrcweir
917cdf0e10cSrcweir    # Changing key for multilingual items from "Name ( )" to "Name" or "HostName ( )" to "HostName"
918cdf0e10cSrcweir
919cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
920cdf0e10cSrcweir    {
921cdf0e10cSrcweir        my $oneitem = ${$itemsarrayref}[$i];
922cdf0e10cSrcweir        my $onelanguage = $oneitem->{'specificlanguage'};
923cdf0e10cSrcweir
924cdf0e10cSrcweir        if (!($onelanguage eq "" ))                 # language dependent item
925cdf0e10cSrcweir        {
926cdf0e10cSrcweir            my $itemkey;
927cdf0e10cSrcweir
928cdf0e10cSrcweir            foreach $itemkey (keys %{$oneitem})
929cdf0e10cSrcweir            {
930cdf0e10cSrcweir                if ( $itemkey =~ /^\s*(\S+?)\s+\(\S+\)\s*$/ )
931cdf0e10cSrcweir                {
932cdf0e10cSrcweir                    my $newitemkey = $1;
933cdf0e10cSrcweir                    my $itemvalue = $oneitem->{$itemkey};
934cdf0e10cSrcweir                    $oneitem->{$newitemkey} = $itemvalue;
935cdf0e10cSrcweir                    delete($oneitem->{$itemkey});
936cdf0e10cSrcweir                }
937cdf0e10cSrcweir            }
938cdf0e10cSrcweir        }
939cdf0e10cSrcweir    }
940cdf0e10cSrcweir}
941cdf0e10cSrcweir
942cdf0e10cSrcweir################################################################################
943cdf0e10cSrcweir# Collecting language specific names for language packs
944cdf0e10cSrcweir################################################################################
945cdf0e10cSrcweir
946cdf0e10cSrcweirsub collect_language_specific_names
947cdf0e10cSrcweir{
948cdf0e10cSrcweir    my ($itemsarrayref) = @_;
949cdf0e10cSrcweir
950cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
951cdf0e10cSrcweir    {
952cdf0e10cSrcweir        my $oneitem = ${$itemsarrayref}[$i];
953cdf0e10cSrcweir        my $styles = "";
954cdf0e10cSrcweir        if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
955cdf0e10cSrcweir
956cdf0e10cSrcweir        if ( $styles =~ /\bUSELANGUAGENAME\b/ )
957cdf0e10cSrcweir        {
958cdf0e10cSrcweir            my $language = "";
959cdf0e10cSrcweir            if ( $oneitem->{'Language'} ) { $language = $oneitem->{'Language'}; }
960cdf0e10cSrcweir            my $specificlanguage = "";
961cdf0e10cSrcweir            if ( $oneitem->{'specificlanguage'} ) { $specificlanguage = $oneitem->{'specificlanguage'}; }
962cdf0e10cSrcweir
963cdf0e10cSrcweir            if (( $language ne "" ) && ( $language eq $specificlanguage ))
964cdf0e10cSrcweir            {
965cdf0e10cSrcweir                if (! installer::existence::exists_in_array($oneitem->{'Name'}, \@installer::globals::languagenames ))
966cdf0e10cSrcweir                {
967cdf0e10cSrcweir                    push(@installer::globals::languagenames, $oneitem->{'Name'});
968cdf0e10cSrcweir                }
969cdf0e10cSrcweir            }
970cdf0e10cSrcweir        }
971cdf0e10cSrcweir    }
972cdf0e10cSrcweir}
973cdf0e10cSrcweir
974cdf0e10cSrcweir################################################################################
975cdf0e10cSrcweir# Replacement of setup variables in ConfigurationItems and ProfileItems
976cdf0e10cSrcweir# <productkey>, <buildid>, <sequence_languages>, <productcode>, <upgradecode>, <productupdate>
977cdf0e10cSrcweir################################################################################
978cdf0e10cSrcweir
979cdf0e10cSrcweirsub replace_setup_variables
980cdf0e10cSrcweir{
981cdf0e10cSrcweir    my ($itemsarrayref, $languagestringref, $hashref) = @_;
982cdf0e10cSrcweir
983cdf0e10cSrcweir    my $languagesstring = $$languagestringref;
984cdf0e10cSrcweir    $languagesstring =~ s/\_/ /g;   # replacing underscore with whitespace
985cdf0e10cSrcweir    # $languagesstring is "01 49" instead of "en-US de"
986cdf0e10cSrcweir    installer::languages::fake_languagesstring(\$languagesstring);
987cdf0e10cSrcweir
988cdf0e10cSrcweir    my $productname = $hashref->{'PRODUCTNAME'};
989cdf0e10cSrcweir    my $productversion = $hashref->{'PRODUCTVERSION'};
990cdf0e10cSrcweir    my $userdirproductversion = "";
991cdf0e10cSrcweir    if ( $hashref->{'USERDIRPRODUCTVERSION'} ) { $userdirproductversion = $hashref->{'USERDIRPRODUCTVERSION'}; }
992cdf0e10cSrcweir    my $productkey = $productname . " " . $productversion;
993cdf0e10cSrcweir
9949f8f7bfbSAriel Constenla-Haile    my $scsrevision;
995f8d20be8SJim Jagielski    $scsrevision = "" unless ( $scsrevision = RepoRevision::DetectRevisionId(File::Spec->catfile($ENV{'SRC_ROOT'}, File::Spec->updir())) );
9968bd5297cSJürgen Schmidt
997cdf0e10cSrcweir    # string $buildid, which is used to replace the setup variable <buildid>
998cdf0e10cSrcweir
999cdf0e10cSrcweir    my $localminor = "flat";
1000cdf0e10cSrcweir    if ( $installer::globals::minor ne "" ) { $localminor = $installer::globals::minor; }
1001cdf0e10cSrcweir    else { $localminor = $installer::globals::lastminor; }
1002cdf0e10cSrcweir
1003cdf0e10cSrcweir    my $localbuild = $installer::globals::build;
1004cdf0e10cSrcweir
1005cdf0e10cSrcweir    if ( $localbuild =~ /^\s*(\w+?)(\d+)\s*$/ ) { $localbuild = $2; }   # using "680" instead of "src680"
1006cdf0e10cSrcweir
1007cdf0e10cSrcweir    my $buildidstring = $localbuild . $localminor . "(Build:" . $installer::globals::buildid . ")";
1008cdf0e10cSrcweir
1009cdf0e10cSrcweir    # the environment variable CWS_WORK_STAMP is set only in CWS
1010cdf0e10cSrcweir    if ( $ENV{'CWS_WORK_STAMP'} ) { $buildidstring = $buildidstring . "\[CWS\:" . $ENV{'CWS_WORK_STAMP'} . "\]"; }
1011cdf0e10cSrcweir
1012cdf0e10cSrcweir    if ( $localminor =~ /^\s*\w(\d+)\w*\s*$/ ) { $localminor = $1; }
1013cdf0e10cSrcweir
1014cdf0e10cSrcweir    # $updateid
1015cdf0e10cSrcweir    my $updateid = $productname . "_" . $userdirproductversion . "_" . $$languagestringref;
1016cdf0e10cSrcweir    $updateid =~ s/ /_/g;
1017cdf0e10cSrcweir
1018cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
1019cdf0e10cSrcweir    {
1020cdf0e10cSrcweir        my $oneitem = ${$itemsarrayref}[$i];
1021cdf0e10cSrcweir        my $value = $oneitem->{'Value'};
1022cdf0e10cSrcweir
1023cdf0e10cSrcweir        $value =~ s/\<buildid\>/$buildidstring/;
10249f8f7bfbSAriel Constenla-Haile        $value =~ s/\<scsrevision\>/$scsrevision/;
1025cdf0e10cSrcweir        $value =~ s/\<sequence_languages\>/$languagesstring/;
1026cdf0e10cSrcweir        $value =~ s/\<productkey\>/$productkey/;
1027cdf0e10cSrcweir        $value =~ s/\<productcode\>/$installer::globals::productcode/;
1028cdf0e10cSrcweir        $value =~ s/\<upgradecode\>/$installer::globals::upgradecode/;
1029cdf0e10cSrcweir        $value =~ s/\<alllanguages\>/$languagesstring/;
1030cdf0e10cSrcweir        $value =~ s/\<productmajor\>/$localbuild/;
1031cdf0e10cSrcweir        $value =~ s/\<productminor\>/$localminor/;
1032cdf0e10cSrcweir        $value =~ s/\<productbuildid\>/$installer::globals::buildid/;
1033cdf0e10cSrcweir        $value =~ s/\<sourceid\>/$installer::globals::build/;
1034cdf0e10cSrcweir        $value =~ s/\<updateid\>/$updateid/;
1035cdf0e10cSrcweir        $value =~ s/\<pkgformat\>/$installer::globals::packageformat/;
1036cdf0e10cSrcweir
1037cdf0e10cSrcweir        $oneitem->{'Value'} = $value;
1038cdf0e10cSrcweir    }
1039cdf0e10cSrcweir}
1040cdf0e10cSrcweir
1041cdf0e10cSrcweir################################################################################
1042cdf0e10cSrcweir# By defining variable LOCALUSERDIR in *.lst it is possible to change
1043cdf0e10cSrcweir# the standard destination of user directory defined in scp2 ($SYSUSERCONFIG).
1044cdf0e10cSrcweir################################################################################
1045cdf0e10cSrcweir
1046dba1a2e4SAndre Fischersub replace_userdir_variable ($$)
1047cdf0e10cSrcweir{
1048dba1a2e4SAndre Fischer    my ($itemsarrayref, $allvariableshashref) = @_;
1049cdf0e10cSrcweir
1050cdf0e10cSrcweir    my $userdir = "";
1051dba1a2e4SAndre Fischer    if ($allvariableshashref->{'LOCALUSERDIR'})
1052dba1a2e4SAndre Fischer    {
1053dba1a2e4SAndre Fischer        $userdir = $allvariableshashref->{'LOCALUSERDIR'};
1054dba1a2e4SAndre Fischer    }
1055dba1a2e4SAndre Fischer    else
1056dba1a2e4SAndre Fischer    {
1057dba1a2e4SAndre Fischer        $userdir = $installer::globals::simpledefaultuserdir;
1058dba1a2e4SAndre Fischer    }
1059cdf0e10cSrcweir
1060cdf0e10cSrcweir    if ($userdir ne "")
1061cdf0e10cSrcweir    {
1062dba1a2e4SAndre Fischer        foreach my $oneitem (@$itemsarrayref)
1063cdf0e10cSrcweir        {
1064cdf0e10cSrcweir            $oneitem->{'Value'} =~ s/\$SYSUSERCONFIG/$userdir/;
1065cdf0e10cSrcweir        }
1066cdf0e10cSrcweir    }
1067cdf0e10cSrcweir}
1068cdf0e10cSrcweir
1069cdf0e10cSrcweir#####################################################################################
1070cdf0e10cSrcweir# Files and ConfigurationItems are not included for all languages.
1071*c97fd792Smseidel# For instance Asian fonts. These can be removed, if no "Name" is found.
1072cdf0e10cSrcweir# ConfigurationItems are not always defined in the linguistic configuration file.
1073cdf0e10cSrcweir# The "Key" cannot be found for them.
1074cdf0e10cSrcweir#####################################################################################
1075cdf0e10cSrcweir
1076cdf0e10cSrcweirsub remove_non_existent_languages_in_productlists
1077cdf0e10cSrcweir{
1078cdf0e10cSrcweir    my ($itemsarrayref, $languagestringref, $searchkey, $itemtype) = @_;
1079cdf0e10cSrcweir
1080*c97fd792Smseidel    # Removing of all non existent files, for instance Asian fonts
1081cdf0e10cSrcweir
1082cdf0e10cSrcweir    installer::logger::include_header_into_logfile("Removing for this language $$languagestringref:");
1083cdf0e10cSrcweir
1084cdf0e10cSrcweir    my @allexistentitems = ();
1085cdf0e10cSrcweir
1086cdf0e10cSrcweir    my $infoline;
1087cdf0e10cSrcweir
1088cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
1089cdf0e10cSrcweir    {
1090cdf0e10cSrcweir        my $oneitem = ${$itemsarrayref}[$i];
1091cdf0e10cSrcweir        my $oneitemname = "";       # $searchkey is "Name" for files and "Key" for ConfigurationItems
1092cdf0e10cSrcweir
1093cdf0e10cSrcweir        if ( $oneitem->{$searchkey} ) { $oneitemname = $oneitem->{$searchkey} }
1094cdf0e10cSrcweir
1095cdf0e10cSrcweir        my $itemtoberemoved = 0;
1096cdf0e10cSrcweir
1097*c97fd792Smseidel        if ($oneitemname eq "")                     # for instance Asian font in English installation set
1098cdf0e10cSrcweir        {
1099cdf0e10cSrcweir            $itemtoberemoved = 1;
1100cdf0e10cSrcweir        }
1101cdf0e10cSrcweir
1102cdf0e10cSrcweir        if ($itemtoberemoved)
1103cdf0e10cSrcweir        {
1104b274bc22SAndre Fischer            $installer::logger::Lang->printf("WARNING: Language %s: No $itemtype packed for %s!\n",
1105b274bc22SAndre Fischer                $$languagestringref,
1106b274bc22SAndre Fischer                $oneitem->{'gid'});
1107cdf0e10cSrcweir        }
1108cdf0e10cSrcweir        else
1109cdf0e10cSrcweir        {
1110cdf0e10cSrcweir            push(@allexistentitems, $oneitem);
1111cdf0e10cSrcweir        }
1112cdf0e10cSrcweir    }
1113cdf0e10cSrcweir
1114b274bc22SAndre Fischer    $installer::logger::Lang->print("\n");
1115cdf0e10cSrcweir
1116cdf0e10cSrcweir    return \@allexistentitems;
1117cdf0e10cSrcweir}
1118cdf0e10cSrcweir
1119cdf0e10cSrcweir########################################################################
1120cdf0e10cSrcweir# Input is the directory gid, output the "HostName" of the directory
1121cdf0e10cSrcweir########################################################################
1122cdf0e10cSrcweir
1123cdf0e10cSrcweirsub get_Directoryname_From_Directorygid
1124cdf0e10cSrcweir{
1125cdf0e10cSrcweir    my ($dirsarrayref ,$searchgid, $onelanguage, $oneitemgid) = @_;
1126cdf0e10cSrcweir
1127cdf0e10cSrcweir    my $directoryname = "";
1128cdf0e10cSrcweir    my $onedirectory;
1129cdf0e10cSrcweir    my $foundgid = 0;
1130cdf0e10cSrcweir
1131cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$dirsarrayref}; $i++ )
1132cdf0e10cSrcweir    {
1133cdf0e10cSrcweir        $onedirectory = ${$dirsarrayref}[$i];
1134cdf0e10cSrcweir        my $directorygid = $onedirectory->{'gid'};
1135cdf0e10cSrcweir
1136cdf0e10cSrcweir        if ($directorygid eq $searchgid)
1137cdf0e10cSrcweir        {
1138cdf0e10cSrcweir            $foundgid = 1;
1139cdf0e10cSrcweir            last;
1140cdf0e10cSrcweir        }
1141cdf0e10cSrcweir    }
1142cdf0e10cSrcweir
1143cdf0e10cSrcweir    if (!($foundgid))
1144cdf0e10cSrcweir    {
1145cdf0e10cSrcweir        installer::exiter::exit_program("ERROR: Gid $searchgid not defined in $installer::globals::setupscriptname", "get_Directoryname_From_Directorygid");
1146cdf0e10cSrcweir    }
1147cdf0e10cSrcweir
1148cdf0e10cSrcweir    if ( ! ( $onedirectory->{'ismultilingual'} ))   # the directory is not language dependent
1149cdf0e10cSrcweir    {
1150cdf0e10cSrcweir        $directoryname = $onedirectory->{'HostName'};
1151cdf0e10cSrcweir    }
1152cdf0e10cSrcweir    else
1153cdf0e10cSrcweir    {
1154cdf0e10cSrcweir        $directoryname = $onedirectory->{"HostName ($onelanguage)"};
1155cdf0e10cSrcweir    }
1156cdf0e10cSrcweir
1157cdf0e10cSrcweir    # gid_Dir_Template_Wizard_Letter is defined as language dependent directory, but the file gid_Dir_Template_Wizard_Letter
1158cdf0e10cSrcweir    # is not language dependent. Therefore $onelanguage is not defined. But which language is the correct language for the
1159cdf0e10cSrcweir    # directory?
1160cdf0e10cSrcweir    # Perhaps better solution: In scp it must be forbidden to have a language independent file in a language dependent directory.
1161cdf0e10cSrcweir
1162cdf0e10cSrcweir    if (( ! $directoryname ) && ( $onelanguage eq "" ))
1163cdf0e10cSrcweir    {
1164cdf0e10cSrcweir        installer::exiter::exit_program("ERROR (in scp): Directory $searchgid is language dependent, but not $oneitemgid inside this directory", "get_Directoryname_From_Directorygid");
1165cdf0e10cSrcweir    }
1166cdf0e10cSrcweir
1167cdf0e10cSrcweir    return \$directoryname;
1168cdf0e10cSrcweir}
1169cdf0e10cSrcweir
1170cdf0e10cSrcweir##################################################################
1171010ec03aSHerbert Dürr# Getting destination directory for links, files and profiles
1172cdf0e10cSrcweir##################################################################
1173cdf0e10cSrcweir
1174cdf0e10cSrcweirsub get_Destination_Directory_For_Item_From_Directorylist       # this is used for Files, Profiles and Links
1175cdf0e10cSrcweir{
1176cdf0e10cSrcweir    my ($itemarrayref, $dirsarrayref) = @_;
1177cdf0e10cSrcweir
1178cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemarrayref}; $i++ )
1179cdf0e10cSrcweir    {
1180cdf0e10cSrcweir        my $oneitem = ${$itemarrayref}[$i];
1181cdf0e10cSrcweir        my $oneitemgid = $oneitem->{'gid'};
1182cdf0e10cSrcweir        my $directorygid = $oneitem->{'Dir'};       # for instance gid_Dir_Program
1183cdf0e10cSrcweir        my $netdirectorygid = "";
1184cdf0e10cSrcweir        my $onelanguage = $oneitem->{'specificlanguage'};
1185cdf0e10cSrcweir        my $ispredefinedprogdir = 0;
1186cdf0e10cSrcweir        my $ispredefinedconfigdir = 0;
1187cdf0e10cSrcweir
1188cdf0e10cSrcweir        my $oneitemname = $oneitem->{'Name'};
1189cdf0e10cSrcweir
1190cdf0e10cSrcweir        if ( $oneitem->{'NetDir'} ) { $netdirectorygid = $oneitem->{'NetDir'}; }
1191cdf0e10cSrcweir
1192cdf0e10cSrcweir        installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$oneitemname);    # making /registry/schema/org/openoffice/VCL.xcs to VCL.xcs
1193cdf0e10cSrcweir
1194cdf0e10cSrcweir        my $searchdirgid;
1195cdf0e10cSrcweir
1196cdf0e10cSrcweir        if ( $netdirectorygid eq "" )   # if NetDir is defined, it is privileged
1197cdf0e10cSrcweir        {
1198cdf0e10cSrcweir            $searchdirgid = $directorygid
1199cdf0e10cSrcweir        }
1200cdf0e10cSrcweir        else
1201cdf0e10cSrcweir        {
1202cdf0e10cSrcweir            $searchdirgid = $netdirectorygid
1203cdf0e10cSrcweir        }
1204cdf0e10cSrcweir
1205cdf0e10cSrcweir        if ($searchdirgid =~ /PREDEFINED_PROGDIR/)  # the root directory is not defined in setup script
1206cdf0e10cSrcweir        {
1207cdf0e10cSrcweir            $ispredefinedprogdir = 1;
1208cdf0e10cSrcweir        }
1209cdf0e10cSrcweir
1210cdf0e10cSrcweir        if ($searchdirgid =~ /PREDEFINED_CONFIGDIR/)    # the root directory is not defined in setup script
1211cdf0e10cSrcweir        {
1212cdf0e10cSrcweir            $ispredefinedconfigdir = 1;
1213cdf0e10cSrcweir        }
1214cdf0e10cSrcweir
1215cdf0e10cSrcweir        my $destfilename;
1216cdf0e10cSrcweir
1217cdf0e10cSrcweir        if ((!( $ispredefinedprogdir )) && (!( $ispredefinedconfigdir )))
1218cdf0e10cSrcweir        {
1219cdf0e10cSrcweir            my $directorynameref = get_Directoryname_From_Directorygid($dirsarrayref, $searchdirgid, $onelanguage, $oneitemgid);
1220cdf0e10cSrcweir            $destfilename = $$directorynameref . $installer::globals::separator . $oneitemname;
1221cdf0e10cSrcweir        }
1222cdf0e10cSrcweir        else
1223cdf0e10cSrcweir        {
1224cdf0e10cSrcweir            $destfilename = $oneitemname;
1225cdf0e10cSrcweir        }
1226cdf0e10cSrcweir
1227cdf0e10cSrcweir        $oneitem->{'destination'} = $destfilename;
1228cdf0e10cSrcweir    }
1229cdf0e10cSrcweir}
1230cdf0e10cSrcweir
1231cdf0e10cSrcweir##########################################################################
123286e1cf34SPedro Giffuni# Searching a file in a list of paths
1233cdf0e10cSrcweir##########################################################################
1234cdf0e10cSrcweir
1235cdf0e10cSrcweirsub get_sourcepath_from_filename_and_includepath_classic
1236cdf0e10cSrcweir{
1237cdf0e10cSrcweir    my ($searchfilenameref, $includepatharrayref, $write_logfile) = @_;
1238cdf0e10cSrcweir
1239cdf0e10cSrcweir    my ($onefile, $includepath, $infoline);
1240cdf0e10cSrcweir
1241cdf0e10cSrcweir    my $foundsourcefile = 0;
1242cdf0e10cSrcweir
1243cdf0e10cSrcweir    for ( my $j = 0; $j <= $#{$includepatharrayref}; $j++ )
1244cdf0e10cSrcweir    {
1245cdf0e10cSrcweir        $includepath = ${$includepatharrayref}[$j];
1246cdf0e10cSrcweir        installer::remover::remove_leading_and_ending_whitespaces(\$includepath);
1247cdf0e10cSrcweir
1248cdf0e10cSrcweir        $onefile = $includepath . $installer::globals::separator . $$searchfilenameref;
1249cdf0e10cSrcweir
1250cdf0e10cSrcweir        if ( -f $onefile )
1251cdf0e10cSrcweir        {
1252cdf0e10cSrcweir            $foundsourcefile = 1;
1253cdf0e10cSrcweir            last;
1254cdf0e10cSrcweir        }
1255cdf0e10cSrcweir    }
1256cdf0e10cSrcweir
1257cdf0e10cSrcweir    if (!($foundsourcefile))
1258cdf0e10cSrcweir    {
1259cdf0e10cSrcweir        $onefile = "";  # the sourcepath has to be empty
1260cdf0e10cSrcweir        if ( $write_logfile)
1261cdf0e10cSrcweir        {
1262cdf0e10cSrcweir            if ( $ENV{'DEFAULT_TO_ENGLISH_FOR_PACKING'} )
1263cdf0e10cSrcweir            {
1264cdf0e10cSrcweir                $infoline = "WARNING: Source for $$searchfilenameref not found!\n";  # Important message in log file
1265cdf0e10cSrcweir            }
1266cdf0e10cSrcweir            else
1267cdf0e10cSrcweir            {
1268cdf0e10cSrcweir                $infoline = "ERROR: Source for $$searchfilenameref not found!\n";    # Important message in log file
1269cdf0e10cSrcweir            }
1270cdf0e10cSrcweir
1271b274bc22SAndre Fischer            $installer::logger::Lang->printf($infoline);
1272cdf0e10cSrcweir        }
1273cdf0e10cSrcweir    }
1274cdf0e10cSrcweir    else
1275cdf0e10cSrcweir    {
1276cdf0e10cSrcweir        if ( $write_logfile)
1277cdf0e10cSrcweir        {
1278b274bc22SAndre Fischer            $installer::logger::Lang->printf("SUCCESS: Source for %s: %s\n",
1279b274bc22SAndre Fischer                $$searchfilenameref,
1280b274bc22SAndre Fischer                $onefile);
1281cdf0e10cSrcweir        }
1282cdf0e10cSrcweir    }
1283cdf0e10cSrcweir
1284cdf0e10cSrcweir    return \$onefile;
1285cdf0e10cSrcweir}
1286cdf0e10cSrcweir
1287cdf0e10cSrcweir##########################################################################
1288cdf0e10cSrcweir# Input is one file name, output the complete absolute path of this file
1289cdf0e10cSrcweir##########################################################################
1290cdf0e10cSrcweir
1291cdf0e10cSrcweirsub get_sourcepath_from_filename_and_includepath
1292cdf0e10cSrcweir{
1293cdf0e10cSrcweir    my ($searchfilenameref, $unused, $write_logfile) = @_;
1294cdf0e10cSrcweir
1295cdf0e10cSrcweir    my ($onefile, $includepath, $infoline);
1296cdf0e10cSrcweir
1297cdf0e10cSrcweir    my $foundsourcefile = 0;
1298cdf0e10cSrcweir    my $foundnewname = 0;
1299cdf0e10cSrcweir
1300cdf0e10cSrcweir    for ( my $j = 0; $j <= $#installer::globals::allincludepathes; $j++ )
1301cdf0e10cSrcweir    {
1302cdf0e10cSrcweir        my $allfiles = $installer::globals::allincludepathes[$j];
1303cdf0e10cSrcweir
1304cdf0e10cSrcweir        if ( exists( $allfiles->{$$searchfilenameref} ))
1305cdf0e10cSrcweir        {
1306cdf0e10cSrcweir            $onefile = $allfiles->{'includepath'} . $installer::globals::separator . $$searchfilenameref;
1307cdf0e10cSrcweir            $foundsourcefile = 1;
1308cdf0e10cSrcweir            last;
1309cdf0e10cSrcweir        }
1310cdf0e10cSrcweir    }
1311cdf0e10cSrcweir
1312cdf0e10cSrcweir    if (!($foundsourcefile))    # testing with lowercase filename
1313cdf0e10cSrcweir    {
1314cdf0e10cSrcweir        # Attention: README01.html is copied for Windows to readme01.html, not case sensitive
1315cdf0e10cSrcweir
1316cdf0e10cSrcweir        for ( my $j = 0; $j <= $#installer::globals::allincludepathes; $j++ )
1317cdf0e10cSrcweir        {
1318cdf0e10cSrcweir            my $allfiles = $installer::globals::allincludepathes[$j];
1319cdf0e10cSrcweir
1320cdf0e10cSrcweir            my $newfilename = $$searchfilenameref;
1321cdf0e10cSrcweir            $newfilename =~ s/readme/README/;       # special handling for readme files
1322cdf0e10cSrcweir            $newfilename =~ s/license/LICENSE/;     # special handling for license files
1323cdf0e10cSrcweir
1324cdf0e10cSrcweir            if ( exists( $allfiles->{$newfilename} ))
1325cdf0e10cSrcweir            {
1326cdf0e10cSrcweir                $onefile = $allfiles->{'includepath'} . $installer::globals::separator . $newfilename;
1327cdf0e10cSrcweir                $foundsourcefile = 1;
1328cdf0e10cSrcweir                $foundnewname = 1;
1329cdf0e10cSrcweir                last;
1330cdf0e10cSrcweir            }
1331cdf0e10cSrcweir        }
1332cdf0e10cSrcweir    }
1333cdf0e10cSrcweir
1334cdf0e10cSrcweir    if (!($foundsourcefile))
1335cdf0e10cSrcweir    {
1336cdf0e10cSrcweir        $onefile = "";  # the sourcepath has to be empty
1337cdf0e10cSrcweir        if ( $write_logfile)
1338cdf0e10cSrcweir        {
1339cdf0e10cSrcweir            if ( $ENV{'DEFAULT_TO_ENGLISH_FOR_PACKING'} )
1340cdf0e10cSrcweir            {
1341cdf0e10cSrcweir                $infoline = "WARNING: Source for $$searchfilenameref not found!\n";  # Important message in log file
1342cdf0e10cSrcweir            }
1343cdf0e10cSrcweir            else
1344cdf0e10cSrcweir            {
1345cdf0e10cSrcweir                $infoline = "ERROR: Source for $$searchfilenameref not found!\n";    # Important message in log file
1346cdf0e10cSrcweir            }
1347cdf0e10cSrcweir
1348b274bc22SAndre Fischer            $installer::logger::Lang->printf($infoline);
1349cdf0e10cSrcweir        }
1350cdf0e10cSrcweir    }
1351cdf0e10cSrcweir    else
1352cdf0e10cSrcweir    {
1353cdf0e10cSrcweir        if ( $write_logfile)
1354cdf0e10cSrcweir        {
1355cdf0e10cSrcweir            if (!($foundnewname))
1356cdf0e10cSrcweir            {
1357cdf0e10cSrcweir                $infoline = "SUCCESS: Source for $$searchfilenameref: $onefile\n";
1358cdf0e10cSrcweir            }
1359cdf0e10cSrcweir            else
1360cdf0e10cSrcweir            {
1361cdf0e10cSrcweir                $infoline = "SUCCESS/WARNING: Special handling for $$searchfilenameref: $onefile\n";
1362cdf0e10cSrcweir            }
1363b274bc22SAndre Fischer            $installer::logger::Lang->printf($infoline);
1364cdf0e10cSrcweir        }
1365cdf0e10cSrcweir    }
1366cdf0e10cSrcweir
1367cdf0e10cSrcweir    return \$onefile;
1368cdf0e10cSrcweir}
1369cdf0e10cSrcweir
1370cdf0e10cSrcweir##############################################################
1371cdf0e10cSrcweir# Determining, whether a specified directory is language
1372cdf0e10cSrcweir# dependent
1373cdf0e10cSrcweir##############################################################
1374cdf0e10cSrcweir
1375cdf0e10cSrcweirsub determine_directory_language_dependency
1376cdf0e10cSrcweir{
1377cdf0e10cSrcweir    my($directorygid, $dirsref) = @_;
1378cdf0e10cSrcweir
1379cdf0e10cSrcweir    my $is_multilingual = 0;
1380cdf0e10cSrcweir
1381cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
1382cdf0e10cSrcweir    {
1383cdf0e10cSrcweir        my $onedir = ${$dirsref}[$i];
1384cdf0e10cSrcweir        my $gid = $onedir->{'gid'};
1385cdf0e10cSrcweir
1386cdf0e10cSrcweir        if ( $gid eq $directorygid )
1387cdf0e10cSrcweir        {
1388cdf0e10cSrcweir            $is_multilingual = $onedir->{'ismultilingual'};
1389cdf0e10cSrcweir            last;
1390cdf0e10cSrcweir        }
1391cdf0e10cSrcweir    }
1392cdf0e10cSrcweir
1393cdf0e10cSrcweir    return $is_multilingual;
1394cdf0e10cSrcweir}
1395cdf0e10cSrcweir
1396cdf0e10cSrcweir##############################################################
139786e1cf34SPedro Giffuni# Getting all source paths for all files to be packed
1398cdf0e10cSrcweir# $item can be "Files" or "ScpActions"
1399cdf0e10cSrcweir##############################################################
1400cdf0e10cSrcweir
1401cdf0e10cSrcweirsub get_Source_Directory_For_Files_From_Includepathlist
1402cdf0e10cSrcweir{
1403cdf0e10cSrcweir    my ($filesarrayref, $includepatharrayref, $dirsref, $item) = @_;
1404cdf0e10cSrcweir
1405cdf0e10cSrcweir    installer::logger::include_header_into_logfile("$item:");
1406cdf0e10cSrcweir
1407cdf0e10cSrcweir    my $infoline = "";
1408cdf0e10cSrcweir
1409cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
1410cdf0e10cSrcweir    {
1411cdf0e10cSrcweir        my $onefile = ${$filesarrayref}[$i];
1412cdf0e10cSrcweir        my $onelanguage = $onefile->{'specificlanguage'};
1413cdf0e10cSrcweir
1414cdf0e10cSrcweir        if ( ! $onefile->{'Name'} ) { installer::exiter::exit_program("ERROR: $item without name ! GID: $onefile->{'gid'} ! Language: $onelanguage", "get_Source_Directory_For_Files_From_Includepathlist"); }
1415cdf0e10cSrcweir
1416cdf0e10cSrcweir        my $onefilename = $onefile->{'Name'};
1417cdf0e10cSrcweir        if ( $item eq "ScpActions" ) { $onefilename =~ s/\//$installer::globals::separator/g; }
1418cdf0e10cSrcweir        $onefilename =~ s/^\s*\Q$installer::globals::separator\E//;     # filename begins with a slash, for instance /registry/schema/org/openoffice/VCL.xcs
1419cdf0e10cSrcweir
1420cdf0e10cSrcweir        my $styles = "";
1421cdf0e10cSrcweir        my $file_can_miss = 0;
1422cdf0e10cSrcweir        if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
1423cdf0e10cSrcweir        if ( $styles =~ /\bFILE_CAN_MISS\b/ ) { $file_can_miss = 1; }
1424cdf0e10cSrcweir
1425cdf0e10cSrcweir        if (( $installer::globals::languagepack ) && ( ! $onefile->{'ismultilingual'} ) && ( ! ( $styles =~ /\bFORCELANGUAGEPACK\b/ ))) { $file_can_miss = 1; }
1426cdf0e10cSrcweir
1427cdf0e10cSrcweir        my $sourcepathref = "";
1428cdf0e10cSrcweir
1429cdf0e10cSrcweir        if ( $file_can_miss ) { $sourcepathref = get_sourcepath_from_filename_and_includepath(\$onefilename, $includepatharrayref, 0); }
1430cdf0e10cSrcweir        else { $sourcepathref = get_sourcepath_from_filename_and_includepath(\$onefilename, $includepatharrayref, 1); }
1431cdf0e10cSrcweir
1432cdf0e10cSrcweir        $onefile->{'sourcepath'} = $$sourcepathref; # This $$sourcepathref is empty, if no source was found
1433cdf0e10cSrcweir
1434*c97fd792Smseidel        # defaulting to English for multilingual files if DEFAULT_TO_ENGLISH_FOR_PACKING is set
1435cdf0e10cSrcweir
1436cdf0e10cSrcweir        if ( $ENV{'DEFAULT_TO_ENGLISH_FOR_PACKING'} )
1437cdf0e10cSrcweir        {
1438cdf0e10cSrcweir            if (( ! $onefile->{'sourcepath'} ) && ( $onefile->{'ismultilingual'} ))
1439cdf0e10cSrcweir            {
1440cdf0e10cSrcweir                my $oldname = $onefile->{'Name'};
1441cdf0e10cSrcweir                my $oldlanguage = $onefile->{'specificlanguage'};
1442cdf0e10cSrcweir                my $newlanguage = "en-US";
1443cdf0e10cSrcweir                # $onefile->{'Name'} =~ s/$oldlanguage\./$newlanguage\./;   # Example: tplwizfax_it.zip -> tplwizfax_en-US.zip
1444cdf0e10cSrcweir                $onefilename = $onefile->{'Name'};
1445cdf0e10cSrcweir                $onefilename =~ s/$oldlanguage\./$newlanguage\./;   # Example: tplwizfax_it.zip -> tplwizfax_en-US.zip
1446cdf0e10cSrcweir                $onefilename =~ s/^\s*\Q$installer::globals::separator\E//;     # filename begins with a slash, for instance /registry/schema/org/openoffice/VCL.xcs
1447cdf0e10cSrcweir                $sourcepathref = get_sourcepath_from_filename_and_includepath(\$onefilename, $includepatharrayref, 1);
1448cdf0e10cSrcweir                $onefile->{'sourcepath'} = $$sourcepathref;                     # This $$sourcepathref is empty, if no source was found
1449cdf0e10cSrcweir
1450*c97fd792Smseidel                if ($onefile->{'sourcepath'})   # defaulting to English was successful
1451cdf0e10cSrcweir                {
1452b274bc22SAndre Fischer                    $installer::logger::Lang->printf("WARNING: Using %s instead of %s\n", $onefilename, $oldname);
1453b274bc22SAndre Fischer                    $installer::logger::Info->printf("WARNING: Using %s instead of %s\n", $onefilename, $oldname);
1454cdf0e10cSrcweir                    # if ( $onefile->{'destination'} ) { $onefile->{'destination'} =~ s/\Q$oldname\E/$onefile->{'Name'}/; }
1455cdf0e10cSrcweir
1456cdf0e10cSrcweir                    # If the directory, in which the new file is installed, is not language dependent,
1457cdf0e10cSrcweir                    # the filename has to be changed to avoid installation conflicts
1458cdf0e10cSrcweir                    # No mechanism for resource files!
1459cdf0e10cSrcweir                    # -> implementing for the content of ARCHIVE files
1460cdf0e10cSrcweir
1461cdf0e10cSrcweir                    if ( $onefile->{'Styles'} =~ /\bARCHIVE\b/ )
1462cdf0e10cSrcweir                    {
1463cdf0e10cSrcweir                        my $directorygid = $onefile->{'Dir'};
1464cdf0e10cSrcweir                        my $islanguagedependent = determine_directory_language_dependency($directorygid, $dirsref);
1465cdf0e10cSrcweir
1466cdf0e10cSrcweir                        if ( ! $islanguagedependent )
1467cdf0e10cSrcweir                        {
1468cdf0e10cSrcweir                            $onefile->{'Styles'} =~ s/\bARCHIVE\b/ARCHIVE, RENAME_TO_LANGUAGE/; # Setting new flag RENAME_TO_LANGUAGE
1469b274bc22SAndre Fischer                            $installer::logger::Lang->printf(
1470b274bc22SAndre Fischer                                "Setting flag RENAME_TO_LANGUAGE: File %s in directory: %s\n",
1471b274bc22SAndre Fischer                                $onefile->{'Name'},
1472b274bc22SAndre Fischer                                $directorygid);
1473cdf0e10cSrcweir                        }
1474cdf0e10cSrcweir                    }
1475cdf0e10cSrcweir                }
1476cdf0e10cSrcweir                else
1477cdf0e10cSrcweir                {
1478b274bc22SAndre Fischer                    $installer::logger::Lang->printf("WARNING: Using %s instead of %s was not successful\n",
1479b274bc22SAndre Fischer                        $onefile->{'Name'}, $oldname);
1480cdf0e10cSrcweir                    $onefile->{'Name'} = $oldname;  # Switching back to old file name
1481cdf0e10cSrcweir                }
1482cdf0e10cSrcweir            }
1483cdf0e10cSrcweir        }
1484cdf0e10cSrcweir    }
1485cdf0e10cSrcweir
1486b274bc22SAndre Fischer    # empty line after listing of all files
1487b274bc22SAndre Fischer    $installer::logger::Lang->printf("\n");
1488cdf0e10cSrcweir}
1489cdf0e10cSrcweir
1490cdf0e10cSrcweir#################################################################################
1491cdf0e10cSrcweir# Removing files, that shall not be included into languagepacks
1492cdf0e10cSrcweir# (because of rpm conflicts)
1493cdf0e10cSrcweir#################################################################################
1494cdf0e10cSrcweir
1495cdf0e10cSrcweirsub remove_Files_For_Languagepacks
1496cdf0e10cSrcweir{
1497cdf0e10cSrcweir    my ($itemsarrayref) = @_;
1498cdf0e10cSrcweir
1499cdf0e10cSrcweir    my $infoline;
1500cdf0e10cSrcweir
1501cdf0e10cSrcweir    my @newitemsarray = ();
1502cdf0e10cSrcweir
1503cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
1504cdf0e10cSrcweir    {
1505cdf0e10cSrcweir        my $oneitem = ${$itemsarrayref}[$i];
1506cdf0e10cSrcweir        my $gid = $oneitem->{'gid'};
1507cdf0e10cSrcweir
1508cdf0e10cSrcweir        # scp Todo: Remove asap after removal of old setup
1509cdf0e10cSrcweir
1510cdf0e10cSrcweir        if (( $gid eq "gid_File_Extra_Fontunxpsprint" ) ||
1511cdf0e10cSrcweir            ( $gid eq "gid_File_Extra_Migration_Lang" ))
1512cdf0e10cSrcweir        {
1513b274bc22SAndre Fischer            $installer::logger::Lang->printf("ATTENTION: Removing item %s from the installation set.\n",
1514b274bc22SAndre Fischer                $oneitem->{'gid'},);
1515cdf0e10cSrcweir
1516cdf0e10cSrcweir            next;
1517cdf0e10cSrcweir        }
1518cdf0e10cSrcweir
1519cdf0e10cSrcweir        push(@newitemsarray, $oneitem);
1520cdf0e10cSrcweir    }
1521cdf0e10cSrcweir
1522cdf0e10cSrcweir    return \@newitemsarray;
1523cdf0e10cSrcweir}
1524cdf0e10cSrcweir
1525cdf0e10cSrcweir#################################################################################
1526cdf0e10cSrcweir# Files, whose source directory is not found, are removed now (this is an ERROR)
1527cdf0e10cSrcweir#################################################################################
1528cdf0e10cSrcweir
1529cdf0e10cSrcweirsub remove_Files_Without_Sourcedirectory
1530cdf0e10cSrcweir{
1531cdf0e10cSrcweir    my ($filesarrayref) = @_;
1532cdf0e10cSrcweir
1533cdf0e10cSrcweir    my $infoline;
1534cdf0e10cSrcweir
1535cdf0e10cSrcweir    my $error_occured = 0;
1536cdf0e10cSrcweir    my @missingfiles = ();
1537cdf0e10cSrcweir    push(@missingfiles, "ERROR: The following files could not be found: \n");
1538cdf0e10cSrcweir
1539cdf0e10cSrcweir    my @newfilesarray = ();
1540cdf0e10cSrcweir
1541cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
1542cdf0e10cSrcweir    {
1543cdf0e10cSrcweir        my $onefile = ${$filesarrayref}[$i];
1544cdf0e10cSrcweir        my $sourcepath = $onefile->{'sourcepath'};
1545cdf0e10cSrcweir
1546cdf0e10cSrcweir        if ($sourcepath eq "")
1547cdf0e10cSrcweir        {
1548cdf0e10cSrcweir            my $styles = $onefile->{'Styles'};
1549cdf0e10cSrcweir            my $filename = $onefile->{'Name'};
1550cdf0e10cSrcweir
1551cdf0e10cSrcweir            if ( ! $installer::globals::languagepack )
1552cdf0e10cSrcweir            {
1553b274bc22SAndre Fischer                $installer::logger::Lang->printf("ERROR: No sourcepath -> Removing file %s from file list.\n",
1554b274bc22SAndre Fischer                    $filename);
1555cdf0e10cSrcweir
1556cdf0e10cSrcweir                push(@missingfiles, "ERROR: File not found: $filename\n");
1557cdf0e10cSrcweir                $error_occured = 1;
1558cdf0e10cSrcweir
1559cdf0e10cSrcweir                next;   # removing this file from list, if sourcepath is empty
1560cdf0e10cSrcweir            }
1561cdf0e10cSrcweir            else # special case for language packs
1562cdf0e10cSrcweir            {
1563cdf0e10cSrcweir                if (( $onefile->{'ismultilingual'} ) || ( $styles =~ /\bFORCELANGUAGEPACK\b/ ))
1564cdf0e10cSrcweir                {
1565b274bc22SAndre Fischer                    $installer::logger::Lang->printf("ERROR: Removing file %s from file list.\n", $filename);
1566cdf0e10cSrcweir
1567cdf0e10cSrcweir                    push(@missingfiles, "ERROR: File not found: $filename\n");
1568cdf0e10cSrcweir                    $error_occured = 1;
1569cdf0e10cSrcweir
1570cdf0e10cSrcweir                    next;   # removing this file from list, if sourcepath is empty
1571cdf0e10cSrcweir                }
1572cdf0e10cSrcweir                else
1573cdf0e10cSrcweir                {
1574b274bc22SAndre Fischer                    $installer::logger::Lang->printf(
1575b274bc22SAndre Fischer                        "INFO: Removing file %s from file list. It is not language dependent.\n",
1576b274bc22SAndre Fischer                        $filename);
1577b274bc22SAndre Fischer                    $installer::logger::Lang->printf(
1578b274bc22SAndre Fischer                        "INFO: It is not language dependent and can be ignored in language packs.\n");
1579cdf0e10cSrcweir
1580cdf0e10cSrcweir                    next;   # removing this file from list, if sourcepath is empty
1581cdf0e10cSrcweir                }
1582cdf0e10cSrcweir            }
1583cdf0e10cSrcweir        }
1584cdf0e10cSrcweir
1585cdf0e10cSrcweir        push(@newfilesarray, $onefile);
1586cdf0e10cSrcweir    }
1587cdf0e10cSrcweir
1588b274bc22SAndre Fischer    $installer::logger::Lang->printf("\n");
1589cdf0e10cSrcweir
1590cdf0e10cSrcweir    if ( $error_occured )
1591cdf0e10cSrcweir    {
1592cdf0e10cSrcweir        for ( my $i = 0; $i <= $#missingfiles; $i++ ) { print "$missingfiles[$i]"; }
1593cdf0e10cSrcweir        installer::exiter::exit_program("ERROR: Missing files", "remove_Files_Without_Sourcedirectory");
1594cdf0e10cSrcweir    }
1595cdf0e10cSrcweir
1596cdf0e10cSrcweir    return \@newfilesarray;
1597cdf0e10cSrcweir}
1598cdf0e10cSrcweir
1599cdf0e10cSrcweir############################################################################
1600cdf0e10cSrcweir# License and Readme files in the default language have to be installed
1601cdf0e10cSrcweir# in the directory with flag OFFICEDIRECTORY. If this is not defined
1602cdf0e10cSrcweir# they have to be installed in the installation root.
1603cdf0e10cSrcweir############################################################################
1604cdf0e10cSrcweir
1605cdf0e10cSrcweirsub get_office_directory_gid_and_hostname
1606cdf0e10cSrcweir{
1607cdf0e10cSrcweir    my ($dirsarrayref) = @_;
1608cdf0e10cSrcweir
1609cdf0e10cSrcweir    my $foundofficedir = 0;
1610cdf0e10cSrcweir    my $gid = "";
1611cdf0e10cSrcweir    my $hostname = "";
1612cdf0e10cSrcweir
1613cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$dirsarrayref}; $i++ )
1614cdf0e10cSrcweir    {
1615cdf0e10cSrcweir        my $onedir = ${$dirsarrayref}[$i];
1616cdf0e10cSrcweir        if ( $onedir->{'Styles'} )
1617cdf0e10cSrcweir        {
1618cdf0e10cSrcweir            my $styles = $onedir->{'Styles'};
1619cdf0e10cSrcweir
1620cdf0e10cSrcweir            if ( $styles =~ /\bOFFICEDIRECTORY\b/ )
1621cdf0e10cSrcweir            {
1622cdf0e10cSrcweir                $foundofficedir = 1;
1623cdf0e10cSrcweir                $gid = $onedir->{'gid'};
1624cdf0e10cSrcweir                $hostname = $onedir->{'HostName'};
1625cdf0e10cSrcweir                last;
1626cdf0e10cSrcweir            }
1627cdf0e10cSrcweir        }
1628cdf0e10cSrcweir    }
1629cdf0e10cSrcweir
1630cdf0e10cSrcweir    return ($foundofficedir, $gid, $hostname);
1631cdf0e10cSrcweir}
1632cdf0e10cSrcweir
1633cdf0e10cSrcweir############################################################################
1634cdf0e10cSrcweir# License and Readme files in the default language have to be installed
1635cdf0e10cSrcweir# in the installation root (next to the program dir). This is in scp
1636cdf0e10cSrcweir# project done by a post install basic script
1637cdf0e10cSrcweir############################################################################
1638cdf0e10cSrcweir
1639cdf0e10cSrcweirsub add_License_Files_into_Installdir
1640cdf0e10cSrcweir{
1641cdf0e10cSrcweir    my ($filesarrayref, $dirsarrayref, $languagesarrayref) = @_;
1642cdf0e10cSrcweir
1643cdf0e10cSrcweir    my $infoline;
1644cdf0e10cSrcweir
1645cdf0e10cSrcweir    my @newfilesarray = ();
1646cdf0e10cSrcweir
1647cdf0e10cSrcweir    my $defaultlanguage = installer::languages::get_default_language($languagesarrayref);
1648cdf0e10cSrcweir
1649cdf0e10cSrcweir    my ($foundofficedir, $officedirectorygid, $officedirectoryhostname) = get_office_directory_gid_and_hostname($dirsarrayref);
1650cdf0e10cSrcweir
1651cdf0e10cSrcweir    # copy all files from directory share/readme, that contain the default language in their name
1652cdf0e10cSrcweir    # without default language into the installation root. This makes the settings of the correct
1653cdf0e10cSrcweir    # file names superfluous. On the other hand this requires a dependency to the directory
1654cdf0e10cSrcweir    # share/readme
1655cdf0e10cSrcweir
1656cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
1657cdf0e10cSrcweir    {
1658cdf0e10cSrcweir        my $onefile = ${$filesarrayref}[$i];
1659cdf0e10cSrcweir        my $destination = $onefile->{'destination'};
1660cdf0e10cSrcweir        my $styles = "";
1661cdf0e10cSrcweir        if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
1662cdf0e10cSrcweir
1663cdf0e10cSrcweir        if ( ( $destination =~ /share\Q$installer::globals::separator\Ereadme\Q$installer::globals::separator\E(\w+?)_?$defaultlanguage\.?(\w*)\s*/ )
1664cdf0e10cSrcweir            || (( $styles =~ /\bROOTLICENSEFILE\b/ ) && ( $destination =~ /\Q$installer::globals::separator\E?(\w+?)_?$defaultlanguage\.?(\w*?)\s*$/ )) )
1665cdf0e10cSrcweir        {
1666cdf0e10cSrcweir            my $filename = $1;
1667cdf0e10cSrcweir            my $extension = $2;
1668cdf0e10cSrcweir
1669cdf0e10cSrcweir            my $newfilename;
1670cdf0e10cSrcweir
1671cdf0e10cSrcweir            if ( $extension eq "" ) { $newfilename = $filename; }
1672cdf0e10cSrcweir            else { $newfilename = $filename . "\." . $extension; }
1673cdf0e10cSrcweir
1674cdf0e10cSrcweir            my %newfile = ();
1675cdf0e10cSrcweir            my $newfile = \%newfile;
1676cdf0e10cSrcweir
1677cdf0e10cSrcweir            installer::converter::copy_item_object($onefile, $newfile);
1678cdf0e10cSrcweir
1679cdf0e10cSrcweir            $newfile->{'gid'} = $onefile->{'gid'} . "_Copy";
1680cdf0e10cSrcweir            $newfile->{'Name'} = $newfilename;
1681cdf0e10cSrcweir            $newfile->{'ismultilingual'} = "0";
1682cdf0e10cSrcweir            $newfile->{'specificlanguage'} = "";
1683cdf0e10cSrcweir            $newfile->{'haslanguagemodule'} = "0";
1684cdf0e10cSrcweir
1685cdf0e10cSrcweir            if ( defined $newfile->{'InstallName'} )
1686cdf0e10cSrcweir            {
1687cdf0e10cSrcweir                if ( $newfile->{'InstallName'} =~ /^\s*(.*?)_$defaultlanguage\.?(\w*?)\s*$/ )
1688cdf0e10cSrcweir                {
1689cdf0e10cSrcweir                    my $localfilename = $1;
1690cdf0e10cSrcweir                    my $localextension = $2;
1691cdf0e10cSrcweir
1692cdf0e10cSrcweir                    if ( $localextension eq "" ) { $newfile->{'InstallName'} = $localfilename; }
1693cdf0e10cSrcweir                    else { $newfile->{'InstallName'} = $localfilename . "\." . $localextension; }
1694cdf0e10cSrcweir                }
1695cdf0e10cSrcweir            }
1696cdf0e10cSrcweir
1697cdf0e10cSrcweir            $newfile->{'removelangfromfile'} = "1"; # Important for files with an InstallName, because language also has to be removed there.
1698cdf0e10cSrcweir
1699cdf0e10cSrcweir            if ( $foundofficedir )
1700cdf0e10cSrcweir            {
1701cdf0e10cSrcweir                $newfile->{'Dir'} = $officedirectorygid;
1702cdf0e10cSrcweir                $newfile->{'destination'} = $officedirectoryhostname . $installer::globals::separator . $newfilename;
1703cdf0e10cSrcweir            }
1704cdf0e10cSrcweir            else
1705cdf0e10cSrcweir            {
1706cdf0e10cSrcweir                $newfile->{'Dir'} = "PREDEFINED_PROGDIR";
1707cdf0e10cSrcweir                $newfile->{'destination'} = $newfilename;
1708cdf0e10cSrcweir            }
1709cdf0e10cSrcweir
1710cdf0e10cSrcweir            # Also setting "modules=gid_Module_Root_Brand" (module with style: ROOT_BRAND_PACKAGE)
1711cdf0e10cSrcweir            if ( $installer::globals::rootbrandpackageset )
1712cdf0e10cSrcweir            {
1713cdf0e10cSrcweir                $newfile->{'modules'} = $installer::globals::rootbrandpackage;
1714cdf0e10cSrcweir            }
1715cdf0e10cSrcweir
1716cdf0e10cSrcweir            push(@newfilesarray, $newfile);
1717cdf0e10cSrcweir
1718b274bc22SAndre Fischer            $installer::logger::Lang->printf(
1719b274bc22SAndre Fischer                "New files: Adding file %s for the installation root to the file list. Language: %s\n",
1720b274bc22SAndre Fischer                $newfilename,
1721b274bc22SAndre Fischer                $defaultlanguage);
1722cdf0e10cSrcweir
1723cdf0e10cSrcweir            if ( defined $newfile->{'InstallName'} )
1724cdf0e10cSrcweir            {
1725b274bc22SAndre Fischer                $installer::logger::Lang->printf(
1726b274bc22SAndre Fischer                    "New files: Using installation name: %s\n", $newfile->{'InstallName'});
1727cdf0e10cSrcweir            }
1728cdf0e10cSrcweir
1729cdf0e10cSrcweir            # Collecting license and readme file for the installation set
1730cdf0e10cSrcweir
1731cdf0e10cSrcweir            push(@installer::globals::installsetfiles, $newfile);
1732b274bc22SAndre Fischer            $installer::logger::Lang->printf(
1733b274bc22SAndre Fischer                "New files: Adding file %s to the file collector for the installation set. Language: %s\n",
1734b274bc22SAndre Fischer                $newfilename,
1735b274bc22SAndre Fischer                $defaultlanguage);
1736cdf0e10cSrcweir        }
1737cdf0e10cSrcweir
1738cdf0e10cSrcweir        push(@newfilesarray, $onefile);
1739cdf0e10cSrcweir    }
1740cdf0e10cSrcweir
1741cdf0e10cSrcweir    return \@newfilesarray;
1742cdf0e10cSrcweir}
1743cdf0e10cSrcweir
1744cdf0e10cSrcweir############################################################################
1745*c97fd792Smseidel# Removing files with flag ONLY_ASIA_LANGUAGE, only if no Asian
1746cdf0e10cSrcweir# language is part of the product.
1747cdf0e10cSrcweir# This special files are connected to the root module and are not
1748cdf0e10cSrcweir# included into a language pack (would lead to conflicts!).
1749cdf0e10cSrcweir# But this files shall only be included into the product, if the
1750*c97fd792Smseidel# product contains at least one Asian language.
1751cdf0e10cSrcweir############################################################################
1752cdf0e10cSrcweir
1753cdf0e10cSrcweirsub remove_onlyasialanguage_files_from_productlists
1754cdf0e10cSrcweir{
1755cdf0e10cSrcweir    my ($filesarrayref) = @_;
1756cdf0e10cSrcweir
1757cdf0e10cSrcweir    my $infoline;
1758cdf0e10cSrcweir
1759cdf0e10cSrcweir    my @newfilesarray = ();
1760cdf0e10cSrcweir    my $returnfilesarrayref;
1761cdf0e10cSrcweir
1762cdf0e10cSrcweir    my $containsasianlanguage = installer::languages::detect_asian_language($installer::globals::alllanguagesinproductarrayref);
1763cdf0e10cSrcweir
1764cdf0e10cSrcweir    my $alllangstring = installer::converter::convert_array_to_comma_separated_string($installer::globals::alllanguagesinproductarrayref);
1765b274bc22SAndre Fischer    $installer::logger::Lang->printf("\n");
1766b274bc22SAndre Fischer    $installer::logger::Lang->printf("Languages in complete product: %s\n", $alllangstring);
1767cdf0e10cSrcweir
1768cdf0e10cSrcweir    if ( ! $containsasianlanguage )
1769cdf0e10cSrcweir    {
1770*c97fd792Smseidel        $installer::logger::Lang->printf("Product does not contain Asian language -> removing files\n");
1771cdf0e10cSrcweir
1772cdf0e10cSrcweir        for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
1773cdf0e10cSrcweir        {
1774cdf0e10cSrcweir            my $onefile = ${$filesarrayref}[$i];
1775cdf0e10cSrcweir            my $styles = "";
1776cdf0e10cSrcweir            if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
1777cdf0e10cSrcweir            if ( $styles =~ /\bONLY_ASIA_LANGUAGE\b/ )
1778cdf0e10cSrcweir            {
1779b274bc22SAndre Fischer                $installer::logger::Lang->printf(
1780b274bc22SAndre Fischer                    "Flag ONLY_ASIA_LANGUAGE: Removing file %s from files collector!\n",
1781b274bc22SAndre Fischer                    $onefile->{'Name'});
1782cdf0e10cSrcweir                next;
1783cdf0e10cSrcweir            }
1784cdf0e10cSrcweir
1785cdf0e10cSrcweir            push(@newfilesarray, $onefile);
1786cdf0e10cSrcweir        }
1787cdf0e10cSrcweir
1788cdf0e10cSrcweir        $returnfilesarrayref = \@newfilesarray;
1789cdf0e10cSrcweir    }
1790cdf0e10cSrcweir    else
1791cdf0e10cSrcweir    {
1792cdf0e10cSrcweir        $returnfilesarrayref = $filesarrayref;
1793cdf0e10cSrcweir
1794*c97fd792Smseidel        $installer::logger::Lang->printf("Product contains Asian language -> Nothing to do\n");
1795cdf0e10cSrcweir    }
1796cdf0e10cSrcweir
1797cdf0e10cSrcweir    return $returnfilesarrayref;
1798cdf0e10cSrcweir}
1799cdf0e10cSrcweir
1800cdf0e10cSrcweir############################################################################
1801cdf0e10cSrcweir# Removing files with flag ONLY_WESTERN_LANGUAGE, only if no western
1802cdf0e10cSrcweir# language is part of the product.
1803cdf0e10cSrcweir# This special files are connected to the root module and are not
1804cdf0e10cSrcweir# included into a language pack (would lead to conflicts!).
1805cdf0e10cSrcweir# But this files shall only be included into the product, if the
1806cdf0e10cSrcweir# product contains at least one western language.
1807cdf0e10cSrcweir############################################################################
1808cdf0e10cSrcweir
1809cdf0e10cSrcweirsub remove_onlywesternlanguage_files_from_productlists
1810cdf0e10cSrcweir{
1811cdf0e10cSrcweir    my ($filesarrayref) = @_;
1812cdf0e10cSrcweir
1813cdf0e10cSrcweir    my $infoline;
1814cdf0e10cSrcweir
1815cdf0e10cSrcweir    my @newfilesarray = ();
1816cdf0e10cSrcweir    my $returnfilesarrayref;
1817cdf0e10cSrcweir
1818cdf0e10cSrcweir    my $containswesternlanguage = installer::languages::detect_western_language($installer::globals::alllanguagesinproductarrayref);
1819cdf0e10cSrcweir
1820cdf0e10cSrcweir    my $alllangstring = installer::converter::convert_array_to_comma_separated_string($installer::globals::alllanguagesinproductarrayref);
1821b274bc22SAndre Fischer    $installer::logger::Lang->printf("\n");
1822b274bc22SAndre Fischer    $installer::logger::Lang->printf("Languages in complete product: %s\n", $alllangstring);
1823cdf0e10cSrcweir
1824cdf0e10cSrcweir    if ( ! $containswesternlanguage )
1825cdf0e10cSrcweir    {
1826b274bc22SAndre Fischer        $installer::logger::Lang->printf("Product does not contain western language -> removing files\n");
1827cdf0e10cSrcweir
1828cdf0e10cSrcweir        for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
1829cdf0e10cSrcweir        {
1830cdf0e10cSrcweir            my $onefile = ${$filesarrayref}[$i];
1831cdf0e10cSrcweir            my $styles = "";
1832cdf0e10cSrcweir            if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
1833cdf0e10cSrcweir            if ( $styles =~ /\bONLY_WESTERN_LANGUAGE\b/ )
1834cdf0e10cSrcweir            {
1835b274bc22SAndre Fischer                $installer::logger::Lang->printf(
1836b274bc22SAndre Fischer                    "Flag ONLY_WESTERN_LANGUAGE: Removing file %s from files collector!\n",
1837b274bc22SAndre Fischer                    $onefile->{'Name'});
1838cdf0e10cSrcweir                next;
1839cdf0e10cSrcweir            }
1840cdf0e10cSrcweir
1841cdf0e10cSrcweir            push(@newfilesarray, $onefile);
1842cdf0e10cSrcweir        }
1843cdf0e10cSrcweir
1844cdf0e10cSrcweir        $returnfilesarrayref = \@newfilesarray;
1845cdf0e10cSrcweir    }
1846cdf0e10cSrcweir    else
1847cdf0e10cSrcweir    {
1848cdf0e10cSrcweir        $returnfilesarrayref = $filesarrayref;
1849cdf0e10cSrcweir
1850b274bc22SAndre Fischer        $installer::logger::Lang->printf("Product contains western language -> Nothing to do\n");
1851cdf0e10cSrcweir    }
1852cdf0e10cSrcweir
1853cdf0e10cSrcweir    return $returnfilesarrayref;
1854cdf0e10cSrcweir}
1855cdf0e10cSrcweir
1856cdf0e10cSrcweir############################################################################
1857cdf0e10cSrcweir# Some files are included for more than one language and have the same
1858cdf0e10cSrcweir# name and the same destination directory for all languages. This would
1859cdf0e10cSrcweir# lead to conflicts, if the filenames are not changed.
1860cdf0e10cSrcweir# In scp project this files must have the flag MAKE_LANG_SPECIFIC
1861cdf0e10cSrcweir# For this files, the language is included into the filename.
1862cdf0e10cSrcweir############################################################################
1863cdf0e10cSrcweir
1864cdf0e10cSrcweirsub make_filename_language_specific
1865cdf0e10cSrcweir{
1866cdf0e10cSrcweir    my ($filesarrayref) = @_;
1867cdf0e10cSrcweir
1868cdf0e10cSrcweir    my $infoline = "";
1869cdf0e10cSrcweir
1870cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
1871cdf0e10cSrcweir    {
1872cdf0e10cSrcweir        my $onefile = ${$filesarrayref}[$i];
1873cdf0e10cSrcweir
1874cdf0e10cSrcweir        if ( $onefile->{'ismultilingual'} )
1875cdf0e10cSrcweir        {
1876cdf0e10cSrcweir            my $styles = "";
1877cdf0e10cSrcweir            if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
1878cdf0e10cSrcweir            if ( $styles =~ /\bMAKE_LANG_SPECIFIC\b/ )
1879cdf0e10cSrcweir            {
1880cdf0e10cSrcweir                my $language = $onefile->{'specificlanguage'};
1881cdf0e10cSrcweir                my $olddestination = $onefile->{'destination'};
1882cdf0e10cSrcweir                my $oldname = $onefile->{'Name'};
1883cdf0e10cSrcweir
1884cdf0e10cSrcweir                # Including the language into the file name.
1885cdf0e10cSrcweir                # But be sure, to include the language before the file extension.
1886cdf0e10cSrcweir
1887cdf0e10cSrcweir                my $fileextension = "";
1888cdf0e10cSrcweir
1889cdf0e10cSrcweir                if ( $onefile->{'Name'} =~ /(\.\w+?)\s*$/ ) { $fileextension = $1; }
1890cdf0e10cSrcweir                if ( $fileextension ne "" )
1891cdf0e10cSrcweir                {
1892cdf0e10cSrcweir                    $onefile->{'Name'} =~ s/\Q$fileextension\E\s*$/_$language$fileextension/;
1893cdf0e10cSrcweir                    $onefile->{'destination'} =~ s/\Q$fileextension\E\s*$/_$language$fileextension/;
1894cdf0e10cSrcweir                }
1895cdf0e10cSrcweir
1896b274bc22SAndre Fischer                $installer::logger::Lang->printf("Flag MAKE_LANG_SPECIFIC:\n");
1897b274bc22SAndre Fischer                $installer::logger::Lang->printf("Changing name from %s to %s !\n", $oldname, $onefile->{'Name'});
1898b274bc22SAndre Fischer                $installer::logger::Lang->printf("Changing destination from %s to %s !\n",
1899b274bc22SAndre Fischer                    $olddestination, $onefile->{'destination'});
1900cdf0e10cSrcweir            }
1901cdf0e10cSrcweir        }
1902cdf0e10cSrcweir    }
1903cdf0e10cSrcweir}
1904cdf0e10cSrcweir
1905cdf0e10cSrcweir############################################################################
1906cdf0e10cSrcweir# Removing all scpactions, that have no name.
1907cdf0e10cSrcweir# See: FlatLoaderZip
1908cdf0e10cSrcweir############################################################################
1909cdf0e10cSrcweir
1910cdf0e10cSrcweirsub remove_scpactions_without_name
1911cdf0e10cSrcweir{
1912cdf0e10cSrcweir    my ($itemsarrayref) = @_;
1913cdf0e10cSrcweir
1914cdf0e10cSrcweir    my $infoline;
1915cdf0e10cSrcweir
1916cdf0e10cSrcweir    my @newitemsarray = ();
1917cdf0e10cSrcweir
1918cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
1919cdf0e10cSrcweir    {
1920cdf0e10cSrcweir        my $oneitem = ${$itemsarrayref}[$i];
1921cdf0e10cSrcweir        my $name = "";
1922cdf0e10cSrcweir
1923cdf0e10cSrcweir        if ( $oneitem->{'Name'} ) { $name = $oneitem->{'Name'}; }
1924cdf0e10cSrcweir
1925cdf0e10cSrcweir        if  ( $name eq "" )
1926cdf0e10cSrcweir        {
1927b274bc22SAndre Fischer            $installer::logger::Lang->printf(
1928b274bc22SAndre Fischer                "ATTENTION: Removing scpaction %s from the installation set.\n",
1929b274bc22SAndre Fischer                $oneitem->{'gid'});
1930cdf0e10cSrcweir            next;
1931cdf0e10cSrcweir        }
1932cdf0e10cSrcweir
1933cdf0e10cSrcweir        push(@newitemsarray, $oneitem);
1934cdf0e10cSrcweir    }
1935cdf0e10cSrcweir
1936cdf0e10cSrcweir    return \@newitemsarray;
1937cdf0e10cSrcweir}
1938cdf0e10cSrcweir
1939cdf0e10cSrcweir############################################################################
1940cdf0e10cSrcweir# Because of the item "File" the source name must be "Name". Therefore
1941cdf0e10cSrcweir# "Copy" is changed to "Name" and "Name" is changed to "DestinationName".
1942cdf0e10cSrcweir############################################################################
1943cdf0e10cSrcweir
1944cdf0e10cSrcweirsub change_keys_of_scpactions
1945cdf0e10cSrcweir{
1946cdf0e10cSrcweir    my ($itemsarrayref) = @_;
1947cdf0e10cSrcweir
1948cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
1949cdf0e10cSrcweir    {
1950cdf0e10cSrcweir        my $oneitem = ${$itemsarrayref}[$i];
1951cdf0e10cSrcweir
1952cdf0e10cSrcweir        my $key;
1953cdf0e10cSrcweir
1954cdf0e10cSrcweir        # First Name to DestinationName, then deleting Name
1955cdf0e10cSrcweir        foreach $key (keys %{$oneitem})
1956cdf0e10cSrcweir        {
1957cdf0e10cSrcweir            if ( $key =~ /\bName\b/ )
1958cdf0e10cSrcweir            {
1959cdf0e10cSrcweir                my $value = $oneitem->{$key};
1960cdf0e10cSrcweir                my $oldkey = $key;
1961cdf0e10cSrcweir                $key =~ s/Name/DestinationName/;
1962cdf0e10cSrcweir                $oneitem->{$key} = $value;
1963cdf0e10cSrcweir                delete($oneitem->{$oldkey});
1964cdf0e10cSrcweir            }
1965cdf0e10cSrcweir        }
1966cdf0e10cSrcweir
1967cdf0e10cSrcweir        # Second Copy to Name, then deleting Copy
1968cdf0e10cSrcweir        foreach $key (keys %{$oneitem})
1969cdf0e10cSrcweir        {
1970cdf0e10cSrcweir            if ( $key =~ /\bCopy\b/ )
1971cdf0e10cSrcweir            {
1972cdf0e10cSrcweir                my $value = $oneitem->{$key};
1973cdf0e10cSrcweir                my $oldkey = $key;
1974cdf0e10cSrcweir                $key =~ s/Copy/Name/;
1975cdf0e10cSrcweir                $oneitem->{$key} = $value;
1976cdf0e10cSrcweir                delete($oneitem->{$oldkey});
1977cdf0e10cSrcweir            }
1978cdf0e10cSrcweir        }
1979cdf0e10cSrcweir    }
1980cdf0e10cSrcweir}
1981cdf0e10cSrcweir
1982cdf0e10cSrcweir############################################################################
1983cdf0e10cSrcweir# Removing all xpd only items from installation set (scpactions with
1984cdf0e10cSrcweir# the style XPD_ONLY), except an xpd installation set is created
1985cdf0e10cSrcweir############################################################################
1986cdf0e10cSrcweir
1987cdf0e10cSrcweirsub remove_Xpdonly_Items
1988cdf0e10cSrcweir{
1989cdf0e10cSrcweir    my ($itemsarrayref) = @_;
1990cdf0e10cSrcweir
1991cdf0e10cSrcweir    my $infoline;
1992cdf0e10cSrcweir
1993cdf0e10cSrcweir    my @newitemsarray = ();
1994cdf0e10cSrcweir
1995cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
1996cdf0e10cSrcweir    {
1997cdf0e10cSrcweir        my $oneitem = ${$itemsarrayref}[$i];
1998cdf0e10cSrcweir        my $styles = "";
1999cdf0e10cSrcweir        if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
2000cdf0e10cSrcweir
2001cdf0e10cSrcweir        if ( $styles =~ /\bXPD_ONLY\b/ )
2002cdf0e10cSrcweir        {
2003b274bc22SAndre Fischer            $installer::logger::Global->printf(
2004b274bc22SAndre Fischer                "Removing \"xpd only\" item %s from the installation set.\n",
2005b274bc22SAndre Fischer                $oneitem->{'gid'});
2006cdf0e10cSrcweir
2007cdf0e10cSrcweir            next;
2008cdf0e10cSrcweir        }
2009cdf0e10cSrcweir
2010cdf0e10cSrcweir        push(@newitemsarray, $oneitem);
2011cdf0e10cSrcweir    }
2012cdf0e10cSrcweir
2013b274bc22SAndre Fischer    $installer::logger::Global->print("\n");
2014cdf0e10cSrcweir
2015cdf0e10cSrcweir    return \@newitemsarray;
2016cdf0e10cSrcweir}
2017cdf0e10cSrcweir
2018cdf0e10cSrcweir############################################################################
2019cdf0e10cSrcweir# Removing all language pack files from installation set (files with
2020cdf0e10cSrcweir# the style LANGUAGEPACK), except this is a language pack.
2021cdf0e10cSrcweir############################################################################
2022cdf0e10cSrcweir
2023cdf0e10cSrcweirsub remove_Languagepacklibraries_from_Installset
2024cdf0e10cSrcweir{
2025cdf0e10cSrcweir    my ($itemsarrayref) = @_;
2026cdf0e10cSrcweir
2027cdf0e10cSrcweir    my $infoline;
2028cdf0e10cSrcweir
2029cdf0e10cSrcweir    my @newitemsarray = ();
2030cdf0e10cSrcweir
2031cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
2032cdf0e10cSrcweir    {
2033cdf0e10cSrcweir        my $oneitem = ${$itemsarrayref}[$i];
2034cdf0e10cSrcweir        my $styles = "";
2035cdf0e10cSrcweir        if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
2036cdf0e10cSrcweir
2037cdf0e10cSrcweir        if ( $styles =~ /\bLANGUAGEPACK\b/ )
2038cdf0e10cSrcweir        {
2039b274bc22SAndre Fischer            $installer::logger::Global->printf(
2040b274bc22SAndre Fischer                "Removing language pack file %s from the installation set.\n",
2041b274bc22SAndre Fischer                $oneitem->{'gid'});
2042cdf0e10cSrcweir
2043cdf0e10cSrcweir            next;
2044cdf0e10cSrcweir        }
2045cdf0e10cSrcweir
2046cdf0e10cSrcweir        push(@newitemsarray, $oneitem);
2047cdf0e10cSrcweir    }
2048cdf0e10cSrcweir
2049b274bc22SAndre Fischer    $installer::logger::Global->print("\n");
2050cdf0e10cSrcweir
2051cdf0e10cSrcweir    return \@newitemsarray;
2052cdf0e10cSrcweir}
2053cdf0e10cSrcweir
2054cdf0e10cSrcweir############################################################################
2055cdf0e10cSrcweir# Removing all files with flag PATCH_ONLY from installation set.
2056cdf0e10cSrcweir# This function is not called during patch creation.
2057cdf0e10cSrcweir############################################################################
2058cdf0e10cSrcweir
2059cdf0e10cSrcweirsub remove_patchonlyfiles_from_Installset
2060cdf0e10cSrcweir{
2061cdf0e10cSrcweir    my ($itemsarrayref) = @_;
2062cdf0e10cSrcweir
2063cdf0e10cSrcweir    my $infoline;
2064cdf0e10cSrcweir
2065cdf0e10cSrcweir    my @newitemsarray = ();
2066cdf0e10cSrcweir
2067cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
2068cdf0e10cSrcweir    {
2069cdf0e10cSrcweir        my $oneitem = ${$itemsarrayref}[$i];
2070cdf0e10cSrcweir        my $styles = "";
2071cdf0e10cSrcweir        if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
2072cdf0e10cSrcweir
2073cdf0e10cSrcweir        if ( $styles =~ /\bPATCH_ONLY\b/ )
2074cdf0e10cSrcweir        {
2075b274bc22SAndre Fischer            $installer::logger::Global->printf(
2076b274bc22SAndre Fischer                "Removing file with flag PATCH_ONLY %s from the installation set.\n",
2077b274bc22SAndre Fischer                $oneitem->{'gid'});
2078cdf0e10cSrcweir
2079cdf0e10cSrcweir            next;
2080cdf0e10cSrcweir        }
2081cdf0e10cSrcweir
2082cdf0e10cSrcweir        push(@newitemsarray, $oneitem);
2083cdf0e10cSrcweir    }
2084cdf0e10cSrcweir
2085b274bc22SAndre Fischer    $installer::logger::Global->print("\n");
2086cdf0e10cSrcweir
2087cdf0e10cSrcweir    return \@newitemsarray;
2088cdf0e10cSrcweir}
2089cdf0e10cSrcweir
2090cdf0e10cSrcweir############################################################################
2091cdf0e10cSrcweir# Removing all files with flag TAB_ONLY from installation set.
2092cdf0e10cSrcweir# This function is not called during tab creation.
2093cdf0e10cSrcweir############################################################################
2094cdf0e10cSrcweir
2095cdf0e10cSrcweirsub remove_tabonlyfiles_from_Installset
2096cdf0e10cSrcweir{
2097cdf0e10cSrcweir    my ($itemsarrayref) = @_;
2098cdf0e10cSrcweir
2099cdf0e10cSrcweir    my $infoline;
2100cdf0e10cSrcweir
2101cdf0e10cSrcweir    my @newitemsarray = ();
2102cdf0e10cSrcweir
2103cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
2104cdf0e10cSrcweir    {
2105cdf0e10cSrcweir        my $oneitem = ${$itemsarrayref}[$i];
2106cdf0e10cSrcweir        my $styles = "";
2107cdf0e10cSrcweir        if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
2108cdf0e10cSrcweir
2109cdf0e10cSrcweir        if ( $styles =~ /\bTAB_ONLY\b/ )
2110cdf0e10cSrcweir        {
2111b274bc22SAndre Fischer            $installer::logger::Global->printf(
2112b274bc22SAndre Fischer                "Removing tab only file %s from the installation set.\n",
2113b274bc22SAndre Fischer                $oneitem->{'gid'});
2114cdf0e10cSrcweir
2115cdf0e10cSrcweir            next;
2116cdf0e10cSrcweir        }
2117cdf0e10cSrcweir
2118cdf0e10cSrcweir        push(@newitemsarray, $oneitem);
2119cdf0e10cSrcweir    }
2120cdf0e10cSrcweir
2121b274bc22SAndre Fischer    $installer::logger::Global->print("\n");
2122cdf0e10cSrcweir
2123cdf0e10cSrcweir    return \@newitemsarray;
2124cdf0e10cSrcweir}
2125cdf0e10cSrcweir
2126cdf0e10cSrcweir###############################################################################
2127cdf0e10cSrcweir# Removing all files with flag ONLY_INSTALLED_PRODUCT from installation set.
2128cdf0e10cSrcweir# This function is not called for PKGFORMAT installed and archive.
2129cdf0e10cSrcweir###############################################################################
2130cdf0e10cSrcweir
2131cdf0e10cSrcweirsub remove_installedproductonlyfiles_from_Installset
2132cdf0e10cSrcweir{
2133cdf0e10cSrcweir    my ($itemsarrayref) = @_;
2134cdf0e10cSrcweir
2135cdf0e10cSrcweir    my $infoline;
2136cdf0e10cSrcweir
2137cdf0e10cSrcweir    my @newitemsarray = ();
2138cdf0e10cSrcweir
2139cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
2140cdf0e10cSrcweir    {
2141cdf0e10cSrcweir        my $oneitem = ${$itemsarrayref}[$i];
2142cdf0e10cSrcweir        my $styles = "";
2143cdf0e10cSrcweir        if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
2144cdf0e10cSrcweir
2145cdf0e10cSrcweir        if ( $styles =~ /\bONLY_INSTALLED_PRODUCT\b/ )
2146cdf0e10cSrcweir        {
2147b274bc22SAndre Fischer            $installer::logger::Global->printf(
2148b274bc22SAndre Fischer                "Removing file from the installation set. This file is only required for PKGFORMAT archive or installed).\n",
2149b274bc22SAndre Fischer                $oneitem->{'gid'});
2150cdf0e10cSrcweir            next;
2151cdf0e10cSrcweir        }
2152cdf0e10cSrcweir
2153cdf0e10cSrcweir        push(@newitemsarray, $oneitem);
2154cdf0e10cSrcweir    }
2155cdf0e10cSrcweir
2156b274bc22SAndre Fischer    $installer::logger::Global->print("\n");
2157cdf0e10cSrcweir
2158cdf0e10cSrcweir    return \@newitemsarray;
2159cdf0e10cSrcweir}
2160cdf0e10cSrcweir
2161cdf0e10cSrcweir############################################################################
2162*c97fd792Smseidel# Some files contain a $ in their name. epm conflicts with such files.
2163cdf0e10cSrcweir# Solution: Renaming this files, converting "$" to "$$"
2164cdf0e10cSrcweir############################################################################
2165cdf0e10cSrcweir
2166cdf0e10cSrcweirsub quoting_illegal_filenames
2167cdf0e10cSrcweir{
2168cdf0e10cSrcweir    my ($filesarrayref) = @_;
2169cdf0e10cSrcweir
2170cdf0e10cSrcweir    # This function has to be removed as soon as possible!
2171cdf0e10cSrcweir
2172cdf0e10cSrcweir    installer::logger::include_header_into_logfile("Renaming illegal filenames:");
2173cdf0e10cSrcweir
2174cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
2175cdf0e10cSrcweir    {
2176cdf0e10cSrcweir        my $onefile = ${$filesarrayref}[$i];
2177cdf0e10cSrcweir        my $filename = $onefile->{'Name'};
2178cdf0e10cSrcweir
2179cdf0e10cSrcweir        if ( $filename =~ /\$/ )
2180cdf0e10cSrcweir        {
2181cdf0e10cSrcweir            my $sourcepath = $onefile->{'sourcepath'};
2182cdf0e10cSrcweir            my $destpath = $onefile->{'destination'};
2183cdf0e10cSrcweir
2184cdf0e10cSrcweir            # sourcepath and destination have to be quoted for epm list file
2185cdf0e10cSrcweir
2186cdf0e10cSrcweir            $destpath =~ s/\$/\$\$/g;
2187cdf0e10cSrcweir            $sourcepath =~ s/\$/\$\$/g;
2188cdf0e10cSrcweir
2189b274bc22SAndre Fischer            $installer::logger::Lang->printf("ATTENTION: Files: Quoting sourcepath %s to %s\n",
2190b274bc22SAndre Fischer                $onefile->{'sourcepath'},
2191b274bc22SAndre Fischer                $sourcepath);
2192b274bc22SAndre Fischer            $installer::logger::Lang->printf("ATTENTION: Files: Quoting destination path %s to %s\n",
2193b274bc22SAndre Fischer                $onefile->{'destination'},
2194b274bc22SAndre Fischer                $destpath);
2195cdf0e10cSrcweir
2196cdf0e10cSrcweir            # $onefile->{'Name'} = $filename;
2197cdf0e10cSrcweir            $onefile->{'sourcepath'} = $sourcepath;
2198cdf0e10cSrcweir            $onefile->{'destination'} = $destpath;
2199cdf0e10cSrcweir        }
2200cdf0e10cSrcweir    }
2201cdf0e10cSrcweir}
2202cdf0e10cSrcweir
2203cdf0e10cSrcweir############################################################################
220486e1cf34SPedro Giffuni# Removing multiple occurrences of same module.
2205cdf0e10cSrcweir############################################################################
2206cdf0e10cSrcweir
2207cdf0e10cSrcweirsub optimize_list
2208cdf0e10cSrcweir{
2209cdf0e10cSrcweir    my ( $longlist ) = @_;
2210cdf0e10cSrcweir
2211cdf0e10cSrcweir    my $shortlist = "";
2212cdf0e10cSrcweir    my $hashref = installer::converter::convert_stringlist_into_hash(\$longlist, ",");
2213cdf0e10cSrcweir    foreach my $key (sort keys %{$hashref} ) { $shortlist = "$shortlist,$key"; }
2214cdf0e10cSrcweir    $shortlist =~ s/^\s*\,//;
2215cdf0e10cSrcweir
2216cdf0e10cSrcweir    return $shortlist;
2217cdf0e10cSrcweir}
2218cdf0e10cSrcweir
2219cdf0e10cSrcweir#######################################################################
2220cdf0e10cSrcweir# Collecting all directories needed for the epm list
2221cdf0e10cSrcweir# 1. Looking for all destination paths in the files array
2222cdf0e10cSrcweir# 2. Looking for directories with CREATE flag in the directory array
2223cdf0e10cSrcweir#######################################################################
2224cdf0e10cSrcweir
2225cdf0e10cSrcweir##################################
2226cdf0e10cSrcweir# Collecting directories: Part 1
2227cdf0e10cSrcweir##################################
2228cdf0e10cSrcweir
2229cdf0e10cSrcweirsub collect_directories_from_filesarray
2230cdf0e10cSrcweir{
2231cdf0e10cSrcweir    my ($filesarrayref) = @_;
2232cdf0e10cSrcweir
2233cdf0e10cSrcweir    my @alldirectories = ();
2234cdf0e10cSrcweir    my %alldirectoryhash = ();
2235cdf0e10cSrcweir
2236cdf0e10cSrcweir    my $predefinedprogdir_added = 0;
2237cdf0e10cSrcweir    my $alreadyincluded = 0;
2238cdf0e10cSrcweir
2239cdf0e10cSrcweir    # Preparing this already as hash, although the only needed value at the moment is the HostName
2240cdf0e10cSrcweir    # But also adding: "specificlanguage" and "Dir" (for instance gid_Dir_Program)
2241cdf0e10cSrcweir
2242cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
2243cdf0e10cSrcweir    {
2244cdf0e10cSrcweir        my $onefile = ${$filesarrayref}[$i];
2245cdf0e10cSrcweir        my $destinationpath = $onefile->{'destination'};
2246cdf0e10cSrcweir        installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationpath);
2247cdf0e10cSrcweir        $destinationpath =~ s/\Q$installer::globals::separator\E\s*$//;     # removing ending slashes or backslashes
2248cdf0e10cSrcweir
2249cdf0e10cSrcweir        $alreadyincluded = 0;
2250cdf0e10cSrcweir        if ( exists($alldirectoryhash{$destinationpath}) ) { $alreadyincluded = 1; }
2251cdf0e10cSrcweir
2252cdf0e10cSrcweir        if (!($alreadyincluded))
2253cdf0e10cSrcweir        {
2254cdf0e10cSrcweir            my %directoryhash = ();
2255cdf0e10cSrcweir            $directoryhash{'HostName'} = $destinationpath;
2256cdf0e10cSrcweir            $directoryhash{'specificlanguage'} = $onefile->{'specificlanguage'};
2257cdf0e10cSrcweir            $directoryhash{'Dir'} = $onefile->{'Dir'};
2258cdf0e10cSrcweir            $directoryhash{'modules'} = $onefile->{'modules'}; # NEW, saving modules
2259cdf0e10cSrcweir            # NEVER!!!  if ( ! $installer::globals::iswindowsbuild ) { $directoryhash{'Styles'} = "(CREATE)"; } # this directories must be created
2260cdf0e10cSrcweir
2261cdf0e10cSrcweir            if ( $onefile->{'Dir'} eq "PREDEFINED_PROGDIR" ) { $predefinedprogdir_added = 1; }
2262cdf0e10cSrcweir
2263cdf0e10cSrcweir            $alldirectoryhash{$destinationpath} = \%directoryhash;
2264cdf0e10cSrcweir
2265cdf0e10cSrcweir            # Problem: The $destinationpath can be share/registry/schema/org/openoffice
2266cdf0e10cSrcweir            # but not all directories contain files and will be added to this list.
2267cdf0e10cSrcweir            # Therefore the path has to be analyzed.
2268cdf0e10cSrcweir
2269cdf0e10cSrcweir            while ( $destinationpath =~ /(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/ )    # as long as the path contains slashes
2270cdf0e10cSrcweir            {
2271cdf0e10cSrcweir                $destinationpath = $1;
2272cdf0e10cSrcweir
2273cdf0e10cSrcweir                $alreadyincluded = 0;
2274cdf0e10cSrcweir                if ( exists($alldirectoryhash{$destinationpath}) ) { $alreadyincluded = 1; }
2275cdf0e10cSrcweir
2276cdf0e10cSrcweir                if (!($alreadyincluded))
2277cdf0e10cSrcweir                {
2278cdf0e10cSrcweir                    my %directoryhash = ();
2279cdf0e10cSrcweir
2280cdf0e10cSrcweir                    $directoryhash{'HostName'} = $destinationpath;
2281cdf0e10cSrcweir                    $directoryhash{'specificlanguage'} = $onefile->{'specificlanguage'};
2282cdf0e10cSrcweir                    $directoryhash{'Dir'} = $onefile->{'Dir'};
2283cdf0e10cSrcweir                    $directoryhash{'modules'} = $onefile->{'modules'}; # NEW, saving modules
2284cdf0e10cSrcweir                    # NEVER!!! if ( ! $installer::globals::iswindowsbuild ) { $directoryhash{'Styles'} = "(CREATE)"; }  # this directories must be created
2285cdf0e10cSrcweir
2286cdf0e10cSrcweir                    $alldirectoryhash{$destinationpath} = \%directoryhash;
2287cdf0e10cSrcweir                }
2288cdf0e10cSrcweir                else
2289cdf0e10cSrcweir                {
2290cdf0e10cSrcweir                    # Adding the modules to the module list!
2291cdf0e10cSrcweir                    $alldirectoryhash{$destinationpath}->{'modules'} = $alldirectoryhash{$destinationpath}->{'modules'} . "," . $onefile->{'modules'};
2292cdf0e10cSrcweir                }
2293cdf0e10cSrcweir            }
2294cdf0e10cSrcweir        }
2295cdf0e10cSrcweir        else
2296cdf0e10cSrcweir        {
2297cdf0e10cSrcweir            # Adding the modules to the module list!
2298cdf0e10cSrcweir            $alldirectoryhash{$destinationpath}->{'modules'} = $alldirectoryhash{$destinationpath}->{'modules'} . "," . $onefile->{'modules'};
2299cdf0e10cSrcweir
2300cdf0e10cSrcweir            # Also adding the module to all parents
2301cdf0e10cSrcweir            while ( $destinationpath =~ /(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/ )    # as long as the path contains slashes
2302cdf0e10cSrcweir            {
2303cdf0e10cSrcweir                $destinationpath = $1;
2304cdf0e10cSrcweir                $alldirectoryhash{$destinationpath}->{'modules'} = $alldirectoryhash{$destinationpath}->{'modules'} . "," . $onefile->{'modules'};
2305cdf0e10cSrcweir            }
2306cdf0e10cSrcweir        }
2307cdf0e10cSrcweir    }
2308cdf0e10cSrcweir
2309cdf0e10cSrcweir    # if there is no file in the root directory PREDEFINED_PROGDIR, it has to be included into the directory array now
2310cdf0e10cSrcweir    # HostName= specificlanguage=   Dir=PREDEFINED_PROGDIR
2311cdf0e10cSrcweir
2312cdf0e10cSrcweir    if (! $predefinedprogdir_added )
2313cdf0e10cSrcweir    {
2314cdf0e10cSrcweir        my %directoryhash = ();
2315cdf0e10cSrcweir        $directoryhash{'HostName'} = "";
2316cdf0e10cSrcweir        $directoryhash{'specificlanguage'} = "";
2317cdf0e10cSrcweir        $directoryhash{'modules'} = ""; # ToDo?
2318cdf0e10cSrcweir        $directoryhash{'Dir'} = "PREDEFINED_PROGDIR";
2319cdf0e10cSrcweir
2320cdf0e10cSrcweir        push(@alldirectories, \%directoryhash);
2321cdf0e10cSrcweir    }
2322cdf0e10cSrcweir
2323cdf0e10cSrcweir    # Creating directory array
2324cdf0e10cSrcweir    foreach my $destdir ( sort keys %alldirectoryhash )
2325cdf0e10cSrcweir    {
2326cdf0e10cSrcweir        $alldirectoryhash{$destdir}->{'modules'} = optimize_list($alldirectoryhash{$destdir}->{'modules'});
2327cdf0e10cSrcweir        push(@alldirectories, $alldirectoryhash{$destdir});
2328cdf0e10cSrcweir    }
2329cdf0e10cSrcweir
2330cdf0e10cSrcweir    return (\@alldirectories, \%alldirectoryhash);
2331cdf0e10cSrcweir}
2332cdf0e10cSrcweir
2333cdf0e10cSrcweir##################################
2334cdf0e10cSrcweir# Collecting directories: Part 2
2335cdf0e10cSrcweir##################################
2336cdf0e10cSrcweir
2337dba1a2e4SAndre Fischersub collect_directories_with_create_flag_from_directoryarray ($$)
2338cdf0e10cSrcweir{
2339cdf0e10cSrcweir    my ($directoryarrayref, $alldirectoryhash) = @_;
2340cdf0e10cSrcweir
2341cdf0e10cSrcweir    my $alreadyincluded = 0;
2342cdf0e10cSrcweir    my @alldirectories = ();
2343cdf0e10cSrcweir
2344cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$directoryarrayref}; $i++ )
2345cdf0e10cSrcweir    {
2346cdf0e10cSrcweir        my $onedir = ${$directoryarrayref}[$i];
2347cdf0e10cSrcweir        my $styles = "";
2348dba1a2e4SAndre Fischer        my $newdirincluded = 0;
2349cdf0e10cSrcweir
2350cdf0e10cSrcweir        if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
2351cdf0e10cSrcweir
2352cdf0e10cSrcweir        if ( $styles =~ /\bCREATE\b/ )
2353cdf0e10cSrcweir        {
2354cdf0e10cSrcweir            my $directoryname = "";
2355cdf0e10cSrcweir
2356cdf0e10cSrcweir            if ( $onedir->{'HostName'} ) { $directoryname = $onedir->{'HostName'}; }
2357cdf0e10cSrcweir            else { installer::exiter::exit_program("ERROR: No directory name (HostName) set for specified language in gid $onedir->{'gid'}", "collect_directories_with_create_flag_from_directoryarray"); }
2358cdf0e10cSrcweir
2359cdf0e10cSrcweir            $alreadyincluded = 0;
2360cdf0e10cSrcweir            if ( exists($alldirectoryhash->{$directoryname}) ) { $alreadyincluded = 1; }
2361cdf0e10cSrcweir
2362cdf0e10cSrcweir            if (!($alreadyincluded))
2363cdf0e10cSrcweir            {
2364cdf0e10cSrcweir                my %directoryhash = ();
2365cdf0e10cSrcweir                $directoryhash{'HostName'} = $directoryname;
2366cdf0e10cSrcweir                $directoryhash{'specificlanguage'} = $onedir->{'specificlanguage'};
2367cdf0e10cSrcweir                # $directoryhash{'gid'} = $onedir->{'gid'};
2368cdf0e10cSrcweir                $directoryhash{'Dir'} = $onedir->{'gid'};
2369cdf0e10cSrcweir                $directoryhash{'Styles'} = $onedir->{'Styles'};
2370cdf0e10cSrcweir
2371cdf0e10cSrcweir                # saving also the modules
2372cdf0e10cSrcweir                if ( ! $onedir->{'modules'} ) { installer::exiter::exit_program("ERROR: No assigned modules found for directory $onedir->{'gid'}", "collect_directories_with_create_flag_from_directoryarray"); }
2373cdf0e10cSrcweir                $directoryhash{'modules'} = $onedir->{'modules'};
2374cdf0e10cSrcweir
2375cdf0e10cSrcweir                $alldirectoryhash->{$directoryname} = \%directoryhash;
2376cdf0e10cSrcweir                $newdirincluded = 1;
2377cdf0e10cSrcweir
2378cdf0e10cSrcweir                # Problem: The $destinationpath can be share/registry/schema/org/openoffice
2379cdf0e10cSrcweir                # but not all directories contain files and will be added to this list.
2380cdf0e10cSrcweir                # Therefore the path has to be analyzed.
2381cdf0e10cSrcweir
2382cdf0e10cSrcweir                while ( $directoryname =~ /(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/ )  # as long as the path contains slashes
2383cdf0e10cSrcweir                {
2384cdf0e10cSrcweir                    $directoryname = $1;
2385cdf0e10cSrcweir
2386cdf0e10cSrcweir                    $alreadyincluded = 0;
2387cdf0e10cSrcweir                    if ( exists($alldirectoryhash->{$directoryname}) ) { $alreadyincluded = 1; }
2388cdf0e10cSrcweir
2389cdf0e10cSrcweir                    if (!($alreadyincluded))
2390cdf0e10cSrcweir                    {
2391cdf0e10cSrcweir                        my %directoryhash = ();
2392cdf0e10cSrcweir
2393cdf0e10cSrcweir                        $directoryhash{'HostName'} = $directoryname;
2394cdf0e10cSrcweir                        $directoryhash{'specificlanguage'} = $onedir->{'specificlanguage'};
2395cdf0e10cSrcweir                        $directoryhash{'Dir'} = $onedir->{'gid'};
2396*c97fd792Smseidel                        if ( ! $installer::globals::iswindowsbuild ) { $directoryhash{'Styles'} = "(CREATE)"; } # Exception for Windows?
2397cdf0e10cSrcweir
2398cdf0e10cSrcweir                        # saving also the modules
2399cdf0e10cSrcweir                        $directoryhash{'modules'} = $onedir->{'modules'};
2400cdf0e10cSrcweir
2401cdf0e10cSrcweir                        $alldirectoryhash->{$directoryname} = \%directoryhash;
2402cdf0e10cSrcweir                        $newdirincluded = 1;
2403cdf0e10cSrcweir                    }
2404cdf0e10cSrcweir                    else
2405cdf0e10cSrcweir                    {
2406cdf0e10cSrcweir                        # Adding the modules to the module list!
2407cdf0e10cSrcweir                        $alldirectoryhash->{$directoryname}->{'modules'} = $alldirectoryhash->{$directoryname}->{'modules'} . "," . $onedir->{'modules'};
2408cdf0e10cSrcweir                    }
2409cdf0e10cSrcweir                }
2410cdf0e10cSrcweir            }
2411cdf0e10cSrcweir            else
2412cdf0e10cSrcweir            {
2413cdf0e10cSrcweir                # Adding the modules to the module list!
2414cdf0e10cSrcweir                $alldirectoryhash->{$directoryname}->{'modules'} = $alldirectoryhash->{$directoryname}->{'modules'} . "," . $onedir->{'modules'};
2415cdf0e10cSrcweir
2416cdf0e10cSrcweir                while ( $directoryname =~ /(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/ )  # as long as the path contains slashes
2417cdf0e10cSrcweir                {
2418cdf0e10cSrcweir                    $directoryname = $1;
2419cdf0e10cSrcweir                    # Adding the modules to the module list!
2420cdf0e10cSrcweir                    $alldirectoryhash->{$directoryname}->{'modules'} = $alldirectoryhash->{$directoryname}->{'modules'} . "," . $onedir->{'modules'};
2421cdf0e10cSrcweir                }
2422cdf0e10cSrcweir            }
2423cdf0e10cSrcweir        }
2424cdf0e10cSrcweir
2425cdf0e10cSrcweir        # Saving the styles for already added directories in function collect_directories_from_filesarray
2426cdf0e10cSrcweir
2427cdf0e10cSrcweir        if (( ! $newdirincluded ) && ( $styles ne "" ))
2428cdf0e10cSrcweir        {
2429cdf0e10cSrcweir            $styles =~ s/\bWORKSTATION\b//;
2430cdf0e10cSrcweir            $styles =~ s/\bCREATE\b//;
2431cdf0e10cSrcweir
2432cdf0e10cSrcweir            if (( ! ( $styles =~ /^\s*\(\s*\)\s*$/ )) && ( ! ( $styles =~ /^\s*\(\s*\,\s*\)\s*$/ )) && ( ! ( $styles =~ /^\s*$/ ))) # checking, if there are styles left
2433cdf0e10cSrcweir            {
2434cdf0e10cSrcweir                my $directoryname = "";
2435cdf0e10cSrcweir                if ( $onedir->{'HostName'} ) { $directoryname = $onedir->{'HostName'}; }
2436cdf0e10cSrcweir                else { installer::exiter::exit_program("ERROR: No directory name (HostName) set for specified language in gid $onedir->{'gid'}", "collect_directories_with_create_flag_from_directoryarray"); }
2437cdf0e10cSrcweir
2438cdf0e10cSrcweir                if ( exists($alldirectoryhash->{$directoryname}) )
2439cdf0e10cSrcweir                {
2440cdf0e10cSrcweir                    $alldirectoryhash->{$directoryname}->{'Styles'} = $styles;
2441cdf0e10cSrcweir                }
2442cdf0e10cSrcweir            }
2443cdf0e10cSrcweir        }
2444cdf0e10cSrcweir    }
2445cdf0e10cSrcweir
2446cdf0e10cSrcweir    # Creating directory array
2447cdf0e10cSrcweir    foreach my $destdir ( sort keys %{$alldirectoryhash} )
2448cdf0e10cSrcweir    {
2449cdf0e10cSrcweir        $alldirectoryhash->{$destdir}->{'modules'} = optimize_list($alldirectoryhash->{$destdir}->{'modules'});
2450cdf0e10cSrcweir        push(@alldirectories, $alldirectoryhash->{$destdir});
2451cdf0e10cSrcweir    }
2452cdf0e10cSrcweir
2453dba1a2e4SAndre Fischer    return (\@alldirectories, $alldirectoryhash);
2454cdf0e10cSrcweir}
2455cdf0e10cSrcweir
2456cdf0e10cSrcweir#################################################
2457cdf0e10cSrcweir# Determining the destination file of a link
2458cdf0e10cSrcweir#################################################
2459cdf0e10cSrcweir
2460dba1a2e4SAndre Fischersub get_destination_file_path_for_links ($$)
2461cdf0e10cSrcweir{
2462cdf0e10cSrcweir    my ($linksarrayref, $filesarrayref) = @_;
2463cdf0e10cSrcweir
2464cdf0e10cSrcweir    my $infoline;
2465cdf0e10cSrcweir
2466cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$linksarrayref}; $i++ )
2467cdf0e10cSrcweir    {
2468cdf0e10cSrcweir        my $fileid = "";
2469cdf0e10cSrcweir        my $onelink = ${$linksarrayref}[$i];
2470cdf0e10cSrcweir        if ( $onelink->{'FileID'} ) { $fileid = $onelink->{'FileID'}; }
2471cdf0e10cSrcweir
2472cdf0e10cSrcweir        if (!( $fileid eq "" ))
2473cdf0e10cSrcweir        {
2474cdf0e10cSrcweir            my $foundfile = 0;
2475cdf0e10cSrcweir
2476cdf0e10cSrcweir            for ( my $j = 0; $j <= $#{$filesarrayref}; $j++ )
2477cdf0e10cSrcweir            {
2478cdf0e10cSrcweir                my $onefile = ${$filesarrayref}[$j];
2479cdf0e10cSrcweir                my $filegid = $onefile->{'gid'};
2480cdf0e10cSrcweir
2481cdf0e10cSrcweir                if ( $filegid eq $fileid )
2482cdf0e10cSrcweir                {
2483cdf0e10cSrcweir                    $foundfile = 1;
2484cdf0e10cSrcweir                    $onelink->{'destinationfile'} = $onefile->{'destination'};
2485cdf0e10cSrcweir                    last;
2486cdf0e10cSrcweir                }
2487cdf0e10cSrcweir            }
2488cdf0e10cSrcweir
2489cdf0e10cSrcweir            if (!($foundfile))
2490cdf0e10cSrcweir            {
2491b274bc22SAndre Fischer                $installer::logger::Lang->printf("Warning: FileID %s for Link %s not found!\n",
2492b274bc22SAndre Fischer                    $fileid,
2493b274bc22SAndre Fischer                    $onelink->{'gid'});
2494cdf0e10cSrcweir            }
2495cdf0e10cSrcweir        }
2496cdf0e10cSrcweir    }
2497cdf0e10cSrcweir
2498b274bc22SAndre Fischer    $installer::logger::Lang->printf("\n");
2499cdf0e10cSrcweir}
2500cdf0e10cSrcweir
2501cdf0e10cSrcweir#################################################
2502cdf0e10cSrcweir# Determining the destination link of a link
2503cdf0e10cSrcweir#################################################
2504cdf0e10cSrcweir
2505dba1a2e4SAndre Fischersub get_destination_link_path_for_links ($)
2506cdf0e10cSrcweir{
2507cdf0e10cSrcweir    my ($linksarrayref) = @_;
2508cdf0e10cSrcweir
2509cdf0e10cSrcweir    my $infoline;
2510cdf0e10cSrcweir
2511dba1a2e4SAndre Fischer    foreach my $onelink (@$linksarrayref)
2512cdf0e10cSrcweir    {
2513cdf0e10cSrcweir        my $shortcutid = "";
2514dba1a2e4SAndre Fischer        if ($onelink->{'ShortcutID'})
2515dba1a2e4SAndre Fischer        {
2516dba1a2e4SAndre Fischer            $shortcutid = $onelink->{'ShortcutID'};
2517dba1a2e4SAndre Fischer        }
2518cdf0e10cSrcweir
2519dba1a2e4SAndre Fischer        if ($shortcutid ne "")
2520cdf0e10cSrcweir        {
2521cdf0e10cSrcweir            my $foundlink = 0;
2522cdf0e10cSrcweir
2523dba1a2e4SAndre Fischer            foreach my $destlink (@$linksarrayref)
2524cdf0e10cSrcweir            {
2525dba1a2e4SAndre Fischer                if ($destlink->{'gid'} eq $shortcutid)
2526cdf0e10cSrcweir                {
2527cdf0e10cSrcweir                    $foundlink = 1;
2528cdf0e10cSrcweir                    $onelink->{'destinationfile'} = $destlink->{'destination'};     # making key 'destinationfile'
2529cdf0e10cSrcweir                    last;
2530cdf0e10cSrcweir                }
2531cdf0e10cSrcweir            }
2532cdf0e10cSrcweir
2533dba1a2e4SAndre Fischer            if ( ! $foundlink)
2534cdf0e10cSrcweir            {
2535b274bc22SAndre Fischer                $installer::logger::Lang->printf("Warning: ShortcutID %s for Link %s not found!\n",
2536b274bc22SAndre Fischer                    $shortcutid,
2537b274bc22SAndre Fischer                    $onelink->{'gid'});
2538cdf0e10cSrcweir            }
2539cdf0e10cSrcweir        }
2540cdf0e10cSrcweir    }
2541cdf0e10cSrcweir
2542b274bc22SAndre Fischer    $installer::logger::Lang->printf("\n");
2543cdf0e10cSrcweir}
2544cdf0e10cSrcweir
2545cdf0e10cSrcweir###################################################################################
2546cdf0e10cSrcweir# Items with flag WORKSTATION are not needed (here: links and configurationitems)
2547cdf0e10cSrcweir###################################################################################
2548cdf0e10cSrcweir
2549cdf0e10cSrcweirsub remove_workstation_only_items
2550cdf0e10cSrcweir{
2551cdf0e10cSrcweir    my ($itemarrayref) = @_;
2552cdf0e10cSrcweir
2553cdf0e10cSrcweir    my @newitemarray = ();
2554cdf0e10cSrcweir
2555cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$itemarrayref}; $i++ )
2556cdf0e10cSrcweir    {
2557cdf0e10cSrcweir        my $oneitem = ${$itemarrayref}[$i];
2558cdf0e10cSrcweir        my $styles = $oneitem->{'Styles'};
2559cdf0e10cSrcweir
2560cdf0e10cSrcweir        if (( $styles =~ /\bWORKSTATION\b/ ) &&
2561cdf0e10cSrcweir            (!( $styles =~ /\bNETWORK\b/ )) &&
2562cdf0e10cSrcweir            (!( $styles =~ /\bSTANDALONE\b/ )))
2563cdf0e10cSrcweir        {
2564cdf0e10cSrcweir            next;   # removing this link, it is only needed for a workstation installation
2565cdf0e10cSrcweir        }
2566cdf0e10cSrcweir
2567cdf0e10cSrcweir        push(@newitemarray, $oneitem);
2568cdf0e10cSrcweir    }
2569cdf0e10cSrcweir
2570cdf0e10cSrcweir    return \@newitemarray;
2571cdf0e10cSrcweir}
2572cdf0e10cSrcweir
2573cdf0e10cSrcweir################################################
2574cdf0e10cSrcweir# Resolving relative path in links
2575cdf0e10cSrcweir################################################
2576cdf0e10cSrcweir
2577cdf0e10cSrcweirsub resolve_links_with_flag_relative
2578cdf0e10cSrcweir{
2579cdf0e10cSrcweir    my ($linksarrayref) = @_;
2580cdf0e10cSrcweir
2581cdf0e10cSrcweir    # Before this step is:
2582cdf0e10cSrcweir    # destination=program/libsalhelperC52.so.3, this will be the name of the link
2583cdf0e10cSrcweir    # destinationfile=program/libsalhelperC52.so.3, this will be the linked file or name
258486e1cf34SPedro Giffuni    # If the flag RELATIVE is set, the paths have to be analyzed. If the flag is not set
2585cdf0e10cSrcweir    # (this will not occur in the future?) destinationfile has to be an absolute path name
2586cdf0e10cSrcweir
2587cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$linksarrayref}; $i++ )
2588cdf0e10cSrcweir    {
2589cdf0e10cSrcweir        my $onelink = ${$linksarrayref}[$i];
2590cdf0e10cSrcweir        my $styles = $onelink->{'Styles'};
2591cdf0e10cSrcweir
2592cdf0e10cSrcweir        if ( $styles =~ /\bRELATIVE\b/ )
2593cdf0e10cSrcweir        {
2594cdf0e10cSrcweir            # ToDo: This is only a simple not sufficient mechanism
2595cdf0e10cSrcweir
2596cdf0e10cSrcweir            my $destination = $onelink->{'destination'};
2597cdf0e10cSrcweir            my $destinationfile = $onelink->{'destinationfile'};
2598cdf0e10cSrcweir
2599cdf0e10cSrcweir            my $destinationpath = $destination;
2600cdf0e10cSrcweir
2601cdf0e10cSrcweir            installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationpath);
2602cdf0e10cSrcweir
2603cdf0e10cSrcweir            my $destinationfilepath = $destinationfile;
2604cdf0e10cSrcweir
2605cdf0e10cSrcweir            # it is possible, that the destinationfile is no longer part of the files collector
2606cdf0e10cSrcweir            if ($destinationfilepath) { installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationfilepath); }
2607cdf0e10cSrcweir            else { $destinationfilepath = ""; }
2608cdf0e10cSrcweir
2609cdf0e10cSrcweir            if ( $destinationpath eq $destinationfilepath )
2610cdf0e10cSrcweir            {
2611cdf0e10cSrcweir                # link and file are in the same directory
2612cdf0e10cSrcweir                # Therefore the path of the file can be removed
2613cdf0e10cSrcweir
2614cdf0e10cSrcweir                my $newdestinationfile = $destinationfile;
2615cdf0e10cSrcweir                installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$newdestinationfile);
2616cdf0e10cSrcweir
2617cdf0e10cSrcweir                $onelink->{'destinationfile'} = $newdestinationfile;
2618cdf0e10cSrcweir            }
2619cdf0e10cSrcweir        }
2620cdf0e10cSrcweir    }
2621cdf0e10cSrcweir}
2622cdf0e10cSrcweir
2623cdf0e10cSrcweir########################################################################
2624cdf0e10cSrcweir# This function is a helper of function "assigning_modules_to_items"
2625cdf0e10cSrcweir########################################################################
2626cdf0e10cSrcweir
2627cdf0e10cSrcweirsub insert_for_item ($$$)
2628cdf0e10cSrcweir{
2629cdf0e10cSrcweir    my ($hash, $item, $id) = @_;
2630cdf0e10cSrcweir
2631cdf0e10cSrcweir    # print STDERR "insert '$id' for '$item'\n";
2632cdf0e10cSrcweir    if (!defined $hash->{$item})
2633cdf0e10cSrcweir    {
2634cdf0e10cSrcweir        my @gids = ();
2635cdf0e10cSrcweir        $hash->{$item} = \@gids;
2636cdf0e10cSrcweir    }
2637cdf0e10cSrcweir    my $gid_list = $hash->{$item};
2638cdf0e10cSrcweir    push @{$gid_list}, $id;
2639cdf0e10cSrcweir    $hash->{$item} = $gid_list;
2640cdf0e10cSrcweir}
2641cdf0e10cSrcweir
2642dba1a2e4SAndre Fischersub build_modulegids_table ($$)
2643cdf0e10cSrcweir{
2644cdf0e10cSrcweir    my ($modulesref, $itemname) = @_;
2645cdf0e10cSrcweir
2646cdf0e10cSrcweir    my %module_lookup_table = ();
2647cdf0e10cSrcweir
2648cdf0e10cSrcweir    # build map of item names to list of respective module gids
2649cdf0e10cSrcweir    # containing these items
26501ba1fd99SAndre Fischer    foreach my $onemodule (@$modulesref)
2651cdf0e10cSrcweir    {
2652dba1a2e4SAndre Fischer        next if ! defined $onemodule->{$itemname};
26531ba1fd99SAndre Fischer
2654cdf0e10cSrcweir        # these are the items contained in this module
2655*c97fd792Smseidel        # e.g. Files = (gid_a_b_c,gid_d_e_f)
2656cdf0e10cSrcweir        my $module_gids = $onemodule->{$itemname};
2657cdf0e10cSrcweir
2658cdf0e10cSrcweir        # prune outer brackets
2659cdf0e10cSrcweir        $module_gids =~ s|^\s*\(||g;
2660cdf0e10cSrcweir        $module_gids =~ s|\)\s*$||g;
2661cdf0e10cSrcweir        for my $id (split (/,/, $module_gids))
2662cdf0e10cSrcweir        {
2663cdf0e10cSrcweir            chomp $id;
2664cdf0e10cSrcweir            insert_for_item(\%module_lookup_table, lc ($id), $onemodule->{'gid'});
2665cdf0e10cSrcweir        }
2666cdf0e10cSrcweir    }
2667cdf0e10cSrcweir
2668cdf0e10cSrcweir    return \%module_lookup_table;
2669cdf0e10cSrcweir}
2670cdf0e10cSrcweir
2671cdf0e10cSrcweir########################################################################
2672cdf0e10cSrcweir# Items like files do not know their modules
2673cdf0e10cSrcweir# This function is a helper of function "assigning_modules_to_items"
2674cdf0e10cSrcweir########################################################################
2675cdf0e10cSrcweir
2676dba1a2e4SAndre Fischersub get_string_of_modulegids_for_itemgid ($$)
2677cdf0e10cSrcweir{
2678dba1a2e4SAndre Fischer    my ($module_lookup_table, $itemgid) = @_;
2679cdf0e10cSrcweir
2680cdf0e10cSrcweir    my $haslanguagemodule = 0;
2681cdf0e10cSrcweir    my %foundmodules = ();
2682cdf0e10cSrcweir
2683cdf0e10cSrcweir    my $gid_list = $module_lookup_table->{lc($itemgid)};
2684cdf0e10cSrcweir
26851ba1fd99SAndre Fischer    foreach my $gid (@$gid_list)
2686cdf0e10cSrcweir    {
2687cdf0e10cSrcweir        $foundmodules{$gid} = 1;
2688cdf0e10cSrcweir        # Is this module a language module? This info should be stored at the file.
2689dba1a2e4SAndre Fischer        if ( exists($installer::globals::alllangmodules{$gid}) )
2690dba1a2e4SAndre Fischer        {
2691dba1a2e4SAndre Fischer            $haslanguagemodule = 1;
2692dba1a2e4SAndre Fischer        }
2693cdf0e10cSrcweir    }
2694cdf0e10cSrcweir
2695dba1a2e4SAndre Fischer    my $allmodules = join(",", keys %foundmodules);
2696cdf0e10cSrcweir
2697cdf0e10cSrcweir    # Check: All modules or no module must have flag LANGUAGEMODULE
2698cdf0e10cSrcweir    if ( $haslanguagemodule )
2699cdf0e10cSrcweir    {
2700dba1a2e4SAndre Fischer        my $isreallylanguagemodule = installer::worker::key_in_a_is_also_key_in_b(
2701dba1a2e4SAndre Fischer            \%foundmodules,
2702dba1a2e4SAndre Fischer            \%installer::globals::alllangmodules);
2703dba1a2e4SAndre Fischer        if ( ! $isreallylanguagemodule )
2704dba1a2e4SAndre Fischer        {
2705dba1a2e4SAndre Fischer            installer::exiter::exit_program(
2706dba1a2e4SAndre Fischer                sprintf(
27071ba1fd99SAndre Fischer                    "ERROR: \"%s\" is assigned to modules with flag "
2708dba1a2e4SAndre Fischer                    ."\"LANGUAGEMODULE\" and also to modules without this flag! Modules: %s",
2709dba1a2e4SAndre Fischer                    $itemgid,
2710dba1a2e4SAndre Fischer                    $allmodules),
2711dba1a2e4SAndre Fischer                "get_string_of_modulegids_for_itemgid");
2712cdf0e10cSrcweir        }
2713dba1a2e4SAndre Fischer    }
2714cdf0e10cSrcweir
2715cdf0e10cSrcweir    return ($allmodules, $haslanguagemodule);
2716cdf0e10cSrcweir}
2717cdf0e10cSrcweir
2718cdf0e10cSrcweir########################################################
2719cdf0e10cSrcweir# Items like files do not know their modules
2720cdf0e10cSrcweir# This function add the {'modules'} to these items
2721cdf0e10cSrcweir########################################################
2722cdf0e10cSrcweir
2723cdf0e10cSrcweirsub assigning_modules_to_items
2724cdf0e10cSrcweir{
2725cdf0e10cSrcweir    my ($modulesref, $itemsref, $itemname) = @_;
2726cdf0e10cSrcweir
2727cdf0e10cSrcweir    my $languageassignmenterror = 0;
2728cdf0e10cSrcweir    my @languageassignmenterrors = ();
2729cdf0e10cSrcweir
2730cdf0e10cSrcweir    my $module_lookup_table = build_modulegids_table($modulesref, $itemname);
2731cdf0e10cSrcweir
2732cdf0e10cSrcweir    for my $oneitem (@{$itemsref})
2733cdf0e10cSrcweir    {
2734cdf0e10cSrcweir        my $itemgid = $oneitem->{'gid'};
2735cdf0e10cSrcweir
2736cdf0e10cSrcweir        my $styles = "";
2737cdf0e10cSrcweir        if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
2738cdf0e10cSrcweir        if (( $itemname eq "Dirs" ) && ( ! ( $styles =~ /\bCREATE\b/ ))) { next; }
2739cdf0e10cSrcweir
2740cdf0e10cSrcweir        if ( $itemgid eq "" )
2741cdf0e10cSrcweir        {
2742dba1a2e4SAndre Fischer            installer::exiter::exit_program(
2743dba1a2e4SAndre Fischer                sprintf("ERROR in item collection: No gid for item %s", $oneitem->{'Name'}),
2744dba1a2e4SAndre Fischer                "assigning_modules_to_items");
2745cdf0e10cSrcweir        }
2746cdf0e10cSrcweir
2747cdf0e10cSrcweir        # every item can belong to many modules
2748cdf0e10cSrcweir
2749dba1a2e4SAndre Fischer        my ($modulegids, $haslanguagemodule) = get_string_of_modulegids_for_itemgid(
2750dba1a2e4SAndre Fischer            $module_lookup_table,
2751dba1a2e4SAndre Fischer            $itemgid);
2752cdf0e10cSrcweir
2753cdf0e10cSrcweir        if ($modulegids eq "")
2754cdf0e10cSrcweir        {
2755dba1a2e4SAndre Fischer            installer::exiter::exit_program(
2756dba1a2e4SAndre Fischer                sprintf("ERROR in file collection: No module found for %s %s",
2757dba1a2e4SAndre Fischer                    $itemname,
2758dba1a2e4SAndre Fischer                    $itemgid),
2759dba1a2e4SAndre Fischer                "assigning_modules_to_items");
2760cdf0e10cSrcweir        }
2761cdf0e10cSrcweir
2762cdf0e10cSrcweir        $oneitem->{'modules'} = $modulegids;
2763cdf0e10cSrcweir        $oneitem->{'haslanguagemodule'} = $haslanguagemodule;
2764cdf0e10cSrcweir
2765cdf0e10cSrcweir        # Important check: "ismultilingual" and "haslanguagemodule" must have the same value !
2766dba1a2e4SAndre Fischer        if ($oneitem->{'ismultilingual'} && ! $oneitem->{'haslanguagemodule'})
2767cdf0e10cSrcweir        {
2768dba1a2e4SAndre Fischer            my $infoline = sprintf(
2769dba1a2e4SAndre Fischer                "Error: \"%s\" is multi lingual, but not in language pack (Assigned module: %s)\n",
2770dba1a2e4SAndre Fischer                $oneitem->{'gid'},
2771dba1a2e4SAndre Fischer                $modulegids);
2772b274bc22SAndre Fischer            $installer::logger::Global->print($infoline);
2773cdf0e10cSrcweir            push(@languageassignmenterrors, $infoline);
2774cdf0e10cSrcweir            $languageassignmenterror = 1;
2775cdf0e10cSrcweir        }
2776dba1a2e4SAndre Fischer        elsif ($oneitem->{'haslanguagemodule'} && ! $oneitem->{'ismultilingual'})
2777cdf0e10cSrcweir        {
2778dba1a2e4SAndre Fischer            my $infoline = sprintf(
2779dba1a2e4SAndre Fischer                "Error: \"%s\" is in language pack, but not multi lingual (Assigned module: %s)\n",
2780dba1a2e4SAndre Fischer                $oneitem->{'gid'},
2781dba1a2e4SAndre Fischer                $modulegids);
2782b274bc22SAndre Fischer            $installer::logger::Global->print($infoline);
2783cdf0e10cSrcweir            push(@languageassignmenterrors, $infoline);
2784cdf0e10cSrcweir            $languageassignmenterror = 1;
2785cdf0e10cSrcweir        }
2786cdf0e10cSrcweir    }
2787cdf0e10cSrcweir
2788cdf0e10cSrcweir    if ($languageassignmenterror)
2789cdf0e10cSrcweir    {
2790cdf0e10cSrcweir        for ( my $i = 0; $i <= $#languageassignmenterrors; $i++ ) { print "$languageassignmenterrors[$i]"; }
2791cdf0e10cSrcweir        installer::exiter::exit_program("ERROR: Incorrect assignments for language packs.", "assigning_modules_to_items");
2792cdf0e10cSrcweir    }
2793cdf0e10cSrcweir
2794cdf0e10cSrcweir}
2795cdf0e10cSrcweir
2796cdf0e10cSrcweir#################################################################################################
2797cdf0e10cSrcweir# Root path (for instance /opt/openofficeorg20) needs to be added to directories, files and links
2798cdf0e10cSrcweir#################################################################################################
2799cdf0e10cSrcweir
2800cdf0e10cSrcweirsub add_rootpath_to_directories
2801cdf0e10cSrcweir{
2802cdf0e10cSrcweir    my ($dirsref, $rootpath) = @_;
2803cdf0e10cSrcweir
2804cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
2805cdf0e10cSrcweir    {
2806cdf0e10cSrcweir        my $onedir = ${$dirsref}[$i];
2807cdf0e10cSrcweir        my $dir = "";
2808cdf0e10cSrcweir
2809cdf0e10cSrcweir        if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; }
2810cdf0e10cSrcweir
2811cdf0e10cSrcweir        if (!($dir =~ /\bPREDEFINED_/ ))
2812cdf0e10cSrcweir        {
2813cdf0e10cSrcweir            my $hostname = $onedir->{'HostName'};
2814cdf0e10cSrcweir            $hostname = $rootpath . $installer::globals::separator . $hostname;
2815cdf0e10cSrcweir            $onedir->{'HostName'} = $hostname;
2816cdf0e10cSrcweir        }
2817cdf0e10cSrcweir
2818cdf0e10cSrcweir        # added
2819cdf0e10cSrcweir
2820cdf0e10cSrcweir        if ( $dir =~ /\bPREDEFINED_PROGDIR\b/ )
2821cdf0e10cSrcweir        {
2822cdf0e10cSrcweir            my $hostname = $onedir->{'HostName'};
2823cdf0e10cSrcweir            if ( $hostname eq "" ) { $onedir->{'HostName'} = $rootpath; }
2824cdf0e10cSrcweir            else { $onedir->{'HostName'} = $rootpath . $installer::globals::separator . $hostname; }
2825cdf0e10cSrcweir        }
2826cdf0e10cSrcweir    }
2827cdf0e10cSrcweir}
2828cdf0e10cSrcweir
2829cdf0e10cSrcweirsub add_rootpath_to_files
2830cdf0e10cSrcweir{
2831cdf0e10cSrcweir    my ($filesref, $rootpath) = @_;
2832cdf0e10cSrcweir
2833cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$filesref}; $i++ )
2834cdf0e10cSrcweir    {
2835cdf0e10cSrcweir        my $onefile = ${$filesref}[$i];
2836cdf0e10cSrcweir        my $destination = $onefile->{'destination'};
2837cdf0e10cSrcweir        $destination = $rootpath . $installer::globals::separator . $destination;
2838cdf0e10cSrcweir        $onefile->{'destination'} = $destination;
2839cdf0e10cSrcweir    }
2840cdf0e10cSrcweir}
2841cdf0e10cSrcweir
2842cdf0e10cSrcweirsub add_rootpath_to_links
2843cdf0e10cSrcweir{
2844cdf0e10cSrcweir    my ($linksref, $rootpath) = @_;
2845cdf0e10cSrcweir
2846cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$linksref}; $i++ )
2847cdf0e10cSrcweir    {
2848cdf0e10cSrcweir        my $onelink = ${$linksref}[$i];
2849cdf0e10cSrcweir        my $styles = $onelink->{'Styles'};
2850cdf0e10cSrcweir
2851cdf0e10cSrcweir        my $destination = $onelink->{'destination'};
2852cdf0e10cSrcweir        $destination = $rootpath . $installer::globals::separator . $destination;
2853cdf0e10cSrcweir        $onelink->{'destination'} = $destination;
2854cdf0e10cSrcweir
2855cdf0e10cSrcweir        if (!($styles =~ /\bRELATIVE\b/ )) # for absolute links
2856cdf0e10cSrcweir        {
2857cdf0e10cSrcweir            my $destinationfile = $onelink->{'destinationfile'};
2858cdf0e10cSrcweir            $destinationfile = $rootpath . $installer::globals::separator . $destinationfile;
2859cdf0e10cSrcweir            $onelink->{'destinationfile'} = $destinationfile;
2860cdf0e10cSrcweir        }
2861cdf0e10cSrcweir    }
2862cdf0e10cSrcweir}
2863cdf0e10cSrcweir
2864cdf0e10cSrcweir#################################################################################
2865cdf0e10cSrcweir# Collecting all parent gids
2866cdf0e10cSrcweir#################################################################################
2867cdf0e10cSrcweir
2868cdf0e10cSrcweirsub collect_all_parent_feature
2869cdf0e10cSrcweir{
2870cdf0e10cSrcweir    my ($modulesref) = @_;
2871cdf0e10cSrcweir
2872cdf0e10cSrcweir    my @allparents = ();
2873cdf0e10cSrcweir
2874cdf0e10cSrcweir    my $found_root_module = 0;
2875cdf0e10cSrcweir
2876cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
2877cdf0e10cSrcweir    {
2878cdf0e10cSrcweir        my $onefeature = ${$modulesref}[$i];
2879cdf0e10cSrcweir
2880cdf0e10cSrcweir        my $parentgid = "";
2881cdf0e10cSrcweir        if ( $onefeature->{'ParentID'} )
2882cdf0e10cSrcweir        {
2883cdf0e10cSrcweir            $parentgid = $onefeature->{'ParentID'};
2884cdf0e10cSrcweir        }
2885cdf0e10cSrcweir
2886cdf0e10cSrcweir        if ( $parentgid ne "" )
2887cdf0e10cSrcweir        {
2888cdf0e10cSrcweir            if (! installer::existence::exists_in_array($parentgid, \@allparents))
2889cdf0e10cSrcweir            {
2890cdf0e10cSrcweir                push(@allparents, $parentgid);
2891cdf0e10cSrcweir            }
2892cdf0e10cSrcweir        }
2893cdf0e10cSrcweir
2894cdf0e10cSrcweir        # Setting the global root module
2895cdf0e10cSrcweir
2896cdf0e10cSrcweir        if ( $parentgid eq "" )
2897cdf0e10cSrcweir        {
2898cdf0e10cSrcweir            if ( $found_root_module ) { installer::exiter::exit_program("ERROR: Only one module without ParentID or with empty ParentID allowed ($installer::globals::rootmodulegid, $onefeature->{'gid'}).", "collect_all_parent_feature"); }
2899cdf0e10cSrcweir            $installer::globals::rootmodulegid = $onefeature->{'gid'};
2900cdf0e10cSrcweir            $found_root_module = 1;
2901b274bc22SAndre Fischer            $installer::logger::Global->printf("Setting Root Module: %s\n", $installer::globals::rootmodulegid);
2902cdf0e10cSrcweir        }
2903cdf0e10cSrcweir
2904cdf0e10cSrcweir        if ( ! $found_root_module ) { installer::exiter::exit_program("ERROR: Could not define root module. No module without ParentID or with empty ParentID exists.", "collect_all_parent_feature"); }
2905cdf0e10cSrcweir
2906cdf0e10cSrcweir    }
2907cdf0e10cSrcweir
2908cdf0e10cSrcweir    return \@allparents;
2909cdf0e10cSrcweir}
2910cdf0e10cSrcweir
2911cdf0e10cSrcweir#################################################################################
2912cdf0e10cSrcweir# Checking for every feature, whether it has children
2913cdf0e10cSrcweir#################################################################################
2914cdf0e10cSrcweir
2915cdf0e10cSrcweirsub set_children_flag
2916cdf0e10cSrcweir{
2917cdf0e10cSrcweir    my ($modulesref) = @_;
2918cdf0e10cSrcweir
2919cdf0e10cSrcweir    my $allparents = collect_all_parent_feature($modulesref);
2920cdf0e10cSrcweir
2921cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
2922cdf0e10cSrcweir    {
2923cdf0e10cSrcweir        my $onefeature = ${$modulesref}[$i];
2924cdf0e10cSrcweir        my $gid = $onefeature->{'gid'};
2925cdf0e10cSrcweir
2926cdf0e10cSrcweir        # is this gid a parent?
2927cdf0e10cSrcweir
2928cdf0e10cSrcweir        if ( installer::existence::exists_in_array($gid, $allparents) )
2929cdf0e10cSrcweir        {
2930cdf0e10cSrcweir            $onefeature->{'has_children'} = 1;
2931cdf0e10cSrcweir        }
2932cdf0e10cSrcweir        else
2933cdf0e10cSrcweir        {
2934cdf0e10cSrcweir            $onefeature->{'has_children'} = 0;
2935cdf0e10cSrcweir        }
2936cdf0e10cSrcweir    }
2937cdf0e10cSrcweir}
2938cdf0e10cSrcweir
2939cdf0e10cSrcweir#################################################################################
2940cdf0e10cSrcweir# All modules, that use a template module, do now get the assignments of
2941cdf0e10cSrcweir# the template module.
2942cdf0e10cSrcweir#################################################################################
2943cdf0e10cSrcweir
2944cdf0e10cSrcweirsub resolve_assigned_modules
2945cdf0e10cSrcweir{
2946cdf0e10cSrcweir    my ($modulesref) = @_;
2947cdf0e10cSrcweir
2948cdf0e10cSrcweir    # collecting all template modules
2949cdf0e10cSrcweir
2950cdf0e10cSrcweir    my %directaccess = ();
2951cdf0e10cSrcweir
2952cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
2953cdf0e10cSrcweir    {
2954cdf0e10cSrcweir        my $onefeature = ${$modulesref}[$i];
2955cdf0e10cSrcweir        my $styles = "";
2956cdf0e10cSrcweir        if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
2957cdf0e10cSrcweir        if ( $styles =~ /\bTEMPLATEMODULE\b/ ) { $directaccess{$onefeature->{'gid'}} = $onefeature; }
2958cdf0e10cSrcweir
2959cdf0e10cSrcweir        # also looking for module with flag ROOT_BRAND_PACKAGE, to save is for further usage
2960cdf0e10cSrcweir        if ( $styles =~ /\bROOT_BRAND_PACKAGE\b/ )
2961cdf0e10cSrcweir        {
2962cdf0e10cSrcweir            $installer::globals::rootbrandpackage = $onefeature->{'gid'};
2963cdf0e10cSrcweir            $installer::globals::rootbrandpackageset = 1;
2964cdf0e10cSrcweir        }
2965cdf0e10cSrcweir    }
2966cdf0e10cSrcweir
2967cdf0e10cSrcweir    # looking, where template modules are assigned
2968cdf0e10cSrcweir
2969cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
2970cdf0e10cSrcweir    {
2971cdf0e10cSrcweir        my $onefeature = ${$modulesref}[$i];
2972cdf0e10cSrcweir        if ( $onefeature->{'Assigns'} )
2973cdf0e10cSrcweir        {
2974cdf0e10cSrcweir            my $templategid = $onefeature->{'Assigns'};
2975cdf0e10cSrcweir
2976cdf0e10cSrcweir            if ( ! exists($directaccess{$templategid}) )
2977cdf0e10cSrcweir            {
2978cdf0e10cSrcweir                installer::exiter::exit_program("ERROR: Did not find definition of assigned template module \"$templategid\"", "resolve_assigned_modules");
2979cdf0e10cSrcweir            }
2980cdf0e10cSrcweir
2981cdf0e10cSrcweir            # Currently no merging of Files, Dirs, ...
2982cdf0e10cSrcweir            # This has to be included here, if it is required
2983cdf0e10cSrcweir            my $item;
2984cdf0e10cSrcweir            foreach $item (@installer::globals::items_at_modules)
2985cdf0e10cSrcweir            {
2986cdf0e10cSrcweir                if ( exists($directaccess{$templategid}->{$item}) ) { $onefeature->{$item} = $directaccess{$templategid}->{$item}; }
2987cdf0e10cSrcweir            }
2988cdf0e10cSrcweir        }
2989cdf0e10cSrcweir    }
2990cdf0e10cSrcweir}
2991cdf0e10cSrcweir
2992cdf0e10cSrcweir#################################################################################
2993cdf0e10cSrcweir# Removing the template modules from the list, after all
2994cdf0e10cSrcweir# assignments are transferred to the "real" modules.
2995cdf0e10cSrcweir#################################################################################
2996cdf0e10cSrcweir
2997cdf0e10cSrcweirsub remove_template_modules
2998cdf0e10cSrcweir{
2999cdf0e10cSrcweir    my ($modulesref) = @_;
3000cdf0e10cSrcweir
3001cdf0e10cSrcweir    my @modules = ();
3002cdf0e10cSrcweir
3003cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
3004cdf0e10cSrcweir    {
3005cdf0e10cSrcweir        my $onefeature = ${$modulesref}[$i];
3006cdf0e10cSrcweir        my $styles = "";
3007cdf0e10cSrcweir        if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
3008cdf0e10cSrcweir        if ( $styles =~ /\bTEMPLATEMODULE\b/ ) { next; }
3009cdf0e10cSrcweir
3010cdf0e10cSrcweir        push(@modules, $onefeature);
3011cdf0e10cSrcweir    }
3012cdf0e10cSrcweir
3013cdf0e10cSrcweir    return \@modules;
3014cdf0e10cSrcweir}
3015cdf0e10cSrcweir
3016cdf0e10cSrcweir#################################################################################
3017cdf0e10cSrcweir# Collecting all modules with flag LANGUAGEMODULE in a global
3018cdf0e10cSrcweir# collector.
3019cdf0e10cSrcweir#################################################################################
3020cdf0e10cSrcweir
3021cdf0e10cSrcweirsub collect_all_languagemodules
3022cdf0e10cSrcweir{
3023cdf0e10cSrcweir    my ($modulesref) = @_;
3024cdf0e10cSrcweir
3025cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
3026cdf0e10cSrcweir    {
3027cdf0e10cSrcweir        my $onefeature = ${$modulesref}[$i];
3028cdf0e10cSrcweir        my $styles = "";
3029cdf0e10cSrcweir        if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
3030cdf0e10cSrcweir        if ( $styles =~ /\bLANGUAGEMODULE\b/ )
3031cdf0e10cSrcweir        {
3032cdf0e10cSrcweir            if ( ! exists($onefeature->{'Language'}) ) { installer::exiter::exit_program("ERROR: \"$onefeature->{'gid'}\" has flag LANGUAGEMODULE, but does not know its language!", "collect_all_languagemodules"); }
3033cdf0e10cSrcweir            $installer::globals::alllangmodules{$onefeature->{'gid'}} = $onefeature->{'Language'};
3034*c97fd792Smseidel            # Collecting also the English names, that are used for NSIS unpack directory for language packs
3035cdf0e10cSrcweir            my $lang = $onefeature->{'Language'};
3036cdf0e10cSrcweir            my $name = "";
3037cdf0e10cSrcweir            foreach my $localkey ( keys %{$onefeature} )
3038cdf0e10cSrcweir            {
3039cdf0e10cSrcweir                if ( $localkey =~ /^\s*Name\s*\(\s*en-US\s*\)\s*$/ )
3040cdf0e10cSrcweir                {
3041cdf0e10cSrcweir                    $installer::globals::all_english_languagestrings{$lang} = $onefeature->{$localkey};
3042cdf0e10cSrcweir                }
3043cdf0e10cSrcweir            }
3044cdf0e10cSrcweir        }
3045cdf0e10cSrcweir    }
3046cdf0e10cSrcweir}
3047cdf0e10cSrcweir
3048cdf0e10cSrcweir#################################################################################
3049*c97fd792Smseidel# Selecting from all collected English language strings those, that are really
3050cdf0e10cSrcweir# required in this installation set.
3051cdf0e10cSrcweir#################################################################################
3052cdf0e10cSrcweir
3053cdf0e10cSrcweirsub select_required_language_strings
3054cdf0e10cSrcweir{
3055cdf0e10cSrcweir    my ($modulesref) = @_;
3056cdf0e10cSrcweir
3057cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
3058cdf0e10cSrcweir    {
3059cdf0e10cSrcweir        my $onefeature = ${$modulesref}[$i];
3060cdf0e10cSrcweir        my $styles = "";
3061cdf0e10cSrcweir        if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
3062cdf0e10cSrcweir        if ( $styles =~ /\bLANGUAGEMODULE\b/ )
3063cdf0e10cSrcweir        {
3064cdf0e10cSrcweir            if ( ! exists($onefeature->{'Language'}) ) { installer::exiter::exit_program("ERROR: \"$onefeature->{'gid'}\" has flag LANGUAGEMODULE, but does not know its language!", "select_required_language_strings"); }
3065cdf0e10cSrcweir            my $lang = $onefeature->{'Language'};
3066cdf0e10cSrcweir
3067cdf0e10cSrcweir            if (( exists($installer::globals::all_english_languagestrings{$lang}) ) && ( ! exists($installer::globals::all_required_english_languagestrings{$lang}) ))
3068cdf0e10cSrcweir            {
3069cdf0e10cSrcweir                $installer::globals::all_required_english_languagestrings{$lang} = $installer::globals::all_english_languagestrings{$lang};
3070cdf0e10cSrcweir            }
3071cdf0e10cSrcweir        }
3072cdf0e10cSrcweir    }
3073cdf0e10cSrcweir}
3074cdf0e10cSrcweir
3075cdf0e10cSrcweir#####################################################################################
3076cdf0e10cSrcweir# Unixlinks are not always required. For Linux RPMs and Solaris Packages they are
3077cdf0e10cSrcweir# created dynamically. Exception: For package formats "installed" or "archive".
3078cdf0e10cSrcweir# In scp2 this unixlinks have the flag LAYERLINK.
3079cdf0e10cSrcweir#####################################################################################
3080cdf0e10cSrcweir
3081cdf0e10cSrcweirsub filter_layerlinks_from_unixlinks
3082cdf0e10cSrcweir{
3083cdf0e10cSrcweir    my ( $unixlinksref ) = @_;
3084cdf0e10cSrcweir
3085cdf0e10cSrcweir    my @alllinks = ();
3086cdf0e10cSrcweir
3087cdf0e10cSrcweir    for ( my $i = 0; $i <= $#{$unixlinksref}; $i++ )
3088cdf0e10cSrcweir    {
3089cdf0e10cSrcweir        my $isrequired = 1;
3090cdf0e10cSrcweir
3091cdf0e10cSrcweir        my $onelink = ${$unixlinksref}[$i];
3092cdf0e10cSrcweir        my $styles = "";
3093cdf0e10cSrcweir        if ( $onelink->{'Styles'} ) { $styles = $onelink->{'Styles'}; }
3094cdf0e10cSrcweir
3095cdf0e10cSrcweir        if ( $styles =~ /\bLAYERLINK\b/ )
3096cdf0e10cSrcweir        {
3097cdf0e10cSrcweir            # Platforms, that do not need the layer links
3098cdf0e10cSrcweir            if (( $installer::globals::islinuxrpmbuild ) || ( $installer::globals::issolarispkgbuild ))
3099cdf0e10cSrcweir            {
3100cdf0e10cSrcweir                $isrequired = 0;
3101cdf0e10cSrcweir            }
3102cdf0e10cSrcweir
3103cdf0e10cSrcweir            # Package formats, that need the layer link (platform independent)
3104cdf0e10cSrcweir            if (( $installer::globals::packageformat eq "installed" ) || ( $installer::globals::packageformat eq "archive" ))
3105cdf0e10cSrcweir            {
3106cdf0e10cSrcweir                $isrequired = 1;
3107cdf0e10cSrcweir            }
3108cdf0e10cSrcweir        }
3109cdf0e10cSrcweir
3110cdf0e10cSrcweir        if ( $isrequired ) { push(@alllinks, $onelink); }
3111cdf0e10cSrcweir    }
3112cdf0e10cSrcweir
3113cdf0e10cSrcweir    return \@alllinks;
3114cdf0e10cSrcweir}
3115cdf0e10cSrcweir
3116dba1a2e4SAndre Fischer
3117dba1a2e4SAndre Fischer
3118dba1a2e4SAndre Fischer
3119dba1a2e4SAndre Fischer=head2 print_script_item($item)
3120dba1a2e4SAndre Fischer
3121dba1a2e4SAndre Fischer    For debugging.
3122dba1a2e4SAndre Fischer    Print the contents of the given script item to $installer::logger::Lang.
3123dba1a2e4SAndre Fischer
3124dba1a2e4SAndre Fischer=cut
3125dba1a2e4SAndre Fischersub print_script_item ($)
3126dba1a2e4SAndre Fischer{
3127dba1a2e4SAndre Fischer    my ($item) = @_;
3128dba1a2e4SAndre Fischer
3129dba1a2e4SAndre Fischer    $installer::logger::Lang->printf("script item %s\n", $item->{'uniquename'});
3130dba1a2e4SAndre Fischer    foreach my $key (sort keys %$item)
3131dba1a2e4SAndre Fischer    {
3132dba1a2e4SAndre Fischer        my $value = $item->{$key};
3133dba1a2e4SAndre Fischer        $value = "<undef>" unless defined $value;
3134dba1a2e4SAndre Fischer        $installer::logger::Lang->printf("    %20s -> %s\n", $key, $value);
3135dba1a2e4SAndre Fischer    }
3136dba1a2e4SAndre Fischer}
3137dba1a2e4SAndre Fischer
3138dba1a2e4SAndre Fischer
3139cdf0e10cSrcweir1;
3140