/*
 *  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:@"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: %ld\n", (long)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: %ld\n", (long)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: %ld", (long)err);
        AEDisposeDesc(&desc);
    } else if (err == errAEDescNotFound) {
        err = noErr;
    } else {
        NSLog(@"AEGetPArmDesc returned an error: %ld", (long)err);
    }

    return err;
}
