CFPropertyList 2.2.7 → 2.2.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 231474cbce57560dae7b25644de40d1f37663673
4
- data.tar.gz: 9f8dfba275d0463e41334bb31554f87e62779f71
3
+ metadata.gz: a2c18e8671e6aa61b76ef1b99fff2850b2746c4d
4
+ data.tar.gz: 153b07e4656885b5cd155af83555dad763a17e1a
5
5
  SHA512:
6
- metadata.gz: a601bfff8427aa0deeddde5df7ae0661664a3b83aacbc526801363d505619c8d127f920f0ef739c88c5e83382ce9b106d7ebdb1be4b89ef2170f1c83f74055a6
7
- data.tar.gz: fa625c48f0495140e0d271a525b3d5c6c6a58c722a5b33d0f8fcc22b120810da087eac406b229e78d78f1a84c813d7da398396bd35a7bc91aa6ce199d2e2893a
6
+ metadata.gz: 75f4be2ff85f13c0309b7c7fe390b721a5ee98d454aa45a010ba03288381a0f9c6e90539f7c34921685c5ef92e8803ab7469ce826059bfa777a98d001974d3fe
7
+ data.tar.gz: b7842bee8b9cb899b432880b16e675c78e4cb87ed64c473efb988c2dd4313266844b1f341f8b659e0baeaca9ad0bf7fa81fbc74f763ea53c8ecedafd149d59a3
data/README CHANGED
File without changes
@@ -295,11 +295,11 @@ module CFPropertyList
295
295
  # first: read keys
296
296
  if(length != 0) then
297
297
  buff = fd.read(length * @object_ref_size)
298
- keys = unpack_with_size(@object_ref_size, buff) #buff.unpack(@object_ref_size == 1 ? "C*" : "n*")
298
+ keys = unpack_with_size(@object_ref_size, buff)
299
299
 
300
300
  # second: read object refs
301
301
  buff = fd.read(length * @object_ref_size)
302
- objects = unpack_with_size(@object_ref_size, buff) #buff.unpack(@object_ref_size == 1 ? "C*" : "n*")
302
+ objects = unpack_with_size(@object_ref_size, buff)
303
303
 
304
304
  # read real keys and objects
305
305
  0.upto(length-1) do |i|
@@ -313,13 +313,14 @@ module CFPropertyList
313
313
  end
314
314
  protected :read_binary_dict
315
315
 
316
- # Read an object type byte, decode it and delegate to the correct reader function
316
+ # Read an object type byte, decode it and delegate to the correct
317
+ # reader function
317
318
  def read_binary_object(fname,fd)
318
319
  # first: read the marker byte
319
320
  buff = fd.read(1)
320
321
 
321
322
  object_length = buff.unpack("C*")
322
- object_length = object_length[0] & 0xF
323
+ object_length = object_length[0] & 0xF
323
324
 
324
325
  buff = buff.unpack("H*")
325
326
  object_type = buff[0][0].chr
@@ -344,6 +345,8 @@ module CFPropertyList
344
345
  read_binary_string(fname,fd,object_length)
345
346
  when '6' # unicode string (utf16be)
346
347
  read_binary_unicode_string(fname,fd,object_length)
348
+ when '8'
349
+ CFUid.new(read_binary_int(fname, fd, object_length).value)
347
350
  when 'a' # array
348
351
  read_binary_array(fname,fd,object_length)
349
352
  when 'd' # dictionary
@@ -511,6 +514,32 @@ module CFPropertyList
511
514
  @written_object_count - 1
512
515
  end
513
516
 
517
+ def uid_to_binary(value)
518
+ nbytes = 0
519
+ nbytes = 1 if value > 0xFF # 1 byte integer
520
+ nbytes += 1 if value > 0xFFFF # 4 byte integer
521
+ nbytes += 1 if value > 0xFFFFFFFF # 8 byte integer
522
+ nbytes = 3 if value < 0 # 8 byte integer, since signed
523
+
524
+ @object_table[@written_object_count] = Binary.type_bytes(0b1000, nbytes) <<
525
+ if nbytes < 3
526
+ [value].pack(
527
+ if nbytes == 0 then "C"
528
+ elsif nbytes == 1 then "n"
529
+ else "N"
530
+ end
531
+ )
532
+ else
533
+ # 64 bit signed integer; we need the higher and the lower 32 bit of the value
534
+ high_word = value >> 32
535
+ low_word = value & 0xFFFFFFFF
536
+ [high_word,low_word].pack("NN")
537
+ end
538
+
539
+ @written_object_count += 1
540
+ @written_object_count - 1
541
+ end
542
+
514
543
  # Convert date value (apple format) to binary and adds it to the object table
