7b897ee8048dbe99179181c3a61db60bf68e2da8
[ITFoundation.git] / ITAppleEventTools.m
1 /*
2  *  ITAppleEventTools.c
3  *  ITFoundation
4  *
5  *  Created by Alexander Strange on Wed Feb 11 2004.
6  *  Copyright (c) 2004 __MyCompanyName__. All rights reserved.
7  *
8  */
9
10 #import "ITDebug.h"
11 #import "ITAppleEventTools.h"
12
13 NSAppleEventDescriptor *ITSendAEWithString(NSString *sendString, FourCharCode evClass, FourCharCode evID,const ProcessSerialNumber *psn)
14 {
15     //Add error checking...
16     pid_t pid;
17     
18     const char *usendString = [sendString UTF8String];
19     
20     AppleEvent sendEvent, replyEvent;
21     NSAppleEventDescriptor *send, *recv;
22     AEDesc resultDesc;
23     DescType resultType;
24     Size resultSize;
25     
26     AEBuildError buildError;
27     OSStatus berr,err;
28     
29     if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
30         ITDebugLog(@"Error getting PID of application.");
31         return nil;
32     }
33     
34     berr = AEBuildAppleEvent(evClass, evID, typeProcessSerialNumber,psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, usendString);
35     send = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&sendEvent] autorelease];
36     if (!berr) [send logDesc];
37     
38     if (berr) {
39         ITDebugLog(@"Error: %d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]);
40     }
41     
42     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
43     
44     err = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
45     if (resultSize == 0 || err != 0) {
46         return nil;
47     }
48     
49     AEGetParamDesc(&replyEvent, keyDirectObject, resultType, &resultDesc);
50     
51     recv = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&resultDesc] autorelease];
52     if (!err) [recv logDesc];
53     
54     if (err) {
55         ITDebugLog(@"Send Error: %i",err);
56     }
57     return recv;
58 }
59
60 NSAppleEventDescriptor *ITSendAEWithStringAndObject(NSString *sendString, const AEDesc *object, FourCharCode evClass, FourCharCode evID,const ProcessSerialNumber *psn)
61 {
62     //Add error checking...
63     pid_t pid;
64     
65     const char *usendString = [sendString UTF8String];
66     
67     AppleEvent sendEvent, replyEvent;
68     NSAppleEventDescriptor *send, *recv;
69     AEDesc resultDesc;
70     DescType resultType;
71     Size resultSize;
72     
73     AEBuildError buildError;
74     OSStatus berr,err;
75     
76     if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
77         ITDebugLog(@"Error getting PID of application.");
78         return nil;
79     }
80     
81     berr = AEBuildAppleEvent(evClass, evID, typeProcessSerialNumber,psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, usendString);
82     send = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&sendEvent] autorelease];
83     if (!berr) [send logDesc];
84     
85     if (berr) {
86         ITDebugLog(@"Error: %d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]);
87     }
88     err = AEPutParamDesc(&sendEvent, keyDirectObject, object);
89     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
90     
91     err = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
92     if (resultSize == 0 || err != 0) {
93         return nil;
94     }
95     
96     AEGetParamDesc(&replyEvent, keyDirectObject, resultType, &resultDesc);
97     
98     recv = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&resultDesc] autorelease];
99     if (!err) [recv logDesc];
100     
101     if (err) {
102         ITDebugLog(@"Send Error: %i",err);
103     }
104     return recv;
105 }
106
107 NSAppleEventDescriptor *ITSendAEWithKey(FourCharCode reqKey, FourCharCode evClass, FourCharCode evID,const ProcessSerialNumber *psn)
108 {
109     return nil;
110 }
111
112 NSAppleEventDescriptor *ITSendAE(FourCharCode eClass, FourCharCode eID,const ProcessSerialNumber *psn)
113 {
114     AEDesc dest;
115     int pid;
116     
117     AppleEvent event, reply;
118     OSStatus cerr,cerr2,err;
119     NSAppleEventDescriptor *nsd, *nse, *nsr;
120     if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
121         ITDebugLog(@"Error getting PID of application.");
122         return nil;
123     }
124     cerr = AECreateDesc(typeProcessSerialNumber,psn,sizeof(ProcessSerialNumber),&dest);
125     nsd = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&dest] autorelease];
126     cerr2 = AECreateAppleEvent(eClass,eID,&dest,kAutoGenerateReturnID,kAnyTransactionID,&event);
127     nse = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&event] autorelease];
128     if (!cerr2) [nse logDesc];
129     err = AESend(&event, &reply, kAENoReply, kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
130     nsr = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&reply] autorelease];
131     [nsr logDesc];
132     return nsr;
133 }
134
135 @implementation NSAppleEventDescriptor (ITAELogging)
136 -(void) logDesc
137 {
138     Handle xx;
139     AEPrintDescToHandle([self aeDesc],&xx);
140     ITDebugLog(@"AE Descriptor: %s", *xx);
141     DisposeHandle(xx);
142 }
143 @end