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