summaryrefslogtreecommitdiffstats
path: root/phosphor-mapper
diff options
context:
space:
mode:
authorBrad Bishop <bradleyb@us.ibm.com>2015-10-28 22:02:09 -0400
committerBrad Bishop <bradleyb@us.ibm.com>2015-10-28 22:03:21 -0400
commit3f43cdbebb681926ae17bff4b44b36ff90361204 (patch)
treee59c12f991407609552ee4ab1313cc11209d961a /phosphor-mapper
parent86398d233e50a0cbcd17c1920823db7dfa34f48e (diff)
downloadphosphor-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-mapper107
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
OpenPOWER on IntegriCloud