diff options
Diffstat (limited to 'solenv/bin/modules/installer/patch/FileSequenceList.pm')
-rw-r--r-- | solenv/bin/modules/installer/patch/FileSequenceList.pm | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/solenv/bin/modules/installer/patch/FileSequenceList.pm b/solenv/bin/modules/installer/patch/FileSequenceList.pm new file mode 100644 index 000000000000..6c607d8314e8 --- /dev/null +++ b/solenv/bin/modules/installer/patch/FileSequenceList.pm @@ -0,0 +1,159 @@ +#************************************************************** +# +# 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 XML::LibXML; +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 SetFromFileList ($$) +{ + my ($self, $files) = @_; + + my %data = map {$_->{'uniquename'} => $_->{'sequencenumber'}} @$files; + $self->{'data'} = \%data; +} + + + + +sub SetFromMap ($$) +{ + my ($self, $map) = @_; + + $self->{'data'} = $map; +} + + + + +sub GetFileCount ($) +{ + my ($self) = @_; + + return scalar keys %{$self->{'data'}}; +} + + + + +=head2 GetSequenceNumbers ($files) + + $files is a hash that maps unique file names (File->File) to sequence + numbers (File->Sequence). The later is (expected to be) initially unset and + is set in this method. + + For new files -- entries in the given $files that do not exist in the 'data' + member -- no sequence numbers are defined. + + When there are removed files -- entries in the 'data' member that do not + exist in the given $files -- then a list of these files is returned. In + that case the given $files remain unmodified. + + The returned list is empty when everyting is OK. + +=cut +sub GetSequenceNumbers ($$) +{ + my ($self, $files) = @_; + + # Check if files have been removed. + my @missing = (); + foreach my $name (keys %{$self->{'data'}}) + { + if ( ! defined $files->{$name}) + { + push @missing, $name; + } + } + if (scalar @missing > 0) + { + # Yes. Return the names of the removed files. + return @missing; + } + + # No files where removed. Set the sequence numbers. + foreach my $name (keys %$files) + { + $files->{$name} = $self->{'data'}->{$name}; + } + return (); +} + + + + +sub GetDifference ($$) +{ + my ($self, $other) = @_; + + # Create maps for easy reference. + my (@files_in_both, @files_in_self, @files_in_other); + foreach my $name (keys %{$self->{'data'}}) + { + if (defined $other->{'data'}->{$name}) + { + push @files_in_both, $name; + } + else + { + push @files_in_self, $name; + } + } + foreach my $name (keys %{$self->{'data'}}) + { + if ( ! defined $self->{'data'}->{$name}) + { + push @files_in_other, $name; + } + } + + return (\@files_in_both, \@files_in_self, \@files_in_other); +} + + +1; |