Added more error checking. MT no longer crashes when you "Show iTunes", but I still...
[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 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     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 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     err = 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     AEDisposeDesc(&sendEvent);
226     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 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     err = 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     AEDisposeDesc(&sendEvent);
293     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 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     err = 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     AEDisposeDesc(&sendEvent);
354     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 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     err = 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     return _finalString;
427 }
428
429 - (void)sendAEWithEventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
430 {
431     //Add error checking...
432     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
433     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
434     AEDesc dest;
435     int pid;
436
437     AppleEvent event, reply;
438
439     //AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, kAnyTransactionID, &event, nil, "");
440     if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
441             //NSLog(@"Error getting PID of application! Exiting.");
442             return nil;
443         }
444         AECreateDesc(typeProcessSerialNumber,(ProcessSerialNumber*)&psn,sizeof(ProcessSerialNumber),&dest);
445     AECreateAppleEvent(eClass,eID,&dest,kAutoGenerateReturnID,kAnyTransactionID,&event);
446 //[self printCarbonDesc:&event];
447     AESend(&event, &reply, kAENoReply, kAENormalPriority, kAEDefaultTimeout, idleUPP, nil);
448 //[self printCarbonDesc:&reply];
449     AEDisposeDesc(&dest);
450     AEDisposeDesc(&event);
451     AEDisposeDesc(&reply);
452 }
453
454 - (void)printCarbonDesc:(AEDesc*)desc {
455     Handle xx;
456     AEPrintDescToHandle(desc,&xx);
457     NSLog(@"Handle: %s", *xx);
458     DisposeHandle(xx);
459 }
460
461
462 - (AEArrayDataPointer)sendAEWithRequestedKeyForArray:(NSString*)key eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
463 {
464     //Add error checking...
465     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
466     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
467
468     NSString *nssendString = [NSString stringWithFormat:@"'----':obj { form:'indx', want:'%s', seld:abso($616C6C20$), from:'null'() }", [key UTF8String]];
469     const char *sendString = [nssendString UTF8String];
470     AEArrayDataPointer result = nil;
471     int pid;
472
473     AppleEvent sendEvent, replyEvent;
474
475
476     AEBuildError buildError;
477     OSStatus err;
478
479     //NSLog(@"_sendString: %s", sendString);
480 if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
481             //NSLog(@"Error getting PID of application! Exiting.");
482             return nil;
483         }
484     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
485
486     //[self printCarbonDesc:&sendEvent];
487
488     if (err) {
489         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[nssendString substringToIndex:buildError.fErrorPos]);
490     }
491
492
493     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
494
495     //[self printCarbonDesc:&replyEvent];
496
497     if (err) {
498         //NSLog(@"Send Error: %i",err);
499     } else {
500            SInt32 count, resultCount;
501
502            AECountItems(&replyEvent,&count);
503            result=malloc(sizeof(AEDesc)*count);
504            AEGetArray(&replyEvent, kAEDescArray, result, sizeof(AEDesc)*count, NULL, NULL, &resultCount);
505
506         free(result);
507     }
508
509     AEDisposeDesc(&sendEvent);
510     AEDisposeDesc(&replyEvent);
511
512     return result;
513 }
514
515 - (long)sendAEWithSendStringForNumber:(NSString*)string eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
516 {
517     //Add error checking...
518     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
519     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
520
521     const char *sendString = [string UTF8String];
522     SInt32 result = 0;
523     int pid;
524
525     AppleEvent sendEvent, replyEvent;
526
527     DescType resultType;
528     Size resultSize, charResultSize;
529
530     AEBuildError buildError;
531     OSStatus err;
532     OSErr err2, err3;
533     
534         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
535             //NSLog(@"Error getting PID of application! Exiting.");
536             return nil;
537         }
538         
539     //NSLog(@"_sendString: %s", sendString);
540
541     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
542
543     //[self printCarbonDesc:&sendEvent];
544
545     if (err) {
546         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[string substringToIndex:buildError.fErrorPos]);
547     }
548
549     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
550
551     //[self printCarbonDesc:&replyEvent];
552
553     if (err) {
554         //NSLog(@"Send Error: %i",err);
555     } else {
556         err2 = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
557
558         if (err2) {
559             //NSLog(@"Error After AESizeOfParam: %i", err2);
560         } else {
561             err3 = AEGetParamPtr(&replyEvent, keyDirectObject, resultType, NULL, &result, resultSize, &charResultSize);
562
563             if (err3) {
564                 //NSLog(@"Error After AEGetParamPtr: %i", err3);
565             }
566         }
567     }
568
569
570 AEDisposeDesc(&sendEvent);
571 AEDisposeDesc(&replyEvent);
572 //NSLog(@"waffles say %d",result);
573 return result;
574 }
575
576 - (AEArrayDataPointer)sendAEWithSendStringForArray:(NSString*)string eventClass:(NSString*)eventClass eventID:(NSString*)eventID appPSN:(ProcessSerialNumber)psn
577 {
578     //Add error checking...
579     AEEventClass eClass = *((unsigned long*)[eventClass UTF8String]);
580     AEEventID    eID    = *((unsigned long*)[eventID UTF8String]);
581     int pid;
582
583     const char *sendString = [string UTF8String];
584     AEArrayDataPointer result = NULL;
585
586     AppleEvent sendEvent, replyEvent;
587
588     AEBuildError buildError;
589     OSStatus err;
590     
591         if ((GetProcessPID(&psn, &pid) == noErr) && (pid == 0)) {
592             //NSLog(@"Error getting PID of application! Exiting.");
593             return nil;
594         }
595         
596     //NSLog(@"_sendString: %s", sendString);
597
598     err = AEBuildAppleEvent(eClass, eID, typeProcessSerialNumber,(ProcessSerialNumber*)&psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, sendString);
599
600     //[self printCarbonDesc:&sendEvent];
601
602     if (err) {
603         //NSLog(@"%d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[string substringToIndex:buildError.fErrorPos]);
604     }
605
606     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kNoTimeOut, idleUPP, NULL);
607
608     //[self printCarbonDesc:&replyEvent];
609
610     if (err) {
611         //NSLog(@"Send Error: %i",err);
612     } else {
613            SInt32 count, resultCount;
614
615            AECountItems(&replyEvent,&count);
616            result=malloc(sizeof(AEDesc)*count);
617            AEGetArray(&replyEvent, kAEDescArray, result, sizeof(AEDesc)*count, NULL, NULL, &resultCount);
618
619         free(result);
620     }
621
622     AEDisposeDesc(&sendEvent);
623     AEDisposeDesc(&replyEvent);
624
625     return result;
626 }
627 @end