1*9f91b7e3SAndre Fischer#**************************************************************
2*9f91b7e3SAndre Fischer#
3*9f91b7e3SAndre Fischer#  Licensed to the Apache Software Foundation (ASF) under one
4*9f91b7e3SAndre Fischer#  or more contributor license agreements.  See the NOTICE file
5*9f91b7e3SAndre Fischer#  distributed with this work for additional information
6*9f91b7e3SAndre Fischer#  regarding copyright ownership.  The ASF licenses this file
7*9f91b7e3SAndre Fischer#  to you under the Apache License, Version 2.0 (the
8*9f91b7e3SAndre Fischer#  "License"); you may not use this file except in compliance
9*9f91b7e3SAndre Fischer#  with the License.  You may obtain a copy of the License at
10*9f91b7e3SAndre Fischer#
11*9f91b7e3SAndre Fischer#    http://www.apache.org/licenses/LICENSE-2.0
12*9f91b7e3SAndre Fischer#
13*9f91b7e3SAndre Fischer#  Unless required by applicable law or agreed to in writing,
14*9f91b7e3SAndre Fischer#  software distributed under the License is distributed on an
15*9f91b7e3SAndre Fischer#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9f91b7e3SAndre Fischer#  KIND, either express or implied.  See the License for the
17*9f91b7e3SAndre Fischer#  specific language governing permissions and limitations
18*9f91b7e3SAndre Fischer#  under the License.
19*9f91b7e3SAndre Fischer#
20*9f91b7e3SAndre Fischer#**************************************************************
21*9f91b7e3SAndre Fischer
22*9f91b7e3SAndre Fischerpackage installer::patch::FileSequenceList;
23*9f91b7e3SAndre Fischer
24*9f91b7e3SAndre Fischeruse strict;
25*9f91b7e3SAndre Fischer
26*9f91b7e3SAndre Fischer=head1 NAME
27*9f91b7e3SAndre Fischer
28*9f91b7e3SAndre Fischer    FileSequenceList.pm - Class for retrieving and processing the 'Sequence' values of the MSI 'File' table.
29*9f91b7e3SAndre Fischer
30*9f91b7e3SAndre Fischer=cut
31*9f91b7e3SAndre Fischer
32*9f91b7e3SAndre Fischer=head2 new($class)
33*9f91b7e3SAndre Fischer
34*9f91b7e3SAndre Fischer    Create a new FileSequenceList object.
35*9f91b7e3SAndre Fischer
36*9f91b7e3SAndre Fischer=cut
37*9f91b7e3SAndre Fischersub new ($)
38*9f91b7e3SAndre Fischer{
39*9f91b7e3SAndre Fischer    my ($class) = @_;
40*9f91b7e3SAndre Fischer
41*9f91b7e3SAndre Fischer    my $self = {
42*9f91b7e3SAndre Fischer        'data' => undef
43*9f91b7e3SAndre Fischer    };
44*9f91b7e3SAndre Fischer    bless($self, $class);
45*9f91b7e3SAndre Fischer
46*9f91b7e3SAndre Fischer    return $self;
47*9f91b7e3SAndre Fischer}
48*9f91b7e3SAndre Fischer
49*9f91b7e3SAndre Fischer
50*9f91b7e3SAndre Fischer
51*9f91b7e3SAndre Fischer
52*9f91b7e3SAndre Fischersub SetFromMap ($$)
53*9f91b7e3SAndre Fischer{
54*9f91b7e3SAndre Fischer    my ($self, $map) = @_;
55*9f91b7e3SAndre Fischer
56*9f91b7e3SAndre Fischer    $self->{'data'} = $map;
57*9f91b7e3SAndre Fischer}
58*9f91b7e3SAndre Fischer
59*9f91b7e3SAndre Fischer
60*9f91b7e3SAndre Fischer
61*9f91b7e3SAndre Fischer
62*9f91b7e3SAndre Fischersub SetFromMsi ($$)
63*9f91b7e3SAndre Fischer{
64*9f91b7e3SAndre Fischer    my ($self, $msi) = @_;
65*9f91b7e3SAndre Fischer
66*9f91b7e3SAndre Fischer    my $file_table = $msi->GetTable("File");
67*9f91b7e3SAndre Fischer    my $file_map = $msi->GetFileMap();
68*9f91b7e3SAndre Fischer
69*9f91b7e3SAndre Fischer    my $file_column_index = $file_table->GetColumnIndex("File");
70*9f91b7e3SAndre Fischer    my $filename_column_index = $file_table->GetColumnIndex("FileName");
71*9f91b7e3SAndre Fischer    my $sequence_column_index = $file_table->GetColumnIndex("Sequence");
72*9f91b7e3SAndre Fischer
73*9f91b7e3SAndre Fischer    my %sequence_data = ();
74*9f91b7e3SAndre Fischer
75*9f91b7e3SAndre Fischer    printf("extracting columns %d and %d from %d rows\n",
76*9f91b7e3SAndre Fischer        $file_column_index,
77*9f91b7e3SAndre Fischer        $sequence_column_index,
78*9f91b7e3SAndre Fischer        $file_table->GetRowCount());
79*9f91b7e3SAndre Fischer
80*9f91b7e3SAndre Fischer    foreach my $row (@{$file_table->GetAllRows()})
81*9f91b7e3SAndre Fischer    {
82*9f91b7e3SAndre Fischer        my $unique_name = $row->GetValue($file_column_index);
83*9f91b7e3SAndre Fischer        my $filename = $row->GetValue($filename_column_index);
84*9f91b7e3SAndre Fischer        my ($long_filename,$short_filename) = installer::patch::Msi::SplitLongShortName($filename);
85*9f91b7e3SAndre Fischer        my $sequence = $row->GetValue($sequence_column_index);
86*9f91b7e3SAndre Fischer        my $directory_item = $file_map->{$unique_name}->{'directory'};
87*9f91b7e3SAndre Fischer        my $source_path = $directory_item->{'full_source_long_name'};
88*9f91b7e3SAndre Fischer        my $target_path = $directory_item->{'full_target_long_name'};
89*9f91b7e3SAndre Fischer        my $key = $source_path ne ""
90*9f91b7e3SAndre Fischer            ? $source_path."/".$long_filename
91*9f91b7e3SAndre Fischer            : $long_filename;
92*9f91b7e3SAndre Fischer        $sequence_data{$key} = {
93*9f91b7e3SAndre Fischer            'sequence' => $sequence,
94*9f91b7e3SAndre Fischer            'uniquename' => $unique_name,
95*9f91b7e3SAndre Fischer            'row' => $row
96*9f91b7e3SAndre Fischer        };
97*9f91b7e3SAndre Fischer    }
98*9f91b7e3SAndre Fischer    $self->{'data'} = \%sequence_data;
99*9f91b7e3SAndre Fischer}
100*9f91b7e3SAndre Fischer
101*9f91b7e3SAndre Fischer
102*9f91b7e3SAndre Fischer
103*9f91b7e3SAndre Fischer
104*9f91b7e3SAndre Fischersub GetFileCount ($)
105*9f91b7e3SAndre Fischer{
106*9f91b7e3SAndre Fischer    my ($self) = @_;
107*9f91b7e3SAndre Fischer
108*9f91b7e3SAndre Fischer    return scalar keys %{$self->{'data'}};
109*9f91b7e3SAndre Fischer}
110*9f91b7e3SAndre Fischer
111*9f91b7e3SAndre Fischer
112*9f91b7e3SAndre Fischer
113*9f91b7e3SAndre Fischer
114*9f91b7e3SAndre Fischersub get_removed_files ($@)
115*9f91b7e3SAndre Fischer{
116*9f91b7e3SAndre Fischer    my ($self, $target_unique_names) = @_;
117*9f91b7e3SAndre Fischer
118*9f91b7e3SAndre Fischer    my %uniquename_to_row_map = map{$_->{'uniquename'} => $_->{'row'}} values %{$self->{'data'}};
119*9f91b7e3SAndre Fischer
120*9f91b7e3SAndre Fischer    # Check if files have been removed.
121*9f91b7e3SAndre Fischer    my @missing = ();
122*9f91b7e3SAndre Fischer    foreach my $item (values %{$self->{'data'}})
123*9f91b7e3SAndre Fischer    {
124*9f91b7e3SAndre Fischer        my ($uniquename, $row) = ($item->{'uniquename'}, $item->{'row'});
125*9f91b7e3SAndre Fischer        if ( ! defined $target_unique_names->{$uniquename})
126*9f91b7e3SAndre Fischer        {
127*9f91b7e3SAndre Fischer            # $name is defined in source but not in target => it has been removed.
128*9f91b7e3SAndre Fischer            push @missing, $row;
129*9f91b7e3SAndre Fischer        }
130*9f91b7e3SAndre Fischer    }
131*9f91b7e3SAndre Fischer    return @missing;
132*9f91b7e3SAndre Fischer}
133*9f91b7e3SAndre Fischer
134*9f91b7e3SAndre Fischer
135*9f91b7e3SAndre Fischer
136*9f91b7e3SAndre Fischer
137*9f91b7e3SAndre Fischersub get_sequence_and_unique_name($$)
138*9f91b7e3SAndre Fischer{
139*9f91b7e3SAndre Fischer    my ($self, $source_path) = @_;
140*9f91b7e3SAndre Fischer
141*9f91b7e3SAndre Fischer    my $sequence_and_unique_name = $self->{'data'}->{$source_path};
142*9f91b7e3SAndre Fischer    if ( ! defined $sequence_and_unique_name)
143*9f91b7e3SAndre Fischer    {
144*9f91b7e3SAndre Fischer        $installer::logger::Lang->printf("can not find entry for source path '%s'\n", $source_path);
145*9f91b7e3SAndre Fischer        return (undef,undef);
146*9f91b7e3SAndre Fischer    }
147*9f91b7e3SAndre Fischer    else
148*9f91b7e3SAndre Fischer    {
149*9f91b7e3SAndre Fischer        return (
150*9f91b7e3SAndre Fischer            $sequence_and_unique_name->{'sequence'},
151*9f91b7e3SAndre Fischer            $sequence_and_unique_name->{'uniquename'});
152*9f91b7e3SAndre Fischer    }
153*9f91b7e3SAndre Fischer}
154*9f91b7e3SAndre Fischer
155*9f91b7e3SAndre Fischer
156*9f91b7e3SAndre Fischer1;
157