blob: 875ede9394175bb2c87246618d522b426cbeeafb [file] [log] [blame]
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This module's classes provide an interface to mojo modules. Modules are
# collections of interfaces and structs to be used by mojo ipc clients and
# servers.
#
# A simple interface would be created this way:
# module = mojom.generate.module.Module('Foo')
# interface = module.AddInterface('Bar')
# method = interface.AddMethod('Tat', 0)
# method.AddParameter('baz', 0, mojom.INT32)
#
class Kind(object):
def __init__(self, spec=None):
self.spec = spec
self.parent_kind = None
# Initialize the set of primitive types. These can be accessed by clients.
BOOL = Kind('b')
INT8 = Kind('i8')
INT16 = Kind('i16')
INT32 = Kind('i32')
INT64 = Kind('i64')
UINT8 = Kind('u8')
UINT16 = Kind('u16')
UINT32 = Kind('u32')
UINT64 = Kind('u64')
FLOAT = Kind('f')
DOUBLE = Kind('d')
STRING = Kind('s')
HANDLE = Kind('h')
DCPIPE = Kind('h:d:c')
DPPIPE = Kind('h:d:p')
MSGPIPE = Kind('h:m')
SHAREDBUFFER = Kind('h:s')
# Collection of all Primitive types
PRIMITIVES = (
BOOL,
INT8,
INT16,
INT32,
INT64,
UINT8,
UINT16,
UINT32,
UINT64,
FLOAT,
DOUBLE,
STRING,
HANDLE,
DCPIPE,
DPPIPE,
MSGPIPE,
SHAREDBUFFER
)
class Constant(object):
def __init__(self, module, enum, field):
self.module = module
self.namespace = module.namespace
self.parent_kind = enum.parent_kind
self.name = [enum.name, field.name]
self.imported_from = None
def GetSpec(self):
return (self.namespace + '.' +
(self.parent_kind and (self.parent_kind.name + '.') or "") + \
self.name[1])
class Field(object):
def __init__(self, name=None, kind=None, ordinal=None, default=None):
self.name = name
self.kind = kind
self.ordinal = ordinal
self.default = default
class Struct(Kind):
def __init__(self, name=None, module=None):
self.name = name
self.module = module
self.imported_from = None
if name != None:
spec = 'x:' + name
else:
spec = None
Kind.__init__(self, spec)
self.fields = []
def AddField(self, name, kind, ordinal=None, default=None):
field = Field(name, kind, ordinal, default)
self.fields.append(field)
return field
class Array(Kind):
def __init__(self, kind=None):
self.kind = kind
if kind != None:
Kind.__init__(self, 'a:' + kind.spec)
else:
Kind.__init__(self)
class Parameter(object):
def __init__(self, name=None, kind=None, ordinal=None, default=None):
self.name = name
self.ordinal = ordinal
self.kind = kind
self.default = default
class Method(object):
def __init__(self, interface, name, ordinal=None):
self.interface = interface
self.name = name
self.ordinal = ordinal
self.parameters = []
self.response_parameters = None
def AddParameter(self, name, kind, ordinal=None, default=None):
parameter = Parameter(name, kind, ordinal, default)
self.parameters.append(parameter)
return parameter
def AddResponseParameter(self, name, kind, ordinal=None, default=None):
if self.response_parameters == None:
self.response_parameters = []
parameter = Parameter(name, kind, ordinal, default)
self.response_parameters.append(parameter)
return parameter
class Interface(Kind):
def __init__(self, name=None, client=None, module=None):
self.module = module
self.name = name
if name != None:
spec = 'x:' + name
else:
spec = None
Kind.__init__(self, spec)
self.client = client
self.methods = []
def AddMethod(self, name, ordinal=None):
method = Method(self, name, ordinal=ordinal)
self.methods.append(method)
return method
class EnumField(object):
def __init__(self, name=None, value=None):
self.name = name
self.value = value
class Enum(Kind):
def __init__(self, name=None, module=None):
self.module = module
self.name = name
self.imported_from = None
if name != None:
spec = 'x:' + name
else:
spec = None
Kind.__init__(self, spec)
self.fields = []
class Module(object):
def __init__(self, name=None, namespace=None):
self.name = name
self.path = name
self.namespace = namespace
self.structs = []
self.interfaces = []
def AddInterface(self, name):
interface=Interface(name, module=self);
self.interfaces.append(interface)
return interface
def AddStruct(self, name):
struct=Struct(name, module=self)
self.structs.append(struct)
return struct