Class: CFPropertyList::List

Inherits:
Object
  • Object
show all
Defined in:
lib/rbCFPropertyList.rb

Overview

Class representing a CFPropertyList. Instanciate with #new

Constant Summary collapse

FORMAT_BINARY =

Format constant for binary format

1
FORMAT_XML =

Format constant for XML format

2
FORMAT_AUTO =

Format constant for automatic format recognizing

0
@@parsers =
[Binary,XML]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ List

initialize a new CFPropertyList, arguments are:

:file

Parse a file

:format

Format is one of FORMAT_BINARY or FORMAT_XML. Defaults to FORMAT_AUTO

:data

Parse a string

All arguments are optional



177
178
179
180
181
182
183
184
# File 'lib/rbCFPropertyList.rb', line 177

def initialize(opts={})
  @filename = opts[:file]
  @format = opts[:format] || FORMAT_AUTO
  @data = opts[:data]

  load(@filename) unless @filename.nil?
  load_str(@data) unless @data.nil?
end

Instance Attribute Details

#filenameObject

Path of PropertyList



164
165
166
# File 'lib/rbCFPropertyList.rb', line 164

def filename
  @filename
end

#formatObject

Path of PropertyList



166
167
168
# File 'lib/rbCFPropertyList.rb', line 166

def format
  @format
end

#valueObject

the root value in the plist file



168
169
170
# File 'lib/rbCFPropertyList.rb', line 168

def value
  @value
end

Instance Method Details

#load(file = nil, format = nil) ⇒ Object

Read a plist file

file = nil

The filename of the file to read. If nil, use filename instance variable

format = nil

The format of the plist file. Auto-detect if nil

Raises:

  • (IOError)


242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# File 'lib/rbCFPropertyList.rb', line 242

def load(file=nil,format=nil)
  file = @filename if file.nil?
  format = @format if format.nil?
  @value = {}

  raise IOError.new("File #{file} not readable!") unless File.readable? file

  case format
  when List::FORMAT_BINARY, List::FORMAT_XML then
    prsr = @@parsers[format-1].new
    @value = prsr.load({:file => file})

  when List::FORMAT_AUTO then # what we now do is ugly, but neccessary to recognize the file format
    magic_number = IO.read(file,8)
    filetype = magic_number[0..5]
    version = magic_number[6..7]

    prsr = nil
    if filetype == "bplist" then
      raise CFFormatError.new("Wong file version #{version}") unless version == "00"
      prsr = Binary.new
    else
      prsr = XML.new
    end

    @value = prsr.load({:file => file})
  end
end

#load_binary(filename = nil) ⇒ Object

read a binary plist file

filename = nil

The filename to read from; if nil, read from the file defined by instance variable filename



194
195
196
# File 'lib/rbCFPropertyList.rb', line 194

def load_binary(filename=nil)
  load(filename,List::FORMAT_BINARY)
end

#load_binary_str(str = nil) ⇒ Object

load a plist from a binary string

str

The string containing the plist



206
207
208
# File 'lib/rbCFPropertyList.rb', line 206

def load_binary_str(str=nil)
  load_str(str,List::FORMAT_BINARY)
end

#load_str(str = nil, format = nil) ⇒ Object

load a plist from a string

str = nil

The string containing the plist

format = nil

The format of the plist



213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# File 'lib/rbCFPropertyList.rb', line 213

def load_str(str=nil,format=nil)
  str = @data if str.nil?
  format = @format if format.nil?

  @value = {}
  case format
  when List::FORMAT_BINARY, List::FORMAT_XML then
    prsr = @@parsers[format-1].new
    @value = prsr.load({:data => str})

  when List::FORMAT_AUTO then # what we now do is ugly, but neccessary to recognize the file format
    filetype = str[0..5]
    version = str[6..7]

    prsr = nil
    if filetype == "bplist" then
      raise CFFormatError.new("Wong file version #{version}") unless version == "00"
      prsr = Binary.new
    else
      prsr = XML.new
    end

    @value = prsr.load({:data => str})
  end
end

#load_xml(filename = nil) ⇒ Object

Load an XML PropertyList

filename = nil

The filename to read from; if nil, read from the file defined by instance variable filename



188
189
190
# File 'lib/rbCFPropertyList.rb', line 188

def load_xml(filename=nil)
  load(filename,List::FORMAT_XML)
end

#load_xml_str(str = nil) ⇒ Object

load a plist from a XML string

str

The string containing the plist



200
201
202
# File 'lib/rbCFPropertyList.rb', line 200

def load_xml_str(str=nil)
  load_str(str,List::FORMAT_XML)
end

#save(file = nil, format = nil, opts = {}) ⇒ Object

Serialize CFPropertyList object to specified format and write it to file

file = nil

The filename of the file to write to. Uses filename instance variable if nil

format = nil

The format to save in. Uses format instance variable if nil

Raises:



274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
# File 'lib/rbCFPropertyList.rb', line 274

def save(file=nil,format=nil,opts={})
  format = @format if format.nil?
  file = @filename if file.nil?

  raise CFFormatError.new("Format #{format} not supported, use List::FORMAT_BINARY or List::FORMAT_XML") if format != FORMAT_BINARY && format != FORMAT_XML

  if(!File.exists?(file)) then
    raise IOError.new("File #{file} not writable!") unless File.writable?(File.dirname(file))
  elsif(!File.writable?(file)) then
    raise IOError.new("File #{file} not writable!")
  end

  opts[:root] = @value
  prsr = @@parsers[format-1].new
  content = prsr.to_str(opts)

  File.open(file, 'wb') {
    |fd|
    fd.write content
  }
end

#to_str(format = List::FORMAT_BINARY, opts = {}) ⇒ Object

convert plist to string

format = List::FORMAT_BINARY

The format to save the plist

opts={}

Pass parser options



299
300
301
302
303
# File 'lib/rbCFPropertyList.rb', line 299

def to_str(format=List::FORMAT_BINARY,opts={})
  prsr = @@parsers[format-1].new
  opts[:root] = @value
  return prsr.to_str(opts)
end