#!/usr/bin/perl

########################################################
my $SYSTEM_VERS			= "/System/Library/CoreServices/SystemVersion.plist";
my $Package_Path		= $ENV{PACKAGE_PATH};
my $APPLICATION_LOC		= "/Applications/iMovie.app";
my $APPLICATION_VERS	= $APPLICATION_LOC . "/Contents/version.plist";
my $EXIT_VALUE			= 0;

my $TEN_THREE			= CheckVersion($SYSTEM_VERS, "10.3", "ProductVersion", ">=");
########################################################

DO_CHECKS: 
{
	# Must NOT be tier 3
	my $TIER_3_LANG = "/var/db/.AppleTier3Language";
	if (-e $TIER_3_LANG) {
		# return generic error
		$EXIT_VALUE = ( ( 1 << 6 ) | ( 1 << 5 ) | 1 );
		last;
    }

	# Must have min system
	if(CheckVersion($SYSTEM_VERS, "10.1", "ProductVersion", "<")) {
		$EXIT_VALUE = 1;
		last;
	}

	if(CheckVersion($SYSTEM_VERS, "10.2.6", "ProductVersion", "<")) {
		$EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ) | 16);
		last;
	}

    ########################################################################################
    if(!$TEN_THREE) {
        my @localPkgVers = ExtractPkgVersion($Package_Path);
            my @receiptVers = ExtractPkgVersion("/Library/Receipts/" . GetPackageName($Package_Path));
    
            if ($receiptVers[0] == $localPkgVers[0]) {
                    if ($receiptVers[1] > $localPkgVers[1]){
                            $EXIT_VALUE = ((1 << 6));
                    }
            } else {
                    if ($receiptVers[0] > $localPkgVers[0]){
                            $EXIT_VALUE = ((1 << 6));
                    }
            }
    }
    ########################################################################################
	
	# App must be at /Applications/iMovie.app ...
	unless(-e $APPLICATION_LOC) {
		$EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ) | 17);
		last;
	}
	# ... and iMovie must be 4.0.0 or 4.0.1
	unless( CheckVersion($APPLICATION_VERS, "4.0.0", "CFBundleShortVersionString", "==") ||
			CheckVersion($APPLICATION_VERS, "4.0.1", "CFBundleShortVersionString", "==")) {
				$EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ) | 17);
				last;
	}

    ########################################################
    my $APP					= "iMovie.app";
    my $APP_IS_RUNNING 		= 0;
    my $SWU_APP				= "Software Update";
    my $SWU_IS_RUNNING 		= 0;
    my $RUNNING_ERROR		= "Running";
	my $DISPLAYALERT		= $ARGV[0] . "/Contents/Resources/Alert.app/Contents/MacOS/Alert";
	my $CANCEL_COOKIE		= "/tmp/com.apple.pkg.iMovie_401.cancel";
    ########################################################
    open(PSOUT, "/bin/ps -awwx |");
    while( <PSOUT> ) {
        if( /$APP/ ) {
            $APP_IS_RUNNING = 1;
        }
    }
    close(PSOUT);
        
    open(PSOUT, "/bin/ps -awwx |");
    while( <PSOUT> ) {
        if( /$SWU_APP/ ) {
            $SWU_IS_RUNNING = 1;
        }
    }
    close(PSOUT);

	if ($SWU_IS_RUNNING == 1) {
		$RUNNING_ERROR		= "RunningOld";
	}
		
	while (($APP_IS_RUNNING == 1)) {
		unlink $CANCEL_COOKIE;

		$ENV{'ALERT_APP_ACTION'} = $RUNNING_ERROR;
		system($DISPLAYALERT,"");
		# per nat torkington
		
		$APP_IS_RUNNING = 0;

		open(PSOUT, "/bin/ps -awwx |");
		while( <PSOUT> ) {
			if( /$APP/ ) {
				$APP_IS_RUNNING = 1;
			}
		}
		close(PSOUT);
		
		# break out of the loop, and allow error to come up, if user hits cancel
		# note case above where we don't allow cancel
		if (-e $CANCEL_COOKIE) {
			unlink $CANCEL_COOKIE;
			$EXIT_VALUE = ((1 << 6) | ( 1 << 5 ) | 18 );
			exit($EXIT_VALUE);
		}
	} # while app is running, stay stuck here
	$EXIT_VALUE = 0;
	last;
}

exit($EXIT_VALUE);


########################################################
########################################################

sub CheckVersion
{
    my $path            = $_[0];
    my $version         = $_[1];
    my $keyName         = $_[2];
    my $operator        = $_[3];
    
    my $oldSeperator;
    my $plistData;
    my @items;
    my $item;
    my $versiondata;
    my $i;
    my @theVersionArray;
    my %versiondata;
    my @versionArray;

    # if there's no THERE there, we return FALSE
    if (! -e $path) {
        return 0;
    }

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

    $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 GetVersion
{
    my $path            = $_[0];
    my $keyName         = $_[1];
    
    my $oldSeperator;
    my $plistData;
    my @items;
    my $item;
    my $versiondata;
    my $i;
    my @theVersionArray;
    my %versiondata;
    my @versionArray;

    # if there's no THERE there, we return FALSE
    if (! -e $path) {
        return 0;
    }

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

    open( PLIST, "$path");

    $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 ExtractPkgVersion
{
    my $path		= $_[0];

    my $pkgMajor;
    my $pkgMinor;
    my $line;

    $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);
   # 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;
    };

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

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

    shift @items;
    foreach my $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];	
}
