class DBus::IntrospectXMLParser

D-Bus introspect XML parser class

This class parses introspection XML of an object and constructs a tree of Node, Interface, Method, Signal instances.

Public Class Methods

new(xml) click to toggle source

Creates a new parser for XML data in string xml.

# File lib/dbus/introspect.rb, line 228
def initialize(xml)
  @xml = xml
end

Public Instance Methods

parse() click to toggle source

return a pair: [list of Interfaces, list of direct subnode names]

# File lib/dbus/introspect.rb, line 243
def parse
  interfaces = Array.new
  subnodes = Array.new
  t = Time.now
  d = REXML::Document.new(@xml)
  d.elements.each("node/node") do |e|
    subnodes << e.attributes["name"]
  end
  d.elements.each("node/interface") do |e|
    i = Interface.new(e.attributes["name"])
    e.elements.each("method") do |me|
      m = Method.new(me.attributes["name"])
      parse_methsig(me, m)
      i << m
    end
    e.elements.each("signal") do |se|
      s = Signal.new(se.attributes["name"])
      parse_methsig(se, s)
      i << s
    end
    interfaces << i
  end
  d = Time.now - t
  if d > 2
    puts "Some XML took more that two secs to parse. Optimize me!" if $DEBUG
  end
  [interfaces, subnodes]
end
parse_subnodes() click to toggle source

return the names of direct subnodes

# File lib/dbus/introspect.rb, line 233
def parse_subnodes
  subnodes = Array.new
  d = REXML::Document.new(@xml)
  d.elements.each("node/node") do |e|
    subnodes << e.attributes["name"]
  end
  subnodes
end

Private Instance Methods

parse_methsig(e, m) click to toggle source

Parses a method signature XML element e and initialises method/signal m.

# File lib/dbus/introspect.rb, line 277
def parse_methsig(e, m)
  e.elements.each("arg") do |ae|
    name = ae.attributes["name"]
    dir = ae.attributes["direction"]
    sig = ae.attributes["type"]
    if m.is_a?(DBus::Signal)
      m.add_fparam(name, sig)
    elsif m.is_a?(DBus::Method)
      case dir
      when "in"
        m.add_fparam(name, sig)
      when "out"
        m.add_return(name, sig)
      end
    else
      raise NotImplementedError, dir
    end
  end
end