8ad8af55fc2768ee9809576b57442915d2bf8502
[ITFoundation.git] / ITAppleEventCenter.m
1 #import "ITAppleEventCenter.h"
2 //oh, wait, i forgot i had this open.
3 static Boolean MyAEIdleCallback (
4                                          EventRecord * theEvent,
5                                          SInt32 * sleepTime,
6                                          RgnHandle * mouseRgn
7                                          )
8 {
9     return FALSE;
10 }
11
12 @implementation ITAppleEventCenter
13
14 static ITAppleEventCenter *_sharedAECenter = nil;
15
16 + (id)sharedCenter
17 {
18     if( _sharedAECenter ) {
19         return _sharedAECenter;
20     } else {
21         return _sharedAECenter = [[ITAppleEventCenter alloc] init];
22     }
23 }
24
25 - (id)init
26 {
27     if ( ( self = [super init] ) ) {
28         idleUPP = NewAEIdleUPP(MyAEIdleCallback);
29     }
30     return self;
31 }
32
33 - (void)dealloc
34 {
35     DisposeAEIdleUPP(idleUPP);
36 }
37
38 - (NSString*)sendAEWithRequestedKey:(NSString*)key eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
39 {
40     //Add error checking...
41     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
42     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
43     int pid;
44     NSString *nssendString = [NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('%s'), from:'null'() }", [key UTF8String]];
45     const char *sendString = [nssendString UTF8String];
46     NSString  *_finalString = nil;
47
48     AppleEvent sendEvent, replyEvent;
49
50     DescType resultType;
51     Size resultSize, charResultSize;
52
53     AEBuildError buildError;
54     OSStatus err;
55     OSErr berr, err2, err3;
56     
57         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
58             //NSLog(@"Error getting PID of application! Exiting.");
59             return nil;
60         }
61         
62     //NSLog(@"_sendString: %s", sendString);
63
64     berr = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
65 //joe add the ITFDEBUG stuff back?
66     //[self printCarbonDesc:&sendEvent];
67
68     if (err) {
69         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[nssendString substringToIndex:buildError.fErrorPos]);
70     }
71
72     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
73
74     //[self printCarbonDesc:&replyEvent];
75
76     if (err) {
77         //NSLog(@"Send Error: %i",err);
78     } else {
79         unichar *result = 0;
80
81         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
82         result = malloc(resultSize);
83
84         if (err2) {
85             //NSLog(@"Error After AESizeOfParam: %i", err2);
86         } else {
87             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, result, resultSize, &charResultSize);
88
89             if (err3) {
90                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
91             } else {
92                 _finalString = [NSString stringWithCharacters:result length:charResultSize/sizeof(unichar)];
93             }
94         }
95         free(result);
96     }
97
98     if (!berr) AEDisposeDesc(&sendEvent);
99     if (!err) AEDisposeDesc(&replyEvent);
100
101     return _finalString;
102 }
103
104 - (NSString*)sendAEWithSendString:(NSString*)nssendString eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
105 {
106     //Add error checking...
107     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
108     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
109     int pid;
110
111     const char *sendString = [nssendString UTF8String];
112     NSString  *_finalString = nil;
113
114     AppleEvent sendEvent, replyEvent;
115
116     DescType resultType;
117     Size resultSize, charResultSize;
118
119     AEBuildError buildError;
120     OSStatus berr,err;
121     OSErr err2, err3;
122     
123         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
124             //NSLog(@"Error getting PID of application! Exiting.");
125             return nil;
126         }
127         
128     //NSLog(@"_sendString: %s", sendString);
129
130     berr = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
131         NSLog(@"sending...");
132     if (!berr) [self printCarbonDesc:&sendEvent];
133
134     if (berr) {
135         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[nssendString substringToIndex:buildError.fErrorPos]);
136     }
137
138     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
139     NSLog(@"replying...");
140     if (!err) [self printCarbonDesc:&replyEvent];
141
142     if (err) {
143         //NSLog(@"Send Error: %i",err);
144     } else {
145         unichar *result = 0;
146
147         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
148         result = malloc(resultSize);
149
150         if (err2) {
151             //NSLog(@"Error After AESizeOfParam: %i", err2);
152         } else {
153             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, result, resultSize, &charResultSize);
154
155             if (err3) {
156                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
157             } else {
158                 _finalString = [NSString stringWithCharacters:result length:charResultSize/sizeof(unichar)];
159             }
160         }
161         free(result);
162     }
163
164     if (!berr) AEDisposeDesc(&sendEvent);
165     if (!err) AEDisposeDesc(&replyEvent);
166
167     return _finalString;
168 }
169
170 - (long)sendAEWithRequestedKeyForNumber:(NSString*)key eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
171 {
172     //Add error checking...
173     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
174     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
175     int pid;
176
177     NSString *nssendString = [NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('%s'), from:'null'() }", [key UTF8String]];
178     const char *sendString = [nssendString UTF8String];
179     long result = 0;
180
181     AppleEvent sendEvent, replyEvent;
182
183     DescType resultType;
184     Size resultSize, charResultSize;
185
186     AEBuildError buildError;
187     OSStatus err;
188     OSErr berr, err2, err3;
189     
190         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
191             //NSLog(@"Error getting PID of application! Exiting.");
192             return nil;
193         }
194         
195     //NSLog(@"_sendString: %s", sendString);
196
197     berr = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
198
199     //[self printCarbonDesc:&sendEvent];
200
201     if (err) {
202         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[nssendString substringToIndex:buildError.fErrorPos]);
203     }
204
205     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
206
207     //[self printCarbonDesc:&replyEvent];
208
209     if (err) {
210         //NSLog(@"Send Error: %i",err);
211     } else {
212         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
213
214         if (err2) {
215             //NSLog(@"Error After AESizeOfParam: %i", err2);
216         } else {
217             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, &result, resultSize, &charResultSize);
218
219             if (err3) {
220                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
221             }
222         }
223     }
224
225     if (!berr) AEDisposeDesc(&sendEvent);
226     if (!err) AEDisposeDesc(&replyEvent);
227
228     return result;
229 }
230
231 - (NSString*)sendTwoTierAEWithRequestedKey:(NSString*)key fromObjectByKey:(NSString*)object eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
232 {
233     //Add error checking...
234     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
235     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
236     int pid;
237
238     NSString *nssendString = [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]];
239     const char *sendString = [nssendString UTF8String];
240     NSString  *_finalString = nil;
241
242     AppleEvent sendEvent, replyEvent;
243
244     DescType resultType;
245     Size resultSize, charResultSize;
246
247     AEBuildError buildError;
248     OSStatus berr,err;
249     OSErr err2, err3;
250     
251         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
252             //NSLog(@"Error getting PID of application! Exiting.");
253             return nil;
254         }
255
256     //NSLog(@"_sendString: %s", sendString);
257
258     berr = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
259
260     //[self printCarbonDesc:&sendEvent];
261
262     if (err) {
263         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[nssendString substringToIndex:buildError.fErrorPos]);
264     }
265
266     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
267
268     //[self printCarbonDesc:&replyEvent];
269
270     if (err) {
271         //NSLog(@"Send Error: %i",err);
272     } else {
273         unichar *result = 0;
274
275         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
276         result = malloc(resultSize);
277
278         if (err2) {
279             //NSLog(@"Error After AESizeOfParam: %i", err2);
280         } else {
281             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, result, resultSize, &charResultSize);
282
283             if (err3) {
284                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
285             } else {
286                 _finalString = [NSString stringWithCharacters:result length:charResultSize/sizeof(unichar)];
287             }
288         }
289         free(result);
290     }
291
292     if (!berr) AEDisposeDesc(&sendEvent);
293     if (!err) AEDisposeDesc(&replyEvent);
294
295     return _finalString;
296 }
297
298 - (long)sendTwoTierAEWithRequestedKeyForNumber:(NSString*)key fromObjectByKey:(NSString*)object eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
299 {
300     //Add error checking...
301     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
302     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
303
304     NSString *nssendString = [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]];
305     const char *sendString = [nssendString UTF8String];
306     long result = 0;
307
308     AppleEvent sendEvent, replyEvent;
309     int pid;
310
311     DescType resultType;
312     Size resultSize, charResultSize;
313
314     AEBuildError buildError;
315     OSStatus berr, err;
316     OSErr err2, err3;
317     
318         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
319             //NSLog(@"Error getting PID of application! Exiting.");
320             return nil;
321         }
322         
323     // //NSLog(@"_sendString: %s", sendString);
324
325     berr = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
326
327     //[self printCarbonDesc:&sendEvent];
328
329     if (err) {
330         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[nssendString substringToIndex:buildError.fErrorPos]);
331     }
332
333     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
334
335     //[self printCarbonDesc:&replyEvent];
336
337     if (err) {
338         //NSLog(@"Send Error: %i",err);
339     } else {
340         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
341
342         if (err2) {
343             //NSLog(@"Error After AESizeOfParam: %i", err2);
344         } else {
345             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, &result, resultSize, &charResultSize);
346
347             if (err3) {
348                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
349             }
350         }
351     }
352
353     if (!berr) AEDisposeDesc(&sendEvent);
354     if (!err) AEDisposeDesc(&replyEvent);
355
356     return result;
357 }
358
359 - (NSString *)sendAEWithRequestedArray:(NSArray *)array eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
360 {
361     NSString *buildString = [NSString stringWithFormat:@"{ form:'prop', want:type('prop'), seld:type('%s'), from:'null'() }", [[array objectAtIndex:0] UTF8String]];
362     const char *sendString;
363     int i;
364     NSString  *_finalString = nil;
365     int pid;
366
367     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
368     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
369
370     AppleEvent sendEvent, replyEvent;
371
372     DescType resultType;
373     Size resultSize, charResultSize;
374
375     AEBuildError buildError;
376     OSStatus berr, err;
377     OSErr err2, err3;
378
379     for (i = 1; i < [array count]; i++) {
380         NSString *from = [NSString stringWithFormat:@"{ form:'prop', want:type('prop'), seld:type('%s'), from:obj %@ }",
381                   [[array objectAtIndex:i] UTF8String], buildString];
382         buildString = from;
383     }
384     buildString = [@"'----':obj " stringByAppendingString:buildString];
385     sendString = [buildString UTF8String];
386     
387         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
388             //NSLog(@"Error getting PID of application! Exiting.");
389             return nil;
390         }
391         
392     //NSLog(@"_sendString: %s", sendString);
393
394     berr = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
395
396     //[self printCarbonDesc:&sendEvent];
397
398     if (err) {
399         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[buildString substringToIndex:buildError.fErrorPos]);
400     }
401
402     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
403
404     //[self printCarbonDesc:&replyEvent];
405
406     if (err) {
407         //NSLog(@"Send Error: %i",err);
408     } else {
409         unichar *result = 0;
410
411         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
412         result=malloc(resultSize);
413
414         if (err2) {
415             //NSLog(@"Error After AESizeOfParam: %i", err2);
416         } else {
417             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, result, resultSize, &charResultSize);
418             if (err3) {
419                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
420             } else {
421                 _finalString = [NSString stringWithCharacters:result length:charResultSize/sizeof(unichar)];
422             }
423         }
424         free(result);
425     }
426     if (!berr) AEDisposeDesc(&sendEvent);
427     if (!err) AEDisposeDesc(&replyEvent);
428     return _finalString;
429 }
430
431 - (void)sendAEWithEventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
432 {
433     //Add error checking...
434     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
435     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
436     AEDesc dest;
437     int pid;
438
439     AppleEvent event, reply;
440     OSStatus cerr,cerr2,err;
441     //AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, kAnyTransactionID, &event, nil, "");
442     if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
443         //NSLog(@"Error getting PID of application! Exiting.");
444         return;
445     }
446     cerr = AECreateDesc(typeProcessSerialNumber,(ProcessSerialNumber*)&psn,sizeof(ProcessSerialNumber),&dest);
447     cerr2 = AECreateAppleEvent(eClass,eID,&dest,kAutoGenerateReturnID,kAnyTransactionID,&event);
448 //[self printCarbonDesc:&event];
449     err = AESend(&event, &reply, kAENoReply, kAENormalPriority, kAEDefaultTimeout, idleUPP, nil);
450 //[self printCarbonDesc:&reply];
451     if (!cerr2) AEDisposeDesc(&dest);
452     if (!cerr) AEDisposeDesc(&event);
453     if (!err) AEDisposeDesc(&reply);
454 }
455
456 - (void)printCarbonDesc:(AEDesc*)desc {
457     Handle xx;
458     AEPrintDescToHandle(desc,&xx);
459     NSLog(@"Handle: %s", *xx);
460     DisposeHandle(xx);
461 }
462
463
464 - (AEArrayDataPointer)sendAEWithRequestedKeyForArray:(NSString*)key eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
465 {
466     //Add error checking...
467     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
468     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
469
470     NSString *nssendString = [NSString stringWithFormat:@"'----':obj { form:'indx', want:'%s', seld:abso($616C6C20$), from:'null'() }", [key UTF8String]];
471     const char *sendString = [nssendString UTF8String];
472     AEArrayDataPointer result = nil;
473     int pid;
474
475     AppleEvent sendEvent, replyEvent;
476
477
478     AEBuildError buildError;
479     OSStatus err;
480
481     //NSLog(@"_sendString: %s", sendString);
482 if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
483             //NSLog(@"Error getting PID of application! Exiting.");
484             return nil;
485         }
486     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
487
488     //[self printCarbonDesc:&sendEvent];
489
490     if (err) {
491         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[nssendString substringToIndex:buildError.fErrorPos]);
492     }
493
494
495     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
496
497     //[self printCarbonDesc:&replyEvent];
498
499     if (err) {
500         //NSLog(@"Send Error: %i",err);
501     } else {
502            SInt32 count, resultCount;
503
504            AECountItems(&replyEvent,&count);
505            result=malloc(sizeof(AEDesc)*count);
506            AEGetArray(&replyEvent, kAEDescArray, result, sizeof(AEDesc)*count, NULL, NULL, &resultCount);
507
508         free(result);
509     }
510
511     AEDisposeDesc(&sendEvent);
512     AEDisposeDesc(&replyEvent);
513
514     return result;
515 }
516
517 - (long)sendAEWithSendStringForNumber:(NSString*)string eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
518 {
519     //Add error checking...
520     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
521     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
522
523     const char *sendString = [string UTF8String];
524     SInt32 result = 0;
525     int pid;
526
527     AppleEvent sendEvent, replyEvent;
528
529     DescType resultType;
530     Size resultSize, charResultSize;
531
532     AEBuildError buildError;
533     OSStatus berr, err;
534     OSErr err2, err3;
535     
536         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
537             //NSLog(@"Error getting PID of application! Exiting.");
538             return nil;
539         }
540         
541     //NSLog(@"_sendString: %s", sendString);
542
543     berr = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
544
545     //[self printCarbonDesc:&sendEvent];
546
547     if (err) {
548         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[string substringToIndex:buildError.fErrorPos]);
549     }
550
551     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
552
553     //[self printCarbonDesc:&replyEvent];
554
555     if (err) {
556         //NSLog(@"Send Error: %i",err);
557     } else {
558         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
559
560         if (err2) {
561             //NSLog(@"Error After AESizeOfParam: %i", err2);
562         } else {
563             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, &result, resultSize, &charResultSize);
564
565             if (err3) {
566                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
567             }
568         }
569     }
570
571
572 if (!berr) AEDisposeDesc(&sendEvent);
573 if (!err) AEDisposeDesc(&replyEvent);
574 //NSLog(@"waffles say %d",result);
575 return result;
576 }
577
578 - (AEArrayDataPointer)sendAEWithSendStringForArray:(NSString*)string eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
579 {
580     //Add error checking...
581     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
582     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
583     int pid;
584
585     const char *sendString = [string UTF8String];
586     AEArrayDataPointer result = NULL;
587
588     AppleEvent sendEvent, replyEvent;
589
590     AEBuildError buildError;
591     OSStatus berr, err;
592     
593         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
594             //NSLog(@"Error getting PID of application! Exiting.");
595             return nil;
596         }
597         
598     //NSLog(@"_sendString: %s", sendString);
599
600     berr = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
601
602     //[self printCarbonDesc:&sendEvent];
603
604     if (err) {
605         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[string substringToIndex:buildError.fErrorPos]);
606     }
607
608     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
609
610     //[self printCarbonDesc:&replyEvent];
611
612     if (err) {
613         //NSLog(@"Send Error: %i",err);
614     } else {
615            SInt32 count, resultCount;
616
617            AECountItems(&replyEvent,&count);
618            result=malloc(sizeof(AEDesc)*count);
619            AEGetArray(&replyEvent, kAEDescArray, result, sizeof(AEDesc)*count, NULL, NULL, &resultCount);
620
621         free(result);
622     }
623
624     if (!berr) AEDisposeDesc(&sendEvent);
625     if (!err) AEDisposeDesc(&replyEvent);
626
627     return result;
628 }
629 @end