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 NULLABLE_STRING |
| 39 if self == HANDLE: |
| 40 return NULLABLE_HANDLE |
| 41 if self == DCPIPE: |
| 42 return NULLABLE_DCPIPE |
| 43 if self == DPPIPE: |
| 44 return NULLABLE_DPPIPE |
| 45 if self == MSGPIPE: |
| 46 return NULLABLE_MSGPIPE |
| 47 if self == SHAREDBUFFER: |
| 48 return NULLABLE_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 AddSharedProperty(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 NULLABLE_STRING = ReferenceKind('?s', True) |
| 98 NULLABLE_HANDLE = ReferenceKind('?h', True) |
| 99 NULLABLE_DCPIPE = ReferenceKind('?h:d:c', True) |
| 100 NULLABLE_DPPIPE = ReferenceKind('?h:d:p', True) |
| 101 NULLABLE_MSGPIPE = ReferenceKind('?h:m', True) |
| 102 NULLABLE_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 NULLABLE_STRING, |
| 125 NULLABLE_HANDLE, |
| 126 NULLABLE_DCPIPE, |
| 127 NULLABLE_DPPIPE, |
| 128 NULLABLE_MSGPIPE, |
| 129 NULLABLE_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.AddSharedProperty('name') |
| 175 ReferenceKind.AddSharedProperty('module') |
| 176 ReferenceKind.AddSharedProperty('imported_from') |
| 177 ReferenceKind.AddSharedProperty('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.AddSharedProperty('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.AddSharedProperty('kind') |
| 209 ReferenceKind.AddSharedProperty('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.AddSharedProperty('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.AddSharedProperty('module') |
| 262 ReferenceKind.AddSharedProperty('name') |
| 263 ReferenceKind.AddSharedProperty('imported_from') |
| 264 ReferenceKind.AddSharedProperty('client') |
| 265 ReferenceKind.AddSharedProperty('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 |