| 
									
										
										
										
											2002-07-31 13:15:59 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  *  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;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-04 16:26:26 +00:00
										 |  |  |     /* send the command event to Terminal.app */
 | 
					
						
							| 
									
										
										
										
											2002-07-31 13:15:59 +00:00
										 |  |  |     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;
 | 
					
						
							| 
									
										
										
										
											2003-01-04 16:26:26 +00:00
										 |  |  | }
 |