OLD | NEW |
---|---|
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 # This module's classes provide an interface to mojo modules. Modules are | 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 | 6 # collections of interfaces and structs to be used by mojo ipc clients and |
7 # servers. | 7 # servers. |
8 # | 8 # |
9 # A simple interface would be created this way: | 9 # A simple interface would be created this way: |
10 # module = mojom.generate.module.Module('Foo') | 10 # module = mojom.generate.module.Module('Foo') |
11 # interface = module.AddInterface('Bar') | 11 # interface = module.AddInterface('Bar') |
12 # method = interface.AddMethod('Tat', 0) | 12 # method = interface.AddMethod('Tat', 0) |
13 # method.AddParameter('baz', 0, mojom.INT32) | 13 # method.AddParameter('baz', 0, mojom.INT32) |
14 # | 14 |
15 | 15 |
16 class Kind(object): | 16 class Kind(object): |
17 def __init__(self, spec=None): | 17 def __init__(self, spec=None): |
18 self.spec = spec | 18 self.spec = spec |
19 self.parent_kind = None | 19 self.parent_kind = None |
20 | 20 |
21 | |
22 class ReferenceKind(Kind): | |
23 """ReferenceKind represents pointer types and handle types. | |
24 A type is nullable means that NULL (for pointer types) or invalid handle | |
25 (for handle types) is a legal value for the type. | |
26 """ | |
27 | |
28 def __init__(self, spec=None, is_nullable=False): | |
29 assert spec is None or is_nullable == spec.startswith('?') | |
30 Kind.__init__(self, spec) | |
31 self.is_nullable = is_nullable | |
32 self.shared_definition = {} | |
33 | |
34 def MakeNullableKind(self): | |
35 assert not self.is_nullable | |
36 | |
37 if self == STRING: | |
38 return NLBL_STRING | |
39 if self == HANDLE: | |
40 return NLBL_HANDLE | |
41 if self == DCPIPE: | |
42 return NLBL_DCPIPE | |
43 if self == DPPIPE: | |
44 return NLBL_DPPIPE | |
45 if self == MSGPIPE: | |
46 return NLBL_MSGPIPE | |
47 if self == SHAREDBUFFER: | |
48 return NLBL_SHAREDBUFFER | |
49 | |
50 nullable_kind = type(self)() | |
51 nullable_kind.shared_definition = self.shared_definition | |
52 if self.spec is not None: | |
53 nullable_kind.spec = '?' + self.spec | |
54 nullable_kind.is_nullable = True | |
55 | |
56 return nullable_kind | |
57 | |
58 @classmethod | |
59 def AddProperty(cls, name): | |
60 """Adds a property |name| to |cls|, which accesses the corresponding item in | |
61 |shared_definition|. | |
62 | |
63 The reason of adding such indirection is to enable sharing definition | |
64 between a reference kind and its nullable variation. For example: | |
65 a = Struct('test_struct_1') | |
66 b = a.MakeNullableKind() | |
67 a.name = 'test_struct_2' | |
68 print b.name # Outputs 'test_struct_2'. | |
69 """ | |
70 def Get(self): | |
71 return self.shared_definition[name] | |
72 | |
73 def Set(self, value): | |
74 self.shared_definition[name] = value | |
75 | |
76 setattr(cls, name, property(Get, Set)) | |
77 | |
78 | |
21 # Initialize the set of primitive types. These can be accessed by clients. | 79 # Initialize the set of primitive types. These can be accessed by clients. |
22 BOOL = Kind('b') | 80 BOOL = Kind('b') |
23 INT8 = Kind('i8') | 81 INT8 = Kind('i8') |
24 INT16 = Kind('i16') | 82 INT16 = Kind('i16') |
25 INT32 = Kind('i32') | 83 INT32 = Kind('i32') |
26 INT64 = Kind('i64') | 84 INT64 = Kind('i64') |
27 UINT8 = Kind('u8') | 85 UINT8 = Kind('u8') |
28 UINT16 = Kind('u16') | 86 UINT16 = Kind('u16') |
29 UINT32 = Kind('u32') | 87 UINT32 = Kind('u32') |
30 UINT64 = Kind('u64') | 88 UINT64 = Kind('u64') |
31 FLOAT = Kind('f') | 89 FLOAT = Kind('f') |
32 DOUBLE = Kind('d') | 90 DOUBLE = Kind('d') |
33 STRING = Kind('s') | 91 STRING = ReferenceKind('s') |
34 HANDLE = Kind('h') | 92 HANDLE = ReferenceKind('h') |
35 DCPIPE = Kind('h:d:c') | 93 DCPIPE = ReferenceKind('h:d:c') |
36 DPPIPE = Kind('h:d:p') | 94 DPPIPE = ReferenceKind('h:d:p') |
37 MSGPIPE = Kind('h:m') | 95 MSGPIPE = ReferenceKind('h:m') |
38 SHAREDBUFFER = Kind('h:s') | 96 SHAREDBUFFER = ReferenceKind('h:s') |
97 NLBL_STRING = ReferenceKind('?s', True) | |
darin (slow to review)
2014/08/06 22:48:26
I know we have been abbreviating labels here, but
yzshen1
2014/08/06 22:55:42
Done. Thanks!
| |
98 NLBL_HANDLE = ReferenceKind('?h', True) | |
99 NLBL_DCPIPE = ReferenceKind('?h:d:c', True) | |
100 NLBL_DPPIPE = ReferenceKind('?h:d:p', True) | |
101 NLBL_MSGPIPE = ReferenceKind('?h:m', True) | |
102 NLBL_SHAREDBUFFER = ReferenceKind('?h:s', True) | |
39 | 103 |
40 | 104 |
41 # Collection of all Primitive types | 105 # Collection of all Primitive types |
42 PRIMITIVES = ( | 106 PRIMITIVES = ( |
43 BOOL, | 107 BOOL, |
44 INT8, | 108 INT8, |
45 INT16, | 109 INT16, |
46 INT32, | 110 INT32, |
47 INT64, | 111 INT64, |
48 UINT8, | 112 UINT8, |
49 UINT16, | 113 UINT16, |
50 UINT32, | 114 UINT32, |
51 UINT64, | 115 UINT64, |
52 FLOAT, | 116 FLOAT, |
53 DOUBLE, | 117 DOUBLE, |
54 STRING, | 118 STRING, |
55 HANDLE, | 119 HANDLE, |
56 DCPIPE, | 120 DCPIPE, |
57 DPPIPE, | 121 DPPIPE, |
58 MSGPIPE, | 122 MSGPIPE, |
59 SHAREDBUFFER | 123 SHAREDBUFFER, |
124 NLBL_STRING, | |
125 NLBL_HANDLE, | |
126 NLBL_DCPIPE, | |
127 NLBL_DPPIPE, | |
128 NLBL_MSGPIPE, | |
129 NLBL_SHAREDBUFFER | |
60 ) | 130 ) |
61 | 131 |
62 | 132 |
63 class NamedValue(object): | 133 class NamedValue(object): |
64 def __init__(self, module, parent_kind, name): | 134 def __init__(self, module, parent_kind, name): |
65 self.module = module | 135 self.module = module |
66 self.namespace = module.namespace | 136 self.namespace = module.namespace |
67 self.parent_kind = parent_kind | 137 self.parent_kind = parent_kind |
68 self.name = name | 138 self.name = name |
69 self.imported_from = None | 139 self.imported_from = None |
(...skipping 23 matching lines...) Expand all Loading... | |
93 | 163 |
94 | 164 |
95 class Field(object): | 165 class Field(object): |
96 def __init__(self, name=None, kind=None, ordinal=None, default=None): | 166 def __init__(self, name=None, kind=None, ordinal=None, default=None): |
97 self.name = name | 167 self.name = name |
98 self.kind = kind | 168 self.kind = kind |
99 self.ordinal = ordinal | 169 self.ordinal = ordinal |
100 self.default = default | 170 self.default = default |
101 | 171 |
102 | 172 |
103 class Struct(Kind): | 173 class Struct(ReferenceKind): |
174 ReferenceKind.AddProperty('name') | |
175 ReferenceKind.AddProperty('module') | |
176 ReferenceKind.AddProperty('imported_from') | |
177 ReferenceKind.AddProperty('fields') | |
178 | |
104 def __init__(self, name=None, module=None): | 179 def __init__(self, name=None, module=None): |
105 self.name = name | |
106 self.module = module | |
107 self.imported_from = None | |
108 if name is not None: | 180 if name is not None: |
109 spec = 'x:' + name | 181 spec = 'x:' + name |
110 else: | 182 else: |
111 spec = None | 183 spec = None |
112 Kind.__init__(self, spec) | 184 ReferenceKind.__init__(self, spec) |
185 self.name = name | |
186 self.module = module | |
187 self.imported_from = None | |
113 self.fields = [] | 188 self.fields = [] |
114 | 189 |
115 def AddField(self, name, kind, ordinal=None, default=None): | 190 def AddField(self, name, kind, ordinal=None, default=None): |
116 field = Field(name, kind, ordinal, default) | 191 field = Field(name, kind, ordinal, default) |
117 self.fields.append(field) | 192 self.fields.append(field) |
118 return field | 193 return field |
119 | 194 |
120 | 195 |
121 class Array(Kind): | 196 class Array(ReferenceKind): |
197 ReferenceKind.AddProperty('kind') | |
198 | |
122 def __init__(self, kind=None): | 199 def __init__(self, kind=None): |
200 if kind is not None: | |
201 ReferenceKind.__init__(self, 'a:' + kind.spec) | |
202 else: | |
203 ReferenceKind.__init__(self) | |
123 self.kind = kind | 204 self.kind = kind |
205 | |
206 | |
207 class FixedArray(ReferenceKind): | |
208 ReferenceKind.AddProperty('kind') | |
209 ReferenceKind.AddProperty('length') | |
210 | |
211 def __init__(self, length=-1, kind=None): | |
124 if kind is not None: | 212 if kind is not None: |
125 Kind.__init__(self, 'a:' + kind.spec) | 213 ReferenceKind.__init__(self, 'a%d:%s' % (length, kind.spec)) |
126 else: | 214 else: |
127 Kind.__init__(self) | 215 ReferenceKind.__init__(self) |
128 | |
129 class FixedArray(Kind): | |
130 def __init__(self, length, kind=None): | |
131 self.kind = kind | 216 self.kind = kind |
132 self.length = length | 217 self.length = length |
218 | |
219 | |
220 class InterfaceRequest(ReferenceKind): | |
221 ReferenceKind.AddProperty('kind') | |
222 | |
223 def __init__(self, kind=None): | |
133 if kind is not None: | 224 if kind is not None: |
134 Kind.__init__(self, 'a' + length + ':' + kind.spec) | 225 ReferenceKind.__init__(self, 'r:' + kind.spec) |
135 else: | 226 else: |
136 Kind.__init__(self) | 227 ReferenceKind.__init__(self) |
137 | |
138 class InterfaceRequest(Kind): | |
139 def __init__(self, kind=None): | |
140 self.kind = kind | 228 self.kind = kind |
141 if kind is not None: | |
142 Kind.__init__(self, 'r:' + kind.spec) | |
143 else: | |
144 Kind.__init__(self) | |
145 | 229 |
146 | 230 |
147 class Parameter(object): | 231 class Parameter(object): |
148 def __init__(self, name=None, kind=None, ordinal=None, default=None): | 232 def __init__(self, name=None, kind=None, ordinal=None, default=None): |
149 self.name = name | 233 self.name = name |
150 self.ordinal = ordinal | 234 self.ordinal = ordinal |
151 self.kind = kind | 235 self.kind = kind |
152 self.default = default | 236 self.default = default |
153 | 237 |
154 | 238 |
(...skipping 11 matching lines...) Expand all Loading... | |
166 return parameter | 250 return parameter |
167 | 251 |
168 def AddResponseParameter(self, name, kind, ordinal=None, default=None): | 252 def AddResponseParameter(self, name, kind, ordinal=None, default=None): |
169 if self.response_parameters == None: | 253 if self.response_parameters == None: |
170 self.response_parameters = [] | 254 self.response_parameters = [] |
171 parameter = Parameter(name, kind, ordinal, default) | 255 parameter = Parameter(name, kind, ordinal, default) |
172 self.response_parameters.append(parameter) | 256 self.response_parameters.append(parameter) |
173 return parameter | 257 return parameter |
174 | 258 |
175 | 259 |
176 class Interface(Kind): | 260 class Interface(ReferenceKind): |
261 ReferenceKind.AddProperty('module') | |
262 ReferenceKind.AddProperty('name') | |
263 ReferenceKind.AddProperty('imported_from') | |
264 ReferenceKind.AddProperty('client') | |
265 ReferenceKind.AddProperty('methods') | |
266 | |
177 def __init__(self, name=None, client=None, module=None): | 267 def __init__(self, name=None, client=None, module=None): |
178 self.module = module | |
179 self.name = name | |
180 self.imported_from = None | |
181 if name is not None: | 268 if name is not None: |
182 spec = 'x:' + name | 269 spec = 'x:' + name |
183 else: | 270 else: |
184 spec = None | 271 spec = None |
185 Kind.__init__(self, spec) | 272 ReferenceKind.__init__(self, spec) |
273 self.module = module | |
274 self.name = name | |
275 self.imported_from = None | |
186 self.client = client | 276 self.client = client |
187 self.methods = [] | 277 self.methods = [] |
188 | 278 |
189 def AddMethod(self, name, ordinal=None): | 279 def AddMethod(self, name, ordinal=None): |
190 method = Method(self, name, ordinal=ordinal) | 280 method = Method(self, name, ordinal=ordinal) |
191 self.methods.append(method) | 281 self.methods.append(method) |
192 return method | 282 return method |
193 | 283 |
194 | 284 |
195 class EnumField(object): | 285 class EnumField(object): |
(...skipping 25 matching lines...) Expand all Loading... | |
221 | 311 |
222 def AddInterface(self, name): | 312 def AddInterface(self, name): |
223 interface=Interface(name, module=self); | 313 interface=Interface(name, module=self); |
224 self.interfaces.append(interface) | 314 self.interfaces.append(interface) |
225 return interface | 315 return interface |
226 | 316 |
227 def AddStruct(self, name): | 317 def AddStruct(self, name): |
228 struct=Struct(name, module=self) | 318 struct=Struct(name, module=self) |
229 self.structs.append(struct) | 319 self.structs.append(struct) |
230 return struct | 320 return struct |
OLD | NEW |