515
544
  def date_to_binary(val)
516
545
  val = val.getutc.to_f - CFDate::DATE_DIFF_APPLE_UNIX # CFDate is a real, number of seconds since 01/01/2001 00:00:00 GMT
@@ -129,6 +129,7 @@ module CFPropertyList
129
129
  def guess(object, options = {})
130
130
  case object
131
131
  when Fixnum, Integer then CFInteger.new(object)
132
+ when UidFixnum then CFUid.new(object)
132
133
  when Float then CFReal.new(object)
133
134
  when TrueClass, FalseClass then CFBoolean.new(object)
134
135
 
@@ -183,7 +184,7 @@ module CFPropertyList
183
184
  def native_types(object,keys_as_symbols=false)
184
185
  return if object.nil?
185
186
 
186
- if(object.is_a?(CFDate) || object.is_a?(CFString) || object.is_a?(CFInteger) || object.is_a?(CFReal) || object.is_a?(CFBoolean)) then
187
+ if(object.is_a?(CFDate) || object.is_a?(CFString) || object.is_a?(CFInteger) || object.is_a?(CFReal) || object.is_a?(CFBoolean)) || object.is_a?(CFUid) then
187
188
  return object.value
188
189
  elsif(object.is_a?(CFData)) then
189
190
  return CFPropertyList::Blob.new(object.decoded_value)
@@ -17,6 +17,13 @@ module CFPropertyList
17
17
  class Blob < String
18
18
  end
19
19
 
20
+ ##
21
+ # UidFixnum is intended to distinguish between a Ruby Fixnum
22
+ # instance that should be converted to a CFInteger/CFReal type and a
23
+ # Ruby Fixnum instance that should be converted to a CFUid type.
24
+ class UidFixnum < Fixnum
25
+ end
26
+
20
27
  # This class defines the base class for all CFType classes
21
28
  #
22
29
  class CFType
@@ -243,6 +250,17 @@ module CFPropertyList
243
250
  bplist.dict_to_binary(self)
244
251
  end
245
252
  end
253
+
254
+ class CFUid < CFType
255
+ def to_xml(parser)
256
+ CFDictionary.new({'CF$UID' => CFInteger.new(@value)}).to_xml(parser)
257
+ end
258
+
259
+ # convert to binary
260
+ def to_binary(bplist)
261
+ bplist.uid_to_binary(@value)
262
+ end
263
+ end
246
264
  end
247
265
 
248
266
  # eof
@@ -104,7 +104,11 @@ module CFPropertyList
104
104
  end
105
105
  end
106
106
 
107
- ret = CFDictionary.new(hsh)
107
+ if hsh['CF$UID'] and hsh.keys.length == 1
108
+ ret = CFUid.new(hsh['CF$UID'].value)
109
+ else
110
+ ret = CFDictionary.new(hsh)
111
+ end
108
112
 
109
113
  when 'array'
110
114
  ary = Array.new
@@ -107,7 +107,11 @@ module CFPropertyList
107
107
  end
108
108
  end
109
109
 
110
- ret = CFDictionary.new(hsh)
110
+ if hsh['CF$UID'] and hsh.keys.length == 1
111
+ ret = CFUid.new(hsh['CF$UID'].value)
112
+ else
113
+ ret = CFDictionary.new(hsh)
114
+ end
111
115
 
112
116
  when 'array'
113
117
  ary = Array.new
@@ -53,7 +53,6 @@ module CFPropertyList
53
53
  end
54
54
 
55
55
  def new_node(name)
56
- #LibXML::XML::Node.new(name)
57
56
  REXML::Element.new(name)
58
57
  end
59
58
 
@@ -105,7 +104,11 @@ module CFPropertyList
105
104
  end
106
105
  end
107
106
 
108
- ret = CFDictionary.new(hsh)
107
+ if hsh['CF$UID'] and hsh.keys.length == 1
108
+ ret = CFUid.new(hsh['CF$UID'].value)
109
+ else
110
+ ret = CFDictionary.new(hsh)
111
+ end
109
112
 
110
113
  when 'array'
111
114
  ary = Array.new
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: CFPropertyList
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.7
4
+ version: 2.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Kruse
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-12 00:00:00.000000000 Z
11
+ date: 2014-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake