Fixing project references due to the previous upgrade from .xcode to .xcodeproj.
[ITMac.git] / ITAppleEventTools.m
1 #import "ITAppleEventTools.h"
2 #import <ITFoundation/ITCarbonSupport.h>
3
4 NSString *_ITAEDescCarbonDescription(AEDesc desc) {
5         Handle descHandle;
6         NSString *carbonDescription;
7         AEPrintDescToHandle(&desc,&descHandle);
8         carbonDescription = [NSString stringWithUTF8String:*descHandle];
9         DisposeHandle(descHandle);
10         return carbonDescription;
11 }
12
13 NSAppleEventDescriptor *ITSendAE(FourCharCode eClass, FourCharCode eID, const ProcessSerialNumber *psn) {
14         AEDesc dest;
15         int pid;
16         AppleEvent event, reply;
17         OSStatus cerr, err;
18         NSAppleEventDescriptor *cocoaReply;
19         
20         if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
21                 ITDebugLog(@"ITSendAE(%@, %@, {%i, %i}): Error getting PID of application.", NSStringFromFourCharCode(eClass), NSStringFromFourCharCode(eID), psn->highLongOfPSN, psn->lowLongOfPSN);
22                 return nil;
23         }
24         
25         AECreateDesc(typeProcessSerialNumber, psn,sizeof(ProcessSerialNumber),&dest);
26         cerr = AECreateAppleEvent(eClass,eID,&dest,kAutoGenerateReturnID,kAnyTransactionID,&event);
27         
28         if (cerr) {
29                 return nil;
30         }
31         
32         err = AESend(&event, &reply, kAENoReply, kAENormalPriority, /*kAEDefaultTimeout*/60, NULL, NULL);
33         AEDisposeDesc(&dest);
34         AEDisposeDesc(&event);
35         
36         if (err) {
37                 AEDisposeDesc(&reply);
38                 return nil;
39         }
40         return [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&reply] autorelease];
41 }
42
43 NSAppleEventDescriptor *ITSendAEWithKey(FourCharCode reqKey, FourCharCode evClass, FourCharCode evID, const ProcessSerialNumber *psn) {
44         return ITSendAEWithString([NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('%@'), from:'null'() }", NSStringFromFourCharCode(reqKey)], evClass, evID, psn);
45 }
46
47 NSAppleEventDescriptor *ITSendAEWithString(NSString *sendString, FourCharCode evClass, FourCharCode evID, const ProcessSerialNumber *psn) {
48         pid_t pid;
49         AppleEvent sendEvent, replyEvent;
50         AEDesc resultDesc;
51         DescType resultType;
52         Size resultSize;
53         
54         AEBuildError buildError;
55         OSStatus berr,err;
56         
57         if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
58                 ITDebugLog(@"ITSendAEWithString(%@, %@, %@, {%i, %i}): Error getting PID of application.", sendString, NSStringFromFourCharCode(evClass), NSStringFromFourCharCode(evID), psn->highLongOfPSN, psn->lowLongOfPSN);
59                 return nil;
60         }
61         
62         berr = AEBuildAppleEvent(evClass, evID, typeProcessSerialNumber,psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, [sendString UTF8String]);
63         
64         if (berr) {
65                 ITDebugLog(@"ITSendAEWithString(%@, %@, %@, {%i, %i}): Build Error: %d:%d at \"%@\"", sendString, NSStringFromFourCharCode(evClass), NSStringFromFourCharCode(evID), psn->highLongOfPSN, psn->lowLongOfPSN, (int)buildError.fError, buildError.fErrorPos, [sendString substringToIndex:buildError.fErrorPos]);
66                 return nil;
67         }
68         
69         err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, /*kAEDefaultTimeout*/60, NULL, NULL);
70         AEDisposeDesc(&sendEvent);
71         
72         if (err) {
73                 ITDebugLog(@"ITSendAEWithString(%@, %@, %@, {%i, %i}): Send Error: %i", sendString, NSStringFromFourCharCode(evClass), NSStringFromFourCharCode(evID), psn->highLongOfPSN, psn->lowLongOfPSN, err);
74                 return nil;
75         }
76         
77         err = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
78         
79         if (resultSize == 0 || err != 0) {
80                 AEDisposeDesc(&replyEvent);
81                 return nil;
82         }
83         
84         AEGetParamDesc(&replyEvent, keyDirectObject, resultType, &resultDesc);
85         AEDisposeDesc(&replyEvent);
86         return [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&resultDesc] autorelease];
87 }
88
89 NSAppleEventDescriptor *ITSendAEWithStringAndObject(NSString *sendString, const AEDesc *object, FourCharCode evClass, FourCharCode evID, const ProcessSerialNumber *psn) {
90         pid_t pid;
91         AppleEvent sendEvent, replyEvent;
92         NSAppleEventDescriptor *recv;
93         AEDesc resultDesc;
94         DescType resultType;
95         Size resultSize;
96         
97         AEBuildError buildError;
98         OSStatus berr,err;
99         
100         if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
101                 ITDebugLog(@"ITSendAEWithStringAndObject(%@, <%@>, %@, %@, {%i, %i}): Error getting PID of application.", sendString, _ITAEDescCarbonDescription(*object), NSStringFromFourCharCode(evClass), NSStringFromFourCharCode(evID), psn->highLongOfPSN, psn->lowLongOfPSN);
102                 return nil;
103         }
104         
105         berr = AEBuildAppleEvent(evClass, evID, typeProcessSerialNumber,psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, [sendString UTF8String]);
106         
107         if (berr) {
108                 ITDebugLog(@"ITSendAEWithStringAndObject(%@, <%@>, %@, %@, {%i, %i}): Build Error: %d:%d at \"%@\"", sendString, _ITAEDescCarbonDescription(*object), NSStringFromFourCharCode(evClass), NSStringFromFourCharCode(evID), psn->highLongOfPSN, psn->lowLongOfPSN, (int)buildError.fError, buildError.fErrorPos, [sendString substringToIndex:buildError.fErrorPos]);
109                 return nil;
110         }
111         
112         AEPutParamDesc(&sendEvent, keyDirectObject, object);
113         
114         err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, /*kAEDefaultTimeout*/60, NULL, NULL);
115         AEDisposeDesc(&sendEvent);
116         
117         if (err) {
118                 ITDebugLog(@"ITSendAEWithStringAndObject(%@, <%@>, %@, %@, {%i, %i}): Send Error: %i", sendString, _ITAEDescCarbonDescription(*object), NSStringFromFourCharCode(evClass), NSStringFromFourCharCode(evID), psn->highLongOfPSN, psn->lowLongOfPSN, err);
119                 return nil;
120         }
121         
122         err = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
123         
124         if (resultSize == 0 || err != 0) {
125                 AEDisposeDesc(&replyEvent);
126                 return nil;
127         }
128         
129         AEGetParamDesc(&replyEvent, keyDirectObject, resultType, &resultDesc);
130         AEDisposeDesc(&replyEvent);
131         return [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&resultDesc] autorelease];
132 }