rb-appscript 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +45 -0
- data/README +5 -1
- data/TODO +3 -23
- data/doc/aem-manual/04_references.html +6 -6
- data/doc/aem-manual/05_targettingapplications.html +3 -3
- data/doc/aem-manual/07_findapp.html +1 -1
- data/doc/appscript-manual/04_gettinghelp.html +81 -7
- data/doc/appscript-manual/05_keywordconversion.html +18 -18
- data/doc/appscript-manual/07_applicationobjects.html +4 -4
- data/doc/appscript-manual/08_realvsgenericreferences.html +2 -2
- data/doc/appscript-manual/09_referenceforms.html +12 -14
- data/doc/appscript-manual/11_applicationcommands.html +1 -1
- data/doc/appscript-manual/14_notes.html +12 -12
- data/doc/osax-manual/index.html +2 -0
- data/rb-appscript.gemspec +2 -2
- data/sample/AB_list_people_with_emails.rb +3 -0
- data/sample/Add_iCal_event.rb +3 -0
- data/sample/Create_daily_iCal_todos.rb +2 -0
- data/sample/Export_Address_Book_phone_numbers.rb +3 -0
- data/sample/Hello_world.rb +3 -0
- data/sample/List_iTunes_playlist_names.rb +3 -0
- data/sample/Make_Mail_message.rb +3 -0
- data/sample/Open_file_in_TextEdit.rb +3 -0
- data/sample/Organize_Mail_messages.rb +3 -0
- data/sample/Print_folder_tree.rb +3 -0
- data/sample/Select_all_HTML_files.rb +3 -0
- data/sample/Set_iChat_status.rb +3 -0
- data/sample/Simple_Finder_GUI_Scripting.rb +6 -3
- data/sample/Stagger_Finder_windows.rb +3 -0
- data/sample/TextEdit_demo.rb +3 -0
- data/sample/iTunes_top40_to_html.rb +3 -0
- data/src/SendThreadSafe.c +380 -0
- data/src/SendThreadSafe.h +139 -0
- data/src/lib/_aem/aemreference.rb +46 -18
- data/src/lib/_aem/codecs.rb +19 -3
- data/src/lib/_aem/mactypes.rb +2 -6
- data/src/lib/_aem/send.rb +1 -1
- data/src/lib/_aem/typewrappers.rb +2 -2
- data/src/lib/_appscript/referencerenderer.rb +10 -4
- data/src/lib/_appscript/reservedkeywords.rb +4 -4
- data/src/lib/_appscript/terminology.rb +43 -35
- data/src/lib/aem.rb +8 -4
- data/src/lib/appscript.rb +78 -15
- data/src/lib/kae.rb +4 -0
- data/src/lib/osax.rb +9 -6
- data/src/rbae.c +102 -23
- data/test/test_aemreference.rb +4 -4
- data/test/test_appscriptcommands.rb +2 -2
- data/test/test_appscriptreference.rb +4 -4
- data/test/test_codecs.rb +14 -1
- data/test/test_findapp.rb +1 -1
- data/test/test_mactypes.rb +1 -1
- data/test/test_osax.rb +1 -1
- data/test/testall.sh +1 -1
- metadata +4 -2
| @@ -0,0 +1,139 @@ | |
| 1 | 
            +
            /*
         | 
| 2 | 
            +
                File:       AESendThreadSafe.h
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                Contains:   Code to send Apple events in a thread-safe manner.
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                Written by: DTS
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                Copyright:  Copyright (c) 2007 Apple Inc. All Rights Reserved.
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc.
         | 
| 11 | 
            +
                            ("Apple") in consideration of your agreement to the following
         | 
| 12 | 
            +
                            terms, and your use, installation, modification or
         | 
| 13 | 
            +
                            redistribution of this Apple software constitutes acceptance of
         | 
| 14 | 
            +
                            these terms.  If you do not agree with these terms, please do
         | 
| 15 | 
            +
                            not use, install, modify or redistribute this Apple software.
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                            In consideration of your agreement to abide by the following
         | 
| 18 | 
            +
                            terms, and subject to these terms, Apple grants you a personal,
         | 
| 19 | 
            +
                            non-exclusive license, under Apple's copyrights in this
         | 
| 20 | 
            +
                            original Apple software (the "Apple Software"), to use,
         | 
| 21 | 
            +
                            reproduce, modify and redistribute the Apple Software, with or
         | 
| 22 | 
            +
                            without modifications, in source and/or binary forms; provided
         | 
| 23 | 
            +
                            that if you redistribute the Apple Software in its entirety and
         | 
| 24 | 
            +
                            without modifications, you must retain this notice and the
         | 
| 25 | 
            +
                            following text and disclaimers in all such redistributions of
         | 
| 26 | 
            +
                            the Apple Software. Neither the name, trademarks, service marks
         | 
| 27 | 
            +
                            or logos of Apple Inc. may be used to endorse or promote
         | 
| 28 | 
            +
                            products derived from the Apple Software without specific prior
         | 
| 29 | 
            +
                            written permission from Apple.  Except as expressly stated in
         | 
| 30 | 
            +
                            this notice, no other rights or licenses, express or implied,
         | 
| 31 | 
            +
                            are granted by Apple herein, including but not limited to any
         | 
| 32 | 
            +
                            patent rights that may be infringed by your derivative works or
         | 
| 33 | 
            +
                            by other works in which the Apple Software may be incorporated.
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                            The Apple Software is provided by Apple on an "AS IS" basis. 
         | 
| 36 | 
            +
                            APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
         | 
| 37 | 
            +
                            WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT,
         | 
| 38 | 
            +
                            MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING
         | 
| 39 | 
            +
                            THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
         | 
| 40 | 
            +
                            COMBINATION WITH YOUR PRODUCTS.
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                            IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT,
         | 
| 43 | 
            +
                            INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
         | 
| 44 | 
            +
                            TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
         | 
| 45 | 
            +
                            DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY
         | 
| 46 | 
            +
                            OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
         | 
| 47 | 
            +
                            OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY
         | 
| 48 | 
            +
                            OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR
         | 
| 49 | 
            +
                            OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF
         | 
| 50 | 
            +
                            SUCH DAMAGE.
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                Change History (most recent first):
         | 
| 53 | 
            +
             | 
| 54 | 
            +
            $Log: AESendThreadSafe.h,v $
         | 
| 55 | 
            +
            Revision 1.2  2007/02/12 11:58:43         
         | 
| 56 | 
            +
            Corrected grammo in comment.
         | 
| 57 | 
            +
             | 
| 58 | 
            +
            Revision 1.1  2007/02/09 10:55:27         
         | 
| 59 | 
            +
            First checked in.
         | 
| 60 | 
            +
             | 
| 61 | 
            +
             | 
| 62 | 
            +
            */
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            /*
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            2007/06/24 -- Modified by HAS to make AESendMessageThreadSafeSynchronous API-compatible with AESendMessage.
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            */
         | 
