Added ITSendAEWithKey, need to fix up a small part of it though.
[ITFoundation.git] / ITOSAScript.m
index 833c84f..6f1a27f 100755 (executable)
@@ -21,34 +21,35 @@ Script Subtypes:
 #import "ITOSAScript.h"
 #import "ITOSAComponent.h"
 
+#warning To do - Error Dictionaries
+
 @implementation ITOSAScript
 
 - (id)init
 {
-    if ( (self = [super init]) ) {
-        _source = nil;
-    }
-    return self;
+    return nil; // initWithSource: is the designated initializer for this class
 }
 
 - (id)initWithContentsOfFile:(NSString *)path
 {
-    if ( (self = [super init]) ) {
-        _source = [[NSString alloc] initWithContentsOfFile:path];
-    }
-    return self;
+    return [self initWithSource:[[[NSString alloc] initWithContentsOfFile:path] autorelease]];
 }
 
 - (id)initWithSource:(NSString *)source
 {
     if ( (self = [super init]) ) {
-        [self setSource:source];
+        _source = [source copy];
+        _scriptID = kOSANullScript;
     }
     return self;
 }
 
 - (void)dealloc
 {
+    if (_scriptID != kOSANullScript) {
+        OSADispose([_component componentInstance], _scriptID);
+    }
+    
     [_source release];
     [super dealloc];
 }
@@ -58,12 +59,6 @@ Script Subtypes:
     return _source;
 }
 
-- (void)setSource:(NSString *)newSource
-{
-    [_source release];
-    _source = [newSource copy];
-}
-
 - (ITOSAComponent *)component
 {
     return _component;
@@ -74,43 +69,58 @@ Script Subtypes:
     _component = newComponent;
 }
 
-- (BOOL)compile
+- (BOOL)compileAndReturnError:(NSDictionary **)errorInfo
 {
-    return NO;
+    if ([_component componentInstance] == nil) {
+        //Set the error dictionary
+        return NO;
+    }
+    
+    AEDesc moof;
+    AECreateDesc(typeChar, [_source cString], [_source cStringLength], &moof);
+    if (OSACompile([_component componentInstance], &moof, kOSAModeNull, &_scriptID) != 0) {
+        NSLog(@"Compile error!");
+        return NO;
+    }
+    return YES;
 }
 
 - (BOOL)isCompiled
 {
-    return NO;
+    return (_scriptID != kOSANullScript);
 }
 
-- (NSString *)execute
+- (NSAppleEventDescriptor *)executeAndReturnError:(NSDictionary **)errorInfo
 {
+    if ([_component componentInstance] == nil) {
+        //Set the error dictionary
+        return nil;
+    }
+    
+    NSAppleEventDescriptor *cocoaDesc;
+    
     AEDesc scriptDesc, resultDesc;
-    Size length;
-    NSString *result;
-    Ptr buffer;
+    OSAID resultID = kOSANullScript;
+    
+    //If not compiled, compile it
+    if (![self isCompiled]) {
+        if (![self compileAndReturnError:nil]) {
+            //Set the error info dictionary
+            return nil;
+        }
+    }
     
-    AECreateDesc(typeChar, [_source cString], [_source cStringLength], &scriptDesc);
+    OSAExecute([_component componentInstance], _scriptID, kOSANullScript, kOSANullMode, &resultID);
     
-    OSADoScript([_component componentInstance], &scriptDesc, kOSANullScript, typeChar, kOSAModeCanInteract, &resultDesc);
+    OSACoerceToDesc([_component componentInstance], resultID, typeWildCard, kOSAModeNull, &resultDesc); // Using this instead of OSADisplay, as we don't care about human readability, but rather, the integrity of the data.
     
-    length = AEGetDescDataSize(&resultDesc);
-    buffer = malloc(length);
+    cocoaDesc = [[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&resultDesc];
     
-    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;
+    
+    OSADispose([_component componentInstance], resultID);
+    
+    return [cocoaDesc autorelease];
 }
 
 @end