diff options
| -rw-r--r-- | python/introspect_parser.py | 50 | 
1 files changed, 50 insertions, 0 deletions
diff --git a/python/introspect_parser.py b/python/introspect_parser.py new file mode 100644 index 00000000..6e94cccf --- /dev/null +++ b/python/introspect_parser.py @@ -0,0 +1,50 @@ +import libxml2 +import cStringIO +import exceptions + +def process_introspection_data(data): +    method_map = {} + +    XMLREADER_START_ELEMENT_NODE_TYPE = 1 +    XMLREADER_END_ELEMENT_NODE_TYPE = 15 + +    stream = cStringIO.StringIO(data) +    input_source = libxml2.inputBuffer(stream) +    reader = input_source.newTextReader("urn:introspect") + +    ret = reader.Read() +    current_iface='' +    current_method='' +    current_sigstr = '' +     +    while ret == 1: +        name = reader.LocalName() +        if reader.NodeType() == XMLREADER_START_ELEMENT_NODE_TYPE: +            if name == 'interface': +                current_iface = reader.GetAttribute('name') +            elif name == 'method': +                current_method = reader.GetAttribute('name') +                if reader.IsEmptyElement(): +                    method_map[current_iface + '.' + current_method] = ''  +                    current_method = '' +                    current_sigstr = '' +                     +            elif 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 name == 'method': +                method_map[current_iface + '.' + current_method] = current_sigstr  +                current_method = '' +                current_sigstr = '' + +          +        ret = reader.Read() + +    if ret != 0: +        raise exceptions.IntrospectionParserException(data) + +    return method_map  | 