| 69 | 
            +
             | 
| 70 | 
            +
            #ifndef _SENDTHREADSAFE_H
         | 
| 71 | 
            +
            #define _SENDTHREADSAFE_H
         | 
| 72 | 
            +
             | 
| 73 | 
            +
            #include <ApplicationServices/ApplicationServices.h>
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            /////////////////////////////////////////////////////////////////
         | 
| 76 | 
            +
             | 
| 77 | 
            +
            /*
         | 
| 78 | 
            +
                Introduction
         | 
| 79 | 
            +
                ------------
         | 
| 80 | 
            +
                Since Mac OS X 10.2 it has been possible to synchronously send an Apple event 
         | 
| 81 | 
            +
                from a thread other than the main thread.  The technique for doing this is 
         | 
| 82 | 
            +
                documented in Technote 2053 "Mac OS X 10.2".
         | 
| 83 | 
            +
                
         | 
| 84 | 
            +
                <http://developer.apple.com/technotes/tn2002/tn2053.html>
         | 
| 85 | 
            +
                
         | 
| 86 | 
            +
                Unfortunately, this technique isn't quite right.  Specifically, due to a bug 
         | 
| 87 | 
            +
                in Apple Event Manager <rdar://problem/4976113>, it is not safe to dispose of 
         | 
| 88 | 
            +
                the Mach port (using mach_port_destroy, as documented in the technote, or, more 
         | 
| 89 | 
            +
                correctly, using mach_port_mod_refs) that you created to use as the reply port. 
         | 
| 90 | 
            +
                Doing this triggers a race condition that, very rarely, can cause the system 
         | 
| 91 | 
            +
                to destroy some other, completely unrelated, Mach port within your process.  
         | 
| 92 | 
            +
                This could cause all sorts of problems.  One common symptom is that, after 
         | 
| 93 | 
            +
                accidentally destroying the Mach port associated with a thread, your program 
         | 
| 94 | 
            +
                dies with the following message:
         | 
| 95 | 
            +
                
         | 
| 96 | 
            +
                /SourceCache/Libc/Libc-320.1.3/pthreads/pthread.c:897: failed assertion `ret == MACH_MSG_SUCCESS'
         | 
| 97 | 
            +
                
         | 
| 98 | 
            +
                The best workaround to this problem is to not dispose of the Mach port that 
         | 
| 99 | 
            +
                you use as the Apple event reply port.  If you have a limited number of 
         | 
| 100 | 
            +
                secondary threads from which you need to send Apple events, it's relatively 
         | 
| 101 | 
            +
                easy to allocate an Apple event reply port for each thread and then never 
         | 
| 102 | 
            +
                dispose it.  However, if you have general case code, it might be tricky 
         | 
| 103 | 
            +
                to track down all of the threads that send Apple events and make sure they 
         | 
| 104 | 
            +
                have reply ports.  This module was designed as a general case solution to 
         | 
| 105 | 
            +
                the problem.
         | 
| 106 | 
            +
                
         | 
| 107 | 
            +
                The module exports a single function, AESendMessageThreadSafeSynchronous, which, 
         | 
| 108 | 
            +
                as its name suggests, sends an Apple event and waits for the reply (that is, 
         | 
| 109 | 
            +
                a synchronous IPC) and is safe to call from an arbitrary thread.  It's basically 
         | 
| 110 | 
            +
                a wrapper around the system function AESendMessage, with added smarts to manage 
         | 
| 111 | 
            +
                a per-thread Apple event reply port.
         | 
| 112 | 
            +
                
         | 
| 113 | 
            +
                When <rdar://problem/4976113> is fixed, this module should be unnecessary but 
         | 
| 114 | 
            +
                benign.
         | 
| 115 | 
            +
                
         | 
| 116 | 
            +
                For information about how this works, see the comments in the implementation.
         | 
| 117 | 
            +
            */
         | 
