Chromium Code Reviews| 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 |