fix malloc leak
[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*/30, 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*/30, 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     //Add error checking...
110     pid_t pid;
111     
112         unsigned char *chr = (unsigned char *)malloc(4*sizeof(unsigned char));
113         memcpy(chr, &reqKey, 4);
114         NSString *sendString = [NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('%s'), from:'null'() }", chr];
115         free(chr);
116         const char *usendString = [sendString UTF8String];
117     
118     AppleEvent sendEvent, replyEvent;
119     NSAppleEventDescriptor *send, *recv;
120     AEDesc resultDesc;
121     DescType resultType;
122     Size resultSize;
123     
124     AEBuildError buildError;
125     OSStatus berr,err;
126     
127     if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
128         ITDebugLog(@"Error getting PID of application.");
129         return nil;
130     }
131     
132     berr = AEBuildAppleEvent(evClass, evID, typeProcessSerialNumber,psn, sizeof(ProcessSerialNumber), kAutoGenerateReturnID, 0, &sendEvent, &buildError, usendString);
133     send = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&sendEvent] autorelease];
134     if (!berr) [send logDesc];
135     
136     if (berr) {
137         ITDebugLog(@"Error: %d:%d at \"%@\"",(int)buildError.fError,buildError.fErrorPos,[sendString substringToIndex:buildError.fErrorPos]);
138     }
139     
140     err = AESend(&sendEvent, &replyEvent, kAEWaitReply, kAENormalPriority, /*kAEDefaultTimeout*/30, NULL, NULL);
141     
142     err = AESizeOfParam(&replyEvent, keyDirectObject, &resultType, &resultSize);
143     if (resultSize == 0 || err != 0) {
144         return nil;
145     }
146     
147     AEGetParamDesc(&replyEvent, keyDirectObject, resultType, &resultDesc);
148     
149     recv = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&resultDesc] autorelease];
150     if (!err) [recv logDesc];
151     
152     if (err) {
153         ITDebugLog(@"Send Error: %i",err);
154     }
155     return recv;
156 }
157
158 NSAppleEventDescriptor *ITSendAE(FourCharCode eClass, FourCharCode eID,const ProcessSerialNumber *psn)
159 {
160     AEDesc dest;
161     int pid;
162     
163     AppleEvent event, reply;
164     OSStatus cerr,cerr2,err;
165     NSAppleEventDescriptor *nsd, *nse, *nsr;
166     if ((GetProcessPID(psn, &pid) == noErr) && (pid == 0)) {
167         ITDebugLog(@"Error getting PID of application.");
168         return nil;
169     }
170     cerr = AECreateDesc(typeProcessSerialNumber,psn,sizeof(ProcessSerialNumber),&dest);
171     nsd = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&dest] autorelease];
172     cerr2 = AECreateAppleEvent(eClass,eID,&dest,kAutoGenerateReturnID,kAnyTransactionID,&event);
173     nse = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&event] autorelease];
174     if (!cerr2) [nse logDesc];
175     err = AESend(&event, &reply, kAENoReply, kAENormalPriority, /*kAEDefaultTimeout*/30, NULL, NULL);
176     nsr = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&reply] autorelease];
177     [nsr logDesc];
178     return nsr;
179 }
180
181 @implementation NSAppleEventDescriptor (ITAELogging)
182 -(void) logDesc
183 {
184     Handle xx;
185     AEPrintDescToHandle([self aeDesc],&xx);
186     ITDebugLog(@"AE Descriptor: %s", *xx);
187     DisposeHandle(xx);
188 }
189 @end