[Python-checkins] r62649 - in python/branches/release25-maint: Lib/plat-mac/Carbon/AppleEvents.py Lib/plat-mac/terminalcommand.py Mac/PythonLauncher/doscript.m
ronald.oussoren
python-checkins at python.org
Fri May 2 23:46:56 CEST 2008
Author: ronald.oussoren
Date: Fri May 2 23:46:55 2008
New Revision: 62649
Log:
Backport of revision 62648
Modified:
python/branches/release25-maint/Lib/plat-mac/Carbon/AppleEvents.py
python/branches/release25-maint/Lib/plat-mac/terminalcommand.py
python/branches/release25-maint/Mac/PythonLauncher/doscript.m
Modified: python/branches/release25-maint/Lib/plat-mac/Carbon/AppleEvents.py
==============================================================================
--- python/branches/release25-maint/Lib/plat-mac/Carbon/AppleEvents.py (original)
+++ python/branches/release25-maint/Lib/plat-mac/Carbon/AppleEvents.py Fri May 2 23:46:55 2008
@@ -1,6 +1,7 @@
# Generated from 'AEDataModel.h'
def FOUR_CHAR_CODE(x): return x
+typeApplicationBundleID = FOUR_CHAR_CODE('bund')
typeBoolean = FOUR_CHAR_CODE('bool')
typeChar = FOUR_CHAR_CODE('TEXT')
typeSInt16 = FOUR_CHAR_CODE('shor')
Modified: python/branches/release25-maint/Lib/plat-mac/terminalcommand.py
==============================================================================
--- python/branches/release25-maint/Lib/plat-mac/terminalcommand.py (original)
+++ python/branches/release25-maint/Lib/plat-mac/terminalcommand.py Fri May 2 23:46:55 2008
@@ -27,7 +27,7 @@
def run(command):
"""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,
kAutoGenerateReturnID, kAnyTransactionID)
commandDesc = AE.AECreateDesc(typeChar, command)
Modified: python/branches/release25-maint/Mac/PythonLauncher/doscript.m
==============================================================================
--- python/branches/release25-maint/Mac/PythonLauncher/doscript.m (original)
+++ python/branches/release25-maint/Mac/PythonLauncher/doscript.m Fri May 2 23:46:55 2008
@@ -11,108 +11,49 @@
#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;
- }
+ char *bundleID = "com.apple.Terminal";
+ AppleEvent evt, res;
+ AEDesc desc;
+ OSStatus err;
+
+ [[NSWorkspace sharedWorkspace] launchApplication:@"/Applications/Utilities/Terminal.app/"];
+
+ // Build event
+ err = AEBuildAppleEvent(kAECoreSuite, kAEDoScript,
+ typeApplicationBundleID,
+ bundleID, strlen(bundleID),
+ kAutoGenerateReturnID,
+ kAnyTransactionID,
+ &evt, NULL,
+ "'----':utf8(@)", strlen(command),
+ command);
+ if (err) {
+ NSLog(@"AEBuildAppleEvent failed: %d\n", err);
+ return err;
+ }
+
+ // Send event and check for any Apple Event Manager errors
+ err = AESendMessage(&evt, &res, kAEWaitReply, kAEDefaultTimeout);
+ AEDisposeDesc(&evt);
+ if (err) {
+ NSLog(@"AESendMessage failed: %d\n", err);
+ return err;
+ }
+ // Check for any application errors
+ err = AEGetParamDesc(&res, keyErrorNumber, typeSInt32, &desc);
+ AEDisposeDesc(&res);
+ 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;
}
More information about the Python-checkins
mailing list