119 lines
3.7 KiB
Mathematica
119 lines
3.7 KiB
Mathematica
|
/*
|
||
|
* 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 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;
|
||
|
}
|