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