/* * Copyright (C) 2015, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "type_java.h" #include #include #include #include "aidl_language.h" #include "logging.h" using std::string; namespace android { namespace aidl { namespace java { Expression* NULL_VALUE; Expression* THIS_VALUE; Expression* SUPER_VALUE; Expression* TRUE_VALUE; Expression* FALSE_VALUE; // ================================================================ Type::Type(const JavaTypeNamespace* types, const string& name, int kind, bool canWriteToParcel) : Type(types, "", name, kind, canWriteToParcel, "", -1) {} Type::Type(const JavaTypeNamespace* types, const string& package, const string& name, int kind, bool canWriteToParcel, const string& declFile, int declLine) : ValidatableType(kind, package, name, declFile, declLine), m_types(types), m_javaType((package.empty()) ? name : package + "." + name), m_canWriteToParcel(canWriteToParcel) {} string Type::InstantiableName() const { return JavaType(); } Expression* Type::BuildWriteToParcelFlags(int flags) const { if (flags == 0) { return new LiteralExpression("0"); } if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0) { return new FieldVariable(m_types->ParcelableInterfaceType()->JavaType(), "PARCELABLE_WRITE_RETURN_VALUE"); } return new LiteralExpression("0"); } // ================================================================ BasicType::BasicType(const JavaTypeNamespace* types, const string& name, const string& marshallParcel, const string& unmarshallParcel, const string& writeArrayParcel, const string& createArrayParcel, const string& readArrayParcel) : Type(types, name, ValidatableType::KIND_BUILT_IN, true), m_marshallParcel(marshallParcel), m_unmarshallParcel(unmarshallParcel) { m_array_type.reset(new BasicArrayType(types, name, writeArrayParcel, createArrayParcel, readArrayParcel)); } BasicArrayType::BasicArrayType(const JavaTypeNamespace* types, const string& name, const string& writeArrayParcel, const string& createArrayParcel, const string& readArrayParcel) : Type(types, name, ValidatableType::KIND_BUILT_IN, true), m_writeArrayParcel(writeArrayParcel), m_createArrayParcel(createArrayParcel), m_readArrayParcel(readArrayParcel) {} // ================================================================ FileDescriptorType::FileDescriptorType(const JavaTypeNamespace* types) : Type(types, "java.io", "FileDescriptor", ValidatableType::KIND_BUILT_IN, true) { m_array_type.reset(new FileDescriptorArrayType(types)); } FileDescriptorArrayType::FileDescriptorArrayType(const JavaTypeNamespace* types) : Type(types, "java.io", "FileDescriptor", ValidatableType::KIND_BUILT_IN, true) {} // ================================================================ ParcelFileDescriptorType::ParcelFileDescriptorType(const JavaTypeNamespace* types) : Type(types, "android.os", "ParcelFileDescriptor", ValidatableType::KIND_BUILT_IN, true) { m_array_type.reset(new ParcelFileDescriptorArrayType(types)); } ParcelFileDescriptorArrayType::ParcelFileDescriptorArrayType(const JavaTypeNamespace* types) : Type(types, "android.os", "ParcelFileDescriptor", ValidatableType::KIND_BUILT_IN, true) {} // ================================================================ BooleanType::BooleanType(const JavaTypeNamespace* types) : Type(types, "boolean", ValidatableType::KIND_BUILT_IN, true) { m_array_type.reset(new BooleanArrayType(types)); } BooleanArrayType::BooleanArrayType(const JavaTypeNamespace* types) : Type(types, "boolean", ValidatableType::KIND_BUILT_IN, true) {} // ================================================================ CharType::CharType(const JavaTypeNamespace* types) : Type(types, "char", ValidatableType::KIND_BUILT_IN, true) { m_array_type.reset(new CharArrayType(types)); } CharArrayType::CharArrayType(const JavaTypeNamespace* types) : Type(types, "char", ValidatableType::KIND_BUILT_IN, true) {} // ================================================================ StringType::StringType(const JavaTypeNamespace* types, const std::string& package, const std::string& class_name) : Type(types, package, class_name, ValidatableType::KIND_BUILT_IN, true) { m_array_type.reset(new StringArrayType(types)); } StringArrayType::StringArrayType(const JavaTypeNamespace* types) : Type(types, "java.lang", "String", ValidatableType::KIND_BUILT_IN, true) {} // ================================================================ CharSequenceType::CharSequenceType(const JavaTypeNamespace* types) : Type(types, "java.lang", "CharSequence", ValidatableType::KIND_BUILT_IN, true) {} // ================================================================ RemoteExceptionType::RemoteExceptionType(const JavaTypeNamespace* types) : Type(types, "android.os", "RemoteException", ValidatableType::KIND_BUILT_IN, false) {} // ================================================================ RuntimeExceptionType::RuntimeExceptionType(const JavaTypeNamespace* types) : Type(types, "java.lang", "RuntimeException", ValidatableType::KIND_BUILT_IN, false) {} // ================================================================ IBinderType::IBinderType(const JavaTypeNamespace* types) : Type(types, "android.os", "IBinder", ValidatableType::KIND_BUILT_IN, true) { m_array_type.reset(new IBinderArrayType(types)); } IBinderArrayType::IBinderArrayType(const JavaTypeNamespace* types) : Type(types, "android.os", "IBinder", ValidatableType::KIND_BUILT_IN, true) {} // ================================================================ IInterfaceType::IInterfaceType(const JavaTypeNamespace* types) : Type(types, "android.os", "IInterface", ValidatableType::KIND_BUILT_IN, false) {} // ================================================================ BinderType::BinderType(const JavaTypeNamespace* types) : Type(types, "android.os", "Binder", ValidatableType::KIND_BUILT_IN, false) {} // ================================================================ BinderProxyType::BinderProxyType(const JavaTypeNamespace* types) : Type(types, "android.os", "BinderProxy", ValidatableType::KIND_BUILT_IN, false) {} // ================================================================ ParcelType::ParcelType(const JavaTypeNamespace* types) : Type(types, "android.os", "Parcel", ValidatableType::KIND_BUILT_IN, false) {} // ================================================================ ParcelableInterfaceType::ParcelableInterfaceType(const JavaTypeNamespace* types) : Type(types, "android.os", "Parcelable", ValidatableType::KIND_BUILT_IN, false) {} // ================================================================ MapType::MapType(const JavaTypeNamespace* types) : Type(types, "java.util", "Map", ValidatableType::KIND_BUILT_IN, true) {} // ================================================================ ListType::ListType(const JavaTypeNamespace* types) : Type(types, "java.util", "List", ValidatableType::KIND_BUILT_IN, true) {} string ListType::InstantiableName() const { return "java.util.ArrayList"; } // ================================================================ UserDataType::UserDataType(const JavaTypeNamespace* types, const string& package, const string& name, bool builtIn, bool canWriteToParcel, const string& declFile, int declLine) : Type(types, package, name, builtIn ? ValidatableType::KIND_BUILT_IN : ValidatableType::KIND_PARCELABLE, canWriteToParcel, declFile, declLine) { m_array_type.reset(new UserDataArrayType(types, package, name, builtIn, canWriteToParcel, declFile, declLine)); } UserDataArrayType::UserDataArrayType(const JavaTypeNamespace* types, const string& package, const string& name, bool builtIn, bool canWriteToParcel, const string& declFile, int declLine) : Type(types, package, name, builtIn ? ValidatableType::KIND_BUILT_IN : ValidatableType::KIND_PARCELABLE, canWriteToParcel, declFile, declLine) {} // ================================================================ InterfaceType::InterfaceType(const JavaTypeNamespace* types, const string& package, const string& name, bool builtIn, const string& declFile, int declLine, const Type* stub, const Type* proxy, const Type* defaultImpl) : Type(types, package, name, builtIn ? ValidatableType::KIND_BUILT_IN : ValidatableType::KIND_INTERFACE, true, declFile, declLine), stub_(stub), proxy_(proxy), defaultImpl_(defaultImpl) {} // ================================================================ GenericListType::GenericListType(const JavaTypeNamespace* types, const Type* contained_type) : Type(types, "java.util", "List<" + contained_type->CanonicalName() + ">", ValidatableType::KIND_BUILT_IN, true), m_contained_type(contained_type) {} string GenericListType::InstantiableName() const { return "java.util.ArrayList<" + m_contained_type->JavaType() + ">"; } // ================================================================ ClassLoaderType::ClassLoaderType(const JavaTypeNamespace* types) : Type(types, "java.lang", "ClassLoader", ValidatableType::KIND_BUILT_IN, false) {} // ================================================================ void JavaTypeNamespace::Init() { Add(std::make_unique(this, "void", "XXX", "XXX", "XXX", "XXX", "XXX")); AddAndSetMember(&m_bool_type, std::make_unique(this)); Add(std::make_unique(this, "byte", "writeByte", "readByte", "writeByteArray", "createByteArray", "readByteArray")); Add(std::make_unique(this)); AddAndSetMember(&m_int_type, std::make_unique(this, "int", "writeInt", "readInt", "writeIntArray", "createIntArray", "readIntArray")); Add(std::make_unique(this, "long", "writeLong", "readLong", "writeLongArray", "createLongArray", "readLongArray")); Add(std::make_unique(this, "float", "writeFloat", "readFloat", "writeFloatArray", "createFloatArray", "readFloatArray")); Add(std::make_unique(this, "double", "writeDouble", "readDouble", "writeDoubleArray", "createDoubleArray", "readDoubleArray")); AddAndSetMember(&m_string_type, std::make_unique(this, "java.lang", "String")); Add(std::make_unique(this, ::android::aidl::kAidlReservedTypePackage, ::android::aidl::kUtf8InCppStringClass)); Add(std::make_unique(this, "java.lang", "Object", ValidatableType::KIND_BUILT_IN, false)); Add(std::make_unique(this)); Add(std::make_unique(this)); Add(std::make_unique(this)); Add(std::make_unique(this)); Add(std::make_unique(this)); AddAndSetMember(&m_text_utils_type, std::make_unique(this, "android.text", "TextUtils", ValidatableType::KIND_BUILT_IN, false)); AddAndSetMember(&m_remote_exception_type, std::make_unique(this)); AddAndSetMember(&m_runtime_exception_type, std::make_unique(this)); AddAndSetMember(&m_ibinder_type, std::make_unique(this)); AddAndSetMember(&m_iinterface_type, std::make_unique(this)); AddAndSetMember(&m_binder_native_type, std::make_unique(this)); AddAndSetMember(&m_binder_proxy_type, std::make_unique(this)); AddAndSetMember(&m_parcel_type, std::make_unique(this)); AddAndSetMember(&m_parcelable_interface_type, std::make_unique(this)); AddAndSetMember(&m_context_type, std::make_unique(this, "android.content", "Context", ValidatableType::KIND_BUILT_IN, false)); AddAndSetMember(&m_classloader_type, std::make_unique(this)); NULL_VALUE = new LiteralExpression("null"); THIS_VALUE = new LiteralExpression("this"); SUPER_VALUE = new LiteralExpression("super"); TRUE_VALUE = new LiteralExpression("true"); FALSE_VALUE = new LiteralExpression("false"); } bool JavaTypeNamespace::AddParcelableType(const AidlParcelable& p, const std::string& filename) { return Add( std::make_unique(this, p.GetPackage(), p.GetName(), false, true, filename)); } bool JavaTypeNamespace::AddBinderType(const AidlInterface& b, const std::string& filename) { // for interfaces, add the stub, proxy, and interface types. auto stub = std::make_unique(this, b.GetPackage(), b.GetName() + ".Stub", ValidatableType::KIND_GENERATED, false, filename); auto proxy = std::make_unique(this, b.GetPackage(), b.GetName() + ".Stub.Proxy", ValidatableType::KIND_GENERATED, false, filename); auto defaultImpl = std::make_unique(this, b.GetPackage(), b.GetName() + ".Default", ValidatableType::KIND_GENERATED, false, filename); auto type = std::make_unique(this, b.GetPackage(), b.GetName(), false, filename, -1, stub.get(), proxy.get(), defaultImpl.get()); bool success = true; success &= Add(std::move(type)); success &= Add(std::move(stub)); success &= Add(std::move(proxy)); success &= Add(std::move(defaultImpl)); return success; } bool JavaTypeNamespace::AddListType(const std::string& contained_type_name) { const Type* contained_type = FindTypeByCanonicalName(contained_type_name); if (!contained_type) { return false; } Add(std::make_unique(this, contained_type)); return true; } bool JavaTypeNamespace::AddMapType(const string& /*key_type_name*/, const string& /*value_type_name*/) { LOG(ERROR) << "Don't know how to create a Map container."; return false; } } // namespace java } // namespace aidl } // namespace android