aboutsummaryrefslogtreecommitdiff
path: root/Foundation/GTMNSAppleEventDescriptor+Handler.m
diff options
context:
space:
mode:
Diffstat (limited to 'Foundation/GTMNSAppleEventDescriptor+Handler.m')
-rw-r--r--Foundation/GTMNSAppleEventDescriptor+Handler.m130
1 files changed, 130 insertions, 0 deletions
diff --git a/Foundation/GTMNSAppleEventDescriptor+Handler.m b/Foundation/GTMNSAppleEventDescriptor+Handler.m
new file mode 100644
index 0000000..b5b2974
--- /dev/null
+++ b/Foundation/GTMNSAppleEventDescriptor+Handler.m
@@ -0,0 +1,130 @@
+//
+// NSAppleEventDescriptor+Handler.m
+//
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+
+#import "GTMNSAppleEventDescriptor+Handler.h"
+#import "GTMNSAppleEventDescriptor+Foundation.h"
+#import "GTMMethodCheck.h"
+#import <Carbon/Carbon.h>
+
+@implementation NSAppleEventDescriptor (GTMAppleEventDescriptorHandlerAdditions)
+GTM_METHOD_CHECK(NSProcessInfo, gtm_appleEventDescriptor); // COV_NF_LINE
+
++ (id)gtm_descriptorWithPositionalHandler:(NSString*)handler
+ parametersArray:(NSArray*)params {
+ return [[[self alloc] gtm_initWithPositionalHandler:handler
+ parametersArray:params] autorelease];
+}
+
++ (id)gtm_descriptorWithPositionalHandler:(NSString*)handler
+ parametersDescriptor:(NSAppleEventDescriptor*)params {
+ return [[[self alloc] gtm_initWithPositionalHandler:handler
+ parametersDescriptor:params] autorelease];
+}
+
++ (id)gtm_descriptorWithLabeledHandler:(NSString*)handler
+ labels:(AEKeyword*)labels
+ parameters:(id*)params
+ count:(NSUInteger)count {
+ return [[[self alloc] gtm_initWithLabeledHandler:handler
+ labels:labels
+ parameters:params
+ count:count] autorelease];
+}
+
+- (id)gtm_initWithPositionalHandler:(NSString*)handler
+ parametersArray:(NSArray*)params {
+ return [self gtm_initWithPositionalHandler:handler
+ parametersDescriptor:[params gtm_appleEventDescriptor]];
+}
+
+- (id)gtm_initWithPositionalHandler:(NSString*)handler
+ parametersDescriptor:(NSAppleEventDescriptor*)params {
+ if ((self = [self initWithEventClass:kASAppleScriptSuite
+ eventID:kASSubroutineEvent
+ targetDescriptor:[[NSProcessInfo processInfo] gtm_appleEventDescriptor]
+ returnID:kAutoGenerateReturnID
+ transactionID:kAnyTransactionID])) {
+ // Create an NSAppleEventDescriptor with the method handler. Note that the
+ // name must be lowercase (even if it is uppercase in AppleScript).
+ // http://developer.apple.com/qa/qa2001/qa1111.html
+ // has details.
+ handler = [handler lowercaseString];
+ if (!handler) {
+ [self release];
+ return nil;
+ }
+ NSAppleEventDescriptor *handlerDesc
+ = [NSAppleEventDescriptor descriptorWithString:handler];
+ [self setParamDescriptor:handlerDesc forKeyword:keyASSubroutineName];
+ if (params) {
+ [self setParamDescriptor:params forKeyword:keyDirectObject];
+ }
+ }
+ return self;
+}
+
+
+- (id)gtm_initWithLabeledHandler:(NSString*)handler
+ labels:(AEKeyword*)labels
+ parameters:(id*)params
+ count:(NSUInteger)count {
+ if ((self = [self initWithEventClass:kASAppleScriptSuite
+ eventID:kASSubroutineEvent
+ targetDescriptor:[[NSProcessInfo processInfo] gtm_appleEventDescriptor]
+ returnID:kAutoGenerateReturnID
+ transactionID:kAnyTransactionID])) {
+ if (!handler) {
+ [self release];
+ return nil;
+ }
+ // Create an NSAppleEventDescriptor with the method handler. Note that the
+ // name must be lowercase (even if it is uppercase in AppleScript).
+ NSAppleEventDescriptor *handlerDesc
+ = [NSAppleEventDescriptor descriptorWithString:[handler lowercaseString]];
+ [self setParamDescriptor:handlerDesc forKeyword:keyASSubroutineName];
+ for (NSUInteger i = 0; i < count; i++) {
+ NSAppleEventDescriptor *paramDesc = [params[i] gtm_appleEventDescriptor];
+ if(labels[i] == keyASPrepositionGiven) {
+ if (![params[i] isKindOfClass:[NSDictionary class]]) {
+ _GTMDevLog(@"Must pass in dictionary for keyASPrepositionGiven "
+ "(got %@)", params[i]);
+ [self release];
+ self = nil;
+ break;
+ }
+ NSAppleEventDescriptor *userDesc
+ = [paramDesc descriptorForKeyword:keyASUserRecordFields];
+ if (!userDesc) {
+ _GTMDevLog(@"Dictionary for keyASPrepositionGiven must be a user "
+ "record field dictionary (got %@)", params[i]);
+ [self release];
+ self = nil;
+ break;
+ }
+ [self setParamDescriptor:userDesc
+ forKeyword:keyASUserRecordFields];
+ } else {
+ [self setParamDescriptor:paramDesc
+ forKeyword:labels[i]];
+ }
+ }
+ }
+ return self;
+}
+
+@end