summaryrefslogtreecommitdiff
path: root/tools/InterfaceGenerator/generator/parsers/JSONRPC.py
blob: e63bcc38aa8838f9a7d6ea0a9b18abaf5772d05c (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
102
103
104
"""JSON RPC parser.

Contains parser for JSON RPC XML format.

"""

from parsers.parse_error import ParseError
from parsers.rpc_base import RPCBase


class Parser(RPCBase):
    """JSON RPC parser."""

    @property
    def get_version(self):
        return '1.0.0'

    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 ParseError("Subelement '" + element.tag +
                                 "' is unexpected in interfaces")

            if "name" not in element.attrib:
                raise 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 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 ParseError(
                "'" + function_param_name +
                "' is a predefined name and can't be used" +
                " as a function parameter name")