From 748766149b657b5e86f861a277e7e054406ec87c Mon Sep 17 00:00:00 2001 From: David Reitter Date: Tue, 22 Jul 2008 03:15:09 +0000 Subject: [PATCH] do-applescript: NS version of the Carbon implementation of the same functionality: execute arbitrary AppleScript code. --- src/nsfns.m | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/src/nsfns.m b/src/nsfns.m index 8bed60a4b4b..40016d9479b 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -2194,6 +2194,92 @@ x_sync (Lisp_Object frame) ========================================================================== */ +#ifdef NS_IMPL_COCOA + +/* Compile and execute the AppleScript SCRIPT and return the error + status as function value. A zero is returned if compilation and + execution is successful, in which case *RESULT is set to a Lisp + string or a number containing the resulting script value. Otherwise, + 1 is returned. */ + +static int +do_applescript (script, result) + Lisp_Object script, *result; +{ + NSAppleEventDescriptor *desc; + NSDictionary* errorDict; + NSAppleEventDescriptor* returnDescriptor = NULL; + + NSAppleScript* scriptObject = + [[NSAppleScript alloc] initWithSource: + [NSString stringWithUTF8String: SDATA (script)]]; + + returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; + [scriptObject release]; + + *result = Qnil; + + if (returnDescriptor != NULL) + { + // successful execution + if (kAENullEvent != [returnDescriptor descriptorType]) + { + *result = Qt; + // script returned an AppleScript result + if ((typeUnicodeText == [returnDescriptor descriptorType]) || + (typeUTF16ExternalRepresentation + == [returnDescriptor descriptorType]) || + (typeUTF8Text == [returnDescriptor descriptorType]) || + (typeCString == [returnDescriptor descriptorType])) + { + desc = [returnDescriptor coerceToDescriptorType: typeUTF8Text]; + if (desc) + *result = build_string([[desc stringValue] UTF8String]); + } + else + { + /* use typeUTF16ExternalRepresentation? */ + // coerce the result to the appropriate ObjC type + desc = [returnDescriptor coerceToDescriptorType: typeUTF8Text]; + if (desc) + *result = make_number([desc int32Value]); + } + } + } + else + { + // no script result, return error + return 1; + } + return 0; +} + +DEFUN ("do-applescript", Fdo_applescript, Sdo_applescript, 1, 1, 0, + doc: /* Execute AppleScript SCRIPT and return the result. If +compilation and execution are successful, the resulting script value +is returned as a string, a number or, in the case of other constructs, +t. In case the execution fails, an error is signaled. */) + (script) + Lisp_Object script; +{ + Lisp_Object result; + long status; + + CHECK_STRING (script); + check_ns (); + + BLOCK_INPUT; + status = do_applescript (script, &result); + UNBLOCK_INPUT; + if (status == 0) + return result; + else if (!STRINGP (result)) + error ("AppleScript error %d", status); + else + error ("%s", SDATA (result)); +} +#endif + DEFUN ("xw-color-defined-p", Fns_color_defined_p, Sns_color_defined_p, 1, 2, 0, doc: /* Return t if the current Nextstep display supports the color COLOR. The optional argument FRAME is currently ignored. */) @@ -2554,6 +2640,9 @@ be used as the image of the icon representing the frame. */); defsubr (&Sns_list_fonts); defsubr (&Sns_font_name); defsubr (&Sns_list_colors); +#ifdef NS_IMPL_COCOA + defsubr (&Sdo_applescript); +#endif defsubr (&Sns_color_defined_p); defsubr (&Sns_color_values); defsubr (&Sns_server_max_request_size); -- 2.39.2