| 118 | 
            +
             | 
| 119 | 
            +
            /////////////////////////////////////////////////////////////////
         | 
| 120 | 
            +
             | 
| 121 | 
            +
            #ifdef __cplusplus
         | 
| 122 | 
            +
                extern "C" {
         | 
| 123 | 
            +
            #endif
         | 
| 124 | 
            +
             | 
| 125 | 
            +
            OSStatus SendMessageThreadSafe(
         | 
| 126 | 
            +
            	AppleEvent *            eventPtr,
         | 
| 127 | 
            +
                AppleEvent *            replyPtr,
         | 
| 128 | 
            +
            	AESendMode              sendMode,
         | 
| 129 | 
            +
                long                    timeOutInTicks
         | 
| 130 | 
            +
            );
         | 
| 131 | 
            +
                // A thread-safe replacement for AESend.  This is very much like AESendMessage, 
         | 
| 132 | 
            +
                // except that it takes care of setting up the reply port when you use it 
         | 
| 133 | 
            +
                // from a thread other than the main thread.
         | 
| 134 | 
            +
             | 
| 135 | 
            +
            #ifdef __cplusplus
         | 
| 136 | 
            +
            }
         | 
| 137 | 
            +
            #endif
         | 
| 138 | 
            +
             | 
| 139 | 
            +
            #endif
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            #!/usr/local/bin/ruby
         | 
| 1 | 
            +
            #!/usr/local/bin/ruby -w
         | 
| 2 2 | 
             
            # Copyright (C) 2006 HAS. 
         | 
| 3 3 | 
             
            # Released under MIT License.
         | 
| 4 4 |  | 
| @@ -83,6 +83,10 @@ module AEMReference | |
| 83 83 |  | 
| 84 84 | 
             
            	class Base
         | 
| 85 85 |  | 
| 86 | 
            +
            		def initialize
         | 
| 87 | 
            +
            			@_comparable = nil
         | 
| 88 | 
            +
            		end
         | 
| 89 | 
            +
            	
         | 
| 86 90 | 
             
            		def AEM_comparable
         | 
| 87 91 | 
             
            			# called by Base#==; returns the data needed to compare two aem references
         | 
| 88 92 | 
             
            			if not @_comparable
         | 
| @@ -122,6 +126,8 @@ module AEMReference | |
| 122 126 | 
             
            		protected :_key, :_container
         | 
| 123 127 |  | 
| 124 128 | 
             
            		def initialize(container, key)
         | 
| 129 | 
            +
            			super()
         | 
| 130 | 
            +
            			@_desc = nil
         | 
| 125 131 | 
             
            			@_container = container
         | 
| 126 132 | 
             
            			@_key = key
         | 
| 127 133 | 
             
            		end
         | 
| @@ -163,7 +169,7 @@ module AEMReference | |
| 163 169 | 
             
            	class InsertionSpecifier < Specifier
         | 
| 164 170 | 
             
            		# A reference to an element insertion point.
         | 
| 165 171 |  | 
| 166 | 
            -
            		# Syntax: all_elements_ref. | 
| 172 | 
            +
            		# Syntax: all_elements_ref.beginning / all_elements_ref.end / element_ref.before / element_ref.after
         | 
| 167 173 |  | 
| 168 174 | 
             
            		def initialize(container, key, keyname)
         | 
| 169 175 | 
             
            			super(container, key)
         | 
| @@ -256,8 +262,8 @@ module AEMReference | |
| 256 262 | 
             
            			return LessOrEquals.new(self, val)
         | 
| 257 263 | 
             
            		end
         | 
| 258 264 |  | 
| 259 | 
            -
            		def  | 
| 260 | 
            -
            			return  | 
| 265 | 
            +
            		def begins_with(val)
         | 
| 266 | 
            +
            			return BeginsWith.new(self, val)
         | 
| 261 267 | 
             
            		end
         | 
| 262 268 |  | 
| 263 269 | 
             
            		def ends_with(val)
         | 
| @@ -296,8 +302,8 @@ module AEMReference | |
| 296 302 | 
             
            		# Thes can be called on any kind of element reference, and also on property references where the 
         | 
| 297 303 | 
             
            		# property represents a one-to-one relationship, e.g. textedit.documents[1].text.end is valid
         | 
| 298 304 |  | 
| 299 | 
            -
            		def  | 
