Index: introspect_parser.py =================================================================== RCS file: /cvs/dbus/dbus/python/introspect_parser.py,v retrieving revision 1.3 diff -u -r1.3 introspect_parser.py --- introspect_parser.py 7 Nov 2005 15:31:30 -0000 1.3 +++ introspect_parser.py 16 May 2006 18:10:51 -0000 @@ -1,51 +1,33 @@ -import libxml2 +from xml.sax import make_parser, handler import cStringIO -import exceptions +class IntrospectionHandler(handler.ContentHandler): + def __init__(self, method_map): + self._map = method_map + self._name = [] + + def startElement(self, name, attrs): + if name in ['interface', 'method']: + self._name.append(str(attrs['name'])) + elif name == 'arg': + direction = attrs.get('direction', 'in') + if direction == 'in': + try: + self._map['.'.join(self._name)] += str(attrs['type']) + except KeyError, e: + self._map['.'.join(self._name)] = str(attrs['type']) + + def endElement(self, name): + if name == 'method': + if not self._map.has_key('.'.join(self._name)): + self._map['.'.join(self._name)] = '' # no args + if name in ['interface', 'method']: + self._name.pop() + def process_introspection_data(data): method_map = {} - - XMLREADER_START_ELEMENT_NODE_TYPE = 1 - XMLREADER_END_ELEMENT_NODE_TYPE = 15 - + parser = make_parser() + parser.setContentHandler(IntrospectionHandler(method_map)) stream = cStringIO.StringIO(data.encode('utf-8')) - input_source = libxml2.inputBuffer(stream) - reader = input_source.newTextReader("urn:introspect") - - ret = reader.Read() - current_iface = None - current_method = None - current_sigstr = '' - - while ret == 1: - name = reader.LocalName() - if reader.NodeType() == XMLREADER_START_ELEMENT_NODE_TYPE: - if (not current_iface and not current_method and name == 'interface'): - current_iface = reader.GetAttribute('name') - elif (current_iface and not current_method and name == 'method'): - current_method = reader.GetAttribute('name') - if reader.IsEmptyElement(): - method_map[current_iface + '.' + current_method] = '' - current_method = None - current_sigstr = '' - - elif (current_iface and current_method and name == 'arg'): - direction = reader.GetAttribute('direction') - - if not direction or direction == 'in': - current_sigstr = current_sigstr + reader.GetAttribute('type') - - elif reader.NodeType() == XMLREADER_END_ELEMENT_NODE_TYPE: - if (current_iface and not current_method and name == 'interface'): - current_iface = None - if (current_iface and current_method and name == 'method'): - method_map[current_iface + '.' + current_method] = current_sigstr - current_method = None - current_sigstr = '' - - ret = reader.Read() - - if ret != 0: - raise exceptions.IntrospectionParserException(data) - + parser.parse(stream) return method_map