ITSendAEWithString returns the AEDesc at index 1 of the resulting AEDesc, which is...
[ITFoundation.git] / ITAppleEventTools.m
1 /*
2  *  ITAppleEventTools.c
3  *  ITFoundation
4  *
5  *  Created by Alexander Strange on Wed Feb 11 2004.
6  *  Copyright (c) 2004 __MyCompanyName__. All rights reserved.
7  *
8  */
9
10 #import "ITDebug.h"
11 #import "ITAppleEventTools.h"
12
13 NSAppleEventDescriptor *ITSendAEWithString(NSString *sendString, FourCharCode evClass, FourCharCode evID,const ProcessSerialNumber *psn)
14 {
15     //Add error checking...
16     pid_t pid;
17     
18     const char *usendString = [sendString UTF8String];
19     
20     AppleEvent sendEvent, replyEvent;
21     NSAppleEventDescriptor *send, *recv;
22     AEDesc nthDesc;
23     
24     AEBuildError buildError;
25     OSStatus berr,err;
26     
27     if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
28         ITDebugLog(@"Error getting PID of application.");
29         return nil;
30     }
31     
32     berr = AEBuildAppleEvent(evClass, evID, typeProcessSerialNumber,psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, usendString);
33     send = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&sendEvent] autorelease];
34     if (!berr) [send logDesc];
35     
36     if (berr) {
37         ITDebugLog(@"Error: %d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]);
38     }
39     
40     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, NULL, NULL);
41     
42     err = AEGetNthDesc(&replyEvent, 1, typeWildCard, nil, &nthDesc);
43     if (!err) ITDebugLog(@"Error getting Nth desc.");
44     
45     recv = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&nthDesc] autorelease];
46     if (!err) [recv logDesc];
47     
48     if (err) {
49         ITDebugLog(@"Send Error: %i",err);
50     }
51     return recv;
52 }
53
54 NSAppleEventDescriptor *ITSendAEWithKey(FourCharCode reqKey, FourCharCode evClass, FourCharCode evID,const ProcessSerialNumber *psn)
55 {
56     return nil;
57 }
58
59 NSAppleEventDescriptor *ITSendAE(FourCharCode eClass, FourCharCode eID,const ProcessSerialNumber *psn)
60 {
61     AEDesc dest;
62     int pid;
63     
64     AppleEvent event, reply;
65     OSStatus cerr,cerr2,err;
66     NSAppleEventDescriptor *nsd, *nse, *nsr;
67     if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
68         ITDebugLog(@"Error getting PID of application.");
69         return nil;
70     }
71     cerr = AECreateDesc(typeProcessSerialNumber,psn,sizeof(ProcessSerialNumber),&dest);
72     nsd = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&dest] autorelease];
73     cerr2 = AECreateAppleEvent(eClass,eID,&dest,kAutoGenerateReturnID,kAnyTransactionID,&event);
74     nse = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&event] autorelease];
75     if (!cerr2) [nse logDesc];
76     err = AESend(&event, &reply, kAENoReply, kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
77     nsr = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&reply] autorelease];
78     [nsr logDesc];
79     return nsr;
80 }
81
82 @implementation NSAppleEventDescriptor (ITAELogging)
83 -(void) logDesc
84 {
85     Handle xx;
86     AEPrintDescToHandle([self aeDesc],&xx);
87     ITDebugLog(@"AE Descriptor: %s", *xx);
88     DisposeHandle(xx);
89 }
90 @end