Kaydet (Commit) 7fd29f01 authored tarafından Ronald Oussoren's avatar Ronald Oussoren

Backport of revision 62648

üst f3bb2839
# Generated from 'AEDataModel.h' # Generated from 'AEDataModel.h'
def FOUR_CHAR_CODE(x): return x def FOUR_CHAR_CODE(x): return x
typeApplicationBundleID = FOUR_CHAR_CODE('bund')
typeBoolean = FOUR_CHAR_CODE('bool') typeBoolean = FOUR_CHAR_CODE('bool')
typeChar = FOUR_CHAR_CODE('TEXT') typeChar = FOUR_CHAR_CODE('TEXT')
typeSInt16 = FOUR_CHAR_CODE('shor') typeSInt16 = FOUR_CHAR_CODE('shor')
......
...@@ -27,7 +27,7 @@ SEND_MODE = kAENoReply # kAEWaitReply hangs when run from Terminal.app itself ...@@ -27,7 +27,7 @@ SEND_MODE = kAENoReply # kAEWaitReply hangs when run from Terminal.app itself
def run(command): def run(command):
"""Run a shell command in a new Terminal.app window.""" """Run a shell command in a new Terminal.app window."""
termAddress = AE.AECreateDesc(typeApplSignature, TERMINAL_SIG) termAddress = AE.AECreateDesc(typeApplicationBundleID, "com.apple.Terminal")
theEvent = AE.AECreateAppleEvent(kAECoreSuite, kAEDoScript, termAddress, theEvent = AE.AECreateAppleEvent(kAECoreSuite, kAEDoScript, termAddress,
kAutoGenerateReturnID, kAnyTransactionID) kAutoGenerateReturnID, kAnyTransactionID)
commandDesc = AE.AECreateDesc(typeChar, command) commandDesc = AE.AECreateDesc(typeChar, command)
......
...@@ -11,108 +11,49 @@ ...@@ -11,108 +11,49 @@
#import <ApplicationServices/ApplicationServices.h> #import <ApplicationServices/ApplicationServices.h>
#import "doscript.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 extern int
doscript(const char *command) doscript(const char *command)
{ {
OSErr err; char *bundleID = "com.apple.Terminal";
AppleEvent theAEvent, theReply; AppleEvent evt, res;
AEAddressDesc terminalAddress; AEDesc desc;
AEDesc commandDesc; OSStatus err;
OSType terminalCreator = CREATOR;
[[NSWorkspace sharedWorkspace] launchApplication:@"/Applications/Utilities/Terminal.app/"];
/* set up locals */
AECreateDesc(typeNull, NULL, 0, &theAEvent); // Build event
AECreateDesc(typeNull, NULL, 0, &terminalAddress); err = AEBuildAppleEvent(kAECoreSuite, kAEDoScript,
AECreateDesc(typeNull, NULL, 0, &theReply); typeApplicationBundleID,
AECreateDesc(typeNull, NULL, 0, &commandDesc); bundleID, strlen(bundleID),
kAutoGenerateReturnID,
/* create the "activate" event for Terminal */ kAnyTransactionID,
err = AECreateDesc(typeApplSignature, (Ptr) &terminalCreator, &evt, NULL,
sizeof(terminalCreator), &terminalAddress); "'----':utf8(@)", strlen(command),
if (err != noErr) { command);
NSLog(@"doscript: AECreateDesc: error %d\n", err); if (err) {
goto bail; NSLog(@"AEBuildAppleEvent failed: %d\n", err);
} return err;
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 */ // Send event and check for any Apple Event Manager errors
err = AECreateDesc(typeChar, command, strlen(command), &commandDesc); err = AESendMessage(&evt, &res, kAEWaitReply, kAEDefaultTimeout);
if (err != noErr) { AEDisposeDesc(&evt);
NSLog(@"doscript: AECreateDesc(command): error %d\n", err); if (err) {
goto bail; NSLog(@"AESendMessage failed: %d\n", err);
return err;
} }
err = AEPutParamDesc(&theAEvent, WITHCOMMAND, &commandDesc); // Check for any application errors
if (err != noErr) { err = AEGetParamDesc(&res, keyErrorNumber, typeSInt32, &desc);
NSLog(@"doscript: AEPutParamDesc: error %d\n", err); AEDisposeDesc(&res);
goto bail; if (!err) {
AEGetDescData(&desc, &err, sizeof(err));
NSLog(@"Terminal returned an error: %d", err);
AEDisposeDesc(&desc);
} else if (err == errAEDescNotFound) {
err = noErr;
} else {
NSLog(@"AEGetPArmDesc returned an error: %d", err);
} }
/* 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; return err;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment