CFPropertyList 2.0.11 → 2.0.12

Sign up to get free protection for your applications and to get access to all the features.
@@ -141,7 +141,15 @@ module CFPropertyList
141
141
  val = val[0]
142
142
  when 3
143
143
  hiword,loword = buff.unpack("NN")
144
- val = hiword << 32 | loword
144
+ if (hiword & 0x80000000) != 0
145
+ # 8 byte integers are always signed, and are negative when bit 63 is
146
+ # set. Decoding into either a Fixnum or Bignum is tricky, however,
147
+ # because the size of a Fixnum varies among systems, and Ruby
148
+ # doesn't consider the number to be negative, and won't sign extend.
149
+ val = -(2**63 - ((hiword & 0x7fffffff) << 32 | loword))
150
+ else
151
+ val = hiword << 32 | loword
152
+ end
145
153
  end
146
154
 
147
155
  return CFInteger.new(val);
@@ -226,8 +234,15 @@ module CFPropertyList
226
234
  def Binary.charset_strlen(str,charset="UTF-8")
227
235
  return str.length if str.respond_to?("encode")
228
236
 
229
- str = Iconv.conv("UTF-8",charset,str) if charset != "UTF-8"
230
- return str.scan(/./mu).size
237
+ utf8_str = Iconv.conv("UTF-8",charset,str)
238
+ size = utf8_str.scan(/./mu).size
239
+
240
+ # UTF-16 code units in the range D800-DBFF are the beginning of
241
+ # a surrogate pair, and count as one additional character for
242
+ # length calculation.
243
+ str.split('').each_slice(2) { |pair| size += 1 if ("\xd8".."\xdb").include?(pair[0]) } if charset =~ /^UTF-16/
244
+
245
+ return size
231
246
  end
232
247
 
233
248
  # Read a unicode string value, coded as UTF-16BE
@@ -374,11 +389,16 @@ module CFPropertyList
374
389
 
375
390
  # calculate how many bytes are needed to save +count+
376
391
  def Binary.bytes_needed(count)
377
- nbytes = 0
378
-
379
- while count >= 1 do
380
- nbytes += 1
381
- count /= 256
392
+ if count < 2**8
393
+ nbytes = 1
394
+ elsif count < 2**16
395
+ nbytes = 2
396
+ elsif count < 2**32
397
+ nbytes = 4
398
+ elsif count < 2**64
399
+ nbytes = 8
400
+ else
401
+ raise CFFormatError.new("Data size too large: #{count}")
382
402
  end
383
403
 
384
404
  return nbytes
@@ -388,12 +408,20 @@ module CFPropertyList
388
408
  def Binary.int_bytes(int)
389
409
  intbytes = ""
390
410
 
391
- if(int > 0xFFFF) then
392
- intbytes = "\x12"+[int].pack("N") # 4 byte integer
393
- elsif(int > 0xFF) then
394
- intbytes = "\x11"+[int].pack("n") # 2 byte integer
411
+ if(int >= 0) then
412
+ if (int <= 0xFF) then
413
+ intbytes = "\x10"+[int].pack("c") # 1 byte integer
414
+ elsif(int <= 0xFFFF) then
415
+ intbytes = "\x11"+[int].pack("n") # 2 byte integer
416
+ elsif(int <= 0xFFFFFFFF) then
417
+ intbytes = "\x12"+[int].pack("N") # 4 byte integer
418
+ elsif(int <= 0x7FFFFFFFFFFFFFFF)
419
+ intbytes = "\x13"+[int >> 32, int & 0xFFFFFFFF].pack("NN") # 8 byte integer
420
+ else
421
+ raise CFFormatError.new("Integer too large: #{int}")
422
+ end
395
423
  else
396
- intbytes = "\x10"+[int].pack("C") # 8 byte integer
424
+ intbytes = "\x13"+[int >> 32, int & 0xFFFFFFFF].pack("NN") # 8 byte integer
397
425
  end
398
426
 
399
427
  return intbytes;
@@ -519,8 +547,8 @@ module CFPropertyList
519
547
  end
520
548
 
521
549
  if(utf16) then
522
- bdata = Binary.type_bytes("6",Binary.charset_strlen(val,"UTF-8")) # 6 is 0110, unicode string (utf16be)
523
550
  val = Binary.charset_convert(val,"UTF-8","UTF-16BE")
551
+ bdata = Binary.type_bytes("6",Binary.charset_strlen(val,"UTF-16BE")) # 6 is 0110, unicode string (utf16be)
524
552
 
525
553
  val.force_encoding("ASCII-8BIT") if val.respond_to?("encode")
526
554
  @object_table[saved_object_count] = bdata + val
@@ -109,7 +109,7 @@ module CFPropertyList
109
109
  return CFBoolean.new(object)
110
110
  elsif(object.is_a?(String)) then
111
111
  return object.blob? ? CFData.new(object, CFData::DATA_RAW) : CFString.new(object)
112
- elsif(object.is_a?(IO)) then
112
+ elsif(object.respond_to?(:read)) then
113
113
  return CFData.new(object.read(), CFData::DATA_RAW)
114
114
  elsif(object.is_a?(Time) || object.is_a?(DateTime) || object.is_a?(Date)) then
115
115
  return CFDate.new(object)
@@ -166,7 +166,7 @@ module CFPropertyList
166
166
 
167
167
  # get base64 encoded value
168
168
  def encoded_value
169
- @value ||= Base64.encode64(@raw_value)
169
+ @value ||= "\n#{Base64.encode64(@raw_value).gsub("\n", '').scan(/.{1,76}/).join("\n")}\n"
170
170
  end
171
171
 
172
172
  # get base64 decoded value
@@ -37,7 +37,7 @@ module CFPropertyList
37
37
  |line|
38
38
  str1 << line
39
39
  unless(first) then
40
- str1 << "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" if line =~ /^\s*<\?xml/
40
+ str1 << "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" if line =~ /^\s*<\?xml/
41
41
  end
42
42
 
43
43
  first = true
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: CFPropertyList
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
5
4
  prerelease: false
6
5
  segments:
7
6
  - 2
8
7
  - 0
9
- - 11
10
- version: 2.0.11
8
+ - 12
9
+ version: 2.0.12
11
10
  platform: ruby
12
11
  authors:
13
12
  - Christian Kruse
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-08-26 00:00:00 +02:00
17
+ date: 2010-09-08 00:00:00 +02:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
@@ -26,7 +25,6 @@ dependencies:
26
25
  requirements:
27
26
  - - ">="
28
27
  - !ruby/object:Gem::Version
29
- hash: 19
30
28
  segments:
31
29
  - 1
32
30
  - 1
@@ -42,7 +40,6 @@ dependencies:
42
40
  requirements:
43
41
  - - ">="
44
42
  - !ruby/object:Gem::Version
45
- hash: 3
46
43
  segments:
47
44
  - 0
48
45
  - 7
@@ -80,7 +77,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
80
77
  requirements:
81
78
  - - ">="
82
79
  - !ruby/object:Gem::Version
83
- hash: 3
84
80
  segments:
85
81
  - 0
86
82
  version: "0"
@@ -89,7 +85,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
85
  requirements:
90
86
  - - ">="
91
87
  - !ruby/object:Gem::Version
92
- hash: 3
93
88
  segments:
94
89
  - 0
95
90
  version: "0"