#!/usr/bin/perl

my $SYSTEM_VERS = "/System/Library/CoreServices/SystemVersion.plist";
my $EXIT_VALUE = 0;
my $Package_Path = $ENV{PACKAGE_PATH};
my $hasG4 = 1;
my $badOS = 0;

DO_CHECKS: {

	# Only G3s are not compatible
        if(CheckIOReg("PowerPC,750@", "PowerPC,755@", "PowerPC,740@",
                "PowerPC,745@", "PowerPC,750CX@", "PowerPC,750CXe@",
                "PowerPC,G3@", "PowerMac1,2")) {
                $hasG4 = 0;
        }

        #set the exit value dependant on the hardware present
        if(!$hasG4)
        {
                $EXIT_VALUE = ((1 << 6) | ( 1 << 5 ) | 16 );
                last;
        }

        if(CheckVersion("$SYSTEM_VERS", "10.2.5", "ProductVersion", "<")) {
                $badOS = 1;
        }

        if ($badOS)
        {
                $EXIT_VALUE = ((1 << 6) | ( 1 << 5 ) | 17 );
		last;
        }
}

if (!$EXIT_VALUE)
{
	if(CheckVersion("$SYSTEM_VERS", "10.3", "ProductVersion", "<")) {
                @localPkgVers = ExtractPkgVersion("$Package_Path");
		@receiptVers = ExtractPkgVersion("/Library/Receipts/" . GetPackageName("$Package_Path"));

		if ($receiptVers[0] > $localPkgVers[0])
		{
			$EXIT_VALUE = ((1 << 6));
		} else {
			if (($receiptVers[0] == $localPkgVers[0])
				&& ($receiptVers[1] > $localPkgVers[1]))
			{
				$EXIT_VALUE = ((1 << 6));
			}
		}
        }
}

#Remove the special "RegResult" cookie file to allow the serialization dialog to run again
system ("/bin/rm -rf /tmp/RegResult");

exit($EXIT_VALUE);

###

sub CheckVersion
{
    my $path            = $_[0];
    my $version         = $_[1];
    my $keyName         = $_[2];
    my $operator        = $_[3];

    if (! -e $path) {
        return 0;
    }

    if (!$operator) {
        $operator = "==";
    }

    my $oldSeperator = $/;
    $/ = \0;

    open( PLIST, "$path") || do {
        return 0;
    };

    $plistData = <PLIST>;
    $plistData =~ /<dict>(.*?)<\/dict>/gis;

    @items = split(/<key>/, $plistData);

    shift @items;
    foreach $item (@items) {
        $item =~ /(.*?)<\/key>.*?<string>(.*?)<\/string>/gis;
        $versiondata{ $1 } = $2;
    }

    close(PLIST);

    $/ = $oldSeperator;

    @theVersionArray = split(/\./, $versiondata{$keyName});
    for ($i = 0; $i < 3; $i++) {
        if(!$theVersionArray[$i]) {
            $theVersionArray[$i] = '0';
        }
    }

    @versionArray = split(/\./, $version);
    
    my $actualVersion;

    for ($i = 0; $i < 3; $i++) {
        if (($theVersionArray[$i] != $versionArray[$i]) or ($i == 2)) {

            $actualVersion = $theVersionArray[$i];
            $version = $versionArray[$i];

            last;
        }
    }

    my $expression = '$actualVersion ' . $operator . ' $version';
    if( eval ($expression) )
    {
        return 1;
    }
    else
    {
        return 0;
    }

}

sub CheckIOReg
{
        $RESULT = 0;

        open(IOREGOUT, "/usr/sbin/ioreg |");

        foreach $LINE (<IOREGOUT>) {
                $BUF .= $LINE;
        }
        close(IOREGOUT);

        foreach $ITEM (@_) {
                if($BUF =~ /$ITEM/g) {
                        $RESULT = 1;
                        last;
                }
        }

        return($RESULT);
}

sub ExtractPkgVersion
{
    my $path		= $_[0];

    my $pkgMajor;
    my $pkgMinor;

    $pkgMajor = GetPlistVersion("$path/Contents/Info.plist", "IFMajorVersion");
    $pkgMinor = GetPlistVersion("$path/Contents/Info.plist", "IFMinorVersion");

    if (! $pkgMajor || ! $pkgMinor)
    {
        open (FILE, "$path/Contents/Resources/package_version");
        $line = <FILE>;
	chomp $line;
        $line =~ /Major:\s(.*)/;
	$pkgMajor = $1;
        $line = <FILE>;
	chomp $line;
        $line =~ /Minor:\s(.*)/;
        $pkgMinor = $1;
        close (FILE);
    }

    if (! $pkgMajor)
    {
        $pkgMajor = 0;
    }
    if (! $pkgMinor)    
    {
        $pkgMinor = 0;
    }

    return ($pkgMajor, $pkgMinor);
}

sub GetPlistVersion
{
    my $path            = $_[0];
    my $keyName         = $_[1];

    my %versiondata;
    
    if (! -e $path) {
        return 0;
    }

    my $oldSeperator = $/;
    $/ = \0;

    open( PLIST, "$path") || do {
        return 0;
    };

    $plistData = <PLIST>;
    $plistData =~ /<dict>(.*?)<\/dict>/gis;

    @items = split(/<key>/, $plistData);

    shift @items;
    foreach $item (@items) {
        $item =~ /(.*?)<\/key>.*?<string>(.*?)<\/string>/gis;
        $versiondata{ $1 } = $2;
    }

    close(PLIST);

    $/ = $oldSeperator;
	
    return $versiondata{$keyName};
}

sub GetPackageName
{
  my $pathToPackage	= $_[0];
  
  my @pathItems = split (/\//,$pathToPackage);

  return $pathItems[-1];	
}