| 300 | 
            -
            			return InsertionSpecifier.new(self, Beginning, : | 
| 305 | 
            +
            		def beginning
         | 
| 306 | 
            +
            			return InsertionSpecifier.new(self, Beginning, :beginning)
         | 
| 301 307 | 
             
            		end
         | 
| 302 308 |  | 
| 303 309 | 
             
            		def end
         | 
| @@ -591,18 +597,12 @@ module AEMReference | |
| 591 597 | 
             
            		# Syntax: elements_ref.by_filter(test)
         | 
| 592 598 |  | 
| 593 599 | 
             
            		# The test argument is a Test object constructed from an its-based reference.
         | 
| 594 | 
            -
            		# For convenience, an its-based reference can also be passed directly - this will
         | 
| 595 | 
            -
            		# be expanded to a Boolean equality test, e.g. AEM.its.visible -> AEM.its.visible.eq(true)
         | 
| 596 600 |  | 
| 597 601 | 
             
            		KeyForm = AEMReference.pack_enum(KAE::FormTest)
         | 
| 598 602 |  | 
| 599 603 | 
             
            		def initialize(wantcode, container, key)
         | 
| 600 604 | 
             
            			if not key.is_a?(Test)
         | 
| 601 | 
            -
            				 | 
| 602 | 
            -
            					key = key.eq(true)
         | 
| 603 | 
            -
            				else
         | 
| 604 | 
            -
            					raise TypeError, "Bad selector: not a test (its) based specifier: #{key.inspect}"
         | 
| 605 | 
            -
            				end
         | 
| 605 | 
            +
            				raise TypeError, "Bad selector: not a test (its) based specifier: #{key.inspect}"
         | 
| 606 606 | 
             
            			end
         | 
| 607 607 | 
             
            			super(wantcode, container.AEM_true_self, key)
         | 
| 608 608 | 
             
            		end
         | 
| @@ -730,6 +730,7 @@ module AEMReference | |
| 730 730 |  | 
| 731 731 | 
             
            	class DeferredSpecifier < Base
         | 
| 732 732 | 
             
            		def initialize(desc, codecs)
         | 
| 733 | 
            +
            			@_ref = nil
         | 
| 733 734 | 
             
            			@_desc = desc
         | 
| 734 735 | 
             
            			@_codecs   = codecs
         | 
| 735 736 | 
             
            		end
         | 
| @@ -792,6 +793,7 @@ module AEMReference | |
| 792 793 | 
             
            		protected :_operand1, :_operand2
         | 
| 793 794 |  | 
| 794 795 | 
             
            		def initialize(operand1, operand2)
         | 
| 796 | 
            +
            			super()
         | 
| 795 797 | 
             
            			@_operand1 = operand1
         | 
| 796 798 | 
             
            			@_operand2 = operand2
         | 
| 797 799 | 
             
            		end
         | 
| @@ -851,8 +853,8 @@ module AEMReference | |
| 851 853 | 
             
            		Operator = AEMReference.pack_enum(KAE::KAELessThanEquals)
         | 
| 852 854 | 
             
            	end
         | 
| 853 855 |  | 
| 854 | 
            -
            	class  | 
| 855 | 
            -
            		Name = : | 
| 856 | 
            +
            	class BeginsWith < ComparisonTest
         | 
| 857 | 
            +
            		Name = :begins_with
         | 
| 856 858 | 
             
            		Operator = AEMReference.pack_enum(KAE::KAEBeginsWith)
         | 
| 857 859 | 
             
            	end
         | 
| 858 860 |  | 
| @@ -886,6 +888,7 @@ module AEMReference | |
| 886 888 | 
             
            		protected :_operands
         | 
| 887 889 |  | 
| 888 890 | 
             
            		def initialize(operands)
         | 
| 891 | 
            +
            			super()
         | 
| 889 892 | 
             
            			@_operands = operands
         | 
| 890 893 | 
             
            		end
         | 
| 891 894 |  | 
| @@ -942,6 +945,7 @@ module AEMReference | |
| 942 945 | 
             
            	class ReferenceRoot < PositionSpecifier
         | 
| 943 946 |  | 
| 944 947 | 
             
            		def initialize
         | 
| 948 | 
            +
            			super(nil, nil, nil)
         | 
| 945 949 | 
             
            		end
         | 
| 946 950 |  | 
| 947 951 | 
             
            		def to_s
         | 
| @@ -968,7 +972,7 @@ module AEMReference | |
| 968 972 | 
             
            	class ApplicationRoot < ReferenceRoot
         | 
| 969 973 | 
             
            		# Reference base; represents an application's application object. Used to construct full references.
         | 
| 970 974 |  | 
| 971 | 
            -
            		# Syntax: app
         | 
| 975 | 
            +
            		# Syntax: AEM.app
         | 
| 972 976 |  | 
| 973 977 | 
             
            		Name = :app
         | 
| 974 978 | 
             
            		Type = AE::AEDesc.new(KAE::TypeNull, '')
         | 
| @@ -978,7 +982,7 @@ module AEMReference | |
| 978 982 | 
             
            	class CurrentContainer < ReferenceRoot
         | 
| 979 983 | 
             
            		# Reference base; represents elements' container object. Used to construct by-range references.
         | 
| 980 984 |  | 
| 981 | 
            -
            		# Syntax: con
         | 
| 985 | 
            +
            		# Syntax: AEM.con
         | 
| 982 986 |  | 
| 983 987 | 
             
            		Name = :con
         | 
| 984 988 | 
             
            		Type = AE::AEDesc.new(KAE::TypeCurrentContainer, '')
         | 
| @@ -988,13 +992,37 @@ module AEMReference | |
| 988 992 | 
             
            	class ObjectBeingExamined < ReferenceRoot
         | 
| 989 993 | 
             
            		# Reference base; represents an element to be tested. Used to construct by-filter references.
         | 
| 990 994 |  | 
| 991 | 
            -
            		# Syntax: its
         | 
| 995 | 
            +
            		# Syntax: AEM.its
         | 
| 992 996 |  | 
| 993 997 | 
             
            		Name = :its
         | 
| 994 998 | 
             
            		Type = AE::AEDesc.new(KAE::TypeObjectBeingExamined, '')
         | 
| 995 999 | 
             
            	end
         | 
| 996 1000 |  | 
| 997 1001 |  | 
| 1002 | 
            +
            	class CustomRoot < ReferenceRoot
         | 
| 1003 | 
            +
            		# Reference base; represents an arbitrary root object, e.g. an AEAddressDesc in a fully qualified reference
         | 
| 1004 | 
            +
            		
         | 
| 1005 | 
            +
            		# Syntax: AEM.custom_root(value)
         | 
| 1006 | 
            +
            		
         | 
| 1007 | 
            +
            		def initialize(value)
         | 
| 1008 | 
            +
            			@value = value
         | 
| 1009 | 
            +
            			super()
         | 
| 1010 | 
            +
            		end
         | 
| 1011 | 
            +
            		
         | 
| 1012 | 
            +
            		def to_s
         | 
| 1013 | 
            +
            			return "AEM.custom_root(#{@value.inspect})"
         | 
| 1014 | 
            +
            		end
         | 
| 1015 | 
            +
            		
         | 
| 1016 | 
            +
            		def _pack_self(codecs)
         | 
| 1017 | 
            +
            			return codecs.pack(@value)
         | 
| 1018 | 
            +
            		end
         | 
| 1019 | 
            +
            		
         | 
| 1020 | 
            +
            		def AEM_resolve(obj)
         | 
| 1021 | 
            +
            			return obj.send(:custom_root, @value)
         | 
| 1022 | 
            +
            		end
         | 
| 1023 | 
            +
            	end
         | 
| 1024 | 
            +
            	
         | 
| 1025 | 
            +
            	
         | 
| 998 1026 | 
             
            	###################################
         | 
| 999 1027 | 
             
            	# Reference root objects; used to construct new specifiers, e.g. AEM.app.property('pnam')
         | 
| 1000 1028 |  | 
    
        data/src/lib/_aem/codecs.rb
    CHANGED
    
    | @@ -138,7 +138,7 @@ class Codecs | |
| 138 138 | 
             
            		# e.g. Adobe apps define additional unit types (ciceros, pixels, etc.)
         | 
| 139 139 | 
             
            		@unit_type_codecs.add_types(type_defs)
         | 
| 140 140 | 
             
            	end
         | 
| 141 | 
            -
             | 
| 141 | 
            +
             | 
| 142 142 | 
             
            	######################################################################
         | 
| 143 143 | 
             
            	# Subclasses could override these to provide their own reference roots if needed
         | 
| 144 144 |  | 
| @@ -151,6 +151,7 @@ class Codecs | |
| 151 151 |  | 
| 152 152 | 
             
            	SInt32Bounds = (-2**31)..(2**31-1)
         | 
| 153 153 | 
             
            	SInt64Bounds = (-2**63)..(2**63-1)
         | 
| 154 | 
            +
            	UInt64Bounds = (2**63)..(2**64-1)
         | 
| 154 155 |  | 
| 155 156 | 
             
            	NullDesc = AE::AEDesc.new(KAE::TypeNull, '')
         | 
| 156 157 | 
             
            	TrueDesc = AE::AEDesc.new(KAE::TypeTrue, '')
         | 
| @@ -218,6 +219,8 @@ class Codecs | |
| 218 219 | 
             
            					AE::AEDesc.new(KAE::TypeSInt32, [val].pack('l')) 
         | 
| 219 220 | 
             
            				elsif SInt64Bounds === val
         | 
| 220 221 | 
             
            					AE::AEDesc.new(KAE::TypeSInt64, [val].pack('q'))
         | 
| 222 | 
            +
            				elsif UInt64Bounds === val
         | 
| 223 | 
            +
            					pack_uint64(val)
         | 
| 221 224 | 
             
            				else
         | 
| 222 225 | 
             
            					AE::AEDesc.new(KAE::TypeFloat, [val.to_f].pack('d'))
         | 
| 223 226 | 
             
            				end
         | 
| @@ -235,6 +238,16 @@ class Codecs | |
| 235 238 |  | 
| 236 239 | 
             
            	#######
         | 
| 237 240 |  | 
| 241 | 
            +
            	def pack_uint64(val) 
         | 
| 242 | 
            +
            		# On 10.5+, clients could override this method to do a non-lossy conversion,
         | 
| 243 | 
            +
            		# (assuming target app knows how to handle new UInt64 type):
         | 
| 244 | 
            +
            		#
         | 
| 245 | 
            +
            		# def pack_uint64(val)
         | 
| 246 | 
            +
            		# 	AE::AEDesc.new(KAE::TypeUInt64, [val.to_f].pack('Q'))
         | 
| 247 | 
            +
            		# end
         | 
| 248 | 
            +
            		AE::AEDesc.new(KAE::TypeFloat, [val.to_f].pack('d')) # pack as 64-bit float for compatibility (lossy conversion)
         | 
| 249 | 
            +
            	end
         | 
| 250 | 
            +
            	
         | 
| 238 251 | 
             
            	def pack_array(val)
         | 
| 239 252 | 
             
            		lst = AE::AEDesc.new_list(false)
         | 
| 240 253 | 
             
            		val.each do |item|
         | 
| @@ -352,6 +365,9 @@ class Codecs | |
| 352 365 | 
             
            				"#{vers}.#{subvers}.#{patch}"
         | 
| 353 366 |  | 
| 354 367 | 
             
            			when KAE::TypeBoolean then desc.data != "\000"
         | 
| 368 | 
            +
            			
         | 
| 369 | 
            +
            			when KAE::TypeUInt16 then desc.data.unpack('S')[0] # 10.5+
         | 
| 370 | 
            +
            			when KAE::TypeUInt64 then desc.data.unpack('Q')[0] # 10.5+
         | 
| 355 371 | 
             
            		else
         | 
| 356 372 | 
             
            			did_unpack, val = @unit_type_codecs.unpack(desc)
         | 
| 357 373 | 
             
            			if did_unpack
         | 
| @@ -427,7 +443,7 @@ class Codecs | |
| 427 443 | 
             
            	InsertionLocEnums = {
         | 
| 428 444 | 
             
            			Codecs.four_char_code(KAE::KAEBefore) => 'before', 
         | 
| 429 445 | 
             
            			Codecs.four_char_code(KAE::KAEAfter) => 'after', 
         | 
| 430 | 
            -
            			Codecs.four_char_code(KAE::KAEBeginning) => ' | 
| 446 | 
            +
            			Codecs.four_char_code(KAE::KAEBeginning) => 'beginning',
         | 
| 431 447 | 
             
            			Codecs.four_char_code(KAE::KAEEnd) => 'end',
         | 
| 432 448 | 
             
            			}
         | 
| 433 449 |  | 
| @@ -437,7 +453,7 @@ class Codecs | |
| 437 453 | 
             
            			Codecs.four_char_code(KAE::KAEEquals) => 'eq',
         | 
| 438 454 | 
             
            			Codecs.four_char_code(KAE::KAELessThan) => 'lt',
         | 
| 439 455 | 
             
            			Codecs.four_char_code(KAE::KAELessThanEquals) => 'le',
         | 
| 440 | 
            -
            			Codecs.four_char_code(KAE::KAEBeginsWith) => ' | 
| 456 | 
            +
            			Codecs.four_char_code(KAE::KAEBeginsWith) => 'begins_with',
         | 
| 441 457 | 
             
            			Codecs.four_char_code(KAE::KAEEndsWith) => 'ends_with',
         | 
| 442 458 | 
             
            			Codecs.four_char_code(KAE::KAEContains) => 'contains',
         | 
| 443 459 | 
             
            			}
         | 
    
        data/src/lib/_aem/mactypes.rb
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            #!/usr/local/bin/ruby
         | 
