1115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen/* 2115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen * Copyright (C) 2016 The Android Open Source Project 3115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen * 4115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen * Licensed under the Apache License, Version 2.0 (the "License"); 5115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen * you may not use this file except in compliance with the License. 6115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen * You may obtain a copy of the License at 7115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen * 8115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen * http://www.apache.org/licenses/LICENSE-2.0 9115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen * 10115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen * Unless required by applicable law or agreed to in writing, software 11115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen * distributed under the License is distributed on an "AS IS" BASIS, 12115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen * See the License for the specific language governing permissions and 14115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen * limitations under the License. 15115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen */ 16115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 17115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen#include "DeathRecipientType.h" 18115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 19115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen#include <hidl-util/Formatter.h> 20115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen#include <android-base/logging.h> 21115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 22115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenennamespace android { 23115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 24115d428f9c38c078d679a98942c47ce4a17bd599Martijn CoenenDeathRecipientType::DeathRecipientType() {} 25115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 268b66d53dffa4e91c932d09b8be21c8d2edc8ab78Steven Morelandstd::string DeathRecipientType::typeName() const { 278b66d53dffa4e91c932d09b8be21c8d2edc8ab78Steven Moreland return "death recipient"; 288b66d53dffa4e91c932d09b8be21c8d2edc8ab78Steven Moreland} 298b66d53dffa4e91c932d09b8be21c8d2edc8ab78Steven Moreland 30115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenenstd::string DeathRecipientType::getCppType(StorageMode mode, 31115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen bool specifyNamespaces) const { 32115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen const std::string base = 33115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen std::string(specifyNamespaces ? "::android::" : "") 34115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen + "sp<" 35115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen + (specifyNamespaces ? "::android::hardware::" : "") 36115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen + "hidl_death_recipient>"; 37115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 38115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen switch (mode) { 39115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen case StorageMode_Stack: 40115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen return base; 41115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 42115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen case StorageMode_Argument: 43115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen return "const " + base + "&"; 44115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 45115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen case StorageMode_Result: 46115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen return "const " + base + "*"; 47115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen } 48115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen} 49115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 50115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenenstd::string DeathRecipientType::getJavaType(bool /* forInitializer */) const { 518d12b50cfb20eaef50e0998abe8d458866896003Martijn Coenen // TODO(b/33440494) decouple from hwbinder 528d12b50cfb20eaef50e0998abe8d458866896003Martijn Coenen return "android.os.IHwBinder.DeathRecipient"; 53115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen} 54115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 55115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenenstd::string DeathRecipientType::getVtsType() const { 56115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen return "TYPE_DEATH_RECIPIENT"; 57115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen} 58115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 59115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenenvoid DeathRecipientType::emitReaderWriter( 60115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen Formatter& out, 61115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen const std::string& /* name */, 62115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen const std::string& /* parcelObj */, 63115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen bool /* parcelObjIsPointer */, 64115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen bool /* isReader */, 65115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen ErrorMode /* mode */) const { 66115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen out << "LOG_ALWAYS_FATAL(\"DeathRecipient is only supported in passthrough mode\");\n"; 67115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen} 68115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 69115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenenbool DeathRecipientType::needsEmbeddedReadWrite() const { 70115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen return false; 71115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen} 72115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 73115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenenbool DeathRecipientType::resultNeedsDeref() const { 74115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen return true; 75115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen} 76115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 77115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenenbool DeathRecipientType::isJavaCompatible() const { 78115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen return true; 79115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen} 80115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 81115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenenvoid DeathRecipientType::getAlignmentAndSize(size_t *align, size_t *size) const { 82115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen *align = *size = 0; // this object should only be used in passthrough mode 83115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen} 84115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 85115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenenstatus_t DeathRecipientType::emitVtsTypeDeclarations(Formatter &out) const { 86115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen out << "type: " << getVtsType() << "\n"; 87115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen return OK; 88115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen} 89115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 90115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen} // namespace android 91115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen 92