| /* |
| * 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" |
| |
| /* 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 event to the Finder */ |
| 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; |
| } |