blob: f0b6653a4d84d5366d1f7af931248a0aef35aba8 [file] [log] [blame]
#**************************************************************
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
#**************************************************************
package installer::patch::FileSequenceList;
use strict;
=head1 NAME
FileSequenceList.pm - Class for retrieving and processing the 'Sequence' values of the MSI 'File' table.
=cut
=head2 new($class)
Create a new FileSequenceList object.
=cut
sub new ($)
{
my ($class) = @_;
my $self = {
'data' => undef
};
bless($self, $class);
return $self;
}
sub SetFromMap ($$)
{
my ($self, $map) = @_;
$self->{'data'} = $map;
}
sub SetFromMsi ($$)
{
my ($self, $msi) = @_;
my $file_table = $msi->GetTable("File");
my $file_map = $msi->GetFileMap();
my $file_column_index = $file_table->GetColumnIndex("File");
my $filename_column_index = $file_table->GetColumnIndex("FileName");
my $sequence_column_index = $file_table->GetColumnIndex("Sequence");
my %sequence_data = ();
printf("extracting columns %d and %d from %d rows\n",
$file_column_index,
$sequence_column_index,
$file_table->GetRowCount());
foreach my $row (@{$file_table->GetAllRows()})
{
my $unique_name = $row->GetValue($file_column_index);
my $filename = $row->GetValue($filename_column_index);
my ($long_filename,$short_filename) = installer::patch::Msi::SplitLongShortName($filename);
my $sequence = $row->GetValue($sequence_column_index);
my $directory_item = $file_map->{$unique_name}->{'directory'};
my $source_path = $directory_item->{'full_source_long_name'};
my $target_path = $directory_item->{'full_target_long_name'};
my $key = $source_path ne ""
? $source_path."/".$long_filename
: $long_filename;
$sequence_data{$key} = {
'sequence' => $sequence,
'uniquename' => $unique_name,
'row' => $row
};
}
$self->{'data'} = \%sequence_data;
}
sub GetFileCount ($)
{
my ($self) = @_;
return scalar keys %{$self->{'data'}};
}
sub get_removed_files ($@)
{
my ($self, $target_unique_names) = @_;
my %uniquename_to_row_map = map{$_->{'uniquename'} => $_->{'row'}} values %{$self->{'data'}};
# Check if files have been removed.
my @missing = ();
foreach my $item (values %{$self->{'data'}})
{
my ($uniquename, $row) = ($item->{'uniquename'}, $item->{'row'});
if ( ! defined $target_unique_names->{$uniquename})
{
# $name is defined in source but not in target => it has been removed.
push @missing, $row;
}
}
return @missing;
}
sub get_sequence_and_unique_name($$)
{
my ($self, $source_path) = @_;
my $sequence_and_unique_name = $self->{'data'}->{$source_path};
if ( ! defined $sequence_and_unique_name)
{
$installer::logger::Lang->printf("can not find entry for source path '%s'\n", $source_path);
return (undef,undef);
}
else
{
return (
$sequence_and_unique_name->{'sequence'},
$sequence_and_unique_name->{'uniquename'});
}
}
1;