summaryrefslogtreecommitdiff
path: root/solenv/bin/modules/installer/patch/FileSequenceList.pm
diff options
context:
space:
mode:
Diffstat (limited to 'solenv/bin/modules/installer/patch/FileSequenceList.pm')
-rw-r--r--solenv/bin/modules/installer/patch/FileSequenceList.pm159
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;