| 1 | 
            +
            #!/usr/local/bin/ruby -w
         | 
| 2 2 | 
             
            # Copyright (C) 2006 HAS. 
         | 
| 3 3 | 
             
            # Released under MIT License.
         | 
| 4 4 |  | 
| @@ -61,7 +61,6 @@ module MacTypes | |
| 61 61 | 
             
            		#
         | 
| 62 62 | 
             
            		# Since Ruby doesn't already bridge the Mac OS's Alias Manager, simplest solution is to always store data internally as an AEDesc of typeAlias, and convert this to other forms on demand (e.g. when casting to string).
         | 
| 63 63 |  | 
| 64 | 
            -
            		attr_reader :desc
         | 
| 65 64 | 
             
            		private_class_method :new
         | 
| 66 65 |  | 
| 67 66 | 
             
            		def initialize(desc)
         | 
| @@ -89,10 +88,7 @@ module MacTypes | |
| 89 88 |  | 
| 90 89 | 
             
            		# Methods
         | 
| 91 90 |  | 
| 92 | 
            -
            		 | 
| 93 | 
            -
            			# Return AEDesc of typeAlias. If clients want a different type, they can subsequently call this AEDesc's coerce method.
         | 
| 94 | 
            -
            			return @desc
         | 
| 95 | 
            -
            		end
         | 
