ITOSAScript stuff.
[ITFoundation.git] / ITOSAScript.m
diff --git a/ITOSAScript.m b/ITOSAScript.m
new file mode 100755 (executable)
index 0000000..6b079c8
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ *     ITFoundation
+ *      ITOSAScript
+ *          An extended NSAppleScript that allows any OSA language.
+ *
+ *     Original Author : Kent Sutherland <ksutherland@ithinksw.com>
+ *      Responsibility : Kent Sutherland <ksutherland@ithinksw.com>
+ *      Responsibility : Joseph Spiros <joseph.spiros@ithinksw.com>
+ *
+ *     Copyright (c) 2002 - 2004 iThink Software.
+ *     All Rights Reserved
+ *
+ */
+
+/*
+Script Subtypes:
+    kAppleScriptSubtype - AppleScript (Default)
+    'Jscr' - JavaScript (if installed)
+*/
+
+#import "ITOSAScript.h"
+
+@implementation ITOSAScript
+
+- (id)init
+{
+    if ( (self = [super init]) ) {
+        _source = nil;
+        _scriptSubtype = kAppleScriptSubtype; //Default to AppleScript
+    }
+    return self;
+}
+
+- (id)initWithContentsOfFile:(NSString *)path
+{
+    if ( (self = [super init]) ) {
+        _source = [[NSString alloc] initWithContentsOfFile:path];
+        _scriptSubtype = kAppleScriptSubtype; //Default to AppleScript
+    }
+    return self;
+}
+
+- (id)initWithSource:(NSString *)source
+{
+    if ( (self = [super init]) ) {
+        [self setSource:source];
+        _scriptSubtype = kAppleScriptSubtype; //Default to AppleScript
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+    [_source release];
+    [super dealloc];
+}
+
+- (NSString *)source
+{
+    return _source;
+}
+
+- (void)setSource:(NSString *)newSource
+{
+    [_source release];
+    _source = [newSource copy];
+}
+
+- (unsigned long)scriptSubtype
+{
+    return _scriptSubtype;
+}
+
+- (void)setScriptSubtype:(unsigned long)newSubtype
+{
+    _scriptSubtype = newSubtype;
+}
+
+- (NSString *)execute
+{
+    AEDesc scriptDesc, resultDesc;
+    Size length;
+    NSString *result;
+    Ptr buffer;
+    
+    AECreateDesc(typeChar, [_source cString], [_source cStringLength], &scriptDesc);
+    
+    OSADoScript(OpenDefaultComponent(kOSAComponentType, _scriptSubtype), &scriptDesc, kOSANullScript, typeChar, kOSAModeCanInteract, &resultDesc);
+    
+    length = AEGetDescDataSize(&resultDesc);
+    buffer = malloc(length);
+    
+    AEGetDescData(&resultDesc, buffer, length);
+    AEDisposeDesc(&scriptDesc);
+    AEDisposeDesc(&resultDesc);
+    result = [NSString stringWithCString:buffer length:length];
+    if (![result isEqualToString:@""] &&
+        ([result characterAtIndex:0] == '\"') &&
+        ([result characterAtIndex:[result length] - 1] == '\"'))
+    {
+        result = [result substringWithRange:NSMakeRange(1, [result length] - 2)];
+    }
+    free(buffer);
+    buffer = NULL;
+    return result;
+}
+
+@end