/* * doscript.c * PythonLauncher * * Created by Jack Jansen on Wed Jul 31 2002. * Copyright (c) 2002 __MyCompanyName__. All rights reserved. * */ #import #import #import "doscript.h" /* I assume I could pick these up from somewhere, but where... */ #define CREATOR 'trmx' #define ACTIVATE_CMD 'misc' #define ACTIVATE_SUITE 'actv' #define DOSCRIPT_CMD 'dosc' #define DOSCRIPT_SUITE 'core' #define WITHCOMMAND 'cmnd' /* ... and there's probably also a better way to do this... */ #define START_TERMINAL "/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal &" extern int doscript(const char *command) { OSErr err; AppleEvent theAEvent, theReply; AEAddressDesc terminalAddress; AEDesc commandDesc; OSType terminalCreator = CREATOR; /* set up locals */ AECreateDesc(typeNull, NULL, 0, &theAEvent); AECreateDesc(typeNull, NULL, 0, &terminalAddress); AECreateDesc(typeNull, NULL, 0, &theReply); AECreateDesc(typeNull, NULL, 0, &commandDesc); /* create the "activate" event for Terminal */ err = AECreateDesc(typeApplSignature, (Ptr) &terminalCreator, sizeof(terminalCreator), &terminalAddress); if (err != noErr) { NSLog(@"doscript: AECreateDesc: error %d\n", err); goto bail; } err = AECreateAppleEvent(ACTIVATE_SUITE, ACTIVATE_CMD, &terminalAddress, kAutoGenerateReturnID, kAnyTransactionID, &theAEvent); if (err != noErr) { NSLog(@"doscript: AECreateAppleEvent(activate): error %d\n", err); goto bail; } /* send the event */ err = AESend(&theAEvent, &theReply, kAEWaitReply, kAENormalPriority, kAEDefaultTimeout, NULL, NULL); if ( err == -600 ) { int count=10; /* If it failed with "no such process" try to start Terminal */ err = system(START_TERMINAL); if ( err ) { NSLog(@"doscript: system(): %s\n", strerror(errno)); goto bail; } do { sleep(1); /* send the event again */ err = AESend(&theAEvent, &theReply, kAEWaitReply, kAENormalPriority, kAEDefaultTimeout, NULL, NULL); } while (err == -600 && --count > 0); if ( err == -600 ) NSLog(@"doscript: Could not activate Terminal\n"); } if (err != noErr) { NSLog(@"doscript: AESend(activate): error %d\n", err); goto bail; } /* create the "doscript with command" event for Terminal */ err = AECreateAppleEvent(DOSCRIPT_SUITE, DOSCRIPT_CMD, &terminalAddress, kAutoGenerateReturnID, kAnyTransactionID, &theAEvent); if (err != noErr) { NSLog(@"doscript: AECreateAppleEvent(doscript): error %d\n", err); goto bail; } /* add the command to the apple event */ err = AECreateDesc(typeChar, command, strlen(command), &commandDesc); if (err != noErr) { NSLog(@"doscript: AECreateDesc(command): error %d\n", err); goto bail; } err = AEPutParamDesc(&theAEvent, WITHCOMMAND, &commandDesc); if (err != noErr) { NSLog(@"doscript: AEPutParamDesc: error %d\n", err); goto bail; } /* send the command event to Terminal.app */ err = AESend(&theAEvent, &theReply, kAEWaitReply, kAENormalPriority, kAEDefaultTimeout, NULL, NULL); if (err != noErr) { NSLog(@"doscript: AESend(docommand): error %d\n", err); goto bail; } /* clean up and leave */ bail: AEDisposeDesc(&commandDesc); AEDisposeDesc(&theAEvent); AEDisposeDesc(&terminalAddress); AEDisposeDesc(&theReply); return err; }