#!/usr/bin/perl

########################################################
my $SYSTEM_VERS 	= "/System/Library/CoreServices/SystemVersion.plist";
my $KEYNOTE_VERS 	= "/Applications/Keynote.app/Contents/version.plist";
my $EXIT_VALUE 		= 0;

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

    if( !-f $KEYNOTE_VERS ) 
    {
        $EXIT_VALUE = ((1 << 6) | ( 1 << 5 ) | 19 );
        last;
    }

    if( CheckVersion( $KEYNOTE_VERS, "1.1.1", "CFBundleShortVersionString", ">" )) 
    {
        $EXIT_VALUE = ((1 << 6) | ( 1 << 5 ) | 18 );
        last;
    }

    ########################################################
    my $APP 			= "Keynote.app";
    my $APP_IS_RUNNING 		= 0;
    my $SWU_APP 		= "Software Update";
    my $SWU_IS_RUNNING 		= 0;
    my $TENTHREE		= 0;
    my $DISPLAYALERT            = $ARGV[0] ."/Contents/Resources/Alert.app/Contents/MacOS/Alert";
    ########################################################

#   Alas
#    if( CheckVersion( $SYSTEM_VERS, "10.3.0", "ProductVersion", ">=" )) 
#    {
#        $TENTHREE = 1;
#    }

    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 ($APP_IS_RUNNING == 1) {
        if (($TENTHREE) || ($SWU_IS_RUNNING == 0)) {
            $EXIT_VALUE = ((1 << 6) | ( 1 << 5 ) | 17 );
            last;
        } else {
            while (($APP_IS_RUNNING == 1) && ($SWU_IS_RUNNING == 1)) {
                $ENV{'ALERT_APP_ACTION'} = "KeynoteRunning";
                system($DISPLAYALERT,"");
                # per nat torkington
        
                $APP_IS_RUNNING = 0;
        
                open(PSOUT, "/bin/ps -awwx |");
                while( <PSOUT> ) {
                    if( /$APP/ ) {
                        $APP_IS_RUNNING = 1;
                    }
                }
                close(PSOUT);
        
            } # 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 $i;
    my $oldSeperator;
    my $plistData;
    my @items;
    my $item;
    my @theVersionArray;
    my @versionArray;
    my %versiondata;

    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;
    }

}

