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::profiles;
25
26use installer::converter;
27use installer::existence;
28use installer::exiter;
29use installer::files;
30use installer::globals;
31use installer::logger;
32use installer::remover;
33use installer::systemactions;
34
35#############################
36# Profiles
37#############################
38
39#######################################################
40# Sorting the content of a profile
41#######################################################
42
43sub sorting_profile
44{
45	my ($profilesref) = @_;
46
47	my @profile = ();
48	my @definedsections = ();
49
50	for ( my $i = 0; $i <= $#{$profilesref}; $i++ )
51	{
52		my $line = ${$profilesref}[$i];
53
54		if ( $line =~ /^\s*(\[.*\])\s*$/ )	# this is a section (every second line)
55		{
56			my $section = $1;
57
58			if (!(installer::existence::exists_in_array($section, \@definedsections)))
59			{
60				my $sectionline = $section . "\n";
61				push(@definedsections, $section);
62				push(@profile, $sectionline);
63
64				for ( my $j = 0; $j <= $#{$profilesref}; $j++ )
65				{
66					my $oneline = ${$profilesref}[$j];
67					installer::remover::remove_leading_and_ending_whitespaces(\$oneline);
68
69					if ( $oneline eq $section )
70					{
71						my $nextline = ${$profilesref}[$j+1];
72						push(@profile, $nextline);
73					}
74				}
75			}
76		}
77	}
78
79	return \@profile;
80}
81
82#####################################################################
83# Adding the newly created profile into the file list
84#####################################################################
85
86sub add_profile_into_filelist
87{
88	my ($filesarrayref, $oneprofile, $completeprofilename, $allvariables) = @_;
89
90	my %profile = ();
91
92	# Taking the base data from the "gid_File_Lib_Vcl"
93
94	my $vclgid = "gid_File_Lib_Vcl";
95	if ( $allvariables->{'GLOBALFILEGID'} ) { $vclgid = $allvariables->{'GLOBALFILEGID'}; }
96	my $vclfile = installer::existence::get_specified_file($filesarrayref, $vclgid);
97
98	# copying all base data
99	installer::converter::copy_item_object($vclfile, \%profile);
100
101	# and overriding all new values
102
103	$profile{'ismultilingual'} = 0;
104	$profile{'sourcepath'} = $completeprofilename;
105	$profile{'Name'} = $oneprofile->{'Name'};
106	$profile{'UnixRights'} = "444";
107	$profile{'gid'} = $oneprofile->{'gid'};
108	$profile{'Dir'} = $oneprofile->{'Dir'};
109	$profile{'destination'} = $oneprofile->{'destination'};
110	$profile{'Styles'} = "";
111	if ( $oneprofile->{'Styles'} ) { $profile{'Styles'} = $oneprofile->{'Styles'}; }
112	$profile{'modules'} = $oneprofile->{'ModuleID'};	# Profiles can only be added completely to a module
113
114	push(@{$filesarrayref}, \%profile);
115}
116
117###################################################
118# Including Windows line ends in ini files
119# Profiles on Windows shall have \r\n line ends
120###################################################
121
122sub include_windows_lineends
123{
124	my ($onefile) = @_;
125
126	for ( my $i = 0; $i <= $#{$onefile}; $i++ )
127	{
128		${$onefile}[$i] =~ s/\r?\n$/\r\n/;
129	}
130}
131
132####################################
133# Create profiles
134####################################
135
136sub create_profiles
137{
138	my ($profilesref, $profileitemsref, $filesarrayref, $languagestringref, $allvariables) = @_;
139
140	my $infoline;
141
142	my $profilesdir = installer::systemactions::create_directories("profiles", $languagestringref);
143
144	installer::logger::include_header_into_logfile("Creating profiles:");
145
146	# Attention: The module dependencies from ProfileItems have to be ignored, because
147	# the Profile has to be installed completely with all of its content and the correct name.
148	# Only complete profiles can belong to a specified module, but not ProfileItems!
149
150	# iterating over all files
151
152	for ( my $i = 0; $i <= $#{$profilesref}; $i++ )
153	{
154		my $oneprofile = ${$profilesref}[$i];
155		my $dir = $oneprofile->{'Dir'};
156		if ( $dir eq "PREDEFINED_CONFIGDIR" ) { next; } 	# ignoring the profile sversion file
157
158		my $profilegid = $oneprofile->{'gid'};
159		my $profilename = $oneprofile->{'Name'};
160
161		my $localprofilesdir = $profilesdir . $installer::globals::separator . $profilegid; # uniqueness guaranteed by gid
162		if ( ! -d $localprofilesdir ) { installer::systemactions::create_directory($localprofilesdir); }
163
164		my @onefile = ();
165		my $profileempty = 1;
166
167		for ( my $j = 0; $j <= $#{$profileitemsref}; $j++ )
168		{
169			my $oneprofileitem = ${$profileitemsref}[$j];
170
171			my $styles = "";
172			if ( $oneprofileitem->{'Styles'} ) { $styles = $oneprofileitem->{'Styles'}; }
173			if ( $styles =~ /\bINIFILETABLE\b/ ) { next; }	# these values are written during installation, not during packing
174
175			my $profileid = $oneprofileitem->{'ProfileID'};
176
177			if ( $profileid eq $profilegid )
178			{
179				my $section = $oneprofileitem->{'Section'};
180				my $key = $oneprofileitem->{'Key'};
181				my $value = $oneprofileitem->{'Value'};
182				for (my $pk = 1; $pk <= 50; $pk++)
183				{
184					my $key = "ValueList" . $pk;
185					if ( $oneprofileitem->{$key} )
186						{ $value = $value . " " . $oneprofileitem->{$key} }
187				}
188				my $order = $oneprofileitem->{'Order'};	# ignoring order at the moment
189
190				my $line = "[" . $section . "]" . "\n";
191				push(@onefile, $line);
192				$line = $key . "=" . $value . "\n";
193				push(@onefile, $line);
194
195				$profileempty = 0;
196			}
197		}
198
199		if ( $profileempty ) { next; } 	# ignoring empty profiles
200
201		# Sorting the array @onefile
202		my $onefileref = sorting_profile(\@onefile);
203
204		if ( $installer::globals::iswin && $installer::globals::plat =~ /cygwin/i)		# Windows line ends only for Cygwin
205		{
206			include_windows_lineends($onefileref);
207		}
208
209		# Saving the profile as a file
210		$completeprofilename = $localprofilesdir . $installer::globals::separator . $profilename;
211
212		installer::files::save_file($completeprofilename, $onefileref);
213
214		# Adding the file to the filearray
215		# Some data are set now, others are taken from the file "soffice.exe" ("soffice.bin")
216		add_profile_into_filelist($filesarrayref, $oneprofile, $completeprofilename, $allvariables);
217
218		$infoline = "Created Profile: $completeprofilename\n";
219		push( @installer::globals::logfileinfo, $infoline);
220	}
221
222	$infoline = "\n";
223	push( @installer::globals::logfileinfo, $infoline);
224}
225
226
2271;
228