Alex did something while Hydraing, and wants me to commit. I don't know
[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
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 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     err = 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     AEDisposeDesc(&sendEvent);
99     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
110     const char *sendString = [nssendString UTF8String];
111     NSString  *_finalString = nil;
112
113     AppleEvent sendEvent, replyEvent;
114
115     DescType resultType;
116     Size resultSize, charResultSize;
117
118     AEBuildError buildError;
119     OSStatus err;
120     OSErr err2, err3;
121     
122         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
123             //NSLog(@"Error getting PID of application! Exiting.");
124             return nil;
125         }
126         
127     //NSLog(@"_sendString: %s", sendString);
128
129     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
130
131     //[self printCarbonDesc:&sendEvent];
132
133     if (err) {
134         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[nssendString substringToIndex:buildError.fErrorPos]);
135     }
136
137     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
138
139     //[self printCarbonDesc:&replyEvent];
140
141     if (err) {
142         //NSLog(@"Send Error: %i",err);
143     } else {
144         unichar *result = 0;
145
146         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
147         result = malloc(resultSize);
148
149         if (err2) {
150             //NSLog(@"Error After AESizeOfParam: %i", err2);
151         } else {
152             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, result, resultSize, &charResultSize);
153
154             if (err3) {
155                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
156             } else {
157                 _finalString = [NSString stringWithCharacters:result length:charResultSize/sizeof(unichar)];
158             }
159         }
160         free(result);
161     }
162
163     AEDisposeDesc(&sendEvent);
164     AEDisposeDesc(&replyEvent);
165
166     return _finalString;
167 }
168
169 - (long)sendAEWithRequestedKeyForNumber:(NSString*)key eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
170 {
171     //Add error checking...
172     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
173     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
174
175     NSString *nssendString = [NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('%s'), from:'null'() }", [key UTF8String]];
176     const char *sendString = [nssendString UTF8String];
177     long result = 0;
178
179     AppleEvent sendEvent, replyEvent;
180
181     DescType resultType;
182     Size resultSize, charResultSize;
183
184     AEBuildError buildError;
185     OSStatus err;
186     OSErr err2, err3;
187     
188         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
189             //NSLog(@"Error getting PID of application! Exiting.");
190             return nil;
191         }
192         
193     //NSLog(@"_sendString: %s", sendString);
194
195     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
196
197     //[self printCarbonDesc:&sendEvent];
198
199     if (err) {
200         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[nssendString substringToIndex:buildError.fErrorPos]);
201     }
202
203     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
204
205     //[self printCarbonDesc:&replyEvent];
206
207     if (err) {
208         //NSLog(@"Send Error: %i",err);
209     } else {
210         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
211
212         if (err2) {
213             //NSLog(@"Error After AESizeOfParam: %i", err2);
214         } else {
215             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, &result, resultSize, &charResultSize);
216
217             if (err3) {
218                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
219             }
220         }
221     }
222
223     AEDisposeDesc(&sendEvent);
224     AEDisposeDesc(&replyEvent);
225
226     return result;
227 }
228
229 - (NSString*)sendTwoTierAEWithRequestedKey:(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     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]];
236     const char *sendString = [nssendString UTF8String];
237     NSString  *_finalString = nil;
238
239     AppleEvent sendEvent, replyEvent;
240
241     DescType resultType;
242     Size resultSize, charResultSize;
243
244     AEBuildError buildError;
245     OSStatus err;
246     OSErr err2, err3;
247     
248         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
249             //NSLog(@"Error getting PID of application! Exiting.");
250             return nil;
251         }
252
253     //NSLog(@"_sendString: %s", sendString);
254
255     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
256
257     //[self printCarbonDesc:&sendEvent];
258
259     if (err) {
260         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[nssendString substringToIndex:buildError.fErrorPos]);
261     }
262
263     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
264
265     //[self printCarbonDesc:&replyEvent];
266
267     if (err) {
268         //NSLog(@"Send Error: %i",err);
269     } else {
270         unichar *result = 0;
271
272         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
273         result = malloc(resultSize);
274
275         if (err2) {
276             //NSLog(@"Error After AESizeOfParam: %i", err2);
277         } else {
278             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, result, resultSize, &charResultSize);
279
280             if (err3) {
281                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
282             } else {
283                 _finalString = [NSString stringWithCharacters:result length:charResultSize/sizeof(unichar)];
284             }
285         }
286         free(result);
287     }
288
289     AEDisposeDesc(&sendEvent);
290     AEDisposeDesc(&replyEvent);
291
292     return _finalString;
293 }
294
295 - (long)sendTwoTierAEWithRequestedKeyForNumber:(NSString*)key fromObjectByKey:(NSString*)object eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
296 {
297     //Add error checking...
298     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
299     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
300
301     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]];
302     const char *sendString = [nssendString UTF8String];
303     long result = 0;
304
305     AppleEvent sendEvent, replyEvent;
306
307     DescType resultType;
308     Size resultSize, charResultSize;
309
310     AEBuildError buildError;
311     OSStatus err;
312     OSErr err2, err3;
313     
314         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
315             //NSLog(@"Error getting PID of application! Exiting.");
316             return nil;
317         }
318         
319     // //NSLog(@"_sendString: %s", sendString);
320
321     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
322
323     //[self printCarbonDesc:&sendEvent];
324
325     if (err) {
326         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[nssendString substringToIndex:buildError.fErrorPos]);
327     }
328
329     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
330
331     //[self printCarbonDesc:&replyEvent];
332
333     if (err) {
334         //NSLog(@"Send Error: %i",err);
335     } else {
336         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
337
338         if (err2) {
339             //NSLog(@"Error After AESizeOfParam: %i", err2);
340         } else {
341             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, &result, resultSize, &charResultSize);
342
343             if (err3) {
344                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
345             }
346         }
347     }
348
349     AEDisposeDesc(&sendEvent);
350     AEDisposeDesc(&replyEvent);
351
352     return result;
353 }
354
355 - (NSString *)sendAEWithRequestedArray:(NSArray *)array eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
356 {
357     NSString *buildString = [NSString stringWithFormat:@"{ form:'prop', want:type('prop'), seld:type('%s'), from:'null'() }", [[array objectAtIndex:0] UTF8String]];
358     const char *sendString;
359     int i;
360     NSString  *_finalString = nil;
361
362     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
363     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
364
365     AppleEvent sendEvent, replyEvent;
366
367     DescType resultType;
368     Size resultSize, charResultSize;
369
370     AEBuildError buildError;
371     OSStatus err;
372     OSErr err2, err3;
373
374     for (i = 1; i < [array count]; i++) {
375         NSString *from = [NSString stringWithFormat:@"{ form:'prop', want:type('prop'), seld:type('%s'), from:obj %@ }",
376                   [[array objectAtIndex:i] UTF8String], buildString];
377         buildString = from;
378     }
379     buildString = [@"'----':obj " stringByAppendingString:buildString];
380     sendString = [buildString UTF8String];
381     
382         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
383             //NSLog(@"Error getting PID of application! Exiting.");
384             return nil;
385         }
386         
387     //NSLog(@"_sendString: %s", sendString);
388
389     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
390
391     //[self printCarbonDesc:&sendEvent];
392
393     if (err) {
394         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[buildString substringToIndex:buildError.fErrorPos]);
395     }
396
397     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
398
399     //[self printCarbonDesc:&replyEvent];
400
401     if (err) {
402         //NSLog(@"Send Error: %i",err);
403     } else {
404         unichar *result = 0;
405
406         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
407         result=malloc(resultSize);
408
409         if (err2) {
410             //NSLog(@"Error After AESizeOfParam: %i", err2);
411         } else {
412             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, result, resultSize, &charResultSize);
413             if (err3) {
414                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
415             } else {
416                 _finalString = [NSString stringWithCharacters:result length:charResultSize/sizeof(unichar)];
417             }
418         }
419         free(result);
420     }
421     return _finalString;
422 }
423
424 - (void)sendAEWithEventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
425 {
426     //Add error checking...
427     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
428     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
429     AEDesc dest;
430     AppleEvent event, reply;
431
432     //AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, kAnyTransactionID, &event, nil, "");
433     if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
434             //NSLog(@"Error getting PID of application! Exiting.");
435             return nil;
436         }
437         AECreateDesc(typeProcessSerialNumber,(ProcessSerialNumber*)&psn,sizeof(ProcessSerialNumber),&dest);
438     AECreateAppleEvent(eClass,eID,&dest,kAutoGenerateReturnID,kAnyTransactionID,&event);
439 //[self printCarbonDesc:&event];
440     AESend(&event, &reply, kAENoReply, kAENormalPriority, kAEDefaultTimeout, idleUPP, nil);
441 //[self printCarbonDesc:&reply];
442     AEDisposeDesc(&dest);
443     AEDisposeDesc(&event);
444     AEDisposeDesc(&reply);
445 }
446
447 - (void)printCarbonDesc:(AEDesc*)desc {
448     Handle xx;
449     AEPrintDescToHandle(desc,&xx);
450     NSLog(@"Handle: %s", *xx);
451     DisposeHandle(xx);
452 }
453
454
455 - (AEArrayDataPointer)sendAEWithRequestedKeyForArray:(NSString*)key eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
456 {
457     //Add error checking...
458     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
459     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
460
461     NSString *nssendString = [NSString stringWithFormat:@"'----':obj { form:'indx', want:'%s', seld:abso($616C6C20$), from:'null'() }", [key UTF8String]];
462     const char *sendString = [nssendString UTF8String];
463     AEArrayDataPointer result = nil;
464
465     AppleEvent sendEvent, replyEvent;
466
467
468     AEBuildError buildError;
469     OSStatus err;
470
471     //NSLog(@"_sendString: %s", sendString);
472 if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
473             //NSLog(@"Error getting PID of application! Exiting.");
474             return nil;
475         }
476     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
477
478     //[self printCarbonDesc:&sendEvent];
479
480     if (err) {
481         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[nssendString substringToIndex:buildError.fErrorPos]);
482     }
483
484
485     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
486
487     //[self printCarbonDesc:&replyEvent];
488
489     if (err) {
490         //NSLog(@"Send Error: %i",err);
491     } else {
492            SInt32 count, resultCount;
493
494            AECountItems(&replyEvent,&count);
495            result=malloc(sizeof(AEDesc)*count);
496            AEGetArray(&replyEvent, kAEDescArray, result, sizeof(AEDesc)*count, NULL, NULL, &resultCount);
497
498         free(result);
499     }
500
501     AEDisposeDesc(&sendEvent);
502     AEDisposeDesc(&replyEvent);
503
504     return result;
505 }
506
507 - (long)sendAEWithSendStringForNumber:(NSString*)string eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
508 {
509     //Add error checking...
510     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
511     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
512
513     const char *sendString = [string UTF8String];
514     SInt32 result = 0;
515
516     AppleEvent sendEvent, replyEvent;
517
518     DescType resultType;
519     Size resultSize, charResultSize;
520
521     AEBuildError buildError;
522     OSStatus err;
523     OSErr err2, err3;
524     
525         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
526             //NSLog(@"Error getting PID of application! Exiting.");
527             return nil;
528         }
529         
530     //NSLog(@"_sendString: %s", sendString);
531
532     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
533
534     //[self printCarbonDesc:&sendEvent];
535
536     if (err) {
537         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[string substringToIndex:buildError.fErrorPos]);
538     }
539
540     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
541
542     //[self printCarbonDesc:&replyEvent];
543
544     if (err) {
545         //NSLog(@"Send Error: %i",err);
546     } else {
547         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
548
549         if (err2) {
550             //NSLog(@"Error After AESizeOfParam: %i", err2);
551         } else {
552             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, &result, resultSize, &charResultSize);
553
554             if (err3) {
555                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
556             }
557         }
558     }
559
560
561 AEDisposeDesc(&sendEvent);
562 AEDisposeDesc(&replyEvent);
563 //NSLog(@"waffles say %d",result);
564 return result;
565 }
566
567 - (AEArrayDataPointer)sendAEWithSendStringForArray:(NSString*)string eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
568 {
569     //Add error checking...
570     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
571     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
572
573     const char *sendString = [string UTF8String];
574     AEArrayDataPointer result = NULL;
575
576     AppleEvent sendEvent, replyEvent;
577
578     AEBuildError buildError;
579     OSStatus err;
580     
581         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
582             //NSLog(@"Error getting PID of application! Exiting.");
583             return nil;
584         }
585         
586     //NSLog(@"_sendString: %s", sendString);
587
588     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
589
590     //[self printCarbonDesc:&sendEvent];
591
592     if (err) {
593         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[string substringToIndex:buildError.fErrorPos]);
594     }
595
596     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
597
598     //[self printCarbonDesc:&replyEvent];
599
600     if (err) {
601         //NSLog(@"Send Error: %i",err);
602     } else {
603            SInt32 count, resultCount;
604
605            AECountItems(&replyEvent,&count);
606            result=malloc(sizeof(AEDesc)*count);
607            AEGetArray(&replyEvent, kAEDescArray, result, sizeof(AEDesc)*count, NULL, NULL, &resultCount);
608
609         free(result);
610     }
611
612     AEDisposeDesc(&sendEvent);
613     AEDisposeDesc(&replyEvent);
614
615     return result;
616 }
617 @end