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::upgrade;
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielskiuse installer::exiter;
27*b1cdbd2cSJim Jagielskiuse installer::files;
28*b1cdbd2cSJim Jagielskiuse installer::globals;
29*b1cdbd2cSJim Jagielskiuse installer::windows::idtglobal;
30*b1cdbd2cSJim Jagielski
31*b1cdbd2cSJim Jagielski####################################################################################
32*b1cdbd2cSJim Jagielski# Creating the file Upgrade.idt dynamically
33*b1cdbd2cSJim Jagielski# Content:
34*b1cdbd2cSJim Jagielski# UpgradeCode VersionMin VersionMax Language Attributes Remove ActionProperty
35*b1cdbd2cSJim Jagielski####################################################################################
36*b1cdbd2cSJim Jagielski
37*b1cdbd2cSJim Jagielskisub create_upgrade_table
38*b1cdbd2cSJim Jagielski{
39*b1cdbd2cSJim Jagielski	my ($basedir, $allvariableshashref) = @_;
40*b1cdbd2cSJim Jagielski
41*b1cdbd2cSJim Jagielski	my @upgradetable = ();
42*b1cdbd2cSJim Jagielski
43*b1cdbd2cSJim Jagielski	# fix for problematic OOo 1.9 versions
44*b1cdbd2cSJim Jagielski	my $include_ooo_fix = 0;
45*b1cdbd2cSJim Jagielski	my $ooomaxnew = "";
46*b1cdbd2cSJim Jagielski	if (($installer::globals::product =~ /^\s*OpenOffice/i ) && ( ! ( $installer::globals::product =~ /SDK/i )) && ( ! $installer::globals::languagepack ))
47*b1cdbd2cSJim Jagielski	{
48*b1cdbd2cSJim Jagielski		$include_ooo_fix = 1;
49*b1cdbd2cSJim Jagielski		$ooomaxnew = "34.0.0";
50*b1cdbd2cSJim Jagielski	}
51*b1cdbd2cSJim Jagielski
52*b1cdbd2cSJim Jagielski	installer::windows::idtglobal::write_idt_header(\@upgradetable, "upgrade");
53*b1cdbd2cSJim Jagielski
54*b1cdbd2cSJim Jagielski	# Setting also $installer::globals::msimajorproductversion, that is for example "3.0.0", to differ between old products for OOo 2.x and
55*b1cdbd2cSJim Jagielski	# older products from OOo 3.x. The latter must be removed always, the removal of the first is controlled with a checkbox.
56*b1cdbd2cSJim Jagielski	my $newline = $installer::globals::upgradecode . "\t" . "\t" . $installer::globals::msimajorproductversion . "\t" . "\t" . "0" . "\t" . "\t" . "OLDPRODUCTS" . "\n";
57*b1cdbd2cSJim Jagielski	push(@upgradetable, $newline);
58*b1cdbd2cSJim Jagielski
59*b1cdbd2cSJim Jagielski	# Setting all products, that must be removed.
60*b1cdbd2cSJim Jagielski	$newline = $installer::globals::upgradecode . "\t" . $installer::globals::msimajorproductversion . "\t" . $installer::globals::msiproductversion . "\t" . "\t" . "257" . "\t" . "\t" . "OLDPRODUCTSSAMEMAJOR" . "\n";
61*b1cdbd2cSJim Jagielski	push(@upgradetable, $newline);
62*b1cdbd2cSJim Jagielski
63*b1cdbd2cSJim Jagielski	if ( ! $installer::globals::patch )
64*b1cdbd2cSJim Jagielski	{
65*b1cdbd2cSJim Jagielski		# preventing downgrading
66*b1cdbd2cSJim Jagielski		$newline = $installer::globals::upgradecode . "\t" . $installer::globals::msiproductversion . "\t" . $ooomaxnew . "\t" . "\t" . "2" . "\t" . "\t" . "NEWPRODUCTS" . "\n";
67*b1cdbd2cSJim Jagielski		push(@upgradetable, $newline);
68*b1cdbd2cSJim Jagielski
69*b1cdbd2cSJim Jagielski		$newline = $installer::globals::upgradecode . "\t" . $installer::globals::msiproductversion . "\t" . $ooomaxnew . "\t" . "\t" . "258" . "\t" . "\t" . "SAMEPRODUCTS" . "\n";
70*b1cdbd2cSJim Jagielski		push(@upgradetable, $newline);
71*b1cdbd2cSJim Jagielski
72*b1cdbd2cSJim Jagielski		if ( $include_ooo_fix )
73*b1cdbd2cSJim Jagielski		{
74*b1cdbd2cSJim Jagielski			$newline = $installer::globals::upgradecode . "\t" . "35.0.0" . "\t" . "36.0.0" . "\t" . "\t" . "1" . "\t" . "\t" . "OLDPRODUCTS2" . "\n";
75*b1cdbd2cSJim Jagielski			push(@upgradetable, $newline);
76*b1cdbd2cSJim Jagielski		}
77*b1cdbd2cSJim Jagielski
78*b1cdbd2cSJim Jagielski		# if (( $allvariableshashref->{'PATCHUPGRADECODE'} ) && ( ! $installer::globals::languagepack ))
79*b1cdbd2cSJim Jagielski		# {
80*b1cdbd2cSJim Jagielski		#	$newline = $allvariableshashref->{'PATCHUPGRADECODE'} . "\t" . "\t" . $installer::globals::msiproductversion . "\t" . "\t" . "1" . "\t" . "\t" . "OLDPRODUCTSPATCH" . "\n";
81*b1cdbd2cSJim Jagielski		#	push(@upgradetable, $newline);
82*b1cdbd2cSJim Jagielski		#
83*b1cdbd2cSJim Jagielski		#	$newline = $allvariableshashref->{'PATCHUPGRADECODE'} . "\t" . $installer::globals::msiproductversion . "\t" . "\t" . "\t" . "2" . "\t" . "\t" . "NEWPRODUCTSPATCH" . "\n";
84*b1cdbd2cSJim Jagielski		#	push(@upgradetable, $newline);
85*b1cdbd2cSJim Jagielski		#
86*b1cdbd2cSJim Jagielski		#	$newline = $allvariableshashref->{'PATCHUPGRADECODE'} . "\t" . $installer::globals::msiproductversion . "\t" . "\t" . "\t" . "258" . "\t" . "\t" . "SAMEPRODUCTSPATCH" . "\n";
87*b1cdbd2cSJim Jagielski		#	push(@upgradetable, $newline);
88*b1cdbd2cSJim Jagielski		# }
89*b1cdbd2cSJim Jagielski
90*b1cdbd2cSJim Jagielski		# also searching for the beta
91*b1cdbd2cSJim Jagielski
92*b1cdbd2cSJim Jagielski		if (( $allvariableshashref->{'BETAUPGRADECODE'} ) && ( ! $installer::globals::languagepack ))
93*b1cdbd2cSJim Jagielski		{
94*b1cdbd2cSJim Jagielski			$newline = $allvariableshashref->{'BETAUPGRADECODE'} . "\t" . "1.0" . "\t" . "\t" . "\t" . "1" . "\t" . "\t" . "BETAPRODUCTS" . "\n";
95*b1cdbd2cSJim Jagielski			push(@upgradetable, $newline);
96*b1cdbd2cSJim Jagielski		}
97*b1cdbd2cSJim Jagielski
98*b1cdbd2cSJim Jagielski		# also searching for the stub
99*b1cdbd2cSJim Jagielski
100*b1cdbd2cSJim Jagielski		if (( $allvariableshashref->{'STUBUPGRADECODE'} ) && ( ! $installer::globals::languagepack ))
101*b1cdbd2cSJim Jagielski		{
102*b1cdbd2cSJim Jagielski			$newline = $allvariableshashref->{'STUBUPGRADECODE'} . "\t" . "1.0" . "\t" . "\t" . "\t" . "1" . "\t" . "\t" . "STUBPRODUCTS" . "\n";
103*b1cdbd2cSJim Jagielski			push(@upgradetable, $newline);
104*b1cdbd2cSJim Jagielski		}
105*b1cdbd2cSJim Jagielski
106*b1cdbd2cSJim Jagielski		# searching for all older patches and languagepacks (defined in a extra file)
107*b1cdbd2cSJim Jagielski
108*b1cdbd2cSJim Jagielski		if (( $allvariableshashref->{'REMOVE_UPGRADE_CODE_FILE'} ) && ( ! $installer::globals::languagepack ))
109*b1cdbd2cSJim Jagielski		{
110*b1cdbd2cSJim Jagielski			my $filename = $allvariableshashref->{'REMOVE_UPGRADE_CODE_FILE'};
111*b1cdbd2cSJim Jagielski			my $langpackcodefilename = $installer::globals::idttemplatepath  . $installer::globals::separator . $filename;
112*b1cdbd2cSJim Jagielski			if ( ! -f $langpackcodefilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$langpackcodefilename\".", "create_upgrade_table"); }
113*b1cdbd2cSJim Jagielski
114*b1cdbd2cSJim Jagielski			my $filecontent = installer::files::read_file($langpackcodefilename);
115*b1cdbd2cSJim Jagielski			my $newlines = analyze_file_for_upgrade_table($filecontent);
116*b1cdbd2cSJim Jagielski
117*b1cdbd2cSJim Jagielski			for ( my $i = 0; $i <= $#{$newlines}; $i++ ) { push(@upgradetable, ${$newlines}[$i]); }
118*b1cdbd2cSJim Jagielski		}
119*b1cdbd2cSJim Jagielski	}
120*b1cdbd2cSJim Jagielski
121*b1cdbd2cSJim Jagielski	# No upgrade for Beta versions!
122*b1cdbd2cSJim Jagielski
123*b1cdbd2cSJim Jagielski	if (( $allvariableshashref->{'PRODUCTEXTENSION'} eq "Beta" ) && ( ! $installer::globals::patch ) && ( ! $installer::globals::languagepack ))
124*b1cdbd2cSJim Jagielski	{
125*b1cdbd2cSJim Jagielski		@upgradetable = ();
126*b1cdbd2cSJim Jagielski		installer::windows::idtglobal::write_idt_header(\@upgradetable, "upgrade");
127*b1cdbd2cSJim Jagielski        $installer::logger::Lang->printf("Beta product -> empty Upgrade table\n");
128*b1cdbd2cSJim Jagielski	}
129*b1cdbd2cSJim Jagielski
130*b1cdbd2cSJim Jagielski	# Saving the file
131*b1cdbd2cSJim Jagielski
132*b1cdbd2cSJim Jagielski	my $upgradetablename = $basedir . $installer::globals::separator . "Upgrade.idt";
133*b1cdbd2cSJim Jagielski	installer::files::save_file($upgradetablename ,\@upgradetable);
134*b1cdbd2cSJim Jagielski    $installer::logger::Lang->printf("Created idt file: %s\n", $upgradetablename);
135*b1cdbd2cSJim Jagielski}
136*b1cdbd2cSJim Jagielski
137*b1cdbd2cSJim Jagielski##############################################################
138*b1cdbd2cSJim Jagielski# Reading the file with UpgradeCodes of old products,
139*b1cdbd2cSJim Jagielski# that can be removed, if the user wants to remove them.
140*b1cdbd2cSJim Jagielski##############################################################
141*b1cdbd2cSJim Jagielski
142*b1cdbd2cSJim Jagielskisub analyze_file_for_upgrade_table
143*b1cdbd2cSJim Jagielski{
144*b1cdbd2cSJim Jagielski	my ($filecontent) = @_;
145*b1cdbd2cSJim Jagielski
146*b1cdbd2cSJim Jagielski	my @allnewlines = ();
147*b1cdbd2cSJim Jagielski
148*b1cdbd2cSJim Jagielski	for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
149*b1cdbd2cSJim Jagielski	{
150*b1cdbd2cSJim Jagielski		my $line = ${$filecontent}[$i];
151*b1cdbd2cSJim Jagielski		if ( $line =~ /^\s*$/ ) { next; } # empty lines can be ignored
152*b1cdbd2cSJim Jagielski		if ( $line =~ /^\s*\#/ ) { next; } # comment lines starting with a hash
153*b1cdbd2cSJim Jagielski
154*b1cdbd2cSJim Jagielski		if ( $line =~ /^(.*)\t(.*)\t(.*)\t(.*)\t(.*)\t(.*)\t(.*)$/ ) { push(@allnewlines, $line); }
155*b1cdbd2cSJim Jagielski		else { installer::exiter::exit_program("ERROR: Wrong syntax in file for upgrade table", "analyze_file_for_upgrade_table"); }
156*b1cdbd2cSJim Jagielski	}
157*b1cdbd2cSJim Jagielski
158*b1cdbd2cSJim Jagielski	return \@allnewlines;
159*b1cdbd2cSJim Jagielski}
160*b1cdbd2cSJim Jagielski
161*b1cdbd2cSJim Jagielski1;
162