Added new methods to return numbers. Cleaned up code.
[ITFoundation.git] / ITAppleEventCenter.m
1 #import "ITAppleEventCenter.h"
2
3 Boolean MyAEIdleCallback (
4                                          EventRecord * theEvent,
5                                          SInt32 * sleepTime,
6                                          RgnHandle * mouseRgn
7                                          );
8
9 Boolean MyAEIdleCallback (
10                                          EventRecord * theEvent,
11                                          SInt32 * sleepTime,
12                                          RgnHandle * mouseRgn
13                                          )
14 {
15     return FALSE;
16 }
17
18 @implementation ITAppleEventCenter
19
20 static ITAppleEventCenter *_sharedAECenter = nil;
21
22 + (id)sharedCenter
23 {
24     if( _sharedAECenter ) {
25         return _sharedAECenter;
26     } else {    
27         _sharedAECenter = [[ITAppleEventCenter alloc] init];
28         return _sharedAECenter;
29     }
30 }
31
32 - (NSString*)sendAEWithRequestedKey:(NSString*)key eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
33 {
34     //Add error checking...
35     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
36     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
37     
38     const char *sendString = [[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('%s'), from:'null'() }", [key UTF8String]] UTF8String];
39     NSString  *_finalString;
40     
41     AppleEvent sendEvent, replyEvent;
42     AEIdleUPP upp = NewAEIdleUPP(&MyAEIdleCallback);
43     
44     DescType resultType;
45     Size resultSize, charResultSize;
46     int pid;
47     
48     AEBuildError buildError;
49     OSStatus err;
50     OSErr err2, err3;
51     
52     if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
53         NSLog(@"Error getting PID of application! Exiting.");
54         return nil;
55     }
56     
57     NSLog(@"_sendString: %s", sendString);
58     
59     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
60     
61     [self printCarbonDesc:&sendEvent];
62     
63     if (err) {
64         NSLog(@"%d:%d at \"%@\"",buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]);
65     }
66     
67     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, upp, NULL);
68     
69     [self printCarbonDesc:&replyEvent];
70     
71     if (err) {
72         NSLog(@"Send Error: %i",err);
73     } else {
74         unichar *result = 0;
75         
76         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
77         result = malloc(resultSize);
78         
79         if (err2) {
80             NSLog(@"Error After AESizeOfParam: %i", err2);
81         } else {
82             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, result, resultSize, &charResultSize);
83             
84             if (err3) {
85                 NSLog(@"Error After AEGetParamPtr: %i", err3);
86             } else {
87                 _finalString = [[NSString stringWithCharacters:result length:charResultSize/sizeof(unichar)] copy];
88             }
89         }
90         free(result);
91     }
92     
93     AEDisposeDesc(&sendEvent);
94     AEDisposeDesc(&replyEvent);
95     
96     return _finalString;
97 }
98
99 - (long)sendAEWithRequestedKeyForNumber:(NSString*)key eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
100 {
101     //Add error checking...
102     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
103     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
104     
105     const char *sendString = [[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('%s'), from:'null'() }", [key UTF8String]] UTF8String];
106     long result = 0;
107     
108     AppleEvent sendEvent, replyEvent;
109     AEIdleUPP upp = NewAEIdleUPP(&MyAEIdleCallback);
110     
111     DescType resultType;
112     Size resultSize, charResultSize;
113     int pid;
114     
115     AEBuildError buildError;
116     OSStatus err;
117     OSErr err2, err3;
118     
119     if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
120         NSLog(@"Error getting PID of application! Exiting.");
121         return nil;
122     }
123     
124     NSLog(@"_sendString: %s", sendString);
125     
126     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
127     
128     [self printCarbonDesc:&sendEvent];
129     
130     if (err) {
131         NSLog(@"%d:%d at \"%@\"",buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]);
132     }
133     
134     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, upp, NULL);
135     
136     [self printCarbonDesc:&replyEvent];
137     
138     if (err) {
139         NSLog(@"Send Error: %i",err);
140     } else {
141         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
142         
143         if (err2) {
144             NSLog(@"Error After AESizeOfParam: %i", err2);
145         } else {
146             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, &result, resultSize, &charResultSize);
147             
148             if (err3) {
149                 NSLog(@"Error After AEGetParamPtr: %i", err3);
150             } else {
151                 NSLog(@"%i", result);
152             }
153         }
154     }
155     
156     AEDisposeDesc(&sendEvent);
157     AEDisposeDesc(&replyEvent);
158     
159     return result;
160 }
161
162 - (NSString*)sendTwoTierAEWithRequestedKey:(NSString*)key fromObjectByKey:(NSString*)object eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
163 {
164     //Add error checking...
165     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
166     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
167     
168     const char *sendString = [[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('%s'), from:obj { form:'prop', want:type('prop'), seld:type('%s'), from:'null'() } }", [key UTF8String], [object UTF8String]] UTF8String];
169     NSString  *_finalString;
170     
171     AppleEvent sendEvent, replyEvent;
172     AEIdleUPP upp = NewAEIdleUPP(&MyAEIdleCallback);
173     
174     DescType resultType;
175     Size resultSize, charResultSize;
176     int pid;
177     
178     AEBuildError buildError;
179     OSStatus err;
180     OSErr err2, err3;
181     
182     if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
183         NSLog(@"Error getting PID of application! Exiting.");
184         return nil;
185     }
186     
187     NSLog(@"_sendString: %s", sendString);
188     
189     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
190     
191     [self printCarbonDesc:&sendEvent];
192     
193     if (err) {
194         NSLog(@"%d:%d at \"%@\"",buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]);
195     }
196     
197     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, upp, NULL);
198     
199     [self printCarbonDesc:&replyEvent];
200     
201     if (err) {
202         NSLog(@"Send Error: %i",err);
203     } else {
204         unichar *result = 0;
205         
206         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
207         result = malloc(resultSize);
208         
209         if (err2) {
210             NSLog(@"Error After AESizeOfParam: %i", err2);
211         } else {
212             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, result, resultSize, &charResultSize);
213             
214             if (err3) {
215                 NSLog(@"Error After AEGetParamPtr: %i", err3);
216             } else {
217                 _finalString = [[NSString stringWithCharacters:result length:charResultSize/sizeof(unichar)] copy];
218             }
219         }
220         free(result);
221     }
222     
223     AEDisposeDesc(&sendEvent);
224     AEDisposeDesc(&replyEvent);
225     
226     return _finalString;
227 }
228
229 - (long)sendTwoTierAEWithRequestedKeyForNumber:(NSString*)key fromObjectByKey:(NSString*)object eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
230 {
231     //Add error checking...
232     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
233     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
234     
235     const char *sendString = [[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('%s'), from:obj { form:'prop', want:type('prop'), seld:type('%s'), from:'null'() } }", [key UTF8String], [object UTF8String]] UTF8String];
236     long result = 0;
237     
238     AppleEvent sendEvent, replyEvent;
239     AEIdleUPP upp = NewAEIdleUPP(&MyAEIdleCallback);
240     
241     DescType resultType;
242     Size resultSize, charResultSize;
243     int pid;
244     
245     AEBuildError buildError;
246     OSStatus err;
247     OSErr err2, err3;
248     
249     if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
250         NSLog(@"Error getting PID of application! Exiting.");
251         return nil;
252     }
253     
254     NSLog(@"_sendString: %s", sendString);
255     
256     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
257     
258     [self printCarbonDesc:&sendEvent];
259     
260     if (err) {
261         NSLog(@"%d:%d at \"%@\"",buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]);
262     }
263     
264     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, upp, NULL);
265     
266     [self printCarbonDesc:&replyEvent];
267     
268     if (err) {
269         NSLog(@"Send Error: %i",err);
270     } else {
271         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
272         
273         if (err2) {
274             NSLog(@"Error After AESizeOfParam: %i", err2);
275         } else {
276             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, &result, resultSize, &charResultSize);
277             
278             if (err3) {
279                 NSLog(@"Error After AEGetParamPtr: %i", err3);
280             } else {
281                 NSLog(@"%i", result);
282             }
283         }
284     }
285     
286     AEDisposeDesc(&sendEvent);
287     AEDisposeDesc(&replyEvent);
288     
289     return result;
290 }
291
292 - (NSString *)sendAEWithRequestedArray:(NSArray *)array eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
293 {
294     NSString *buildString = [NSString stringWithFormat:@"{ form:'prop', want:type('prop'), seld:type('%s'), from:'null'() }", [[array objectAtIndex:0] UTF8String]];
295     const char *sendString;
296     int i;
297     NSString  *_finalString;
298     
299     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
300     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
301     
302     AppleEvent sendEvent, replyEvent;
303     AEIdleUPP upp = NewAEIdleUPP(&MyAEIdleCallback);
304     
305     DescType resultType;
306     Size resultSize, charResultSize;
307     int pid;
308     
309     AEBuildError buildError;
310     OSStatus err;
311     OSErr err2, err3;
312     
313     for (i = 1; i < [array count]; i++) {
314         NSString *from = [NSString stringWithFormat:@"{ form:'prop', want:type('prop'), seld:type('%s'), from:obj %@ }",
315                     [[array objectAtIndex:i] UTF8String], buildString];
316         buildString = from;
317     }
318     buildString = [@"'----':obj " stringByAppendingString:buildString];
319     sendString = [buildString UTF8String];
320     
321     if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
322         NSLog(@"Error getting PID of application! Exiting.");
323         return nil;
324     }
325     
326     NSLog(@"_sendString: %s", sendString);
327     
328     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
329     
330     [self printCarbonDesc:&sendEvent];
331     
332     if (err) {
333         NSLog(@"%d:%d at \"%@\"",buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]);
334     }
335     
336     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, upp, NULL);
337     
338     [self printCarbonDesc:&replyEvent];
339     
340     if (err) {
341         NSLog(@"Send Error: %i",err);
342     } else {
343         unichar *result = 0;
344         
345         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
346         result=malloc(resultSize);
347         
348         if (err2) {
349             NSLog(@"Error After AESizeOfParam: %i", err2);
350         } else {
351             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, result, resultSize, &charResultSize);
352             if (err3) {
353                 NSLog(@"Error After AEGetParamPtr: %i", err3);
354             } else {
355                 _finalString = [[NSString stringWithCharacters:result length:charResultSize/sizeof(unichar)] copy];
356             }
357         }
358         free(result);
359     }
360     return _finalString;
361 }
362
363 - (void)sendAEWithEventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
364 {
365     //Add error checking...
366     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
367     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
368     AppleEvent event, reply;
369
370     AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, kAnyTransactionID, &event, nil, "");
371
372     AESend(&event, &reply, kAENoReply, kAENormalPriority, kAEDefaultTimeout, nil, nil);
373     
374     AEDisposeDesc(&event);
375     AEDisposeDesc(&reply);
376 }
377
378 - (void)printCarbonDesc:(AEDesc*)desc {
379     Handle xx;
380     AEPrintDescToHandle(desc,&xx);
381     NSLog(@"Handle: %s", *xx);
382     DisposeHandle(xx);
383 }
384
385 @end