| 91 | 
            +
            		attr_reader :desc # Return AEDesc of typeAlias. If clients want a different type, they can subsequently call this AEDesc's coerce method.
         | 
| 96 92 |  | 
| 97 93 | 
             
            		def url
         | 
| 98 94 | 
             
            			# Get as URL string.
         | 
    
        data/src/lib/_aem/send.rb
    CHANGED
    
    | @@ -160,7 +160,7 @@ module Send | |
| 160 160 |  | 
| 161 161 | 
             
            		def _send_apple_event(flags, timeout)
         | 
| 162 162 | 
             
            			# Hook method; may be overridden to customise how events are sent.
         | 
| 163 | 
            -
            			return @AEM_event. | 
| 163 | 
            +
            			return @AEM_event.send_thread_safe(flags, timeout)
         | 
| 164 164 | 
             
            		end
         | 
| 165 165 |  | 
| 166 166 | 
             
            		def inspect
         | 
| @@ -10,7 +10,7 @@ module TypeWrappers | |
| 10 10 |  | 
| 11 11 | 
             
            		def initialize(code)
         | 
| 12 12 | 
             
            			if not (code.is_a?(String) and code.length == 4)
         | 
| 13 | 
            -
            				raise ArgumentError, "Code must be a four-character string: #{code}"
         | 
