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. @param xml [String]

   # File lib/dbus/xml.rb
38 def initialize(xml)
39   @xml = xml
40 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
118 def parse
119   # Using a Hash instead of a list helps merge split-up interfaces,
120   # a quirk observed in ModemManager (I#41).
121   interfaces = Hash.new do |hash, missing_key|
122     hash[missing_key] = Interface.new(missing_key)
123   end
124   subnodes = []
125   t = Time.now
126 
127   d = IntrospectXMLParser.backend.new(@xml)
128   d.each("node/node") do |e|
129     subnodes << e["name"]
130   end
131   d.each("node/interface") do |e|
132     i = interfaces[e["name"]]
133     e.each("method") do |me|
134       m = Method.new(me["name"])
135       parse_methsig(me, m)
136       i << m
137     end
138     e.each("signal") do |se|
139       s = Signal.new(se["name"])
140       parse_methsig(se, s)
141       i << s
142     end
143     e.each("property") do |pe|
144       p = Property.from_xml(pe)
145       i << p
146     end
147   end
148   d = Time.now - t
149   if d > 2
150     DBus.logger.debug "Some XML took more that two secs to parse. Optimize me!"
151   end
152   [interfaces.values, subnodes]
153 end

Private Instance Methods

parse_methsig(elem, methsig) click to toggle source

Parses a method signature XML element elem and initialises method/signal methsig. @param elem [AbstractXML::Node]

    # File lib/dbus/xml.rb
161 def parse_methsig(elem, methsig)
162   elem.each("arg") do |ae|
163     name = ae["name"]
164     dir = ae["direction"]
165     sig = ae["type"]
166     case methsig
167     when DBus::Signal
168       # Direction can only be "out", ignore it
169       methsig.add_fparam(name, sig)
170     when DBus::Method
171       case dir
172       # This is a method, so dir defaults to "in"
173       when "in", nil
174         methsig.add_fparam(name, sig)
175       when "out"
176         methsig.add_return(name, sig)
177       end
178     else
179       raise NotImplementedError, dir
180     end
181   end
182 end