| #************************************************************** |
| # |
| # 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; |