(* AppleScript.sml *) (* 1997 Jul 04 e *) (* This module is a Mac specific implementation of an applescript client it provides the capability to - compile AppleScript source - run the resulting script objects - retrieve string results and/or error messages - dispose of script objects and results *) (* references: Inside Macintosh: Interapplication Communication, especially Chapter 10 AppleScript Language Guide English Edition -- available at http://applescript.apple.com/support.html *) (* OSA is Apple's Open Scripting Architecture -- the interface to AppleScript *) type OSAerr = int (* 0 => OK *) prim_type OSAID_ (* handle to compiled script objects and results *) type OSAID = { id: OSAID_, ok: bool ref } exception AppleScriptErr of OSAerr * string; local type OSA_oid = { err : OSAerr, id : OSAID_ } type OSA_str = { err : OSAerr, str : string } prim_val as_compile_ : string -> OSA_oid = 1 "mac_OSACompile" prim_val as_execute_ : OSAID_ -> OSA_oid = 1 "mac_OSAExecute" prim_val as_display_ : OSAID_ -> OSA_str = 1 "mac_OSADisplay" prim_val as_dispose_ : OSAID_ -> OSAerr = 1 "mac_OSADispose" prim_val as_error_ : unit -> OSA_str = 1 "mac_OSAScriptError" fun as_run_script_ xid = let val { err, id = rid } = as_execute_ xid val res = if err = 0 then as_display_ rid else as_error_ () in as_dispose_ rid; res end fun as_run_text_ text = let val (ss as { err, id = xid }) = as_compile_ text in let val res = if err = 0 then as_run_script_ xid else as_error_ () in as_dispose_ xid; res end end fun as_check_str_ { err, str } = if err = 0 then str else raise (AppleScriptErr (err,str)) fun as_raise_err _ = let val {err,str} = as_error_ () in raise (AppleScriptErr (err,str)) end fun as_check_err_ err { id, ok } = if err = 0 then ok := false else as_raise_err () fun as_check_oid_ { err = ror, id = rid } = if ror = 0 then { id = rid, ok = ref true } else as_raise_err () fun as_check_osaid_ { id = xid, ok } = if !ok then xid else raise (AppleScriptErr (~1,"Attempt to use disposed OSAID")) in (* as_compile -- compiles a text script for later execution *) fun as_compile txt = as_check_oid_ (as_compile_ txt); (* as_dispose -- disposes the compiled script freeing AS memory *) fun as_dispose s = as_check_err_ (as_dispose_ (as_check_osaid_ s)) s; (* as_run_script -- runs a precompiled script *) fun as_run_script s = as_check_str_ (as_run_script_ (as_check_osaid_ s)); (* as_run_text -- runs a one shot script, like system() but with a result *) fun as_run_text txt = as_check_str_ (as_run_text_ txt) end; (* end of AppleScript.sml *)