Upped the default timeout to 45 ticks.
[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*/45, 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*/45, 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         NSString *sendString = [NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('%c%c%c%c'), from:'null'() }", (reqKey >> 24), (reqKey >> 16) & 0xff, (reqKey >> 8) & 0xff, reqKey & 0xff];
112     const char *usendString = [sendString UTF8String];
113     
114     AppleEvent sendEvent, replyEvent;
115     NSAppleEventDescriptor *send, *recv;
116     AEDesc resultDesc;
117     DescType resultType;
118     Size resultSize;
119     
120     AEBuildError buildError;
121     OSStatus berr,err;
122     
123     if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
124         ITDebugLog(@"Error getting PID of application.");
125         return nil;
126     }
127     
128     berr = AEBuildAppleEvent(evClass, evID, typeProcessSerialNumber,psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, usendString);
129     send = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&sendEvent] autorelease];
130     if (!berr) [send logDesc];
131     
132     if (berr) {
133         ITDebugLog(@"Error: %d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]);
134     }
135     
136     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, /*kAEDefaultTimeout*/45, NULL, NULL);
137     
138     err = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
139     if (resultSize == 0 || err != 0) {
140         return nil;
141     }
142     
143     AEGetParamDesc(&replyEvent, keyDirectObject, resultType, &resultDesc);
144     
145     recv = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&resultDesc] autorelease];
146     if (!err) [recv logDesc];
147     
148     if (err) {
149         ITDebugLog(@"Send Error: %i",err);
150     }
151     return recv;
152 }
153
154 NSAppleEventDescriptor *ITSendAE(FourCharCode eClass, FourCharCode eID,const ProcessSerialNumber *psn)
155 {
156     AEDesc dest;
157     int pid;
158     
159     AppleEvent event, reply;
160     OSStatus cerr,cerr2,err;
161     NSAppleEventDescriptor *nsd, *nse, *nsr;
162     if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
163         ITDebugLog(@"Error getting PID of application.");
164         return nil;
165     }
166     cerr = AECreateDesc(typeProcessSerialNumber,psn,sizeof(ProcessSerialNumber),&dest);
167     nsd = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&dest] autorelease];
168     cerr2 = AECreateAppleEvent(eClass,eID,&dest,kAutoGenerateReturnID,kAnyTransactionID,&event);
169     nse = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&event] autorelease];
170     if (!cerr2) [nse logDesc];
171     err = AESend(&event, &reply, kAENoReply, kAENormalPriority, /*kAEDefaultTimeout*/45, NULL, NULL);
172     nsr = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&reply] autorelease];
173     [nsr logDesc];
174     return nsr;
175 }
176
177 @implementation NSAppleEventDescriptor (ITAELogging)
178 -(void) logDesc
179 {
180     Handle xx;
181     AEPrintDescToHandle([self aeDesc],&xx);
182     ITDebugLog(@"AE Descriptor: %s", *xx);
183     DisposeHandle(xx);
184 }
185 @end