/*
 *  doscript.c
 *  PythonLauncher
 *
 *  Created by Jack Jansen on Wed Jul 31 2002.
 *  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
 *
 */

#import <Cocoa/Cocoa.h>
#import <ApplicationServices/ApplicationServices.h>
#import "doscript.h"

extern int 
doscript(const char *command)
{
	char *bundleID = "com.apple.Terminal";
	AppleEvent evt, res;
	AEDesc desc;
	OSStatus err;

	[[NSWorkspace sharedWorkspace] launchApplication:@"/Applications/Utilities/Terminal.app/"];

	// Build event
	err = AEBuildAppleEvent(kAECoreSuite, kAEDoScript,
	                         typeApplicationBundleID,
	                         bundleID, strlen(bundleID),
	                         kAutoGenerateReturnID,
	                         kAnyTransactionID,
	                         &evt, NULL,
	                         "'----':utf8(@)", strlen(command),
	                         command);
	if (err) {
		NSLog(@"AEBuildAppleEvent failed: %d\n", err);
		return err;
	}

	// Send event and check for any Apple Event Manager errors
	err = AESendMessage(&evt, &res, kAEWaitReply, kAEDefaultTimeout);
	AEDisposeDesc(&evt);
	if (err) {
		NSLog(@"AESendMessage failed: %d\n", err);
		return err;
	}
	// Check for any application errors
	err = AEGetParamDesc(&res, keyErrorNumber, typeSInt32, &desc);
	AEDisposeDesc(&res);
	if (!err) {
		AEGetDescData(&desc, &err, sizeof(err));
		NSLog(@"Terminal returned an error: %d", err);
		AEDisposeDesc(&desc);
	} else if (err == errAEDescNotFound) {
		err = noErr;
	} else {
		NSLog(@"AEGetPArmDesc returned an error: %d", err);
	}

	return err;
}
