diff options
author | Brad Bishop <bradleyb@us.ibm.com> | 2015-10-28 22:02:09 -0400 |
---|---|---|
committer | Brad Bishop <bradleyb@us.ibm.com> | 2015-10-28 22:03:21 -0400 |
commit | 3f43cdbebb681926ae17bff4b44b36ff90361204 (patch) | |
tree | e59c12f991407609552ee4ab1313cc11209d961a /phosphor-mapper | |
parent | 86398d233e50a0cbcd17c1920823db7dfa34f48e (diff) | |
download | phosphor-objmgr-3f43cdbebb681926ae17bff4b44b36ff90361204.tar.gz phosphor-objmgr-3f43cdbebb681926ae17bff4b44b36ff90361204.zip |
Move introspection parser to OpenBMCMapper
Doing this so rest-dbus can use it.
Diffstat (limited to 'phosphor-mapper')
-rw-r--r-- | phosphor-mapper | 107 |
1 files changed, 1 insertions, 106 deletions
diff --git a/phosphor-mapper b/phosphor-mapper index 890e546..313baa2 100644 --- a/phosphor-mapper +++ b/phosphor-mapper @@ -21,8 +21,7 @@ import dbus import dbus.service import dbus.mainloop.glib import gobject -from xml.etree import ElementTree -from OpenBMCMapper import Path +from OpenBMCMapper import Path, IntrospectionParser import OpenBMCMapper class DictionaryCache: @@ -260,110 +259,6 @@ class ObjectMapper(dbus.service.Object): values.update(self.GetTree(x, depth, match_type)) return values -class IntrospectionNodeParser: - def __init__(self, data): - self.data = data - self.cache = {} - - def parse_args(self): - return [ x.attrib for x in self.data.findall('arg') ] - - def parse_children(self): - return [ x.attrib['name'] for x in self.data.findall('node') ] - - def parse_method_or_signal(self): - name = self.data.attrib['name'] - return name, self.parse_args() - - def parse_interface(self): - iface = {} - iface['method'] = {} - iface['signal'] = {} - name = self.data.attrib['name'] - - for node in self.data: - p = IntrospectionNodeParser(node) - if node.tag not in ['method', 'signal']: - continue - n, element = p.parse_method_or_signal() - iface[node.tag][n] = element - - return name, iface - - def parse_node(self): - if self.cache: - return self.cache - - self.cache['interfaces'] = {} - self.cache['children'] = [] - - for node in self.data: - p = IntrospectionNodeParser(node) - if node.tag == 'interface': - name, ifaces = p.parse_interface() - self.cache['interfaces'][name] = ifaces - elif node.tag == 'node': - self.cache['children'] = self.parse_children() - - return self.cache - - def get_interfaces(self): - return self.parse_node()['interfaces'] - - def get_children(self): - return self.parse_node()['children'] - - def recursive_binding(self): - return any('/' in s for s in self.get_children()) - -class IntrospectionParser: - def __init__(self, name, bus): - self.name = name - self.bus = bus - - def _introspect(self, path): - try: - obj = self.bus.get_object(self.name, path) - iface = dbus.Interface(obj, dbus.BUS_DAEMON_IFACE + '.Introspectable') - data = iface.Introspect() - except dbus.DBusException: - return None - - return IntrospectionNodeParser(ElementTree.fromstring(data)) - - def _discover_flat(self, path, parser): - items = {} - interfaces = parser.get_interfaces().keys() - if interfaces: - items[path] = {} - items[path]['interfaces'] = interfaces - - return items - - def introspect(self, path = '/', parser = None): - items = {} - if not parser: - parser = self._introspect(path) - if not parser: - return {} - items.update(self._discover_flat(path, parser)) - - if path != '/': - path += '/' - - if parser.recursive_binding(): - callback = self._discover_flat - else: - callback = self.introspect - - for k in parser.get_children(): - parser = self._introspect(path + k) - if not parser: - continue - items.update(callback(path + k, parser)) - - return items - class BusWrapper: def __init__(self, bus): self.dbus = bus |