ITOSAScript stuff.
[ITFoundation.git] / ITOSAScript.m
1 /*
2  *      ITFoundation
3  *      ITOSAScript
4  *          An extended NSAppleScript that allows any OSA language.
5  *
6  *      Original Author : Kent Sutherland <ksutherland@ithinksw.com>
7  *      Responsibility : Kent Sutherland <ksutherland@ithinksw.com>
8  *      Responsibility : Joseph Spiros <joseph.spiros@ithinksw.com>
9  *
10  *      Copyright (c) 2002 - 2004 iThink Software.
11  *      All Rights Reserved
12  *
13  */
14
15 /*
16 Script Subtypes:
17     kAppleScriptSubtype - AppleScript (Default)
18     'Jscr' - JavaScript (if installed)
19 */
20
21 #import "ITOSAScript.h"
22
23 @implementation ITOSAScript
24
25 - (id)init
26 {
27     if ( (self = [super init]) ) {
28         _source = nil;
29         _scriptSubtype = kAppleScriptSubtype; //Default to AppleScript
30     }
31     return self;
32 }
33
34 - (id)initWithContentsOfFile:(NSString *)path
35 {
36     if ( (self = [super init]) ) {
37         _source = [[NSString alloc] initWithContentsOfFile:path];
38         _scriptSubtype = kAppleScriptSubtype; //Default to AppleScript
39     }
40     return self;
41 }
42
43 - (id)initWithSource:(NSString *)source
44 {
45     if ( (self = [super init]) ) {
46         [self setSource:source];
47         _scriptSubtype = kAppleScriptSubtype; //Default to AppleScript
48     }
49     return self;
50 }
51
52 - (void)dealloc
53 {
54     [_source release];
55     [super dealloc];
56 }
57
58 - (NSString *)source
59 {
60     return _source;
61 }
62
63 - (void)setSource:(NSString *)newSource
64 {
65     [_source release];
66     _source = [newSource copy];
67 }
68
69 - (unsigned long)scriptSubtype
70 {
71     return _scriptSubtype;
72 }
73
74 - (void)setScriptSubtype:(unsigned long)newSubtype
75 {
76     _scriptSubtype = newSubtype;
77 }
78
79 - (NSString *)execute
80 {
81     AEDesc scriptDesc, resultDesc;
82     Size length;
83     NSString *result;
84     Ptr buffer;
85     
86     AECreateDesc(typeChar, [_source cString], [_source cStringLength], &scriptDesc);
87     
88     OSADoScript(OpenDefaultComponent(kOSAComponentType, _scriptSubtype), &scriptDesc, kOSANullScript, typeChar, kOSAModeCanInteract, &resultDesc);
89     
90     length = AEGetDescDataSize(&resultDesc);
91     buffer = malloc(length);
92     
93     AEGetDescData(&resultDesc, buffer, length);
94     AEDisposeDesc(&scriptDesc);
95     AEDisposeDesc(&resultDesc);
96     result = [NSString stringWithCString:buffer length:length];
97     if (![result isEqualToString:@""] &&
98         ([result characterAtIndex:0] == '\"') &&
99         ([result characterAtIndex:[result length] - 1] == '\"'))
100     {
101         result = [result substringWithRange:NSMakeRange(1, [result length] - 2)];
102     }
103     free(buffer);
104     buffer = NULL;
105     return result;
106 }
107
108 @end