cpython/Mac/OSX/PythonLauncher/doscript.m

119 lines
3.7 KiB
Objective-C

/*
* 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;
}