11
11
#import <ApplicationServices/ApplicationServices.h>
12
12
#import "doscript.h"
14
/* I assume I could pick these up from somewhere, but where... */
15
#define CREATOR 'trmx'
17
#define ACTIVATE_CMD 'misc'
18
#define ACTIVATE_SUITE 'actv'
20
#define DOSCRIPT_CMD 'dosc'
21
#define DOSCRIPT_SUITE 'core'
22
#define WITHCOMMAND 'cmnd'
24
/* ... and there's probably also a better way to do this... */
25
#define START_TERMINAL "/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal &"
28
15
doscript(const char *command)
31
AppleEvent theAEvent, theReply;
32
AEAddressDesc terminalAddress;
34
OSType terminalCreator = CREATOR;
37
AECreateDesc(typeNull, NULL, 0, &theAEvent);
38
AECreateDesc(typeNull, NULL, 0, &terminalAddress);
39
AECreateDesc(typeNull, NULL, 0, &theReply);
40
AECreateDesc(typeNull, NULL, 0, &commandDesc);
42
/* create the "activate" event for Terminal */
43
err = AECreateDesc(typeApplSignature, (Ptr) &terminalCreator,
44
sizeof(terminalCreator), &terminalAddress);
46
NSLog(@"doscript: AECreateDesc: error %d\n", err);
49
err = AECreateAppleEvent(ACTIVATE_SUITE, ACTIVATE_CMD,
50
&terminalAddress, kAutoGenerateReturnID,
51
kAnyTransactionID, &theAEvent);
54
NSLog(@"doscript: AECreateAppleEvent(activate): error %d\n", err);
58
err = AESend(&theAEvent, &theReply, kAEWaitReply,
59
kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
62
/* If it failed with "no such process" try to start Terminal */
63
err = system(START_TERMINAL);
65
NSLog(@"doscript: system(): %s\n", strerror(errno));
70
/* send the event again */
71
err = AESend(&theAEvent, &theReply, kAEWaitReply,
72
kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
73
} while (err == -600 && --count > 0);
75
NSLog(@"doscript: Could not activate Terminal\n");
78
NSLog(@"doscript: AESend(activate): error %d\n", err);
82
/* create the "doscript with command" event for Terminal */
83
err = AECreateAppleEvent(DOSCRIPT_SUITE, DOSCRIPT_CMD,
84
&terminalAddress, kAutoGenerateReturnID,
85
kAnyTransactionID, &theAEvent);
87
NSLog(@"doscript: AECreateAppleEvent(doscript): error %d\n", err);
91
/* add the command to the apple event */
92
err = AECreateDesc(typeChar, command, strlen(command), &commandDesc);
94
NSLog(@"doscript: AECreateDesc(command): error %d\n", err);
97
err = AEPutParamDesc(&theAEvent, WITHCOMMAND, &commandDesc);
99
NSLog(@"doscript: AEPutParamDesc: error %d\n", err);
103
/* send the command event to Terminal.app */
104
err = AESend(&theAEvent, &theReply, kAEWaitReply,
105
kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
108
NSLog(@"doscript: AESend(docommand): error %d\n", err);
111
/* clean up and leave */
113
AEDisposeDesc(&commandDesc);
114
AEDisposeDesc(&theAEvent);
115
AEDisposeDesc(&terminalAddress);
116
AEDisposeDesc(&theReply);
17
char *bundleID = "com.apple.Terminal";
22
[[NSWorkspace sharedWorkspace] launchApplication:@"/Applications/Utilities/Terminal.app/"];
25
err = AEBuildAppleEvent(kAECoreSuite, kAEDoScript,
26
typeApplicationBundleID,
27
bundleID, strlen(bundleID),
28
kAutoGenerateReturnID,
31
"'----':utf8(@)", strlen(command),
34
NSLog(@"AEBuildAppleEvent failed: %d\n", err);
38
// Send event and check for any Apple Event Manager errors
39
err = AESendMessage(&evt, &res, kAEWaitReply, kAEDefaultTimeout);
42
NSLog(@"AESendMessage failed: %d\n", err);
45
// Check for any application errors
46
err = AEGetParamDesc(&res, keyErrorNumber, typeSInt32, &desc);
49
AEGetDescData(&desc, &err, sizeof(err));
50
NSLog(@"Terminal returned an error: %d", err);
52
} else if (err == errAEDescNotFound) {
55
NSLog(@"AEGetPArmDesc returned an error: %d", err);