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