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