• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag
 

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
RE: Feature request to solve a problematic AppleScript behavior with raw Apple Event codes
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: Feature request to solve a problematic AppleScript behavior with raw Apple Event codes


  • Subject: RE: Feature request to solve a problematic AppleScript behavior with raw Apple Event codes
  • From: Scott Babcock <email@hidden>
  • Date: Fri, 22 Oct 2010 19:16:34 +0000
  • Thread-topic: Feature request to solve a problematic AppleScript behavior with raw Apple Event codes

has:

Your response was educational as always. It provides in-depth information on how to decompose an AEDesc. Unfortunately, my original issue got lost in my example.

The issue I'm trying to work around (and wishing there was an official solution for) is the behavior of the AppleScript compiler to convert raw Apple Event codes to their "friendly" form whenever possible, regardless of the impact this may have on the function and/or compile-ability of the original source.

I'd like some a way to tell the compiler to leave Apple Event codes in their raw form. My off-the-cuff suggestion was to wrap such codes in back-ticks (e.g. - `<<class from>>`). This would enable scripters to handle esoteric scenarios like the one in my example, but it would also enable them to work around terminology conflicts in which more than one Apple Event code is associated with a particular "friendly" keyword.


-----Original Message-----

Date: Fri, 22 Oct 2010 13:35:05 +0100
From: has <email@hidden>
Subject: Re: Feature request to solve a problematic AppleScript
	behavior with raw Apple Event codes
To: email@hidden
Message-ID:
	<email@hidden>
Content-Type: text/plain; charset=ISO-8859-1

Scott Babcock wrote:

> I have a request for a feature that would solve a problematic AppleScript behavior - conversion of raw Apple Event codes to their "friendly" equivalents and rendering the affected code non-compile-able.
>
> I ran into a situation in which I needed to branch based on the form of a specified object reference (named/index/id). Getting the reference form is obscure but relatively easy (coerce the reference to a record and grab the <<class form>> property).

Coercing an AEDesc of typeObjectSpecifier to typeAERecord is supported
by the Apple Event Manager APIs, but it's not a documented behaviour
within the AppleScript language so you gets exactly what you pays for.
(If anything, coercing a reference to a record within AS ought to
raise a coercion error rather than cause AS to spill its private
implementation all over the place; feel free to file a bug report on
that.)

The correct way to do this (i.e. relying on documented APIs only)
would be to write an osax that uses the AEM APIs to decompose the
AEDesc for you. That's quite easy to do; the only minor catch is that
to pass an arbitrary application reference in an osax command, you
need to wrap it in a script object first, then have the C code pull it
out again on the other side.

If you don't have the option of deploying custom osaxen then your only
other option is to continue exploiting undocumented AS 'features', and
hope that they don't blow up on you:

on getprop(obj, fourcharcode)
	-- Caution: exploits undocumented behaviour; use at own risk!
	-- Caution: four-char code string is _not_ checked or sanitised before eval!
	script wrapper
		property rec : obj as record
	end script
	return run script "
		on run {wrapper}
			return ?class " & fourcharcode & "? of rec of wrapper
		end run" with parameters {wrapper}
end getprop
tell application "System Events"
	set procRef to process "Finder"
end tell
set refRecord to procRef as record

{getprop(refRecord, "want"), getprop(refRecord, "form"),
getprop(refRecord, "seld"), getprop(refRecord, "from")}
--> {application process, named, "Finder", ?script?}


> These hacks do the trick, but there's a property in the reference record that can't be dealt with this way - <<class from>>. This property contains a reference to the object's parent - in this case, System Events.

No, in this case it contains a typeNull descriptor, as that is the
root descriptor for an object specifier that represents an absolute
reference. I don't believe there's any way to get that information
from an AppleScript reference object, short of going through the
official APIs. (AS supports a 'qualified' specifier format whose root
descriptor is an AEAddressDesc, for use by attachable apps such as
Automator that need to pass arbitrary application references in and
out of the AS component via the OSA APIs.)


Matt Neuburg wrote:

> In Ruby, your script is just text; merely opening the script or running it doesn't mysteriously cause its contents to get changed. And inspecting the form of the canonical reference returned by an application doesn't require any magic tricks. Here's the rb-appscript equivalent of your script:
>
> procRef = Appscript.app("System Events").processes["Finder"]
> ref = procRef.get
> if ref.AS_aem_reference.to_s.include? 'by_name("Finder")'
>   puts "a named reference to the Finder"
> end

