1*b1cdbd2cSJim Jagielski#**************************************************************
2*b1cdbd2cSJim Jagielski#
3*b1cdbd2cSJim Jagielski#  Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski#  or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski#  distributed with this work for additional information
6*b1cdbd2cSJim Jagielski#  regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski#  to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski#  "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski#  with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski#
11*b1cdbd2cSJim Jagielski#    http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski#
13*b1cdbd2cSJim Jagielski#  Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski#  software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski#  KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski#  specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski#  under the License.
19*b1cdbd2cSJim Jagielski#
20*b1cdbd2cSJim Jagielski#**************************************************************
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielskipackage installer::windows::component;
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielskiuse installer::converter;
27*b1cdbd2cSJim Jagielskiuse installer::existence;
28*b1cdbd2cSJim Jagielskiuse installer::exiter;
29*b1cdbd2cSJim Jagielskiuse installer::files;
30*b1cdbd2cSJim Jagielskiuse installer::globals;
31*b1cdbd2cSJim Jagielskiuse installer::windows::idtglobal;
32*b1cdbd2cSJim Jagielskiuse installer::windows::language;
33*b1cdbd2cSJim Jagielski
34*b1cdbd2cSJim Jagielskiuse strict;
35*b1cdbd2cSJim Jagielski
36*b1cdbd2cSJim Jagielski##############################################################
37*b1cdbd2cSJim Jagielski# Returning a globally unique ID (GUID) for a component
38*b1cdbd2cSJim Jagielski# If the component is new, a unique guid has to be created.
39*b1cdbd2cSJim Jagielski# If the component already exists, the guid has to be
40*b1cdbd2cSJim Jagielski# taken from a list component <-> guid
41*b1cdbd2cSJim Jagielski# Sample for a guid: {B68FD953-3CEF-4489-8269-8726848056E8}
42*b1cdbd2cSJim Jagielski##############################################################
43*b1cdbd2cSJim Jagielski
44*b1cdbd2cSJim Jagielskisub get_component_guid ($)
45*b1cdbd2cSJim Jagielski{
46*b1cdbd2cSJim Jagielski	my ($componentname) = @_;
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski	# At this time only a template
49*b1cdbd2cSJim Jagielski	my $returnvalue = "\{COMPONENTGUID\}";
50*b1cdbd2cSJim Jagielski
51*b1cdbd2cSJim Jagielski	# Returning a ComponentID, that is assigned in scp project
52*b1cdbd2cSJim Jagielski	if ( exists($installer::globals::componentid{$componentname}) )
53*b1cdbd2cSJim Jagielski	{
54*b1cdbd2cSJim Jagielski        $installer::logger::Lang->printf("reusing guid %s for component %s\n",
55*b1cdbd2cSJim Jagielski            $installer::globals::componentid{$componentname},
56*b1cdbd2cSJim Jagielski            $componentname);
57*b1cdbd2cSJim Jagielski		$returnvalue = "\{" . $installer::globals::componentid{$componentname} . "\}";
58*b1cdbd2cSJim Jagielski	}
59*b1cdbd2cSJim Jagielski
60*b1cdbd2cSJim Jagielski	return $returnvalue;
61*b1cdbd2cSJim Jagielski}
62*b1cdbd2cSJim Jagielski
63*b1cdbd2cSJim Jagielski##############################################################
64*b1cdbd2cSJim Jagielski# Returning the directory for a file component.
65*b1cdbd2cSJim Jagielski##############################################################
66*b1cdbd2cSJim Jagielski
67*b1cdbd2cSJim Jagielskisub get_file_component_directory ($$$)
68*b1cdbd2cSJim Jagielski{
69*b1cdbd2cSJim Jagielski    my ($componentname, $filesref, $dirref) = @_;
70*b1cdbd2cSJim Jagielski
71*b1cdbd2cSJim Jagielski    my ($component,  $uniquedir);
72*b1cdbd2cSJim Jagielski
73*b1cdbd2cSJim Jagielski    foreach my $onefile (@$filesref)
74*b1cdbd2cSJim Jagielski    {
75*b1cdbd2cSJim Jagielski        if ($onefile->{'componentname'} eq $componentname)
76*b1cdbd2cSJim Jagielski        {
77*b1cdbd2cSJim Jagielski            return get_file_component_directory_for_file($onefile, $dirref);
78*b1cdbd2cSJim Jagielski        }
79*b1cdbd2cSJim Jagielski    }
80*b1cdbd2cSJim Jagielski
81*b1cdbd2cSJim Jagielski    # This component can be ignored, if it exists in a version with
82*b1cdbd2cSJim Jagielski    # extension "_pff" (this was renamed in file::get_sequence_for_file() )
83*b1cdbd2cSJim Jagielski    my $ignore_this_component = 0;
84*b1cdbd2cSJim Jagielski    my $origcomponentname = $componentname;
85*b1cdbd2cSJim Jagielski    my $componentname_pff = $componentname . "_pff";
86*b1cdbd2cSJim Jagielski
87*b1cdbd2cSJim Jagielski    foreach my $onefile (@$filesref)
88*b1cdbd2cSJim Jagielski    {
89*b1cdbd2cSJim Jagielski        if ($onefile->{'componentname'} eq $componentname_pff)
90*b1cdbd2cSJim Jagielski        {
91*b1cdbd2cSJim Jagielski            return "IGNORE_COMP";
92*b1cdbd2cSJim Jagielski        }
93*b1cdbd2cSJim Jagielski    }
94*b1cdbd2cSJim Jagielski
95*b1cdbd2cSJim Jagielski    installer::exiter::exit_program(
96*b1cdbd2cSJim Jagielski        "ERROR: Did not find component \"$origcomponentname\" in file collection",
97*b1cdbd2cSJim Jagielski        "get_file_component_directory");
98*b1cdbd2cSJim Jagielski}
99*b1cdbd2cSJim Jagielski
100*b1cdbd2cSJim Jagielski
101*b1cdbd2cSJim Jagielski
102*b1cdbd2cSJim Jagielski
103*b1cdbd2cSJim Jagielskisub get_file_component_directory_for_file ($$)
104*b1cdbd2cSJim Jagielski{
105*b1cdbd2cSJim Jagielski    my ($onefile, $dirref) = @_;
106*b1cdbd2cSJim Jagielski
107*b1cdbd2cSJim Jagielski    my $localstyles = $onefile->{'Styles'};
108*b1cdbd2cSJim Jagielski    $localstyles = "" unless defined $localstyles;
109*b1cdbd2cSJim Jagielski
110*b1cdbd2cSJim Jagielski    if ( $localstyles =~ /\bFONT\b/ )	# special handling for font files
111*b1cdbd2cSJim Jagielski    {
112*b1cdbd2cSJim Jagielski	return $installer::globals::fontsfolder;
113*b1cdbd2cSJim Jagielski    }
114*b1cdbd2cSJim Jagielski
115*b1cdbd2cSJim Jagielski    my $destdir = "";
116*b1cdbd2cSJim Jagielski
117*b1cdbd2cSJim Jagielski    if ( $onefile->{'Dir'} ) { $destdir = $onefile->{'Dir'}; }
118*b1cdbd2cSJim Jagielski
119*b1cdbd2cSJim Jagielski    if ( $destdir =~ /\bPREDEFINED_OSSHELLNEWDIR\b/ )	# special handling for shellnew files
120*b1cdbd2cSJim Jagielski    {
121*b1cdbd2cSJim Jagielski	return $installer::globals::templatefolder;
122*b1cdbd2cSJim Jagielski    }
123*b1cdbd2cSJim Jagielski
124*b1cdbd2cSJim Jagielski    my $destination = $onefile->{'destination'};
125*b1cdbd2cSJim Jagielski
126*b1cdbd2cSJim Jagielski    installer::pathanalyzer::get_path_from_fullqualifiedname(\$destination);
127*b1cdbd2cSJim Jagielski
128*b1cdbd2cSJim Jagielski    $destination =~ s/\Q$installer::globals::separator\E\s*$//;
129*b1cdbd2cSJim Jagielski
130*b1cdbd2cSJim Jagielski    # This path has to be defined in the directory collection at "HostName"
131*b1cdbd2cSJim Jagielski
132*b1cdbd2cSJim Jagielski    my $uniquedir = undef;
133*b1cdbd2cSJim Jagielski    if ($destination eq "")		# files in the installation root
134*b1cdbd2cSJim Jagielski    {
135*b1cdbd2cSJim Jagielski	$uniquedir = "INSTALLLOCATION";
136*b1cdbd2cSJim Jagielski    }
137*b1cdbd2cSJim Jagielski    else
138*b1cdbd2cSJim Jagielski    {
139*b1cdbd2cSJim Jagielski	my $found = 0;
140*b1cdbd2cSJim Jagielski        foreach my $directory (@$dirref)
141*b1cdbd2cSJim Jagielski	{
142*b1cdbd2cSJim Jagielski	    if ($directory->{'HostName'} eq $destination)
143*b1cdbd2cSJim Jagielski	    {
144*b1cdbd2cSJim Jagielski		$found = 1;
145*b1cdbd2cSJim Jagielski                $uniquedir = $directory->{'uniquename'};
146*b1cdbd2cSJim Jagielski		last;
147*b1cdbd2cSJim Jagielski	    }
148*b1cdbd2cSJim Jagielski	}
149*b1cdbd2cSJim Jagielski
150*b1cdbd2cSJim Jagielski	if ( ! $found)
151*b1cdbd2cSJim Jagielski	{
152*b1cdbd2cSJim Jagielski	    installer::exiter::exit_program(
153*b1cdbd2cSJim Jagielski                "ERROR: Did not find destination $destination in directory collection",
154*b1cdbd2cSJim Jagielski                "get_file_component_directory");
155*b1cdbd2cSJim Jagielski	}
156*b1cdbd2cSJim Jagielski
157*b1cdbd2cSJim Jagielski	if ( $uniquedir eq $installer::globals::officeinstalldirectory )
158*b1cdbd2cSJim Jagielski	{
159*b1cdbd2cSJim Jagielski	    $uniquedir = "INSTALLLOCATION";
160*b1cdbd2cSJim Jagielski	}
161*b1cdbd2cSJim Jagielski    }
162*b1cdbd2cSJim Jagielski
163*b1cdbd2cSJim Jagielski    $onefile->{'uniquedirname'} = $uniquedir;		# saving it in the file collection
164*b1cdbd2cSJim Jagielski
165*b1cdbd2cSJim Jagielski    return $uniquedir
166*b1cdbd2cSJim Jagielski}
167*b1cdbd2cSJim Jagielski
168*b1cdbd2cSJim Jagielski##############################################################
169*b1cdbd2cSJim Jagielski# Returning the directory for a registry component.
170*b1cdbd2cSJim Jagielski# This cannot be a useful value
171*b1cdbd2cSJim Jagielski##############################################################
172*b1cdbd2cSJim Jagielski
173*b1cdbd2cSJim Jagielskisub get_registry_component_directory
174*b1cdbd2cSJim Jagielski{
175*b1cdbd2cSJim Jagielski	my $componentdir = "INSTALLLOCATION";
176*b1cdbd2cSJim Jagielski
177*b1cdbd2cSJim Jagielski	return $componentdir;
178*b1cdbd2cSJim Jagielski}
179*b1cdbd2cSJim Jagielski
180*b1cdbd2cSJim Jagielski##############################################################
181*b1cdbd2cSJim Jagielski# Returning the attributes for a file component.
182*b1cdbd2cSJim Jagielski# Always 8 in this first try?
183*b1cdbd2cSJim Jagielski##############################################################
184*b1cdbd2cSJim Jagielski
185*b1cdbd2cSJim Jagielskisub get_file_component_attributes
186*b1cdbd2cSJim Jagielski{
187*b1cdbd2cSJim Jagielski	my ($componentname, $filesref, $allvariables) = @_;
188*b1cdbd2cSJim Jagielski
189*b1cdbd2cSJim Jagielski	my $attributes;
190*b1cdbd2cSJim Jagielski
191*b1cdbd2cSJim Jagielski	$attributes = 2;
192*b1cdbd2cSJim Jagielski
193*b1cdbd2cSJim Jagielski	# special handling for font files
194*b1cdbd2cSJim Jagielski
195*b1cdbd2cSJim Jagielski	my $onefile;
196*b1cdbd2cSJim Jagielski	my $found = 0;
197*b1cdbd2cSJim Jagielski
198*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$filesref}; $i++ )
199*b1cdbd2cSJim Jagielski	{
200*b1cdbd2cSJim Jagielski		$onefile = 	${$filesref}[$i];
201*b1cdbd2cSJim Jagielski		my $component = $onefile->{'componentname'};
202*b1cdbd2cSJim Jagielski
203*b1cdbd2cSJim Jagielski		if ( $component eq $componentname )
204*b1cdbd2cSJim Jagielski		{
205*b1cdbd2cSJim Jagielski			$found = 1;
206*b1cdbd2cSJim Jagielski			last;
207*b1cdbd2cSJim Jagielski		}
208*b1cdbd2cSJim Jagielski	}
209*b1cdbd2cSJim Jagielski
210*b1cdbd2cSJim Jagielski	if (!($found))
211*b1cdbd2cSJim Jagielski	{
212*b1cdbd2cSJim Jagielski		installer::exiter::exit_program("ERROR: Did not find component in file collection", "get_file_component_attributes");
213*b1cdbd2cSJim Jagielski	}
214*b1cdbd2cSJim Jagielski
215*b1cdbd2cSJim Jagielski	my $localstyles = "";
216*b1cdbd2cSJim Jagielski
217*b1cdbd2cSJim Jagielski	if ( $onefile->{'Styles'} ) { $localstyles = $onefile->{'Styles'}; }
218*b1cdbd2cSJim Jagielski
219*b1cdbd2cSJim Jagielski	if ( $localstyles =~ /\bFONT\b/ )
220*b1cdbd2cSJim Jagielski	{
221*b1cdbd2cSJim Jagielski		$attributes = 8;	# font files will be deinstalled if the ref count is 0
222*b1cdbd2cSJim Jagielski	}
223*b1cdbd2cSJim Jagielski
224*b1cdbd2cSJim Jagielski	if ( $localstyles =~ /\bASSEMBLY\b/ )
225*b1cdbd2cSJim Jagielski	{
226*b1cdbd2cSJim Jagielski		$attributes = 0;	# Assembly files cannot run from source
227*b1cdbd2cSJim Jagielski	}
228*b1cdbd2cSJim Jagielski
229*b1cdbd2cSJim Jagielski	if ((defined $onefile->{'Dir'} && $onefile->{'Dir'} =~ /\bPREDEFINED_OSSHELLNEWDIR\b/)
230*b1cdbd2cSJim Jagielski        || $onefile->{'needs_user_registry_key'})
231*b1cdbd2cSJim Jagielski	{
232*b1cdbd2cSJim Jagielski		$attributes = 4;	# Files in shellnew dir and in non advertised startmenu entries must have user registry key as KeyPath
233*b1cdbd2cSJim Jagielski	}
234*b1cdbd2cSJim Jagielski
235*b1cdbd2cSJim Jagielski	# Adding 256, if this is a 64 bit installation set.
236*b1cdbd2cSJim Jagielski	if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) { $attributes = $attributes + 256; }
237*b1cdbd2cSJim Jagielski
238*b1cdbd2cSJim Jagielski	return $attributes
239*b1cdbd2cSJim Jagielski}
240*b1cdbd2cSJim Jagielski
241*b1cdbd2cSJim Jagielski##############################################################
242*b1cdbd2cSJim Jagielski# Returning the attributes for a registry component.
243*b1cdbd2cSJim Jagielski# Always 4, indicating, the keypath is a defined in
244*b1cdbd2cSJim Jagielski# table registry
245*b1cdbd2cSJim Jagielski##############################################################
246*b1cdbd2cSJim Jagielski
247*b1cdbd2cSJim Jagielskisub get_registry_component_attributes
248*b1cdbd2cSJim Jagielski{
249*b1cdbd2cSJim Jagielski	my ($componentname, $allvariables) = @_;
250*b1cdbd2cSJim Jagielski
251*b1cdbd2cSJim Jagielski	my $attributes;
252*b1cdbd2cSJim Jagielski
253*b1cdbd2cSJim Jagielski	$attributes = 4;
254*b1cdbd2cSJim Jagielski
255*b1cdbd2cSJim Jagielski	# Adding 256, if this is a 64 bit installation set.
256*b1cdbd2cSJim Jagielski	if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) { $attributes = $attributes + 256; }
257*b1cdbd2cSJim Jagielski
258*b1cdbd2cSJim Jagielski	if ( exists($installer::globals::dontdeletecomponents{$componentname}) ) { $attributes = $attributes + 16; }
259*b1cdbd2cSJim Jagielski
260*b1cdbd2cSJim Jagielski	return $attributes
261*b1cdbd2cSJim Jagielski}
262*b1cdbd2cSJim Jagielski
263*b1cdbd2cSJim Jagielski##############################################################
264*b1cdbd2cSJim Jagielski# Returning the conditions for a component.
265*b1cdbd2cSJim Jagielski# This is important for language dependent components
266*b1cdbd2cSJim Jagielski# in multilingual installation sets.
267*b1cdbd2cSJim Jagielski##############################################################
268*b1cdbd2cSJim Jagielski
269*b1cdbd2cSJim Jagielskisub get_file_component_condition
270*b1cdbd2cSJim Jagielski{
271*b1cdbd2cSJim Jagielski	my ($componentname, $filesref) = @_;
272*b1cdbd2cSJim Jagielski
273*b1cdbd2cSJim Jagielski	my $condition = "";
274*b1cdbd2cSJim Jagielski
275*b1cdbd2cSJim Jagielski	if (exists($installer::globals::componentcondition{$componentname}))
276*b1cdbd2cSJim Jagielski	{
277*b1cdbd2cSJim Jagielski		$condition = $installer::globals::componentcondition{$componentname};
278*b1cdbd2cSJim Jagielski	}
279*b1cdbd2cSJim Jagielski
280*b1cdbd2cSJim Jagielski	# there can be also tree conditions for multilayer products
281*b1cdbd2cSJim Jagielski	if (exists($installer::globals::treeconditions{$componentname}))
282*b1cdbd2cSJim Jagielski	{
283*b1cdbd2cSJim Jagielski		if ( $condition eq "" )
284*b1cdbd2cSJim Jagielski		{
285*b1cdbd2cSJim Jagielski			$condition = $installer::globals::treeconditions{$componentname};
286*b1cdbd2cSJim Jagielski		}
287*b1cdbd2cSJim Jagielski		else
288*b1cdbd2cSJim Jagielski		{
289*b1cdbd2cSJim Jagielski			$condition = "($condition) And ($installer::globals::treeconditions{$componentname})";
290*b1cdbd2cSJim Jagielski		}
291*b1cdbd2cSJim Jagielski	}
292*b1cdbd2cSJim Jagielski
293*b1cdbd2cSJim Jagielski	return $condition
294*b1cdbd2cSJim Jagielski}
295*b1cdbd2cSJim Jagielski
296*b1cdbd2cSJim Jagielski##############################################################
297*b1cdbd2cSJim Jagielski# Returning the conditions for a registry component.
298*b1cdbd2cSJim Jagielski##############################################################
299*b1cdbd2cSJim Jagielski
300*b1cdbd2cSJim Jagielskisub get_component_condition
301*b1cdbd2cSJim Jagielski{
302*b1cdbd2cSJim Jagielski	my ($componentname) = @_;
303*b1cdbd2cSJim Jagielski
304*b1cdbd2cSJim Jagielski	my $condition;
305*b1cdbd2cSJim Jagielski
306*b1cdbd2cSJim Jagielski	$condition = "";	# Always ?
307*b1cdbd2cSJim Jagielski
308*b1cdbd2cSJim Jagielski	if (exists($installer::globals::componentcondition{$componentname}))
309*b1cdbd2cSJim Jagielski	{
310*b1cdbd2cSJim Jagielski		$condition = $installer::globals::componentcondition{$componentname};
311*b1cdbd2cSJim Jagielski	}
312*b1cdbd2cSJim Jagielski
313*b1cdbd2cSJim Jagielski	return $condition
314*b1cdbd2cSJim Jagielski}
315*b1cdbd2cSJim Jagielski
316*b1cdbd2cSJim Jagielski####################################################################
317*b1cdbd2cSJim Jagielski# Returning the keypath for a component.
318*b1cdbd2cSJim Jagielski# This will be the name of the first file/registry, found in the
319*b1cdbd2cSJim Jagielski# collection $itemsref
320*b1cdbd2cSJim Jagielski# Attention: This has to be the unique (file)name, not the
321*b1cdbd2cSJim Jagielski# real filename!
322*b1cdbd2cSJim Jagielski####################################################################
323*b1cdbd2cSJim Jagielski
324*b1cdbd2cSJim Jagielskisub get_component_keypath ($$)
325*b1cdbd2cSJim Jagielski{
326*b1cdbd2cSJim Jagielski	my ($componentname, $itemsref) = @_;
327*b1cdbd2cSJim Jagielski
328*b1cdbd2cSJim Jagielski	foreach my $oneitem (@$itemsref)
329*b1cdbd2cSJim Jagielski	{
330*b1cdbd2cSJim Jagielski		my $component = $oneitem->{'componentname'};
331*b1cdbd2cSJim Jagielski
332*b1cdbd2cSJim Jagielski		if ( ! defined $component)
333*b1cdbd2cSJim Jagielski        {
334*b1cdbd2cSJim Jagielski            installer::scriptitems::print_script_item($oneitem);
335*b1cdbd2cSJim Jagielski            installer::logger::PrintError("item in get_component_keypath has no 'componentname'\n");
336*b1cdbd2cSJim Jagielski            return "";
337*b1cdbd2cSJim Jagielski        }
338*b1cdbd2cSJim Jagielski		if ( $component eq $componentname )
339*b1cdbd2cSJim Jagielski		{
340*b1cdbd2cSJim Jagielski            my $keypath = $oneitem->{'uniquename'};	# "uniquename", not "Name"
341*b1cdbd2cSJim Jagielski
342*b1cdbd2cSJim Jagielski            # Special handling for components in
343*b1cdbd2cSJim Jagielski            # PREDEFINED_OSSHELLNEWDIR. These components need as
344*b1cdbd2cSJim Jagielski            # KeyPath a RegistryItem in HKCU
345*b1cdbd2cSJim Jagielski            if ($oneitem->{'userregkeypath'})
346*b1cdbd2cSJim Jagielski            {
347*b1cdbd2cSJim Jagielski                $keypath = $oneitem->{'userregkeypath'};
348*b1cdbd2cSJim Jagielski            }
349*b1cdbd2cSJim Jagielski
350*b1cdbd2cSJim Jagielski            # saving it in the file and registry collection
351*b1cdbd2cSJim Jagielski            $oneitem->{'keypath'} = $keypath;
352*b1cdbd2cSJim Jagielski
353*b1cdbd2cSJim Jagielski            return $keypath
354*b1cdbd2cSJim Jagielski		}
355*b1cdbd2cSJim Jagielski	}
356*b1cdbd2cSJim Jagielski
357*b1cdbd2cSJim Jagielski    installer::exiter::exit_program(
358*b1cdbd2cSJim Jagielski        "ERROR: Did not find component in file/registry collection, function get_component_keypath",
359*b1cdbd2cSJim Jagielski        "get_component_keypath");
360*b1cdbd2cSJim Jagielski}
361*b1cdbd2cSJim Jagielski
362*b1cdbd2cSJim Jagielski
363*b1cdbd2cSJim Jagielski
364*b1cdbd2cSJim Jagielski
365*b1cdbd2cSJim Jagielskisub remove_ooversion_from_component_name($)
366*b1cdbd2cSJim Jagielski{
367*b1cdbd2cSJim Jagielski    my ($component_name) = @_;
368*b1cdbd2cSJim Jagielski
369*b1cdbd2cSJim Jagielski    $component_name =~ s/_openoffice\d+//;
370*b1cdbd2cSJim Jagielski
371*b1cdbd2cSJim Jagielski    return $component_name;
372*b1cdbd2cSJim Jagielski}
373*b1cdbd2cSJim Jagielski
374*b1cdbd2cSJim Jagielski
375*b1cdbd2cSJim Jagielski
376*b1cdbd2cSJim Jagielski
377*b1cdbd2cSJim Jagielskisub prepare_component_table_creation ($$$)
378*b1cdbd2cSJim Jagielski{
379*b1cdbd2cSJim Jagielski    my ($file_components, $registry_components, $variables) = @_;
380*b1cdbd2cSJim Jagielski
381*b1cdbd2cSJim Jagielski    if ($installer::globals::is_release)
382*b1cdbd2cSJim Jagielski    {
383*b1cdbd2cSJim Jagielski        my %source_component_data = ();
384*b1cdbd2cSJim Jagielski
385*b1cdbd2cSJim Jagielski        # Collect the components that are used in the source release.
386*b1cdbd2cSJim Jagielski        my $component_table = $installer::globals::source_msi->GetTable("Component");
387*b1cdbd2cSJim Jagielski        foreach my $row (@{$component_table->GetAllRows()})
388*b1cdbd2cSJim Jagielski        {
389*b1cdbd2cSJim Jagielski            $source_component_data{$row->GetValue("Component")} = $row;
390*b1cdbd2cSJim Jagielski        }
391*b1cdbd2cSJim Jagielski
392*b1cdbd2cSJim Jagielski        # Find source components that do not exist in the target components, ie have been removed.
393*b1cdbd2cSJim Jagielski
394*b1cdbd2cSJim Jagielski        # Process file components.
395*b1cdbd2cSJim Jagielski        my @missing_source_component_names = ();
396*b1cdbd2cSJim Jagielski        my %file_component_hash = map {$_ => 1} @$file_components;
397*b1cdbd2cSJim Jagielski        foreach my $source_component_name (keys %source_component_data)
398*b1cdbd2cSJim Jagielski        {
399*b1cdbd2cSJim Jagielski            # In this loop we only process components for files and ignore those for registry entries.
400*b1cdbd2cSJim Jagielski            next if $source_component_name =~ /^registry_/;
401*b1cdbd2cSJim Jagielski
402*b1cdbd2cSJim Jagielski            if ( ! defined $file_component_hash{$source_component_name})
403*b1cdbd2cSJim Jagielski            {
404*b1cdbd2cSJim Jagielski                push @missing_source_component_names, [$source_component_name, $source_component_name];
405*b1cdbd2cSJim Jagielski                $installer::logger::Info->printf("missing file component %s\n", $source_component_name);
406*b1cdbd2cSJim Jagielski            }
407*b1cdbd2cSJim Jagielski        }
408*b1cdbd2cSJim Jagielski
409*b1cdbd2cSJim Jagielski        # Process registry components.
410*b1cdbd2cSJim Jagielski        my %registry_component_hash = map {$_ => 1} @$registry_components;
411*b1cdbd2cSJim Jagielski        my %registry_component_hash_normalized = map {remove_ooversion_from_component_name($_) => $_} @$registry_components;
412*b1cdbd2cSJim Jagielski        my %target_registry_component_translation = ();
413*b1cdbd2cSJim Jagielski        foreach my $source_component_name (keys %source_component_data)
414*b1cdbd2cSJim Jagielski        {
415*b1cdbd2cSJim Jagielski            # In this loop we only process components for registry entries and ignore those for files.
416*b1cdbd2cSJim Jagielski            next if $source_component_name !~ /^registry_/;
417*b1cdbd2cSJim Jagielski
418*b1cdbd2cSJim Jagielski            if (defined $registry_component_hash{$source_component_name})
419*b1cdbd2cSJim Jagielski            {
420*b1cdbd2cSJim Jagielski                # Found the non-normalized name.
421*b1cdbd2cSJim Jagielski            }
422*b1cdbd2cSJim Jagielski            elsif (defined $registry_component_hash_normalized{
423*b1cdbd2cSJim Jagielski                remove_ooversion_from_component_name($source_component_name)})
424*b1cdbd2cSJim Jagielski            {
425*b1cdbd2cSJim Jagielski                # Found the normalized name.
426*b1cdbd2cSJim Jagielski                my $target_component_name = $registry_component_hash_normalized{
427*b1cdbd2cSJim Jagielski                    remove_ooversion_from_component_name($source_component_name)};
428*b1cdbd2cSJim Jagielski                $target_registry_component_translation{$target_component_name} = $source_component_name;
429*b1cdbd2cSJim Jagielski                $installer::logger::Info->printf("found normalized component name %s\n", $source_component_name);
430*b1cdbd2cSJim Jagielski                $installer::logger::Info->printf("    %s -> %s\n", $target_component_name, $source_component_name);
431*b1cdbd2cSJim Jagielski            }
432*b1cdbd2cSJim Jagielski            else
433*b1cdbd2cSJim Jagielski            {
434*b1cdbd2cSJim Jagielski                # Source component was not found.
435*b1cdbd2cSJim Jagielski                push @missing_source_component_names, $source_component_name;
436*b1cdbd2cSJim Jagielski                $installer::logger::Info->printf("missing component %s\n", $source_component_name);
437*b1cdbd2cSJim Jagielski            }
438*b1cdbd2cSJim Jagielski        }
439*b1cdbd2cSJim Jagielski
440*b1cdbd2cSJim Jagielski        if (scalar @missing_source_component_names > 0)
441*b1cdbd2cSJim Jagielski        {
442*b1cdbd2cSJim Jagielski            $installer::logger::Info->printf("Error: there are %d missing components\n",
443*b1cdbd2cSJim Jagielski                scalar @missing_source_component_names);
444*b1cdbd2cSJim Jagielski            return {};
445*b1cdbd2cSJim Jagielski        }
446*b1cdbd2cSJim Jagielski        else
447*b1cdbd2cSJim Jagielski        {
448*b1cdbd2cSJim Jagielski            return \%target_registry_component_translation;
449*b1cdbd2cSJim Jagielski        }
450*b1cdbd2cSJim Jagielski    }
451*b1cdbd2cSJim Jagielski
452*b1cdbd2cSJim Jagielski    return {};
453*b1cdbd2cSJim Jagielski}
454*b1cdbd2cSJim Jagielski
455*b1cdbd2cSJim Jagielski
456*b1cdbd2cSJim Jagielski
457*b1cdbd2cSJim Jagielski
458*b1cdbd2cSJim Jagielskisub get_component_data ($$$$)
459*b1cdbd2cSJim Jagielski{
460*b1cdbd2cSJim Jagielski	my ($file_component_names,
461*b1cdbd2cSJim Jagielski        $registry_component_names,
462*b1cdbd2cSJim Jagielski        $files,
463*b1cdbd2cSJim Jagielski        $registry_entries) = @_;
464*b1cdbd2cSJim Jagielski
465*b1cdbd2cSJim Jagielski    # When we are building a release then prepare building a patch by looking up some data
466*b1cdbd2cSJim Jagielski    # from the previous release.
467*b1cdbd2cSJim Jagielski    my %source_data = ();
468*b1cdbd2cSJim Jagielski    if ($installer::globals::is_release)
469*b1cdbd2cSJim Jagielski    {
470*b1cdbd2cSJim Jagielski        my $source_component_table = $installer::globals::source_msi->GetTable("Component");
471*b1cdbd2cSJim Jagielski        my $component_column_index = $source_component_table->GetColumnIndex("Component");
472*b1cdbd2cSJim Jagielski        my $component_id_column_index = $source_component_table->GetColumnIndex("ComponentId");
473*b1cdbd2cSJim Jagielski        my $key_path_column_index = $source_component_table->GetColumnIndex("KeyPath");
474*b1cdbd2cSJim Jagielski        foreach my $source_row (@{$source_component_table->GetAllRows()})
475*b1cdbd2cSJim Jagielski        {
476*b1cdbd2cSJim Jagielski            my $component_name = $source_row->GetValue($component_column_index);
477*b1cdbd2cSJim Jagielski            my $component_id = $source_row->GetValue($component_id_column_index);
478*b1cdbd2cSJim Jagielski            my $key_path = $source_row->GetValue($key_path_column_index);
479*b1cdbd2cSJim Jagielski
480*b1cdbd2cSJim Jagielski            $source_data{$component_name} = {
481*b1cdbd2cSJim Jagielski                'component_id' => $component_id,
482*b1cdbd2cSJim Jagielski                'key_path' => $key_path
483*b1cdbd2cSJim Jagielski            };
484*b1cdbd2cSJim Jagielski        }
485*b1cdbd2cSJim Jagielski    }
486*b1cdbd2cSJim Jagielski
487*b1cdbd2cSJim Jagielski    # Set up data for the target release.
488*b1cdbd2cSJim Jagielski    # Use data from the source version where possible.
489*b1cdbd2cSJim Jagielski    # Create missind data where necessary.
490*b1cdbd2cSJim Jagielski
491*b1cdbd2cSJim Jagielski    # Set up the target data with flags that remember whether a
492*b1cdbd2cSJim Jagielski    # component contains files or registry entries.
493*b1cdbd2cSJim Jagielski    my %target_data = ();
494*b1cdbd2cSJim Jagielski    foreach my $name (@$file_component_names)
495*b1cdbd2cSJim Jagielski    {
496*b1cdbd2cSJim Jagielski        $target_data{$name} = {'is_file' => 1};
497*b1cdbd2cSJim Jagielski    }
498*b1cdbd2cSJim Jagielski    foreach my $name (@$registry_component_names)
499*b1cdbd2cSJim Jagielski    {
500*b1cdbd2cSJim Jagielski        $target_data{$name} = {'is_file' => 0};
501*b1cdbd2cSJim Jagielski    }
502*b1cdbd2cSJim Jagielski
503*b1cdbd2cSJim Jagielski    # Add values for the ComponentId column.
504*b1cdbd2cSJim Jagielski    $installer::logger::Lang->printf("preparing Component->ComponentId values\n");
505*b1cdbd2cSJim Jagielski    foreach my $name (@$file_component_names,@$registry_component_names)
506*b1cdbd2cSJim Jagielski    {
507*b1cdbd2cSJim Jagielski        # Determine the component id.
508*b1cdbd2cSJim Jagielski        my $guid = $installer::globals::is_release
509*b1cdbd2cSJim Jagielski            ? $source_data{$name}->{'component_id'}
510*b1cdbd2cSJim Jagielski            : undef;
511*b1cdbd2cSJim Jagielski        if (defined $guid)
512*b1cdbd2cSJim Jagielski        {
513*b1cdbd2cSJim Jagielski            $installer::logger::Lang->printf("    reusing guid %s\n", $guid);
514*b1cdbd2cSJim Jagielski        }
515*b1cdbd2cSJim Jagielski        else
516*b1cdbd2cSJim Jagielski        {
517*b1cdbd2cSJim Jagielski            $guid = "{" . installer::windows::msiglobal::create_guid() . "}";
518*b1cdbd2cSJim Jagielski            $installer::logger::Lang->printf("    creating new guid %s\n", $guid);
519*b1cdbd2cSJim Jagielski        }
520*b1cdbd2cSJim Jagielski        $target_data{$name}->{'component_id'} = $guid;
521*b1cdbd2cSJim Jagielski    }
522*b1cdbd2cSJim Jagielski
523*b1cdbd2cSJim Jagielski    # Add values for the KeyPath column.
524*b1cdbd2cSJim Jagielski    $installer::logger::Lang->printf("preparing Component->KeyPath values\n");
525*b1cdbd2cSJim Jagielski    foreach my $component_name (@$file_component_names,@$registry_component_names)
526*b1cdbd2cSJim Jagielski    {
527*b1cdbd2cSJim Jagielski        # Determine the key path.
528*b1cdbd2cSJim Jagielski        my $key_path = $installer::globals::is_release
529*b1cdbd2cSJim Jagielski            ? $source_data{$component_name}->{'key_path'}
530*b1cdbd2cSJim Jagielski            : undef;
531*b1cdbd2cSJim Jagielski        if (defined $key_path)
532*b1cdbd2cSJim Jagielski        {
533*b1cdbd2cSJim Jagielski            $installer::logger::Lang->printf("    reusing key path %s for component %s\n",
534*b1cdbd2cSJim Jagielski                $key_path,
535*b1cdbd2cSJim Jagielski                $component_name);
536*b1cdbd2cSJim Jagielski        }
537*b1cdbd2cSJim Jagielski        else
538*b1cdbd2cSJim Jagielski        {
539*b1cdbd2cSJim Jagielski            if ($target_data{$component_name}->{'is_file'})
540*b1cdbd2cSJim Jagielski            {
541*b1cdbd2cSJim Jagielski                $key_path = get_component_keypath($component_name, $files);
542*b1cdbd2cSJim Jagielski            }
543*b1cdbd2cSJim Jagielski            else
544*b1cdbd2cSJim Jagielski            {
545*b1cdbd2cSJim Jagielski                $key_path = get_component_keypath($component_name, $registry_entries);
546*b1cdbd2cSJim Jagielski            }
547*b1cdbd2cSJim Jagielski            $installer::logger::Lang->printf("    created key path %s for component %s\n",
548*b1cdbd2cSJim Jagielski                $key_path,
549*b1cdbd2cSJim Jagielski                $component_name);
550*b1cdbd2cSJim Jagielski        }
551*b1cdbd2cSJim Jagielski        $target_data{$component_name}->{'key_path'} = $key_path;
552*b1cdbd2cSJim Jagielski    }
553*b1cdbd2cSJim Jagielski
554*b1cdbd2cSJim Jagielski    return \%target_data;
555*b1cdbd2cSJim Jagielski}
556*b1cdbd2cSJim Jagielski
557*b1cdbd2cSJim Jagielski
558*b1cdbd2cSJim Jagielski
559*b1cdbd2cSJim Jagielski
560*b1cdbd2cSJim Jagielskisub	create_component_table_data ($$$$$$)
561*b1cdbd2cSJim Jagielski{
562*b1cdbd2cSJim Jagielski	my ($filesref, $registryref, $dirref, $allfilecomponentsref, $allregistrycomponents, $allvariables) = @_;
563*b1cdbd2cSJim Jagielski
564*b1cdbd2cSJim Jagielski    my $target_data = get_component_data($allfilecomponentsref, $allregistrycomponents, $filesref, $registryref);
565*b1cdbd2cSJim Jagielski
566*b1cdbd2cSJim Jagielski    my @table_data = ();
567*b1cdbd2cSJim Jagielski
568*b1cdbd2cSJim Jagielski	# File components
569*b1cdbd2cSJim Jagielski	foreach my $name (@$allfilecomponentsref)
570*b1cdbd2cSJim Jagielski	{
571*b1cdbd2cSJim Jagielski		my %onecomponent = ();
572*b1cdbd2cSJim Jagielski
573*b1cdbd2cSJim Jagielski		$onecomponent{'name'} = $name;
574*b1cdbd2cSJim Jagielski		$onecomponent{'guid'} = $target_data->{$name}->{'component_id'};
575*b1cdbd2cSJim Jagielski		$onecomponent{'directory'} = get_file_component_directory($name, $filesref, $dirref);
576*b1cdbd2cSJim Jagielski		if ( $onecomponent{'directory'} eq "IGNORE_COMP" ) { next; }
577*b1cdbd2cSJim Jagielski		$onecomponent{'attributes'} = get_file_component_attributes($name, $filesref, $allvariables);
578*b1cdbd2cSJim Jagielski		$onecomponent{'condition'} = get_file_component_condition($name, $filesref);
579*b1cdbd2cSJim Jagielski		$onecomponent{'keypath'} = $target_data->{$name}->{'key_path'};
580*b1cdbd2cSJim Jagielski
581*b1cdbd2cSJim Jagielski        push @table_data, \%onecomponent;
582*b1cdbd2cSJim Jagielski	}
583*b1cdbd2cSJim Jagielski
584*b1cdbd2cSJim Jagielski	# Registry components
585*b1cdbd2cSJim Jagielski	foreach my $name (@$allregistrycomponents)
586*b1cdbd2cSJim Jagielski	{
587*b1cdbd2cSJim Jagielski		my %onecomponent = ();
588*b1cdbd2cSJim Jagielski
589*b1cdbd2cSJim Jagielski        $onecomponent{'name'} = $name;
590*b1cdbd2cSJim Jagielski		$onecomponent{'guid'} = $target_data->{$name}->{'component_id'};
591*b1cdbd2cSJim Jagielski		$onecomponent{'directory'} = get_registry_component_directory();
592*b1cdbd2cSJim Jagielski		$onecomponent{'attributes'} = get_registry_component_attributes($name, $allvariables);
593*b1cdbd2cSJim Jagielski		$onecomponent{'condition'} = get_component_condition($name);
594*b1cdbd2cSJim Jagielski		$onecomponent{'keypath'} = $target_data->{$name}->{'key_path'};
595*b1cdbd2cSJim Jagielski
596*b1cdbd2cSJim Jagielski		push(@table_data, \%onecomponent);
597*b1cdbd2cSJim Jagielski	}
598*b1cdbd2cSJim Jagielski
599*b1cdbd2cSJim Jagielski    return \@table_data;
600*b1cdbd2cSJim Jagielski}
601*b1cdbd2cSJim Jagielski
602*b1cdbd2cSJim Jagielski
603*b1cdbd2cSJim Jagielski
604*b1cdbd2cSJim Jagielski
605*b1cdbd2cSJim Jagielski###################################################################
606*b1cdbd2cSJim Jagielski# Creating the file Componen.idt dynamically
607*b1cdbd2cSJim Jagielski# Content:
608*b1cdbd2cSJim Jagielski# Component ComponentId Directory_ Attributes Condition KeyPath
609*b1cdbd2cSJim Jagielski###################################################################
610*b1cdbd2cSJim Jagielski
611*b1cdbd2cSJim Jagielski
612*b1cdbd2cSJim Jagielskisub	create_component_table ($$)
613*b1cdbd2cSJim Jagielski{
614*b1cdbd2cSJim Jagielski	my ($table_data, $basedir) = @_;
615*b1cdbd2cSJim Jagielski
616*b1cdbd2cSJim Jagielski	my @componenttable = ();
617*b1cdbd2cSJim Jagielski
618*b1cdbd2cSJim Jagielski	my ($oneline, $infoline);
619*b1cdbd2cSJim Jagielski
620*b1cdbd2cSJim Jagielski	installer::windows::idtglobal::write_idt_header(\@componenttable, "component");
621*b1cdbd2cSJim Jagielski
622*b1cdbd2cSJim Jagielski	foreach my $item (@$table_data)
623*b1cdbd2cSJim Jagielski	{
624*b1cdbd2cSJim Jagielski		$oneline = sprintf("%s\t%s\t%s\t%s\t%s\t%s\n",
625*b1cdbd2cSJim Jagielski            $item->{'name'},
626*b1cdbd2cSJim Jagielski            $item->{'guid'},
627*b1cdbd2cSJim Jagielski            $item->{'directory'},
628*b1cdbd2cSJim Jagielski            $item->{'attributes'},
629*b1cdbd2cSJim Jagielski            $item->{'condition'},
630*b1cdbd2cSJim Jagielski            $item->{'keypath'});
631*b1cdbd2cSJim Jagielski		push(@componenttable, $oneline);
632*b1cdbd2cSJim Jagielski	}
633*b1cdbd2cSJim Jagielski
634*b1cdbd2cSJim Jagielski	# Saving the file
635*b1cdbd2cSJim Jagielski
636*b1cdbd2cSJim Jagielski	my $componenttablename = $basedir . $installer::globals::separator . "Componen.idt";
637*b1cdbd2cSJim Jagielski	installer::files::save_file($componenttablename ,\@componenttable);
638*b1cdbd2cSJim Jagielski	$infoline = "Created idt file: $componenttablename\n";
639*b1cdbd2cSJim Jagielski	$installer::logger::Lang->print($infoline);
640*b1cdbd2cSJim Jagielski}
641*b1cdbd2cSJim Jagielski
642*b1cdbd2cSJim Jagielski
643*b1cdbd2cSJim Jagielski
644*b1cdbd2cSJim Jagielski
645*b1cdbd2cSJim Jagielski####################################################################################
646*b1cdbd2cSJim Jagielski# Returning a component for a scp module gid.
647*b1cdbd2cSJim Jagielski# Pairs are saved in the files collector.
648*b1cdbd2cSJim Jagielski####################################################################################
649*b1cdbd2cSJim Jagielski
650*b1cdbd2cSJim Jagielskisub get_component_name_from_modulegid
651*b1cdbd2cSJim Jagielski{
652*b1cdbd2cSJim Jagielski	my ($modulegid, $filesref) = @_;
653*b1cdbd2cSJim Jagielski
654*b1cdbd2cSJim Jagielski	my $componentname = "";
655*b1cdbd2cSJim Jagielski
656*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$filesref}; $i++ )
657*b1cdbd2cSJim Jagielski	{
658*b1cdbd2cSJim Jagielski		my $onefile = ${$filesref}[$i];
659*b1cdbd2cSJim Jagielski
660*b1cdbd2cSJim Jagielski		if ( $onefile->{'modules'} )
661*b1cdbd2cSJim Jagielski		{
662*b1cdbd2cSJim Jagielski			my $filemodules = $onefile->{'modules'};
663*b1cdbd2cSJim Jagielski			my $filemodulesarrayref = installer::converter::convert_stringlist_into_array_without_newline(\$filemodules, ",");
664*b1cdbd2cSJim Jagielski
665*b1cdbd2cSJim Jagielski			if (installer::existence::exists_in_array($modulegid, $filemodulesarrayref))
666*b1cdbd2cSJim Jagielski			{
667*b1cdbd2cSJim Jagielski				$componentname = $onefile->{'componentname'};
668*b1cdbd2cSJim Jagielski				last;
669*b1cdbd2cSJim Jagielski			}
670*b1cdbd2cSJim Jagielski		}
671*b1cdbd2cSJim Jagielski	}
672*b1cdbd2cSJim Jagielski
673*b1cdbd2cSJim Jagielski	return $componentname;
674*b1cdbd2cSJim Jagielski}
675*b1cdbd2cSJim Jagielski
676*b1cdbd2cSJim Jagielski####################################################################################
677*b1cdbd2cSJim Jagielski# Updating the file Environm.idt dynamically
678*b1cdbd2cSJim Jagielski# Content:
679*b1cdbd2cSJim Jagielski# Environment Name Value Component_
680*b1cdbd2cSJim Jagielski####################################################################################
681*b1cdbd2cSJim Jagielski
682*b1cdbd2cSJim Jagielskisub set_component_in_environment_table
683*b1cdbd2cSJim Jagielski{
684*b1cdbd2cSJim Jagielski	my ($basedir, $filesref) = @_;
685*b1cdbd2cSJim Jagielski
686*b1cdbd2cSJim Jagielski	my $infoline = "";
687*b1cdbd2cSJim Jagielski
688*b1cdbd2cSJim Jagielski	my $environmentfilename = $basedir . $installer::globals::separator . "Environm.idt";
689*b1cdbd2cSJim Jagielski
690*b1cdbd2cSJim Jagielski	if ( -f $environmentfilename )	# only do something, if file exists
691*b1cdbd2cSJim Jagielski	{
692*b1cdbd2cSJim Jagielski		my $environmentfile = installer::files::read_file($environmentfilename);
693*b1cdbd2cSJim Jagielski
694*b1cdbd2cSJim Jagielski		for ( my $i = 3; $i <= $#{$environmentfile}; $i++ )	# starting in line 4 of Environm.idt
695*b1cdbd2cSJim Jagielski		{
696*b1cdbd2cSJim Jagielski			if ( ${$environmentfile}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ )
697*b1cdbd2cSJim Jagielski			{
698*b1cdbd2cSJim Jagielski				my $modulegid = $4; # in Environment table a scp module gid can be used as component replacement
699*b1cdbd2cSJim Jagielski
700*b1cdbd2cSJim Jagielski				my $componentname = get_component_name_from_modulegid($modulegid, $filesref);
701*b1cdbd2cSJim Jagielski
702*b1cdbd2cSJim Jagielski				if ( $componentname )	# only do something if a component could be found
703*b1cdbd2cSJim Jagielski				{
704*b1cdbd2cSJim Jagielski					$infoline = "Updated Environment table:\n";
705*b1cdbd2cSJim Jagielski					$installer::logger::Lang->print($infoline);
706*b1cdbd2cSJim Jagielski					$infoline = "Old line: ${$environmentfile}[$i]\n";
707*b1cdbd2cSJim Jagielski					$installer::logger::Lang->print($infoline);
708*b1cdbd2cSJim Jagielski
709*b1cdbd2cSJim Jagielski					${$environmentfile}[$i] =~ s/$modulegid/$componentname/;
710*b1cdbd2cSJim Jagielski
711*b1cdbd2cSJim Jagielski					$infoline = "New line: ${$environmentfile}[$i]\n";
712*b1cdbd2cSJim Jagielski					$installer::logger::Lang->print($infoline);
713*b1cdbd2cSJim Jagielski
714*b1cdbd2cSJim Jagielski				}
715*b1cdbd2cSJim Jagielski			}
716*b1cdbd2cSJim Jagielski		}
717*b1cdbd2cSJim Jagielski
718*b1cdbd2cSJim Jagielski		# Saving the file
719*b1cdbd2cSJim Jagielski
720*b1cdbd2cSJim Jagielski		installer::files::save_file($environmentfilename ,$environmentfile);
721*b1cdbd2cSJim Jagielski		$infoline = "Updated idt file: $environmentfilename\n";
722*b1cdbd2cSJim Jagielski		$installer::logger::Lang->print($infoline);
723*b1cdbd2cSJim Jagielski
724*b1cdbd2cSJim Jagielski	}
725*b1cdbd2cSJim Jagielski}
726*b1cdbd2cSJim Jagielski
727*b1cdbd2cSJim Jagielski
728*b1cdbd2cSJim Jagielski
729*b1cdbd2cSJim Jagielski
730*b1cdbd2cSJim Jagielskisub apply_component_translation ($@)
731*b1cdbd2cSJim Jagielski{
732*b1cdbd2cSJim Jagielski    my ($translation_map, @component_names) = @_;
733*b1cdbd2cSJim Jagielski
734*b1cdbd2cSJim Jagielski    my @translated_names = ();
735*b1cdbd2cSJim Jagielski    foreach my $component_name (@component_names)
736*b1cdbd2cSJim Jagielski    {
737*b1cdbd2cSJim Jagielski        my $translated_name = $translation_map->{$component_name};
738*b1cdbd2cSJim Jagielski        if (defined $translated_name)
739*b1cdbd2cSJim Jagielski        {
740*b1cdbd2cSJim Jagielski            push @translated_names, $translated_name;
741*b1cdbd2cSJim Jagielski        }
742*b1cdbd2cSJim Jagielski        else
743*b1cdbd2cSJim Jagielski        {
744*b1cdbd2cSJim Jagielski            push @translated_names, $component_name;
745*b1cdbd2cSJim Jagielski        }
746*b1cdbd2cSJim Jagielski    }
747*b1cdbd2cSJim Jagielski
748*b1cdbd2cSJim Jagielski    return @translated_names;
749*b1cdbd2cSJim Jagielski}
750*b1cdbd2cSJim Jagielski
751*b1cdbd2cSJim Jagielski
752*b1cdbd2cSJim Jagielski1;
753