mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
6.8 KiB
242 lines
6.8 KiB
############################################################################
|
|
#
|
|
# Represents a line from the infsect table.
|
|
#
|
|
package InfData;
|
|
use strict;
|
|
use lib $ENV{RAZZLETOOLPATH} . "\\PostBuildScripts";
|
|
use lib $ENV{RAZZLETOOLPATH} . "\\sp";
|
|
use lib $ENV{RAZZLETOOLPATH};
|
|
use Logmsg;
|
|
|
|
# Create a new inf entry by full path name and sku.
|
|
sub new {
|
|
my $class = shift;
|
|
my ($src, $dirid, $path, $name, $mask) = @_;
|
|
my $self = {};
|
|
|
|
# Path
|
|
$self->{DIRID} = $dirid; # DirID for the installation path.
|
|
$self->{PATH} = $path; # Rest of installation path.
|
|
|
|
# Inf line
|
|
$self->{DEST} = ""; # Destination filename, if different.
|
|
$self->{NAME} = $src; # Source filename.
|
|
$self->{TEMP} = ""; # Temporary file name.
|
|
$self->{FLAG} = 0; # Inf file flags.
|
|
|
|
# Special data.
|
|
$self->{MASK} = $mask; # Skus to install on.
|
|
$self->{SPEC} = ""; # Info to find a magic section.
|
|
$self->{WHEN} = ""; # When to copy over.
|
|
$self->{CMD} = "copy"; # What to do with the file.
|
|
|
|
# Finish up.
|
|
$self = bless $self;
|
|
$self->setDest($name);
|
|
return $self;
|
|
}
|
|
|
|
sub copy {
|
|
my $self = shift;
|
|
my $new = InfData->new($self->{NAME},$self->{DIRID},$self->{PATH},$self->getDest(),$self->{MASK});
|
|
$new->{SPEC} = $self->{SPEC};
|
|
$new->{WHEN} = $self->{WHEN};
|
|
return $new;
|
|
}
|
|
|
|
# Add a new product if the path is a match.
|
|
sub addBit {
|
|
my $self = shift;
|
|
my ($new) = @_;
|
|
return 0 if $new->{DIRID} != $self->{DIRID};
|
|
return 0 if $new->{FLAG} != $self->{FLAG};
|
|
return 0 if lc $new->{PATH} ne lc $self->{PATH};
|
|
return 0 if lc $new->{DEST} ne lc $self->{DEST};
|
|
return 0 if lc $new->{NAME} ne lc $self->{NAME};
|
|
return 0 if lc $new->{TEMP} ne lc $self->{TEMP};
|
|
return 0 if lc $new->{SPEC} ne lc $self->{SPEC};
|
|
return 0 if lc $new->{WHEN} ne lc $self->{WHEN};
|
|
$self->{MASK} |= $new->{MASK};
|
|
return 1;
|
|
}
|
|
|
|
# Remove an line or part of a line.
|
|
sub delBit {
|
|
my $self = shift;
|
|
my ($new) = @_;
|
|
return $self if $new->{DIRID} != $self->{DIRID};
|
|
return $self if $new->{FLAG} != $self->{FLAG};
|
|
return $self if lc $new->{PATH} ne lc $self->{PATH};
|
|
return $self if lc $new->{DEST} ne lc $self->{DEST};
|
|
return $self if lc $new->{NAME} ne lc $self->{NAME};
|
|
return $self if lc $new->{TEMP} ne lc $self->{TEMP};
|
|
return $self if lc $new->{SPEC} ne lc $self->{SPEC};
|
|
return $self if lc $new->{WHEN} ne lc $self->{WHEN};
|
|
$self->{MASK} &= ~$new->{MASK};
|
|
if ( $self->{MASK} == 0 ) { return undef; }
|
|
else { return $self; }
|
|
}
|
|
|
|
# Remove an line or part of a line, ignoring source directory.
|
|
sub delBit2 {
|
|
my $self = shift;
|
|
my ($new) = @_;
|
|
return $self if $new->{DIRID} != $self->{DIRID};
|
|
return $self if $new->{FLAG} != $self->{FLAG};
|
|
return $self if lc $new->{PATH} ne lc $self->{PATH};
|
|
return $self if lc $new->{DEST} ne lc $self->{DEST};
|
|
return $self if lc $new->{TEMP} ne lc $self->{TEMP};
|
|
return $self if lc $new->{SPEC} ne lc $self->{SPEC};
|
|
return $self if lc $new->{WHEN} ne lc $self->{WHEN};
|
|
return $self if lc $new->getSrc() ne lc $self->getSrc();
|
|
$self->{MASK} &= ~$new->{MASK};
|
|
if ( $self->{MASK} == 0 ) { return undef; }
|
|
else { return $self; }
|
|
}
|
|
|
|
# Output a path identifier for this entry.
|
|
sub getFullPath {
|
|
my $self = shift;
|
|
return lc "$self->{DIRID},\"$self->{PATH}\"";
|
|
}
|
|
|
|
# Get the destination filename.
|
|
sub getDest {
|
|
my $self = shift;
|
|
return $self->{DEST} if $self->{DEST} ne "";
|
|
$self->{NAME} =~ /^(.*\\)?([^\\]*)$/;
|
|
return $2;
|
|
}
|
|
|
|
# Set the destination filename.
|
|
sub setDest {
|
|
my $self = shift;
|
|
my ($dest) = @_;
|
|
return if lc $dest eq lc $self->getDest();
|
|
$self->{DEST} = $dest;
|
|
}
|
|
|
|
# Set the source filename.
|
|
sub setSrc {
|
|
my $self = shift;
|
|
my ($src) = @_;
|
|
return if lc $src eq lc $self->getSrc();
|
|
my $dest = $self->getDest();
|
|
$self->{NAME} = $src;
|
|
$self->{DEST} = "";
|
|
$self->setDest($dest);
|
|
}
|
|
|
|
# Get the source filename, no path.
|
|
sub getSrc {
|
|
my $self = shift;
|
|
$self->{NAME} =~ /^(.*\\)?([^\\]*)$/;
|
|
return $2;
|
|
}
|
|
|
|
# Get the source directory.
|
|
sub getSrcDir {
|
|
my $self = shift;
|
|
$self->{NAME} =~ /^(.*\\)?([^\\]*)$/;
|
|
return (defined $1) ? $1:"";
|
|
}
|
|
|
|
# Set the source directory.
|
|
sub setSrcDir {
|
|
my $self = shift;
|
|
my ($dir) = @_;
|
|
$dir .= "\\" if $dir !~ /\\$/;
|
|
$self->{NAME} =~ /^(.*\\)?([^\\]*)$/;
|
|
$self->{NAME} = "$dir$2";
|
|
}
|
|
|
|
# Set the source directory to root.
|
|
sub clearSrcDir {
|
|
my $self = shift;
|
|
$self->{NAME} = $self->getSrc();
|
|
}
|
|
|
|
# Read in a line from infsect.tbl.
|
|
sub readLine {
|
|
my $self = shift;
|
|
my ($line, $skus) = @_;
|
|
|
|
# Break into sections.
|
|
return 0 if $line !~ /^([^:]*):([^:]*):(\d*),\"([^\"]*)\"(?::([^:]*)(?::([^:]*))?)?/; # "
|
|
my $mask = $1;
|
|
my $data = $2;
|
|
$self->{DIRID} = $3;
|
|
$self->{PATH} = $4;
|
|
$self->{WHEN} = (defined $5) ? $5:"";
|
|
$self->{SPEC} = (defined $6) ? $6:"";
|
|
|
|
# Generate the mask.
|
|
my $bit = 1;
|
|
$self->{MASK} = 0;
|
|
for (my $i=0; $i<=$#$skus; ++$i) {
|
|
$self->{MASK} |= $bit if substr($mask,$i,1) eq $skus->[$i];
|
|
$bit = $bit << 1;
|
|
}
|
|
return 0 if $self->{MASK} == 0;
|
|
|
|
# Read in the line information.
|
|
my $temp;
|
|
my $flag;
|
|
($self->{DEST}, $self->{NAME}, $temp, $flag) = split(",", $data);
|
|
$self->{DEST} = "" if $self->{DEST} eq $self->{NAME};
|
|
$self->{TEMP} = (defined $temp) ? $temp:"";
|
|
$self->{FLAG} = (defined $flag) ? $flag:0;
|
|
return 1;
|
|
}
|
|
|
|
# Generate a line for infsect.tbl.
|
|
sub getLine {
|
|
my $self = shift;
|
|
my ($skus) = @_;
|
|
my $str = "";
|
|
|
|
# Print out the mask data.
|
|
my $mask = $self->{MASK};
|
|
foreach my $sku ( @$skus ) {
|
|
if ( $mask & 1 ) { $str .= $sku; }
|
|
else { $str .= " "; }
|
|
$mask = $mask >> 1;
|
|
}
|
|
|
|
# Print the info needed for the inf line.
|
|
$str .= ":";
|
|
$str .= "$self->{DEST},$self->{NAME}";
|
|
$str .= ",$self->{TEMP}" if $self->{FLAG} != 0 or $self->{TEMP} ne "";
|
|
$str .= ",$self->{FLAG}" if $self->{FLAG} != 0;
|
|
$str .= ":";
|
|
|
|
# Print the install path.
|
|
$str .= $self->getFullPath();
|
|
|
|
# Print special data.
|
|
$str .= ":$self->{WHEN}" if $self->{SPEC} ne "" or $self->{WHEN} ne "";
|
|
$str .= ":$self->{SPEC}" if $self->{SPEC} ne "";
|
|
return $str;
|
|
}
|
|
|
|
# Generate a line for an inf section.
|
|
sub getInfLine {
|
|
my $self = shift;
|
|
my ($flag) = @_;
|
|
$flag = $self->{FLAG} if $flag == 0;
|
|
my $dest = $self->getDest();
|
|
return $dest if $self->{CMD} eq "del";
|
|
my $name = $self->{NAME};
|
|
$name =~ s/^\\//;
|
|
$name = "" if $name eq $dest;
|
|
my $str = "";
|
|
$str .= "$dest";
|
|
$str .= ",$name" if $flag != 0 or $self->{TEMP} ne "" or $name ne "";
|
|
$str .= ",$self->{TEMP}" if $flag != 0 or $self->{TEMP} ne "";
|
|
$str .= ",$flag" if $flag != 0;
|
|
return $str;
|
|
}
|
|
|
|
1;
|
|
|