Added ITSendAEWithKey, need to fix up a small part of it though.
[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 resultDesc;
23     DescType resultType;
24     Size resultSize;
25     
26     AEBuildError buildError;
27     OSStatus berr,err;
28     
29     if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
30         ITDebugLog(@"Error getting PID of application.");
31         return nil;
32     }
33     
34     berr = AEBuildAppleEvent(evClass, evID, typeProcessSerialNumber,psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, usendString);
35     send = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&sendEvent] autorelease];
36     if (!berr) [send logDesc];
37     
38     if (berr) {
39         ITDebugLog(@"Error: %d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]);
40     }
41     
42     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, /*kAEDefaultTimeout*/30, NULL, NULL);
43     
44     err = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
45     if (resultSize == 0 || err != 0) {
46         return nil;
47     }
48     
49     AEGetParamDesc(&replyEvent, keyDirectObject, resultType, &resultDesc);
50     
51     recv = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&resultDesc] autorelease];
52     if (!err) [recv logDesc];
53     
54     if (err) {
55         ITDebugLog(@"Send Error: %i",err);
56     }
57     return recv;
58 }
59
60 NSAppleEventDescriptor *ITSendAEWithStringAndObject(NSString *sendString, const AEDesc *object, FourCharCode evClass, FourCharCode evID,const ProcessSerialNumber *psn)
61 {
62     //Add error checking...
63     pid_t pid;
64     
65     const char *usendString = [sendString UTF8String];
66     
67     AppleEvent sendEvent, replyEvent;
68     NSAppleEventDescriptor *send, *recv;
69     AEDesc resultDesc;
70     DescType resultType;
71     Size resultSize;
72     
73     AEBuildError buildError;
74     OSStatus berr,err;
75     
76     if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
77         ITDebugLog(@"Error getting PID of application.");
78         return nil;
79     }
80     
81     berr = AEBuildAppleEvent(evClass, evID, typeProcessSerialNumber,psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, usendString);
82     send = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&sendEvent] autorelease];
83     if (!berr) [send logDesc];
84     
85     if (berr) {
86         ITDebugLog(@"Error: %d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]);
87     }
88     err = AEPutParamDesc(&sendEvent, keyDirectObject, object);
89     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, /*kAEDefaultTimeout*/30, NULL, NULL);
90     
91     err = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
92     if (resultSize == 0 || err != 0) {
93         return nil;
94     }
95     
96     AEGetParamDesc(&replyEvent, keyDirectObject, resultType, &resultDesc);
97     
98     recv = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&resultDesc] autorelease];
99     if (!err) [recv logDesc];
100     
101     if (err) {
102         ITDebugLog(@"Send Error: %i",err);
103     }
104     return recv;
105 }
106
107 NSAppleEventDescriptor *ITSendAEWithKey(FourCharCode reqKey, FourCharCode evClass, FourCharCode evID,const ProcessSerialNumber *psn)
108 {
109     //Add error checking...
110     pid_t pid;
111     
112         unsigned char *chr = (unsigned char *)malloc(4*sizeof(unsigned char));
113         memcpy(chr, &reqKey, 4);
114         NSString *sendString = [NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('%s'), from:'null'() }", chr];
115     const char *usendString = [sendString UTF8String];
116     
117     AppleEvent sendEvent, replyEvent;
118     NSAppleEventDescriptor *send, *recv;
119     AEDesc resultDesc;
120     DescType resultType;
121     Size resultSize;
122     
123     AEBuildError buildError;
124     OSStatus berr,err;
125     
126     if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
127         ITDebugLog(@"Error getting PID of application.");
128         return nil;
129     }
130     
131     berr = AEBuildAppleEvent(evClass, evID, typeProcessSerialNumber,psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, usendString);
132     send = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&sendEvent] autorelease];
133     if (!berr) [send logDesc];
134     
135     if (berr) {
136         ITDebugLog(@"Error: %d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]);
137     }
138     
139     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, /*kAEDefaultTimeout*/30, NULL, NULL);
140     
141     err = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
142     if (resultSize == 0 || err != 0) {
143         return nil;
144     }
145     
146     AEGetParamDesc(&replyEvent, keyDirectObject, resultType, &resultDesc);
147     
148     recv = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&resultDesc] autorelease];
149     if (!err) [recv logDesc];
150     
151     if (err) {
152         ITDebugLog(@"Send Error: %i",err);
153     }
154     return recv;
155 }
156
157 NSAppleEventDescriptor *ITSendAE(FourCharCode eClass, FourCharCode eID,const ProcessSerialNumber *psn)
158 {
159     AEDesc dest;
160     int pid;
161     
162     AppleEvent event, reply;
163     OSStatus cerr,cerr2,err;
164     NSAppleEventDescriptor *nsd, *nse, *nsr;
165     if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
166         ITDebugLog(@"Error getting PID of application.");
167         return nil;
168     }
169     cerr = AECreateDesc(typeProcessSerialNumber,psn,sizeof(ProcessSerialNumber),&dest);
170     nsd = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&dest] autorelease];
171     cerr2 = AECreateAppleEvent(eClass,eID,&dest,kAutoGenerateReturnID,kAnyTransactionID,&event);
172     nse = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&event] autorelease];
173     if (!cerr2) [nse logDesc];
174     err = AESend(&event, &reply, kAENoReply, kAENormalPriority, /*kAEDefaultTimeout*/30, NULL, NULL);
175     nsr = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&reply] autorelease];
176     [nsr logDesc];
177     return nsr;
178 }
179
180 @implementation NSAppleEventDescriptor (ITAELogging)
181 -(void) logDesc
182 {
183     Handle xx;
184     AEPrintDescToHandle([self aeDesc],&xx);
185     ITDebugLog(@"AE Descriptor: %s", *xx);
186     DisposeHandle(xx);
187 }
188 @end