blob: 52c1963a09b483e4ace64999dbf0f6e5bf204c78 [file] [log] [blame]
Andreas Huberc9410c72016-07-28 12:18:40 -07001#include "Interface.h"
2
Zhuoyao Zhangba7e6e92016-08-10 12:19:02 -07003#include "Annotation.h"
Andreas Huberc9410c72016-07-28 12:18:40 -07004#include "Formatter.h"
5#include "Method.h"
6
7namespace android {
8
Andreas Huberea081b32016-08-17 15:57:47 -07009Interface::Interface(Interface *super, AnnotationVector *annotations)
10 : mSuperType(super),
11 mAnnotationsByName(annotations),
12 mIsJavaCompatibleInProgress(false) {
Andreas Huberc9410c72016-07-28 12:18:40 -070013}
14
15void Interface::addMethod(Method *method) {
16 mMethods.push_back(method);
17}
18
Andreas Huber6cb08cf2016-08-03 15:44:51 -070019const Interface *Interface::superType() const {
Andreas Huberc9410c72016-07-28 12:18:40 -070020 return mSuperType;
21}
22
Andreas Hubera2723d22016-07-29 15:36:07 -070023bool Interface::isInterface() const {
24 return true;
25}
26
Andreas Huber295ad302016-08-16 11:35:00 -070027bool Interface::isBinder() const {
28 return true;
29}
30
Andreas Huber881227d2016-08-02 14:20:21 -070031const std::vector<Method *> &Interface::methods() const {
32 return mMethods;
33}
34
Zhuoyao Zhang5158db42016-08-10 10:25:20 -070035const AnnotationVector &Interface::annotations() const {
Zhuoyao Zhangba7e6e92016-08-10 12:19:02 -070036 return *mAnnotationsByName;
37}
38
Andreas Huber881227d2016-08-02 14:20:21 -070039std::string Interface::getCppType(StorageMode mode, std::string *extra) const {
40 extra->clear();
Andreas Huber31629bc2016-08-03 09:06:40 -070041 const std::string base = "::android::sp<" + fullName() + ">";
Andreas Huber881227d2016-08-02 14:20:21 -070042
43 switch (mode) {
44 case StorageMode_Stack:
45 case StorageMode_Result:
46 return base;
47
48 case StorageMode_Argument:
49 return "const " + base + "&";
50 }
51}
52
Andreas Huber2831d512016-08-15 09:33:47 -070053std::string Interface::getJavaType() const {
54 return fullJavaName();
55}
56
Andreas Huber881227d2016-08-02 14:20:21 -070057void Interface::emitReaderWriter(
58 Formatter &out,
59 const std::string &name,
60 const std::string &parcelObj,
61 bool parcelObjIsPointer,
62 bool isReader,
63 ErrorMode mode) const {
64 const std::string parcelObjDeref =
65 parcelObj + (parcelObjIsPointer ? "->" : ".");
66
67 if (isReader) {
Andreas Hubere7ff2282016-08-16 13:50:03 -070068 out << "{\n";
69 out.indent();
70
Iliyan Malchev549e2592016-08-10 08:59:12 -070071 const std::string binderName = "_hidl_" + name + "_binder";
Andreas Huber881227d2016-08-02 14:20:21 -070072
Andreas Huber8a82ff72016-08-04 10:29:39 -070073 out << "::android::sp<::android::hardware::IBinder> "
Andreas Huber881227d2016-08-02 14:20:21 -070074 << binderName << ";\n";
75
Iliyan Malchev549e2592016-08-10 08:59:12 -070076 out << "_hidl_err = ";
Andreas Huber881227d2016-08-02 14:20:21 -070077 out << parcelObjDeref
78 << "readNullableStrongBinder(&"
79 << binderName
80 << ");\n";
81
82 handleError(out, mode);
83
84 out << name
85 << " = "
Andreas Huber0e00de42016-08-03 09:56:02 -070086 << fullName()
Andreas Huber881227d2016-08-02 14:20:21 -070087 << "::asInterface("
88 << binderName
89 << ");\n";
Andreas Hubere7ff2282016-08-16 13:50:03 -070090
91 out.unindent();
92 out << "}\n\n";
Andreas Huber881227d2016-08-02 14:20:21 -070093 } else {
Iliyan Malchev549e2592016-08-10 08:59:12 -070094 out << "_hidl_err = ";
Andreas Huber881227d2016-08-02 14:20:21 -070095 out << parcelObjDeref
96 << "writeStrongBinder("
Andreas Huber0e00de42016-08-03 09:56:02 -070097 << fullName()
Andreas Huber881227d2016-08-02 14:20:21 -070098 << "::asBinder("
99 << name
100 << "));\n";
101
102 handleError(out, mode);
103 }
104}
105
Andreas Huber2831d512016-08-15 09:33:47 -0700106void Interface::emitJavaReaderWriter(
107 Formatter &out,
108 const std::string &parcelObj,
109 const std::string &argName,
110 bool isReader) const {
111 if (isReader) {
112 out << fullJavaName()
113 << ".asInterface("
114 << parcelObj
115 << ".readStrongBinder());\n";
116 } else {
117 out << parcelObj
118 << ".writeStrongBinder("
119 << argName
120 << " == null ? null : "
121 << argName
122 << ".asBinder());\n";
123 }
124}
125
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700126status_t Interface::emitVtsArgumentType(Formatter &out) const {
127 out << "type: TYPE_HIDL_CALLBACK\n"
128 << "predefined_type: \""
129 << localName()
130 << "\"\n";
131 return OK;
132}
133
Andreas Huber70a59e12016-08-16 12:57:01 -0700134bool Interface::isJavaCompatible() const {
Andreas Huberea081b32016-08-17 15:57:47 -0700135 if (mIsJavaCompatibleInProgress) {
136 // We're currently trying to determine if this Interface is
137 // java-compatible and something is referencing this interface through
138 // one of its methods. Assume we'll ultimately succeed, if we were wrong
139 // the original invocation of Interface::isJavaCompatible() will then
140 // return the correct "false" result.
141 return true;
142 }
143
144 mIsJavaCompatibleInProgress = true;
145
Andreas Huber70a59e12016-08-16 12:57:01 -0700146 if (!Scope::isJavaCompatible()) {
Andreas Huberea081b32016-08-17 15:57:47 -0700147 mIsJavaCompatibleInProgress = false;
Andreas Huber70a59e12016-08-16 12:57:01 -0700148 return false;
149 }
150
151 for (const auto &method : mMethods) {
152 if (!method->isJavaCompatible()) {
Andreas Huberea081b32016-08-17 15:57:47 -0700153 mIsJavaCompatibleInProgress = false;
Andreas Huber70a59e12016-08-16 12:57:01 -0700154 return false;
155 }
156 }
157
Andreas Huberea081b32016-08-17 15:57:47 -0700158 mIsJavaCompatibleInProgress = false;
159
Andreas Huber70a59e12016-08-16 12:57:01 -0700160 return true;
161}
162
Andreas Huberc9410c72016-07-28 12:18:40 -0700163} // namespace android
164