def JavaScriptEncodeSnippet(kind): if kind in mojom.PRIMITIVES: return "encodeStruct(%s, " % CodecType(kind) if mojom.IsStructKind(kind): return "encodeStructPointer(%s, " % JavaScriptType(kind) if mojom.IsAnyArrayKind(kind) and mojom.IsBoolKind(kind.kind): return "encodeArrayPointer(codec.PackedBool, " if mojom.IsAnyArrayKind(kind): return "encodeArrayPointer(%s, " % CodecType(kind.kind) if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): return JavaScriptEncodeSnippet(mojom.MSGPIPE) if mojom.IsEnumKind(kind): return JavaScriptEncodeSnippet(mojom.INT32)
def GetCppConstWrapperType(kind): if mojom.IsStructKind(kind): return "%sPtr" % GetNameForKind(kind) if mojom.IsAnyArrayKind(kind): return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind) if mojom.IsInterfaceKind(kind): return "%sPtr" % GetNameForKind(kind) if mojom.IsInterfaceRequestKind(kind): return "mojo::InterfaceRequest<%s>" % GetNameForKind(kind.kind) if mojom.IsEnumKind(kind): return GetNameForKind(kind) if mojom.IsStringKind(kind): return "const mojo::String&" if mojom.IsHandleKind(kind): return "mojo::ScopedHandle" if mojom.IsDataPipeConsumerKind(kind): return "mojo::ScopedDataPipeConsumerHandle" if mojom.IsDataPipeProducerKind(kind): return "mojo::ScopedDataPipeProducerHandle" if mojom.IsMessagePipeKind(kind): return "mojo::ScopedMessagePipeHandle" if mojom.IsSharedBufferKind(kind): return "mojo::ScopedSharedBufferHandle" if not kind in _kind_to_cpp_type: print "missing:", kind.spec return _kind_to_cpp_type[kind]
def GetFieldType(kind, field=None): if mojom.IsAnyArrayKind(kind): arguments = [] if kind.kind in _kind_to_typecode_for_native_array: arguments.append('%r' % _kind_to_typecode_for_native_array[kind.kind]) elif kind.kind != mojom.BOOL: arguments.append(GetFieldType(kind.kind)) if mojom.IsNullableKind(kind): arguments.append('nullable=True') if mojom.IsFixedArrayKind(kind): arguments.append('length=%d' % kind.length) array_type = 'GenericArrayType' if kind.kind == mojom.BOOL: array_type = 'BooleanArrayType' elif kind.kind in _kind_to_typecode_for_native_array: array_type = 'NativeArrayType' return '_descriptor.%s(%s)' % (array_type, ', '.join(arguments)) if mojom.IsStructKind(kind): arguments = [GetStructClass(kind)] if mojom.IsNullableKind(kind): arguments.append('nullable=True') return '_descriptor.StructType(%s)' % ', '.join(arguments) if mojom.IsEnumKind(kind): return GetFieldType(mojom.INT32) return _kind_to_type.get(kind, '_descriptor.TYPE_NONE')
def EncodeMethod(context, kind, variable, offset, bit): additionalParams = '' if (kind == mojom.BOOL): additionalParams = ', %d' % bit if mojom.IsInterfaceKind(kind): additionalParams = ', %s.BUILDER' % GetJavaType(context, kind) if mojom.IsAnyArrayKind(kind) and mojom.IsInterfaceKind(kind.kind): additionalParams = ', %s.BUILDER' % GetJavaType(context, kind.kind) return 'encode(%s, %s%s)' % (variable, offset, additionalParams)
def _DecodeMethodName(kind): if mojom.IsAnyArrayKind(kind): return _DecodeMethodName(kind.kind) + 's' if mojom.IsEnumKind(kind): return _DecodeMethodName(mojom.INT32) if mojom.IsInterfaceRequestKind(kind): return 'readInterfaceRequest' if mojom.IsInterfaceKind(kind): return 'readServiceInterface' return _spec_to_decode_method[kind.spec]
def GetCppType(kind): if mojom.IsStructKind(kind): return "%s_Data*" % GetNameForKind(kind, internal=True) if mojom.IsAnyArrayKind(kind): return "mojo::internal::Array_Data<%s>*" % GetCppType(kind.kind) if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): return "mojo::MessagePipeHandle" if mojom.IsEnumKind(kind): return "int32_t" if mojom.IsStringKind(kind): return "mojo::internal::String_Data*" return _kind_to_cpp_type[kind]
def AppendEncodeDecodeParams(initial_params, context, kind, bit): """ Appends standard parameters shared between encode and decode calls. """ params = list(initial_params) if (kind == mojom.BOOL): params.append(str(bit)) if mojom.IsReferenceKind(kind): if mojom.IsAnyArrayKind(kind): params.append(GetArrayNullabilityFlags(kind)) else: params.append(GetJavaTrueFalse(mojom.IsNullableKind(kind))) if mojom.IsAnyArrayKind(kind): if mojom.IsFixedArrayKind(kind): params.append(str(kind.length)) else: params.append( 'org.chromium.mojo.bindings.BindingsHelper.UNSPECIFIED_ARRAY_LENGTH' ) if mojom.IsInterfaceKind(kind): params.append('%s.MANAGER' % GetJavaType(context, kind)) if mojom.IsAnyArrayKind(kind) and mojom.IsInterfaceKind(kind.kind): params.append('%s.MANAGER' % GetJavaType(context, kind.kind)) return params
def GetJavaType(context, kind, boxed=False): if boxed: return GetBoxedJavaType(context, kind) if mojom.IsStructKind(kind) or mojom.IsInterfaceKind(kind): return GetNameForKind(context, kind) if mojom.IsInterfaceRequestKind(kind): return ('org.chromium.mojo.bindings.InterfaceRequest<%s>' % GetNameForKind(context, kind.kind)) if mojom.IsAnyArrayKind(kind): return '%s[]' % GetJavaType(context, kind.kind) if mojom.IsEnumKind(kind): return 'int' return _spec_to_java_type[kind.spec]
def GetCppFieldType(kind): if mojom.IsStructKind(kind): return ("mojo::internal::StructPointer<%s_Data>" % GetNameForKind(kind, internal=True)) if mojom.IsAnyArrayKind(kind): return "mojo::internal::ArrayPointer<%s>" % GetCppType(kind.kind) if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): return "mojo::MessagePipeHandle" if mojom.IsEnumKind(kind): return GetNameForKind(kind) if mojom.IsStringKind(kind): return "mojo::internal::StringPointer" return _kind_to_cpp_type[kind]
def GetArrayValidateParams(kind): if not mojom.IsAnyArrayKind(kind) and not mojom.IsStringKind(kind): return "mojo::internal::NoValidateParams" if mojom.IsStringKind(kind): expected_num_elements = 0 element_nullable = False element_validate_params = "mojo::internal::NoValidateParams" else: expected_num_elements = generator.ExpectedArraySize(kind) element_nullable = mojom.IsNullableKind(kind.kind) element_validate_params = GetArrayValidateParams(kind.kind) return "mojo::internal::ArrayValidateParams<%d, %s,\n%s> " % ( expected_num_elements, 'true' if element_nullable else 'false', element_validate_params)
def JavaScriptDefaultValue(field): if field.default: if mojom.IsStructKind(field.kind): assert field.default == "default" return "new %s()" % JavaScriptType(field.kind) return ExpressionToText(field.default) if field.kind in mojom.PRIMITIVES: return _kind_to_javascript_default_value[field.kind] if mojom.IsStructKind(field.kind): return "null" if mojom.IsAnyArrayKind(field.kind): return "null" if mojom.IsInterfaceKind(field.kind) or \ mojom.IsInterfaceRequestKind(field.kind): return _kind_to_javascript_default_value[mojom.MSGPIPE] if mojom.IsEnumKind(field.kind): return "0"
def CodecType(kind): if kind in mojom.PRIMITIVES: return _kind_to_codec_type[kind] if mojom.IsStructKind(kind): pointer_type = "NullablePointerTo" if mojom.IsNullableKind(kind) \ else "PointerTo" return "new codec.%s(%s)" % (pointer_type, JavaScriptType(kind)) if mojom.IsAnyArrayKind(kind): array_type = "NullableArrayOf" if mojom.IsNullableKind( kind) else "ArrayOf" element_type = "codec.PackedBool" if mojom.IsBoolKind(kind.kind) \ else CodecType(kind.kind) return "new codec.%s(%s)" % (array_type, element_type) if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): return CodecType(mojom.MSGPIPE) if mojom.IsEnumKind(kind): return _kind_to_codec_type[mojom.INT32] return kind
def DecodeMethod(context, kind, offset, bit): def _DecodeMethodName(kind): if mojom.IsAnyArrayKind(kind): return _DecodeMethodName(kind.kind) + 's' if mojom.IsEnumKind(kind): return _DecodeMethodName(mojom.INT32) if mojom.IsInterfaceRequestKind(kind): return "readInterfaceRequest" if mojom.IsInterfaceKind(kind): return "readServiceInterface" return _spec_to_decode_method[kind.spec] methodName = _DecodeMethodName(kind) additionalParams = '' if (kind == mojom.BOOL): additionalParams = ', %d' % bit if mojom.IsInterfaceKind(kind): additionalParams = ', %s.BUILDER' % GetJavaType(context, kind) if mojom.IsAnyArrayKind(kind) and mojom.IsInterfaceKind(kind.kind): additionalParams = ', %s.BUILDER' % GetJavaType(context, kind.kind) return '%s(%s%s)' % (methodName, offset, additionalParams)
def GetArrayNullabilityFlags(kind): """Returns nullability flags for an array type, see Decoder.java. As we have dedicated decoding functions for arrays, we have to pass nullability information about both the array itself, as well as the array element type there. """ assert mojom.IsAnyArrayKind(kind) ARRAY_NULLABLE = \ 'org.chromium.mojo.bindings.BindingsHelper.ARRAY_NULLABLE' ELEMENT_NULLABLE = \ 'org.chromium.mojo.bindings.BindingsHelper.ELEMENT_NULLABLE' NOTHING_NULLABLE = \ 'org.chromium.mojo.bindings.BindingsHelper.NOTHING_NULLABLE' flags_to_set = [] if mojom.IsNullableKind(kind): flags_to_set.append(ARRAY_NULLABLE) if mojom.IsNullableKind(kind.kind): flags_to_set.append(ELEMENT_NULLABLE) if not flags_to_set: flags_to_set = [NOTHING_NULLABLE] return ' | '.join(flags_to_set)
def GetCppArrayArgWrapperType(kind): if mojom.IsEnumKind(kind): return GetNameForKind(kind) if mojom.IsStructKind(kind): return "%sPtr" % GetNameForKind(kind) if mojom.IsAnyArrayKind(kind): return "mojo::Array<%s> " % GetCppArrayArgWrapperType(kind.kind) if mojom.IsInterfaceKind(kind): raise Exception("Arrays of interfaces not yet supported!") if mojom.IsInterfaceRequestKind(kind): raise Exception("Arrays of interface requests not yet supported!") if mojom.IsStringKind(kind): return "mojo::String" if mojom.IsHandleKind(kind): return "mojo::ScopedHandle" if mojom.IsDataPipeConsumerKind(kind): return "mojo::ScopedDataPipeConsumerHandle" if mojom.IsDataPipeProducerKind(kind): return "mojo::ScopedDataPipeProducerHandle" if mojom.IsMessagePipeKind(kind): return "mojo::ScopedMessagePipeHandle" if mojom.IsSharedBufferKind(kind): return "mojo::ScopedSharedBufferHandle" return _kind_to_cpp_type[kind]
def NewArray(context, kind, size): if mojom.IsAnyArrayKind(kind.kind): return NewArray(context, kind.kind, size) + '[]' return 'new %s[%s]' % (GetJavaType(context, kind.kind), size)
def IsPointerArrayKind(kind): if not mojom.IsAnyArrayKind(kind): return False sub_kind = kind.kind return mojom.IsObjectKind(sub_kind)
def IsArrayPointerField(field): return mojom.IsAnyArrayKind(field.kind)