• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2013 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5# This module's classes provide an interface to mojo modules. Modules are
6# collections of interfaces and structs to be used by mojo ipc clients and
7# servers.
8#
9# A simple interface would be created this way:
10# module = mojom.generate.module.Module('Foo')
11# interface = module.AddInterface('Bar')
12# method = interface.AddMethod('Tat', 0)
13# method.AddParameter('baz', 0, mojom.INT32)
14#
15
16class Kind(object):
17  def __init__(self, spec=None):
18    self.spec = spec
19    self.parent_kind = None
20
21# Initialize the set of primitive types. These can be accessed by clients.
22BOOL         = Kind('b')
23INT8         = Kind('i8')
24INT16        = Kind('i16')
25INT32        = Kind('i32')
26INT64        = Kind('i64')
27UINT8        = Kind('u8')
28UINT16       = Kind('u16')
29UINT32       = Kind('u32')
30UINT64       = Kind('u64')
31FLOAT        = Kind('f')
32DOUBLE       = Kind('d')
33STRING       = Kind('s')
34HANDLE       = Kind('h')
35DCPIPE       = Kind('h:d:c')
36DPPIPE       = Kind('h:d:p')
37MSGPIPE      = Kind('h:m')
38SHAREDBUFFER = Kind('h:s')
39
40
41# Collection of all Primitive types
42PRIMITIVES = (
43  BOOL,
44  INT8,
45  INT16,
46  INT32,
47  INT64,
48  UINT8,
49  UINT16,
50  UINT32,
51  UINT64,
52  FLOAT,
53  DOUBLE,
54  STRING,
55  HANDLE,
56  DCPIPE,
57  DPPIPE,
58  MSGPIPE,
59  SHAREDBUFFER
60)
61
62
63class NamedValue(object):
64  def __init__(self, module, parent_kind, name):
65    self.module = module
66    self.namespace = module.namespace
67    self.parent_kind = parent_kind
68    self.name = name
69    self.imported_from = None
70
71  def GetSpec(self):
72    return (self.namespace + '.' +
73        (self.parent_kind and (self.parent_kind.name + '.') or "") +
74        self.name)
75
76
77class EnumValue(NamedValue):
78  def __init__(self, module, enum, field):
79    NamedValue.__init__(self, module, enum.parent_kind, field.name)
80    self.enum_name = enum.name
81
82
83class Constant(object):
84  def __init__(self, name=None, kind=None, value=None):
85    self.name = name
86    self.kind = kind
87    self.value = value
88
89
90class Field(object):
91  def __init__(self, name=None, kind=None, ordinal=None, default=None):
92    self.name = name
93    self.kind = kind
94    self.ordinal = ordinal
95    self.default = default
96
97
98class Struct(Kind):
99  def __init__(self, name=None, module=None):
100    self.name = name
101    self.module = module
102    self.imported_from = None
103    if name != None:
104      spec = 'x:' + name
105    else:
106      spec = None
107    Kind.__init__(self, spec)
108    self.fields = []
109
110  def AddField(self, name, kind, ordinal=None, default=None):
111    field = Field(name, kind, ordinal, default)
112    self.fields.append(field)
113    return field
114
115
116class Array(Kind):
117  def __init__(self, kind=None):
118    self.kind = kind
119    if kind != None:
120      Kind.__init__(self, 'a:' + kind.spec)
121    else:
122      Kind.__init__(self)
123
124
125class InterfaceRequest(Kind):
126  def __init__(self, kind=None):
127    self.kind = kind
128    if kind != None:
129      Kind.__init__(self, 'r:' + kind.spec)
130    else:
131      Kind.__init__(self)
132
133
134class Parameter(object):
135  def __init__(self, name=None, kind=None, ordinal=None, default=None):
136    self.name = name
137    self.ordinal = ordinal
138    self.kind = kind
139    self.default = default
140
141
142class Method(object):
143  def __init__(self, interface, name, ordinal=None):
144    self.interface = interface
145    self.name = name
146    self.ordinal = ordinal
147    self.parameters = []
148    self.response_parameters = None
149
150  def AddParameter(self, name, kind, ordinal=None, default=None):
151    parameter = Parameter(name, kind, ordinal, default)
152    self.parameters.append(parameter)
153    return parameter
154
155  def AddResponseParameter(self, name, kind, ordinal=None, default=None):
156    if self.response_parameters == None:
157      self.response_parameters = []
158    parameter = Parameter(name, kind, ordinal, default)
159    self.response_parameters.append(parameter)
160    return parameter
161
162
163class Interface(Kind):
164  def __init__(self, name=None, client=None, module=None):
165    self.module = module
166    self.name = name
167    self.imported_from = None
168    if name != None:
169      spec = 'x:' + name
170    else:
171      spec = None
172    Kind.__init__(self, spec)
173    self.client = client
174    self.methods = []
175
176  def AddMethod(self, name, ordinal=None):
177    method = Method(self, name, ordinal=ordinal)
178    self.methods.append(method)
179    return method
180
181
182class EnumField(object):
183  def __init__(self, name=None, value=None):
184    self.name = name
185    self.value = value
186
187
188class Enum(Kind):
189  def __init__(self, name=None, module=None):
190    self.module = module
191    self.name = name
192    self.imported_from = None
193    if name != None:
194      spec = 'x:' + name
195    else:
196      spec = None
197    Kind.__init__(self, spec)
198    self.fields = []
199
200
201class Module(object):
202  def __init__(self, name=None, namespace=None):
203    self.name = name
204    self.path = name
205    self.namespace = namespace
206    self.structs = []
207    self.interfaces = []
208
209  def AddInterface(self, name):
210    interface=Interface(name, module=self);
211    self.interfaces.append(interface)
212    return interface
213
214  def AddStruct(self, name):
215    struct=Struct(name, module=self)
216    self.structs.append(struct)
217    return struct
218