Index: mojo/public/tools/bindings/generators/mojom_java_generator.py |
diff --git a/mojo/public/tools/bindings/generators/mojom_java_generator.py b/mojo/public/tools/bindings/generators/mojom_java_generator.py |
index cc1569f03cc06d710c9d79197f051db3259e4ad8..7364afc56ad725ff594c1180e68fc377d69071ce 100644 |
--- a/mojo/public/tools/bindings/generators/mojom_java_generator.py |
+++ b/mojo/public/tools/bindings/generators/mojom_java_generator.py |
@@ -17,6 +17,8 @@ from mojom.generate.template_expander import UseJinja |
GENERATOR_PREFIX = 'java' |
+_HEADER_SIZE = 8 |
+ |
_spec_to_java_type = { |
'b': 'boolean', |
'd': 'double', |
@@ -37,6 +39,26 @@ _spec_to_java_type = { |
'u8': 'byte', |
} |
+_spec_to_decode_method = { |
+ 'b': 'readBoolean', |
+ 'd': 'readDouble', |
+ 'f': 'readFloat', |
+ 'h:d:c': 'readConsumerHandle', |
+ 'h:d:p': 'readProducerHandle', |
+ 'h:m': 'readMessagePipeHandle', |
+ 'h': 'readUntypedHandle', |
+ 'h:s': 'readSharedBufferHandle', |
+ 'i16': 'readShort', |
+ 'i32': 'readInt', |
+ 'i64': 'readLong', |
+ 'i8': 'readByte', |
+ 's': 'readString', |
+ 'u16': 'readShort', |
+ 'u32': 'readInt', |
+ 'u64': 'readLong', |
+ 'u8': 'readByte', |
+} |
+ |
_java_primitive_to_boxed_type = { |
'boolean': 'Boolean', |
'byte': 'Byte', |
@@ -99,6 +121,42 @@ def ParseStringAttribute(attribute): |
assert isinstance(attribute, basestring) |
return attribute |
+def IsArray(kind): |
+ return isinstance(kind, (mojom.Array, mojom.FixedArray)) |
+ |
+@contextfilter |
+def DecodeMethod(context, kind, offset, bit): |
+ def _DecodeMethodName(kind): |
+ if IsArray(kind): |
+ return _DecodeMethodName(kind.kind) + 's' |
+ if isinstance(kind, mojom.Enum): |
+ return _DecodeMethodName(mojom.INT32) |
+ if isinstance(kind, mojom.InterfaceRequest): |
+ return "readInterfaceRequest" |
+ if isinstance(kind, mojom.Interface): |
+ return "readServiceInterface" |
+ return _spec_to_decode_method[kind.spec] |
+ methodName = _DecodeMethodName(kind) |
+ additionalParams = '' |
+ if (kind == mojom.BOOL): |
+ additionalParams = ', %d' % bit |
+ if isinstance(kind, mojom.Interface): |
+ additionalParams = ', %s.BUILDER' % GetJavaType(context, kind) |
+ if IsArray(kind) and isinstance(kind.kind, mojom.Interface): |
+ additionalParams = ', %s.BUILDER' % GetJavaType(context, kind.kind) |
+ return '%s(%s%s)' % (methodName, offset, additionalParams) |
+ |
+@contextfilter |
+def EncodeMethod(context, kind, variable, offset, bit): |
+ additionalParams = '' |
+ if (kind == mojom.BOOL): |
+ additionalParams = ', %d' % bit |
+ if isinstance(kind, mojom.Interface): |
+ additionalParams = ', %s.BUILDER' % GetJavaType(context, kind) |
+ if IsArray(kind) and isinstance(kind.kind, mojom.Interface): |
+ additionalParams = ', %s.BUILDER' % GetJavaType(context, kind.kind) |
+ return 'encode(%s, %s%s)' % (variable, offset, additionalParams) |
+ |
def GetPackage(module): |
if 'JavaPackage' in module.attributes: |
return ParseStringAttribute(module.attributes['JavaPackage']) |
@@ -135,7 +193,7 @@ def GetJavaType(context, kind, boxed=False): |
if isinstance(kind, mojom.InterfaceRequest): |
return ("org.chromium.mojo.bindings.InterfaceRequest<%s>" % |
GetNameForKind(context, kind.kind)) |
- if isinstance(kind, (mojom.Array, mojom.FixedArray)): |
+ if IsArray(kind): |
return "%s[]" % GetJavaType(context, kind.kind) |
if isinstance(kind, mojom.Enum): |
return "int" |
@@ -154,6 +212,12 @@ def DefaultValue(context, field): |
ExpressionToText(context, field.default)) |
@contextfilter |
+def NewArray(context, kind, size): |
+ if IsArray(kind.kind): |
+ return NewArray(context, kind.kind, size) + '[]' |
+ return 'new %s[%s]' % (GetJavaType(context, kind.kind), size) |
+ |
+@contextfilter |
def ExpressionToText(context, token): |
def _TranslateNamedValue(named_value): |
entity_name = GetNameForElement(named_value) |
@@ -174,6 +238,12 @@ def ExpressionToText(context, token): |
return token + 'L' |
return token |
+def IsPointerArrayKind(kind): |
+ if not IsArray(kind): |
+ return False |
+ sub_kind = kind.kind |
+ return generator.IsObjectKind(sub_kind) |
+ |
def GetConstantsMainEntityName(module): |
if 'JavaConstantsClassName' in module.attributes: |
return ParseStringAttribute(module.attributes['JavaConstantsClassName']) |
@@ -187,10 +257,16 @@ class Generator(generator.Generator): |
java_filters = { |
"interface_response_name": GetInterfaceResponseName, |
"default_value": DefaultValue, |
+ "decode_method": DecodeMethod, |
"expression_to_text": ExpressionToText, |
+ "encode_method": EncodeMethod, |
"is_handle": IsHandle, |
+ "is_pointer_array_kind": IsPointerArrayKind, |
+ "is_struct_kind": lambda kind: isinstance(kind, mojom.Struct), |
"java_type": GetJavaType, |
"name": GetNameForElement, |
+ "new_array": NewArray, |
+ "struct_size": lambda ps: ps.GetTotalSize() + _HEADER_SIZE, |
} |
def GetJinjaExports(self): |