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