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.
Attributes
backend[RW]
Public Class Methods
new(xml)
click to toggle source
Creates a new parser for XML data in string xml.
# File lib/dbus/xml.rb 29 def initialize(xml) 30 @xml = xml 31 end
Public Instance Methods
parse()
click to toggle source
@return [Array(Array<Interface>,Array<String>)]
a pair: [list of Interfaces, list of direct subnode names]
# File lib/dbus/xml.rb 103 def parse 104 # Using a Hash instead of a list helps merge split-up interfaces, 105 # a quirk observed in ModemManager (I#41). 106 interfaces = Hash.new do |hash, missing_key| 107 hash[missing_key] = Interface.new(missing_key) 108 end 109 subnodes = [] 110 t = Time.now 111 112 d = IntrospectXMLParser.backend.new(@xml) 113 d.each("node/node") do |e| 114 subnodes << e["name"] 115 end 116 d.each("node/interface") do |e| 117 i = interfaces[e["name"]] 118 e.each("method") do |me| 119 m = Method.new(me["name"]) 120 parse_methsig(me, m) 121 i << m 122 end 123 e.each("signal") do |se| 124 s = Signal.new(se["name"]) 125 parse_methsig(se, s) 126 i << s 127 end 128 end 129 d = Time.now - t 130 if d > 2 131 DBus.logger.debug "Some XML took more that two secs to parse. Optimize me!" 132 end 133 [interfaces.values, subnodes] 134 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/xml.rb 141 def parse_methsig(e, m) 142 e.each("arg") do |ae| 143 name = ae["name"] 144 dir = ae["direction"] 145 sig = ae["type"] 146 if m.is_a?(DBus::Signal) 147 # Direction can only be "out", ignore it 148 m.add_fparam(name, sig) 149 elsif m.is_a?(DBus::Method) 150 case dir 151 # This is a method, so dir defaults to "in" 152 when "in", nil 153 m.add_fparam(name, sig) 154 when "out" 155 m.add_return(name, sig) 156 end 157 else 158 raise NotImplementedError, dir 159 end 160 end 161 end