#!/usr/bin/perl

my $TARGET = $ARGV[2];
my $PKG = $ARGV[0];
my $SYSTEM_VERS = "$TARGET/System/Library/CoreServices/SystemVersion.plist";
my $MENU_EXTRA = "$TARGET/System/Library/CoreServices/Menu Extras/RemoteDesktop.menu";
my $PLISTBUDDY = "$PKG/Contents/Resources/PlistBuddy";
my $EXISTS = (-e "${MENU_EXTRA}/Contents/version.plist");

if (CheckVersion( $SYSTEM_VERS, "10.6", "ProductVersion", ">=" )) {
	my $bundleVersion = GetVersion("${MENU_EXTRA}-SnowLeopard/Contents/version.plist", "CFBundleShortVersionString");
	if (!CheckVersion("${MENU_EXTRA}/Contents/version.plist", $bundleVersion, "CFBundleShortVersionString", ">")) {
		system("/bin/rm", "-rf", "${MENU_EXTRA}");
		system("/bin/mv", "${MENU_EXTRA}-SnowLeopard", "${MENU_EXTRA}");
	} else {
		system("/bin/rm", "-rf", "${MENU_EXTRA}-SnowLeopard");
	}
	system("/bin/rm", "-rf", "${MENU_EXTRA}-Leopard");
	system("/bin/rm", "-rf", "${MENU_EXTRA}-Tiger");

} elsif (CheckVersion( $SYSTEM_VERS, "10.5", "ProductVersion", ">=" )) {
	my $bundleVersion = GetVersion("${MENU_EXTRA}-Leopard/Contents/version.plist", "CFBundleShortVersionString");
	if (!CheckVersion("${MENU_EXTRA}/Contents/version.plist", $bundleVersion, "CFBundleShortVersionString", ">")) {
		system("/bin/rm", "-rf", "${MENU_EXTRA}");
		system("/bin/mv", "${MENU_EXTRA}-Leopard", "${MENU_EXTRA}");
	} else {
		system("/bin/rm", "-rf", "${MENU_EXTRA}-Leopard");
	}
	system("/bin/rm", "-rf", "${MENU_EXTRA}-SnowLeopard");
	system("/bin/rm", "-rf", "${MENU_EXTRA}-Tiger");

} elsif (CheckVersion( $SYSTEM_VERS, "10.4", "ProductVersion", ">=" )) {
	my $bundleVersion = GetVersion("${MENU_EXTRA}-Tiger/Contents/version.plist", "CFBundleShortVersionString");
	if (!CheckVersion("${MENU_EXTRA}/Contents/version.plist", $bundleVersion, "CFBundleShortVersionString", ">")) {
		system("/bin/rm", "-rf", "${MENU_EXTRA}");
		system("/bin/mv", "${MENU_EXTRA}-Tiger", "${MENU_EXTRA}");
	} else {
		system("/bin/rm", "-rf", "${MENU_EXTRA}-Tiger");
	}
	system("/bin/rm", "-rf", "${MENU_EXTRA}-Leopard");
	system("/bin/rm", "-rf", "${MENU_EXTRA}-SnowLeopard");

	system($PLISTBUDDY, "-c", "Set CFBundleShortVersionString 2.9", "${MENU_EXTRA}/Contents/version.plist");
}

sub GetVersion
{
    my $path            = $_[0];
    my $keyName         = $_[1];
    
    my $oldSeperator;
    my $plistData;
    my @items;
    my $item;

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

    $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;
        if ($1 eq $keyName) {
			close(PLIST);
			return $2;
		}
    }

    close(PLIST);

	return -1;
}

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