That's not a robust solution though. A better approach would be to
repack the reference as an AEDesc, and then extract the required
information via AEDesc#get_param (with extra points awarded for
converting those descriptors back into Ruby values):

se = app('System Events')
codecs = se.AS_app_data

ref = se.processes['Finder']
# => app("/System/Library/CoreServices/System Events.app").processes["Finder"]

desc = codecs.pack(ref.AS_aem_reference)
# => #<AE::AEDesc type="obj " size=92>

[KAE::KeyAEDesiredClass, KAE::KeyAEKeyForm, KAE::KeyAEKeyData,
KAE::KeyAEContainer].each do |code|
	p codecs.unpack(desc.get_param(code, '****'))
end
# => :process
# => AEM::AEEnum.new("name")
# => "Finder"
# => nil

Alternatively, you could use the AEM ref's #AEM_resolve API to
'replay' the sequence of method calls used to construct it, passing it
a suitable visitor object. While it's technically a private API it's
quite stable and safe to use (as are the other AS_ and AEM_ APIs).

HTH

has

--
Learn AppleScript, 3rd edition, Sanderson & Rosenthal:
http://apress.com/book/view/9781430223610
Control AppleScriptable applications from Python, Ruby and ObjC:
http://appscript.sourceforge.net


------------------------------

Message: 12
Date: Fri, 22 Oct 2010 13:35:51 +0100
From: Steve Thompson <email@hidden>
Subject: Re: codesign
To: tom wible <email@hidden>
Cc: email@hidden
Message-ID: <email@hidden>
Content-Type: text/plain; charset="us-ascii"


On 22 Oct 2010, at 13:05, tom wible wrote:

>> codesigning is to understand how to use the 'codesign' shell command.
>
> where is that?

/usr/bin/codesign

Usage: codesign -s identity [-fv*] [-o flags] [-r reqs] [-i ident] path ... # sign
       codesign -v [-v*] [-R testreq] path|pid ... # verify
       codesign -d [options] path ... # display contents
       codesign -h pid ... # display hosting paths

Steve
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.apple.com/mailman/private/applescript-users/attachments/20101022/bbf2edce/attachment.html

------------------------------

Message: 13
Date: Fri, 22 Oct 2010 07:59:12 -0500
From: Luther Fuller <email@hidden>
Subject: Re: codesign
To: Applescript Users <email@hidden>
Message-ID: <email@hidden>
Content-Type: text/plain; charset="us-ascii"

On Oct 22, 2010, at 7:05 AM, tom wible wrote:

> On Oct 21, 2010, at 7:20 PM, "Luther Fuller" wrote:
>
>> "CodeSigningGuide.pdf"
>
> got url?


CodeSigningGuide.pdf
http://developer.apple.com/library/mac/#documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html

Better yet, open the Developer Search here ... http://developer.apple.com/search/
and search for "codesign". You will see more documents.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.apple.com/mailman/private/applescript-users/attachments/20101022/a20d3091/attachment.html

------------------------------

Message: 14
Date: Fri, 22 Oct 2010 09:26:22 -0400
From: swiley <email@hidden>
Subject: Re: Scripting and Back to Mac
To: email@hidden
Message-ID: <email@hidden>
Content-Type: text/plain; charset=us-ascii

>
>> yea database events. or am I missing something.
>
> That's an option, but a bit more manual than I had in mind.

I'm a bit new to applescript (i'v been using c and basic on linux up until last christmas when I got a mac)

but what could possibly be easier then database events?

------------------------------

_______________________________________________
AppleScript-Users mailing list
email@hidden
http://lists.apple.com/mailman/listinfo/applescript-users

End of AppleScript-Users Digest, Vol 7, Issue 517
*************************************************

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
AppleScript-Users mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
Archives: http://lists.apple.com/archives/applescript-users

This email sent to email@hidden

  • Follow-Ups:
    • RE: Feature request to solve a problematic AppleScript behavior with raw Apple Event codes
      • From: "Stockly, Ed" <email@hidden>
  • Prev by Date: Re: Can't drop onto my app
  • Next by Date: Re: Can't drop onto my app
  • Previous by thread: Re: Feature request to solve a problematic AppleScript behavior with raw Apple Event codes
  • Next by thread: RE: Feature request to solve a problematic AppleScript behavior with raw Apple Event codes
  • Index(es):
    • Date
    • Thread