xref: /AOO41X/main/solenv/bin/modules/installer/windows/assembly.pm (revision 1ba1fd998b3c63060b3efda26b9ecd3d52188c27)
1#**************************************************************
2#
3#  Licensed to the Apache Software Foundation (ASF) under one
4#  or more contributor license agreements.  See the NOTICE file
5#  distributed with this work for additional information
6#  regarding copyright ownership.  The ASF licenses this file
7#  to you under the Apache License, Version 2.0 (the
8#  "License"); you may not use this file except in compliance
9#  with the License.  You may obtain a copy of the License at
10#
11#    http://www.apache.org/licenses/LICENSE-2.0
12#
13#  Unless required by applicable law or agreed to in writing,
14#  software distributed under the License is distributed on an
15#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16#  KIND, either express or implied.  See the License for the
17#  specific language governing permissions and limitations
18#  under the License.
19#
20#**************************************************************
21
22
23
24package installer::windows::assembly;
25
26use installer::files;
27use installer::globals;
28use installer::worker;
29use installer::windows::idtglobal;
30
31use strict;
32
33##############################################################
34# Returning the first module of a file from the
35# comma separated list of modules.
36##############################################################
37
38sub get_msiassembly_feature
39{
40    my ( $onefile ) = @_;
41
42    my $module = "";
43
44    if ( $onefile->{'modules'} ) { $module = $onefile->{'modules'}; }
45
46    # If modules contains a list of modules, only taking the first one.
47
48    if ( $module =~ /^\s*(.*?)\,/ ) { $module = $1; }
49
50    # Attention: Maximum feature length is 38!
51    installer::windows::idtglobal::shorten_feature_gid(\$module);
52
53    return $module;
54}
55
56##############################################################
57# Returning the component of a file.
58##############################################################
59
60sub get_msiassembly_component
61{
62    my ( $onefile ) = @_;
63
64    my $component = "";
65
66    $component = $onefile->{'componentname'};
67
68    return $component;
69}
70
71##############################################################
72# Returning the file name as manifest file
73##############################################################
74
75sub get_msiassembly_filemanifest
76{
77    my ( $onefile ) = @_;
78
79    my $filemanifest = "";
80
81    $filemanifest = $onefile->{'uniquename'};
82    # $filemanifest = $onefile->{'Name'};
83
84    return $filemanifest;
85}
86
87
88##############################################################
89# Returning the file application
90##############################################################
91
92sub get_msiassembly_fileapplication
93{
94    my ( $onefile ) = @_;
95
96    my $fileapplication = "";
97
98    return $fileapplication;
99}
100
101##############################################################
102# Returning the file attributes
103##############################################################
104
105sub get_msiassembly_attributes
106{
107    my ( $onefile ) = @_;
108
109    my $fileattributes = "";
110
111    if ( $onefile->{'Attributes'} ne "" ) { $fileattributes = $onefile->{'Attributes'}; }
112
113    return $fileattributes;
114}
115
116##############################################################
117# Returning the file object for the msiassembly table.
118##############################################################
119
120sub get_msiassembly_file
121{
122    my ( $filesref, $filename ) = @_;
123
124    my $foundfile = 0;
125    my $onefile;
126
127    for ( my $i = 0; $i <= $#{$filesref}; $i++ )
128    {
129        $onefile = ${$filesref}[$i];
130        my $name = $onefile->{'Name'};
131
132        if ( $name eq $filename )
133        {
134            $foundfile = 1;
135            last;
136        }
137    }
138
139    # It does not need to exist. For example products that do not contain the libraries.
140    # if (! $foundfile ) { installer::exiter::exit_program("ERROR: No unique file name found for $filename !", "get_selfreg_file"); }
141
142    if (! $foundfile ) { $onefile  = ""; }
143
144    return $onefile;
145}
146
147##############################################################
148# Returning the file object for the msiassembly table.
149##############################################################
150
151sub get_msiassembly_file_by_gid
152{
153    my ( $filesref, $gid ) = @_;
154
155    my $foundfile = 0;
156    my $onefile;
157
158    for ( my $i = 0; $i <= $#{$filesref}; $i++ )
159    {
160        $onefile = ${$filesref}[$i];
161        my $filegid = $onefile->{'gid'};
162
163        if ( $filegid eq $gid )
164        {
165            $foundfile = 1;
166            last;
167        }
168    }
169
170    # It does not need to exist. For example products that do not contain the libraries.
171    # if (! $foundfile ) { installer::exiter::exit_program("ERROR: No unique file name found for $filename !", "get_selfreg_file"); }
172
173    if (! $foundfile ) { $onefile  = ""; }
174
175    return $onefile;
176}
177
178####################################################################################
179# Creating the file MsiAssembly.idt dynamically
180# Content:
181# Component_    Feature_    File_Manifest   File_Application    Attributes
182# s72   s38 S72 S72 I2
183# MsiAssembly   Component_
184####################################################################################
185
186sub create_msiassembly_table
187{
188    my ($filesref, $basedir) = @_;
189
190    $installer::globals::msiassemblyfiles = installer::worker::collect_all_items_with_special_flag($filesref, "ASSEMBLY");
191
192    my @msiassemblytable = ();
193
194    installer::windows::idtglobal::write_idt_header(\@msiassemblytable, "msiassembly");
195
196    # Registering all libraries listed in $installer::globals::msiassemblyfiles
197
198    for ( my $i = 0; $i <= $#{$installer::globals::msiassemblyfiles}; $i++ )
199    {
200        my $onefile = ${$installer::globals::msiassemblyfiles}[$i];
201
202        my %msiassembly = ();
203
204        $msiassembly{'Component_'} = get_msiassembly_component($onefile);
205        $msiassembly{'Feature_'} = get_msiassembly_feature($onefile);
206        $msiassembly{'File_Manifest'} = get_msiassembly_filemanifest($onefile);
207        $msiassembly{'File_Application'} = get_msiassembly_fileapplication($onefile);
208        $msiassembly{'Attributes'} = get_msiassembly_attributes($onefile);
209
210        my $oneline = $msiassembly{'Component_'} . "\t" . $msiassembly{'Feature_'} . "\t" .
211                        $msiassembly{'File_Manifest'} . "\t" . $msiassembly{'File_Application'} . "\t" .
212                        $msiassembly{'Attributes'} . "\n";
213
214        push(@msiassemblytable, $oneline);
215    }
216
217    # Saving the file
218
219    my $msiassemblytablename = $basedir . $installer::globals::separator . "MsiAssem.idt";
220    installer::files::save_file($msiassemblytablename ,\@msiassemblytable);
221    my $infoline = "Created idt file: $msiassemblytablename\n";
222    $installer::logger::Lang->print($infoline);
223}
224
225####################################################################################
226# Returning the name for the table MsiAssemblyName
227####################################################################################
228
229sub get_msiassemblyname_name ($)
230{
231    my ($number) = @_;
232
233    my $name = "";
234
235    if ( $number == 1 ) { $name = "name"; }
236    elsif ( $number == 2 ) { $name = "publicKeyToken"; }
237    elsif ( $number == 3 ) { $name = "version"; }
238    elsif ( $number == 4 ) { $name = "culture"; }
239
240    return $name;
241}
242
243####################################################################################
244# Creating the file MsiAssemblyName.idt dynamically
245# Content:
246# Component_    Name    Value
247# s72   s255    s255
248# MsiAssemblyName   Component_  Name
249####################################################################################
250
251sub create_msiassemblyname_table
252{
253    my ($filesref, $basedir) = @_;
254
255    my @msiassemblynametable = ();
256
257    installer::windows::idtglobal::write_idt_header(\@msiassemblynametable, "msiassemblyname");
258
259    for ( my $i = 0; $i <= $#{$installer::globals::msiassemblyfiles}; $i++ )
260    {
261        my $onefile = ${$installer::globals::msiassemblyfiles}[$i];
262
263        my $component = get_msiassembly_component($onefile);
264        my $oneline = "";
265
266        # Order: (Assembly)name, publicKeyToken, version, culture.
267
268        if ( $onefile->{'Assemblyname'} )
269        {
270            $oneline = $component . "\t" . "name" . "\t" . $onefile->{'Assemblyname'} . "\n";
271            push(@msiassemblynametable, $oneline);
272        }
273
274        if ( $onefile->{'PublicKeyToken'} )
275        {
276            $oneline = $component . "\t" . "publicKeyToken" . "\t" . $onefile->{'PublicKeyToken'} . "\n";
277            push(@msiassemblynametable, $oneline);
278        }
279
280        if ( $onefile->{'Version'} )
281        {
282            $oneline = $component . "\t" . "version" . "\t" . $onefile->{'Version'} . "\n";
283            push(@msiassemblynametable, $oneline);
284        }
285
286        if ( $onefile->{'Culture'} )
287        {
288            $oneline = $component . "\t" . "culture" . "\t" . $onefile->{'Culture'} . "\n";
289            push(@msiassemblynametable, $oneline);
290        }
291
292        if ( $onefile->{'ProcessorArchitecture'} )
293        {
294            $oneline = $component . "\t" . "processorArchitecture" . "\t" . $onefile->{'ProcessorArchitecture'} . "\n";
295            push(@msiassemblynametable, $oneline);
296        }
297    }
298
299    # Saving the file
300
301    my $msiassemblynametablename = $basedir . $installer::globals::separator . "MsiAsseN.idt";
302    installer::files::save_file($msiassemblynametablename ,\@msiassemblynametable);
303    my $infoline = "Created idt file: $msiassemblynametablename\n";
304    $installer::logger::Lang->print($infoline);
305
306}
307
308####################################################################################
309# setting an installation condition for the assembly libraries saved in
310# @installer::globals::msiassemblynamecontent
311####################################################################################
312
313sub add_assembly_condition_into_component_table
314{
315    my ($filesref, $basedir) = @_;
316
317    my $componenttablename = $basedir . $installer::globals::separator . "Componen.idt";
318    my $componenttable = installer::files::read_file($componenttablename);
319    my $changed = 0;
320
321    foreach my $onefile (@$installer::globals::msiassemblyfiles)
322    {
323        my $filecomponent = get_msiassembly_component($onefile);
324
325        for ( my $j = 0; $j <= $#{$componenttable}; $j++ )
326        {
327            my $oneline = ${$componenttable}[$j];
328
329            if ( $oneline =~ /(.*)\t(.*)\t(.*)\t(.*)\t(.*)\t(.*)/ )
330            {
331                my $component = $1;
332                my $componentid = $2;
333                my $directory = $3;
334                my $attributes = $4;
335                my $condition = $5;
336                my $keypath = $6;
337
338                if ( $component eq $filecomponent )
339                {
340                    # setting the condition
341
342                    # $condition = "MsiNetAssemblySupport";
343                    $condition = "DOTNET_SUFFICIENT=1";
344                    $oneline = join("\t",
345                        $component,
346                        $componentid,
347                        $directory,
348                        $attributes,
349                        $condition,
350                        $keypath) . "\n";
351                    ${$componenttable}[$j] = $oneline;
352                    $changed = 1;
353
354                    $installer::logger::Lang->printf("Changing %s :\n",  $componenttablename);
355                    $installer::logger::Lang->print($oneline);
356
357                    last;
358                }
359            }
360        }
361    }
362
363    if ( $changed )
364    {
365        # Saving the file
366        installer::files::save_file($componenttablename ,$componenttable);
367        $installer::logger::Lang->printf("Saved idt file: %s\n", $componenttablename);
368    }
369}
370
3711;
372