blob: b799f0eb177cce68d79f4a95d4959dfb8ffb7316 [file] [log] [blame]
Andreas Huberc9410c72016-07-28 12:18:40 -07001#include "HandleType.h"
2
3#include "Formatter.h"
4
Andreas Huber2831d512016-08-15 09:33:47 -07005#include <android-base/logging.h>
6
Andreas Huberc9410c72016-07-28 12:18:40 -07007namespace android {
8
9HandleType::HandleType() {}
10
Andreas Hubere852c7d2016-08-09 13:12:18 -070011std::string HandleType::getCppType(StorageMode, std::string *extra) const {
Andreas Huber881227d2016-08-02 14:20:21 -070012 extra->clear();
13
Andreas Hubere852c7d2016-08-09 13:12:18 -070014 return "const ::native_handle_t*";
Andreas Huber881227d2016-08-02 14:20:21 -070015}
16
Andreas Huber2831d512016-08-15 09:33:47 -070017std::string HandleType::getJavaType() const {
18 CHECK(!"Should not be here");
19 return std::string();
20}
21
Andreas Huber881227d2016-08-02 14:20:21 -070022void HandleType::emitReaderWriter(
23 Formatter &out,
24 const std::string &name,
25 const std::string &parcelObj,
26 bool parcelObjIsPointer,
27 bool isReader,
28 ErrorMode mode) const {
29 const std::string parcelObjDeref =
30 parcelObj + (parcelObjIsPointer ? "->" : ".");
31
32 if (isReader) {
33 out << name
34 << " = "
Andreas Hubere852c7d2016-08-09 13:12:18 -070035 << parcelObjDeref
36 << "readNativeHandleNoDup();\n\n";
Andreas Huber881227d2016-08-02 14:20:21 -070037
38 out << "if ("
39 << name
40 << " == nullptr) {\n";
41
42 out.indent();
43
Iliyan Malchev549e2592016-08-10 08:59:12 -070044 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
Andreas Huber881227d2016-08-02 14:20:21 -070045 handleError2(out, mode);
46
47 out.unindent();
48 out << "}\n\n";
49 } else {
Iliyan Malchev549e2592016-08-10 08:59:12 -070050 out << "_hidl_err = ";
Andreas Huber881227d2016-08-02 14:20:21 -070051 out << parcelObjDeref
Andreas Hubere852c7d2016-08-09 13:12:18 -070052 << "writeNativeHandleNoDup("
Andreas Huber881227d2016-08-02 14:20:21 -070053 << name
Andreas Hubere852c7d2016-08-09 13:12:18 -070054 << ");\n";
Andreas Huber881227d2016-08-02 14:20:21 -070055
56 handleError(out, mode);
57 }
58}
59
60void HandleType::emitReaderWriterEmbedded(
61 Formatter &out,
62 const std::string &name,
63 bool nameIsPointer,
64 const std::string &parcelObj,
65 bool parcelObjIsPointer,
66 bool isReader,
67 ErrorMode mode,
68 const std::string &parentName,
69 const std::string &offsetText) const {
70 if (isReader) {
Iliyan Malchev549e2592016-08-10 08:59:12 -070071 const std::string ptrName = "_hidl_" + name + "_ptr";
Andreas Huber881227d2016-08-02 14:20:21 -070072
73 out << "const native_handle_t *"
74 << ptrName
75 << " = "
76 << parcelObj
77 << (parcelObjIsPointer ? "->" : ".")
78 << "readEmbeddedNativeHandle(\n";
79
80 out.indent();
81 out.indent();
82
83 out << parentName
84 << ",\n"
85 << offsetText
Andreas Huber881227d2016-08-02 14:20:21 -070086 << ");\n\n";
87
88 out.unindent();
89 out.unindent();
90
91 out << "if ("
92 << ptrName
93 << " == nullptr) {\n";
94
95 out.indent();
Iliyan Malchev549e2592016-08-10 08:59:12 -070096 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
Andreas Huber881227d2016-08-02 14:20:21 -070097 handleError2(out, mode);
98 out.unindent();
99 out << "}\n\n";
100 } else {
Iliyan Malchev549e2592016-08-10 08:59:12 -0700101 out << "_hidl_err = "
Andreas Huber881227d2016-08-02 14:20:21 -0700102 << parcelObj
103 << (parcelObjIsPointer ? "->" : ".")
104 << "writeEmbeddedNativeHandle(\n";
105
106 out.indent();
107 out.indent();
108
Andreas Hubere852c7d2016-08-09 13:12:18 -0700109 out << (nameIsPointer ? ("*" + name) : name)
110 << ",\n"
Andreas Huber881227d2016-08-02 14:20:21 -0700111 << parentName
112 << ",\n"
113 << offsetText
Andreas Huber881227d2016-08-02 14:20:21 -0700114 << ");\n\n";
115
116 out.unindent();
117 out.unindent();
118
119 handleError(out, mode);
120 }
121}
122
123bool HandleType::needsEmbeddedReadWrite() const {
124 return true;
125}
126
Andreas Huberc9410c72016-07-28 12:18:40 -0700127} // namespace android
128