| 13 | 
            +
            				raise ArgumentError, "Code must be a four-character string: #{code.inspect}"
         | 
| 14 14 | 
             
            			end
         | 
| 15 15 | 
             
            			@code = code
         | 
| 16 16 | 
             
            		end
         | 
| @@ -26,7 +26,7 @@ module TypeWrappers | |
| 26 26 | 
             
            		alias_method :eql?, :== 
         | 
| 27 27 |  | 
| 28 28 | 
             
            		def to_s
         | 
| 29 | 
            -
            			return "AEM::#{self.class::Name}.new(#{@code. | 
| 29 | 
            +
            			return "AEM::#{self.class::Name}.new(#{@code.inspect})"
         | 
| 30 30 | 
             
            		end
         | 
| 31 31 |  | 
| 32 32 | 
             
            		def inspect
         | 
| @@ -75,6 +75,12 @@ class ReferenceRenderer | |
| 75 75 |  | 
| 76 76 | 
             
            	##
         | 
| 77 77 |  | 
| 78 | 
            +
            	def custom_root(value)
         | 
| 79 | 
            +
            		app
         | 
| 80 | 
            +
            		@result += ".AS_new_reference(#{value.inspect})"
         | 
| 81 | 
            +
            		return self
         | 
| 82 | 
            +
            	end
         | 
| 83 | 
            +
            	
         | 
| 78 84 | 
             
            	def app
         | 
| 79 85 | 
             
            		case @_app_data.constructor
         | 
| 80 86 | 
             
            			when :current
         | 
| @@ -99,8 +105,8 @@ class ReferenceRenderer | |
| 99 105 |  | 
| 100 106 | 
             
            	##
         | 
| 101 107 |  | 
| 102 | 
            -
            	def  | 
| 103 | 
            -
            		@result += ". | 
| 108 | 
            +
            	def beginning
         | 
| 109 | 
            +
            		@result += ".beginning"
         | 
| 104 110 | 
             
            		return self
         | 
| 105 111 | 
             
            	end
         | 
| 106 112 |  | 
| @@ -173,8 +179,8 @@ class ReferenceRenderer | |
| 173 179 | 
             
            		return self
         | 
| 174 180 | 
             
            	end
         | 
| 175 181 |  | 
| 176 | 
            -
            	def  | 
| 177 | 
            -
            		@result += ". | 
| 182 | 
            +
            	def begins_with(val)
         | 
| 183 | 
            +
            		@result += ".begins_with(#{_format(val)})"
         | 
| 178 184 | 
             
            		return self
         | 
| 179 185 | 
             
            	end
         | 
| 180 186 |  |