summaryrefslogtreecommitdiff
path: root/tools/InterfaceGenerator/generator/parsers/JSONRPC.py
blob: 52aa5a10488ee9c088fb0a007ed0d49f9655123a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
"""JSON RPC parser.

Contains parser for JSON RPC XML format.

"""

from generator import Model
from generator.parsers import RPCBase
import xml.etree.ElementTree as ET

class Parser(RPCBase.Parser):

    """JSON RPC parser."""

    def __init__(self):
        """Constructor."""
        super(Parser, self).__init__()
        self._interface_name = None

    def _parse_root(self, root):
        """Parse root XML element.

        This implementation parses root as interfaces element with multiple
        interfaces in it.

        Keyword arguments:
        root -- root element.

        """

        self._params = root.attrib
        self._interface_name = None

        for element in root:
            if element.tag != "interface":
                raise RPCBase.ParseError("Subelement '" + element.tag +
                                         "' is unexpected in interfaces")

            if "name" not in element.attrib:
                raise RPCBase.ParseError(
                    "Name is not specified for interface")

            self._interface_name = element.attrib["name"]
            self._parse_interface(element, self._interface_name + "_")

    def _check_enum_name(self, enum):
        """Check enum name.

        This method is called to check whether the newly parsed enum's name
        conflicts with some predefined enum.
        As SDLRPCV2 has no predefined enums this implementation does nothing.

        """

        pass

    def _provide_enum_element_for_function(self, enum_name, element_name):
        """Provide enum element for functions.

        This implementation replaces the underscore separating interface and
        function name with dot and sets it as name of enum element leaving
        the name with underscore as internal_name. For enums other than
        FunctionID the base implementation is called.

        Returns EnumElement.

        """

        name = element_name
        internal_name = None

        if "FunctionID" == enum_name:
            prefix_length = len(self._interface_name) + 1
            if element_name[:prefix_length] != self._interface_name + '_':
                raise RPCBase.ParseError(
                    "Unexpected prefix for function id '" +
                    element_name + "'")
            name = self._interface_name + "." + element_name[prefix_length:]
            internal_name = element_name

        element = super(Parser, self)._provide_enum_element_for_function(
            enum_name,
            name)

        if internal_name is not None:
            element.internal_name = internal_name

        return element

    def _check_function_param_name(self, function_param_name):
        """Check function param name.

        This method is called to check whether the newly parsed function
        parameter name conflicts with some predefined name.
        """

        if function_param_name in ['method', 'code']:
            raise RPCBase.ParseError(
                "'" + function_param_name +
                "' is a predefined name and can't be used" +
                " as a function parameter name")