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