rb-appscript 0.2.1 → 0.3.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 +59 -0
- data/LICENSE +65 -0
- data/README +1 -1
- data/TODO +13 -13
- data/doc/aem-manual/04_references.html +13 -13
- data/doc/aem-manual/05_targettingapplications.html +7 -5
- data/doc/aem-manual/06_buildingandsendingevents.html +1 -1
- data/doc/aem-manual/08_examples.html +6 -6
- data/doc/aem-manual/index.html +3 -4
- data/doc/appscript-manual/02_aboutappscripting.html +2 -10
- data/doc/appscript-manual/04_gettinghelp.html +32 -18
- data/doc/appscript-manual/05_keywordconversion.html +7 -7
- data/doc/appscript-manual/06_classesandenums.html +2 -21
- data/doc/appscript-manual/07_applicationobjects.html +11 -2
- data/doc/appscript-manual/08_realvsgenericreferences.html +1 -1
- data/doc/appscript-manual/09_referenceforms.html +13 -13
- data/doc/appscript-manual/10_referenceexamples.html +7 -7
- data/doc/appscript-manual/11_applicationcommands.html +30 -28
- data/doc/appscript-manual/13_performanceissues.html +3 -3
- data/doc/appscript-manual/{15_notes.html → 14_notes.html} +18 -13
- data/doc/appscript-manual/full.css +1 -2
- data/doc/appscript-manual/index.html +3 -4
- data/doc/index.html +2 -1
- data/doc/mactypes-manual/index.html +23 -13
- data/doc/osax-manual/index.html +27 -5
- data/rb-appscript.gemspec +1 -1
- data/sample/AB_list_people_with_emails.rb +2 -1
- data/sample/Add_iCal_event.rb +18 -0
- data/sample/Export_Address_Book_phone_numbers.rb +56 -0
- data/sample/Hello_world.rb +9 -1
- data/sample/Select_all_HTML_files.rb +4 -2
- data/sample/iTunes_top40_to_html.rb +7 -4
- data/src/lib/_aem/aemreference.rb +50 -51
- data/src/lib/_aem/codecs.rb +148 -178
- data/src/lib/_aem/connect.rb +0 -2
- data/src/lib/_aem/findapp.rb +1 -1
- data/src/lib/_aem/mactypes.rb +2 -9
- data/src/lib/_aem/send.rb +2 -2
- data/src/lib/_appscript/defaultterminology.rb +2 -2
- data/src/lib/_appscript/referencerenderer.rb +119 -14
- data/src/lib/_appscript/reservedkeywords.rb +5 -0
- data/src/lib/_appscript/safeobject.rb +190 -0
- data/src/lib/_appscript/terminology.rb +195 -90
- data/src/lib/aem.rb +8 -9
- data/src/lib/appscript.rb +175 -159
- data/src/lib/osax.rb +65 -29
- data/src/rbae.c +42 -2
- data/test/test_aemreference.rb +3 -3
- data/test/test_appscriptcommands.rb +135 -0
- data/test/test_appscriptreference.rb +10 -8
- data/test/test_mactypes.rb +7 -1
- data/test/test_osax.rb +57 -0
- data/test/testall.sh +2 -1
- metadata +10 -9
- data/doc/aem-manual/09_notes.html +0 -41
- data/doc/appscript-manual/14_problemapps.html +0 -192
- data/misc/adobeunittypes.rb +0 -14
- data/misc/dump.rb +0 -72
- data/rb-appscript-0.2.0.gem +0 -0
data/src/lib/_aem/codecs.rb
CHANGED
@@ -56,7 +56,7 @@ class UnitTypeCodecs
|
|
56
56
|
[:degrees_Kelvin, KAE::TypeDegreesK],
|
57
57
|
]
|
58
58
|
|
59
|
-
DefaultPacker = proc { |
|
59
|
+
DefaultPacker = proc { |units, code| AE::AEDesc.new(code, [units.value].pack('d')) }
|
60
60
|
DefaultUnpacker = proc { |desc, name| MacTypes::Units.new(desc.data.unpack('d')[0], name) }
|
61
61
|
|
62
62
|
def initialize
|
@@ -69,7 +69,7 @@ class UnitTypeCodecs
|
|
69
69
|
# type_defs is a list of lists, where each sublist is of form:
|
70
70
|
# [typename, typecode, packproc, unpackproc]
|
71
71
|
# or:
|
72
|
-
# [typename, typecode
|
72
|
+
# [typename, typecode]
|
73
73
|
# If optional packproc and unpackproc are omitted, default pack/unpack procs
|
74
74
|
# are used instead; these pack/unpack AEDesc data as a double precision float.
|
75
75
|
type_defs.each do |name, code, packer, unpacker|
|
@@ -81,7 +81,7 @@ class UnitTypeCodecs
|
|
81
81
|
def pack(val)
|
82
82
|
if val.is_a?(MacTypes::Units)
|
83
83
|
code, packer = @type_by_name.fetch(val.type) { |val| raise IndexError, "Unknown unit type: #{val.inspect}" }
|
84
|
-
return [true, packer.call(val
|
84
|
+
return [true, packer.call(val, code)]
|
85
85
|
else
|
86
86
|
return [false, val]
|
87
87
|
end
|
@@ -166,19 +166,9 @@ class Codecs
|
|
166
166
|
def pack(val) # clients may override this to replace existing packers
|
167
167
|
case val
|
168
168
|
when AEMReference::Base then val.AEM_pack_self(self)
|
169
|
-
|
170
|
-
when TrueClass then TrueDesc
|
171
|
-
when FalseClass then FalseDesc
|
169
|
+
|
172
170
|
when Fixnum then AE::AEDesc.new(KAE::TypeSInt32, [val].pack('l'))
|
173
|
-
|
174
|
-
if SInt32Bounds === val
|
175
|
-
AE::AEDesc.new(KAE::TypeSInt32, [val].pack('l'))
|
176
|
-
elsif SInt64Bounds === val
|
177
|
-
AE::AEDesc.new(KAE::TypeSInt64, [val].pack('q'))
|
178
|
-
else
|
179
|
-
AE::AEDesc.new(KAE::TypeFloat, [val.to_f].pack('d'))
|
180
|
-
end
|
181
|
-
when Float then AE::AEDesc.new(KAE::TypeFloat, [val].pack('d'))
|
171
|
+
|
182
172
|
when String then
|
183
173
|
begin
|
184
174
|
# Note: while typeUnicodeText is deprecated (see AEDataModel.h), it's still the
|
@@ -197,12 +187,21 @@ class Codecs
|
|
197
187
|
raise
|
198
188
|
end
|
199
189
|
end
|
190
|
+
|
191
|
+
when TrueClass then TrueDesc
|
192
|
+
when FalseClass then FalseDesc
|
193
|
+
|
194
|
+
when Float then AE::AEDesc.new(KAE::TypeFloat, [val].pack('d'))
|
195
|
+
|
200
196
|
when Time
|
201
197
|
AE::AEDesc.new(KAE::TypeLongDateTime,
|
202
198
|
[AE.convert_unix_seconds_to_long_date_time(val.to_i)].pack('q'))
|
199
|
+
|
203
200
|
when Array then pack_array(val)
|
204
201
|
when Hash then pack_hash(val)
|
202
|
+
|
205
203
|
when MacTypes::FileBase then val.desc
|
204
|
+
|
206
205
|
when TypeWrappers::AEType then
|
207
206
|
AE::AEDesc.new(KAE::TypeType, Codecs.four_char_code(val.code))
|
208
207
|
when TypeWrappers::AEEnum then
|
@@ -211,7 +210,19 @@ class Codecs
|
|
211
210
|
AE::AEDesc.new(KAE::TypeProperty, Codecs.four_char_code(val.code))
|
212
211
|
when TypeWrappers::AEKey then
|
213
212
|
AE::AEDesc.new(KAE::TypeKeyword, Codecs.four_char_code(val.code))
|
213
|
+
|
214
214
|
when AE::AEDesc then val
|
215
|
+
|
216
|
+
when Bignum
|
217
|
+
if SInt32Bounds === val
|
218
|
+
AE::AEDesc.new(KAE::TypeSInt32, [val].pack('l'))
|
219
|
+
elsif SInt64Bounds === val
|
220
|
+
AE::AEDesc.new(KAE::TypeSInt64, [val].pack('q'))
|
221
|
+
else
|
222
|
+
AE::AEDesc.new(KAE::TypeFloat, [val.to_f].pack('d'))
|
223
|
+
end
|
224
|
+
|
225
|
+
when NilClass then NullDesc
|
215
226
|
else
|
216
227
|
did_pack, desc = @unit_type_codecs.pack(val)
|
217
228
|
if did_pack
|
@@ -237,7 +248,7 @@ class Codecs
|
|
237
248
|
usrf = nil
|
238
249
|
val.each do | key, value |
|
239
250
|
if key.is_a?(TypeWrappers::AETypeBase)
|
240
|
-
if key.code ==
|
251
|
+
if key.code == KAE::PClass # AS packs records that contain a 'class' property by coercing the packed record to that type at the end
|
241
252
|
begin
|
242
253
|
record = record.coerce(value.code)
|
243
254
|
rescue
|
@@ -255,7 +266,7 @@ class Codecs
|
|
255
266
|
end
|
256
267
|
end
|
257
268
|
if usrf
|
258
|
-
record.put_param(
|
269
|
+
record.put_param(KAE::KeyASUserRecordFields, usrf)
|
259
270
|
end
|
260
271
|
return record
|
261
272
|
end
|
@@ -266,7 +277,7 @@ class Codecs
|
|
266
277
|
def unpack_unknown(desc) # clients may override this to provide additional unpackers
|
267
278
|
if desc.is_record? # if it's a record-like structure with an unknown/unsupported type then unpack it as a hash, including the original type info as a 'class' property
|
268
279
|
rec = desc.coerce(KAE::TypeAERecord)
|
269
|
-
rec.put_param(
|
280
|
+
rec.put_param(KAE::PClass, pack(TypeWrappers::AEType.new(desc.type)))
|
270
281
|
unpack(rec)
|
271
282
|
else # else return unchanged
|
272
283
|
desc
|
@@ -277,37 +288,24 @@ class Codecs
|
|
277
288
|
def unpack(desc) # clients may override this to replace existing unpackers
|
278
289
|
return case desc.type
|
279
290
|
|
280
|
-
when KAE::
|
281
|
-
when KAE::TypeBoolean then desc.data != "\000"
|
282
|
-
when KAE::TypeFalse then false
|
283
|
-
when KAE::TypeTrue then true
|
291
|
+
when KAE::TypeObjectSpecifier then unpack_object_specifier(desc)
|
284
292
|
|
285
|
-
when KAE::TypeSInt16 then desc.data.unpack('s')[0]
|
286
293
|
when KAE::TypeSInt32 then desc.data.unpack('l')[0]
|
287
|
-
when KAE::TypeUInt32 then desc.data.unpack('L')[0]
|
288
|
-
when KAE::TypeSInt64 then desc.data.unpack('q')[0]
|
289
|
-
when KAE::TypeIEEE32BitFloatingPoint then desc.data.unpack('f')[0]
|
290
294
|
when KAE::TypeIEEE64BitFloatingPoint then desc.data.unpack('d')[0]
|
291
|
-
when KAE::Type128BitFloatingPoint then
|
292
|
-
desc.coerce(KAE::TypeIEEE64BitFloatingPoint).data.unpack('d')[0]
|
293
295
|
|
294
|
-
when KAE::TypeUTF8Text then desc.data
|
295
296
|
when
|
296
297
|
KAE::TypeUnicodeText,
|
297
298
|
KAE::TypeChar,
|
298
299
|
KAE::TypeIntlText,
|
299
300
|
KAE::TypeUTF16ExternalRepresentation,
|
300
|
-
KAE::TypeStyledText
|
301
|
-
KAE::TypeStyledUnicodeText
|
301
|
+
KAE::TypeStyledText
|
302
302
|
desc.coerce(KAE::TypeUTF8Text).data
|
303
|
+
|
304
|
+
when KAE::TypeFalse then false
|
305
|
+
when KAE::TypeTrue then true
|
303
306
|
|
304
307
|
when KAE::TypeLongDateTime then
|
305
308
|
Time.at(AE.convert_long_date_time_to_unix_seconds(desc.data.unpack('q')[0]))
|
306
|
-
|
307
|
-
when KAE::TypeVersion
|
308
|
-
vers, lo = desc.data.unpack('CC')
|
309
|
-
subvers, patch = lo.divmod(16)
|
310
|
-
"#{vers}.#{subvers}.#{patch}"
|
311
309
|
|
312
310
|
when KAE::TypeAEList then unpack_aelist(desc)
|
313
311
|
when KAE::TypeAERecord then unpack_aerecord(desc)
|
@@ -319,26 +317,41 @@ class Codecs
|
|
319
317
|
KAE::TypeFSS
|
320
318
|
MacTypes::FileURL.desc(desc)
|
321
319
|
|
322
|
-
when KAE::TypeQDPoint then desc.data.unpack('ss').reverse
|
323
|
-
when KAE::TypeQDRectangle then
|
324
|
-
x1, y1, x2, y2 = desc.data.unpack('ssss')
|
325
|
-
[y1, x1, y2, x2]
|
326
|
-
when KAE::TypeRGBColor then desc.data.unpack('SSS')
|
327
|
-
|
328
320
|
when KAE::TypeType then unpack_type(desc)
|
329
321
|
when KAE::TypeEnumerated then unpack_enumerated(desc)
|
330
322
|
when KAE::TypeProperty then unpack_property(desc)
|
331
323
|
when KAE::TypeKeyword then unpack_keyword(desc)
|
332
324
|
|
325
|
+
when KAE::TypeSInt16 then desc.data.unpack('s')[0]
|
326
|
+
when KAE::TypeUInt32 then desc.data.unpack('L')[0]
|
327
|
+
when KAE::TypeSInt64 then desc.data.unpack('q')[0]
|
328
|
+
|
329
|
+
when KAE::TypeNull then nil
|
330
|
+
|
331
|
+
when KAE::TypeUTF8Text then desc.data
|
332
|
+
|
333
333
|
when KAE::TypeInsertionLoc then unpack_insertion_loc(desc)
|
334
|
-
when KAE::TypeObjectSpecifier then unpack_object_specifier(desc)
|
335
|
-
when KAE::TypeAbsoluteOrdinal then unpack_absolute_ordinal(desc)
|
336
334
|
when KAE::TypeCurrentContainer then unpack_current_container(desc)
|
337
335
|
when KAE::TypeObjectBeingExamined then unpack_object_being_examined(desc)
|
338
336
|
when KAE::TypeCompDescriptor then unpack_comp_descriptor(desc)
|
339
337
|
when KAE::TypeLogicalDescriptor then unpack_logical_descriptor(desc)
|
340
|
-
when KAE::TypeRangeDescriptor then unpack_range_descriptor(desc)
|
341
338
|
|
339
|
+
when KAE::TypeIEEE32BitFloatingPoint then desc.data.unpack('f')[0]
|
340
|
+
when KAE::Type128BitFloatingPoint then
|
341
|
+
desc.coerce(KAE::TypeIEEE64BitFloatingPoint).data.unpack('d')[0]
|
342
|
+
|
343
|
+
when KAE::TypeQDPoint then desc.data.unpack('ss').reverse
|
344
|
+
when KAE::TypeQDRectangle then
|
345
|
+
x1, y1, x2, y2 = desc.data.unpack('ssss')
|
346
|
+
[y1, x1, y2, x2]
|
347
|
+
when KAE::TypeRGBColor then desc.data.unpack('SSS')
|
348
|
+
|
349
|
+
when KAE::TypeVersion
|
350
|
+
vers, lo = desc.data.unpack('CC')
|
351
|
+
subvers, patch = lo.divmod(16)
|
352
|
+
"#{vers}.#{subvers}.#{patch}"
|
353
|
+
|
354
|
+
when KAE::TypeBoolean then desc.data != "\000"
|
342
355
|
else
|
343
356
|
did_unpack, val = @unit_type_codecs.unpack(desc)
|
344
357
|
if did_unpack
|
@@ -354,7 +367,7 @@ class Codecs
|
|
354
367
|
def unpack_aelist(desc)
|
355
368
|
lst = []
|
356
369
|
desc.length().times do |i|
|
357
|
-
lst.push(unpack(desc.
|
370
|
+
lst.push(unpack(desc.get_item(i + 1, KAE::TypeWildCard)[1]))
|
358
371
|
end
|
359
372
|
return lst
|
360
373
|
end
|
@@ -362,8 +375,8 @@ class Codecs
|
|
362
375
|
def unpack_aerecord(desc)
|
363
376
|
dct = {}
|
364
377
|
desc.length().times do |i|
|
365
|
-
key, value = desc.
|
366
|
-
if key ==
|
378
|
+
key, value = desc.get_item(i + 1, KAE::TypeWildCard)
|
379
|
+
if key == KAE::KeyASUserRecordFields
|
367
380
|
lst = unpack_aelist(value)
|
368
381
|
(lst.length / 2).times do |i|
|
369
382
|
dct[lst[i * 2]] = lst[i * 2 + 1]
|
@@ -394,51 +407,22 @@ class Codecs
|
|
394
407
|
end
|
395
408
|
|
396
409
|
#######
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
class Ordinal
|
407
|
-
attr_reader :code
|
408
|
-
|
409
|
-
def initialize(code)
|
410
|
-
@code = code
|
411
|
-
end
|
412
|
-
end
|
413
|
-
|
414
|
-
def _desc_to_hash(desc)
|
415
|
-
desc = desc.coerce(KAE::TypeAERecord)
|
416
|
-
h = {}
|
417
|
-
desc.length.times do |i|
|
418
|
-
k, v = desc.get(i + 1, KAE::TypeWildCard)
|
419
|
-
h[k] = v
|
420
|
-
end
|
421
|
-
return h
|
422
|
-
end
|
423
|
-
|
424
|
-
#######
|
425
|
-
|
426
|
-
FullUnpackOrdinals = {
|
427
|
-
KAE::KAEFirst => 'first',
|
428
|
-
KAE::KAELast => 'last',
|
429
|
-
KAE::KAEMiddle => 'middle',
|
430
|
-
KAE::KAEAny => 'any',
|
410
|
+
# Lookup tables for converting enumerator, ordinal codes to aem reference method names.
|
411
|
+
# Used by unpack_object_specifier, fully_unpack_object_specifier to construct aem references.
|
412
|
+
|
413
|
+
AbsoluteOrdinals = {
|
414
|
+
Codecs.four_char_code(KAE::KAEFirst) => 'first',
|
415
|
+
Codecs.four_char_code(KAE::KAELast) => 'last',
|
416
|
+
Codecs.four_char_code(KAE::KAEMiddle) => 'middle',
|
417
|
+
Codecs.four_char_code(KAE::KAEAny) => 'any',
|
431
418
|
}
|
432
419
|
|
433
|
-
|
434
|
-
KAE::KAEFirst => ['first', AEMReference::MultipleElements::First],
|
435
|
-
KAE::KAELast => ['last', AEMReference::MultipleElements::Last],
|
436
|
-
KAE::KAEMiddle => ['middle', AEMReference::MultipleElements::Middle],
|
437
|
-
KAE::KAEAny => ['any', AEMReference::MultipleElements::Any],
|
438
|
-
}
|
420
|
+
AllAbsoluteOrdinal = Codecs.four_char_code(KAE::KAEAll)
|
439
421
|
|
440
|
-
|
441
|
-
|
422
|
+
RelativePositionEnums = {
|
423
|
+
Codecs.four_char_code(KAE::KAEPrevious) => 'previous',
|
424
|
+
Codecs.four_char_code(KAE::KAENext) => 'next',
|
425
|
+
}
|
442
426
|
|
443
427
|
InsertionLocEnums = {
|
444
428
|
Codecs.four_char_code(KAE::KAEBefore) => 'before',
|
@@ -466,105 +450,98 @@ class Codecs
|
|
466
450
|
|
467
451
|
#######
|
468
452
|
|
469
|
-
def fully_unpack_object_specifier(desc)
|
470
|
-
#
|
453
|
+
def fully_unpack_object_specifier(desc)
|
454
|
+
# Recursively unpack an object specifier and all of its container descs.
|
455
|
+
# (Note: Codecs#unpack_object_specifier and AEMReference::DeferredSpecifier#_real_ref will call this when needed.)
|
471
456
|
case desc.type
|
457
|
+
when KAE::TypeObjectSpecifier
|
458
|
+
want = Codecs.four_char_code(desc.get_param(KAE::KeyAEDesiredClass, KAE::TypeType).data)
|
459
|
+
key_form = Codecs.four_char_code(desc.get_param(KAE::KeyAEKeyForm, KAE::TypeEnumeration).data)
|
460
|
+
key = desc.get_param(KAE::KeyAEKeyData, KAE::TypeWildCard)
|
461
|
+
ref = fully_unpack_object_specifier(desc.get_param(KAE::KeyAEContainer, KAE::TypeWildCard))
|
462
|
+
case key_form
|
463
|
+
when KAE::FormPropertyID
|
464
|
+
return ref.property(Codecs.four_char_code(key.data))
|
465
|
+
when KAE::FormUserPropertyID
|
466
|
+
return ref.userproperty(unpack(key))
|
467
|
+
when KAE::FormRelativePosition
|
468
|
+
return ref.send(RelativePositionEnums[key.data], want)
|
469
|
+
else
|
470
|
+
ref = ref.elements(want)
|
471
|
+
case key_form
|
472
|
+
when KAE::FormAbsolutePosition
|
473
|
+
if key.type == KAE::TypeAbsoluteOrdinal
|
474
|
+
if key.data == AllAbsoluteOrdinal
|
475
|
+
return ref
|
476
|
+
else
|
477
|
+
return ref.send(AbsoluteOrdinals[key.data])
|
478
|
+
end
|
479
|
+
else
|
480
|
+
return ref.by_index(unpack(key))
|
481
|
+
end
|
482
|
+
when KAE::FormName
|
483
|
+
return ref.by_name(unpack(key))
|
484
|
+
when KAE::FormUniqueID
|
485
|
+
return ref.by_id(unpack(key))
|
486
|
+
when KAE::FormRange
|
487
|
+
return ref.by_range(
|
488
|
+
unpack(key.get_param(KAE::KeyAERangeStart, KAE::TypeWildCard)),
|
489
|
+
unpack(key.get_param(KAE::KeyAERangeStop, KAE::TypeWildCard)))
|
490
|
+
when KAE::FormTest
|
491
|
+
return ref.by_filter(unpack(key))
|
492
|
+
end
|
493
|
+
end
|
494
|
+
raise TypeError
|
472
495
|
when KAE::TypeNull then return self.class::App
|
473
496
|
when KAE::TypeCurrentContainer then return self.class::Con
|
474
497
|
when KAE::TypeObjectBeingExamined then return self.class::Its
|
475
|
-
end
|
476
|
-
rec = _desc_to_hash(desc)
|
477
|
-
want = unpack(rec[KAE::KeyAEDesiredClass]).code
|
478
|
-
key_form = unpack(rec[KAE::KeyAEKeyForm]).code
|
479
|
-
key = unpack(rec[KAE::KeyAEKeyData])
|
480
|
-
ref = unpack(rec[KAE::KeyAEContainer])
|
481
|
-
if ref == nil
|
482
|
-
ref = self.class::App
|
483
|
-
end
|
484
|
-
if key_form == KAE::FormPropertyID
|
485
|
-
return ref.property(key.code)
|
486
|
-
elsif key_form == 'usrp'
|
487
|
-
return ref.userproperty(key)
|
488
|
-
elsif key_form == KAE::FormRelativePosition
|
489
|
-
if key.code == KAE::KAEPrevious
|
490
|
-
return ref.previous(want)
|
491
|
-
elsif key.code == KAE::KAENext
|
492
|
-
return ref.next(want)
|
493
|
-
else
|
494
|
-
raise RuntimeError, "Bad relative position selector: #{key}"
|
495
|
-
end
|
496
498
|
else
|
497
|
-
|
498
|
-
if key_form == KAE::FormName
|
499
|
-
return ref.by_name(key)
|
500
|
-
elsif key_form == KAE::FormAbsolutePosition
|
501
|
-
if key.is_a?(Ordinal)
|
502
|
-
if key.code == KAE::KAEAll
|
503
|
-
return ref
|
504
|
-
else
|
505
|
-
return ref.send(FullUnpackOrdinals[key.code])
|
506
|
-
end
|
507
|
-
else
|
508
|
-
return ref.by_index(key)
|
509
|
-
end
|
510
|
-
elsif key_form == KAE::FormUniqueID
|
511
|
-
return ref.by_id(key)
|
512
|
-
elsif key_form == KAE::FormRange
|
513
|
-
return ref.by_range(*key.range)
|
514
|
-
elsif key_form == KAE::FormTest
|
515
|
-
return ref.by_filter(key)
|
516
|
-
end
|
499
|
+
return unpack(desc)
|
517
500
|
end
|
518
|
-
raise TypeError
|
519
501
|
end
|
520
502
|
|
521
503
|
##
|
522
504
|
|
523
|
-
def unpack_object_specifier(desc)
|
524
|
-
#
|
525
|
-
|
526
|
-
key_form =
|
505
|
+
def unpack_object_specifier(desc)
|
506
|
+
# Shallow-unpack an object specifier, retaining the container AEDesc as-is.
|
507
|
+
# (i.e. Defers full unpacking of [most] object specifiers for efficiency.)
|
508
|
+
key_form = Codecs.four_char_code(desc.get_param(KAE::KeyAEKeyForm, KAE::TypeEnumeration).data)
|
527
509
|
if [KAE::FormPropertyID, KAE::FormAbsolutePosition, KAE::FormName, KAE::FormUniqueID].include?(key_form)
|
528
|
-
want =
|
529
|
-
key =
|
530
|
-
container = AEMReference::DeferredSpecifier.new(
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
if key.
|
536
|
-
|
510
|
+
want = Codecs.four_char_code(desc.get_param(KAE::KeyAEDesiredClass, KAE::TypeType).data)
|
511
|
+
key = desc.get_param(KAE::KeyAEKeyData, KAE::TypeWildCard)
|
512
|
+
container = AEMReference::DeferredSpecifier.new(desc.get_param(KAE::KeyAEContainer, KAE::TypeWildCard), self)
|
513
|
+
case key_form
|
514
|
+
when KAE::FormPropertyID
|
515
|
+
ref = AEMReference::Property.new(want, container, Codecs.four_char_code(key.data))
|
516
|
+
when KAE::FormAbsolutePosition
|
517
|
+
if key.type == KAE::TypeAbsoluteOrdinal
|
518
|
+
if key.data == AllAbsoluteOrdinal
|
519
|
+
ref = AEMReference::AllElements.new(want, container)
|
520
|
+
else
|
521
|
+
ref = fully_unpack_object_specifier(desc) # do a full unpack of rarely returned reference forms
|
522
|
+
end
|
537
523
|
else
|
538
|
-
|
539
|
-
ref = AEMReference::ElementByOrdinal.new(want, AEMReference::UnkeyedElements.new(want, container), key, keyname)
|
524
|
+
ref = AEMReference::ElementByIndex.new(want, AEMReference::UnkeyedElements.new(want, container), unpack(key))
|
540
525
|
end
|
541
|
-
|
542
|
-
ref = AEMReference::
|
543
|
-
|
544
|
-
|
545
|
-
ref = AEMReference::ElementByName.new(want, AEMReference::UnkeyedElements.new(want, container), key)
|
546
|
-
elsif key_form == KAE::FormUniqueID
|
547
|
-
ref = AEMReference::ElementByID.new(want, AEMReference::UnkeyedElements.new(want, container), key)
|
526
|
+
when KAE::FormName
|
527
|
+
ref = AEMReference::ElementByName.new(want, AEMReference::UnkeyedElements.new(want, container), unpack(key))
|
528
|
+
when KAE::FormUniqueID
|
529
|
+
ref = AEMReference::ElementByID.new(want, AEMReference::UnkeyedElements.new(want, container), unpack(key))
|
548
530
|
end
|
549
|
-
|
550
|
-
|
551
|
-
else # do full unpack of more complex, rarely returned reference forms
|
552
|
-
return fully_unpack_object_specifier(desc)
|
531
|
+
else
|
532
|
+
ref = fully_unpack_object_specifier(desc) # do a full unpack of more complex, rarely returned reference forms
|
553
533
|
end
|
534
|
+
ref.AEM_set_desc(desc) # retain existing AEDesc for efficiency
|
535
|
+
return ref
|
554
536
|
end
|
555
537
|
|
556
538
|
|
557
539
|
def unpack_insertion_loc(desc)
|
558
|
-
|
559
|
-
return unpack_object_specifier(rec[KAE::KeyAEObject]).send(InsertionLocEnums[rec[KAE::KeyAEPosition].data])
|
540
|
+
return unpack_object_specifier(desc.get_param(KAE::KeyAEObject, KAE::TypeWildCard)).send(InsertionLocEnums[desc.get_param(KAE::KeyAEPosition, KAE::TypeEnumeration).data])
|
560
541
|
end
|
561
542
|
|
562
543
|
##
|
563
544
|
|
564
|
-
def unpack_absolute_ordinal(desc)
|
565
|
-
return Ordinal.new(Codecs.four_char_code(desc.data))
|
566
|
-
end
|
567
|
-
|
568
545
|
def unpack_current_container(desc)
|
569
546
|
return Con
|
570
547
|
end
|
@@ -588,10 +565,9 @@ class Codecs
|
|
588
565
|
end
|
589
566
|
|
590
567
|
def unpack_comp_descriptor(desc)
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
op2 = unpack(rec[KAE::KeyAEObject2])
|
568
|
+
operator = ComparisonEnums[desc.get_param(KAE::KeyAECompOperator, KAE::TypeEnumeration).data]
|
569
|
+
op1 = unpack(desc.get_param(KAE::KeyAEObject1, KAE::TypeWildCard))
|
570
|
+
op2 = unpack(desc.get_param(KAE::KeyAEObject2, KAE::TypeWildCard))
|
595
571
|
if operator == 'contains'
|
596
572
|
return unpack_contains_comp_descriptor(op1, op2)
|
597
573
|
else
|
@@ -600,17 +576,11 @@ class Codecs
|
|
600
576
|
end
|
601
577
|
|
602
578
|
def unpack_logical_descriptor(desc)
|
603
|
-
|
604
|
-
|
605
|
-
operands = unpack(rec[KAE::KeyAELogicalTerms])
|
579
|
+
operator = LogicalEnums[desc.get_param(KAE::KeyAELogicalOperator, KAE::TypeEnumeration).data]
|
580
|
+
operands = unpack(desc.get_param(KAE::KeyAELogicalTerms, KAE::TypeAEList))
|
606
581
|
return operands[0].send(operator, *operands[1, operands.length])
|
607
582
|
end
|
608
583
|
|
609
|
-
def unpack_range_descriptor(desc)
|
610
|
-
rec = _desc_to_hash(desc)
|
611
|
-
return Range.new([unpack(rec[KAE::KeyAERangeStart]), unpack(rec[KAE::KeyAERangeStop])])
|
612
|
-
end
|
613
|
-
|
614
584
|
end
|
615
585
|
|
616
586
|
DefaultCodecs = Codecs.new
|