summaryrefslogtreecommitdiff
path: root/Mac/PythonLauncher/doscript.m
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/PythonLauncher/doscript.m')
-rw-r--r--Mac/PythonLauncher/doscript.m118
1 files changed, 118 insertions, 0 deletions
diff --git a/Mac/PythonLauncher/doscript.m b/Mac/PythonLauncher/doscript.m
new file mode 100644
index 0000000000..3e4e22393c
--- /dev/null
+++ b/Mac/PythonLauncher/doscript.m
@@ -0,0 +1,118 @@
+/*
+ * 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;
+}