blob: 7ad2368c52219a5fc9af1c6f470a4a4ba13e3f70 [file] [log] [blame]
Andreas Huberc9410c72016-07-28 12:18:40 -07001#include "HandleType.h"
2
3#include "Formatter.h"
4
5namespace android {
6
7HandleType::HandleType() {}
8
Andreas Hubere852c7d2016-08-09 13:12:18 -07009std::string HandleType::getCppType(StorageMode, std::string *extra) const {
Andreas Huber881227d2016-08-02 14:20:21 -070010 extra->clear();
11
Andreas Hubere852c7d2016-08-09 13:12:18 -070012 return "const ::native_handle_t*";
Andreas Huber881227d2016-08-02 14:20:21 -070013}
14
15void HandleType::emitReaderWriter(
16 Formatter &out,
17 const std::string &name,
18 const std::string &parcelObj,
19 bool parcelObjIsPointer,
20 bool isReader,
21 ErrorMode mode) const {
22 const std::string parcelObjDeref =
23 parcelObj + (parcelObjIsPointer ? "->" : ".");
24
25 if (isReader) {
26 out << name
27 << " = "
Andreas Hubere852c7d2016-08-09 13:12:18 -070028 << parcelObjDeref
29 << "readNativeHandleNoDup();\n\n";
Andreas Huber881227d2016-08-02 14:20:21 -070030
31 out << "if ("
32 << name
33 << " == nullptr) {\n";
34
35 out.indent();
36
Iliyan Malchev549e2592016-08-10 08:59:12 -070037 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
Andreas Huber881227d2016-08-02 14:20:21 -070038 handleError2(out, mode);
39
40 out.unindent();
41 out << "}\n\n";
42 } else {
Iliyan Malchev549e2592016-08-10 08:59:12 -070043 out << "_hidl_err = ";
Andreas Huber881227d2016-08-02 14:20:21 -070044 out << parcelObjDeref
Andreas Hubere852c7d2016-08-09 13:12:18 -070045 << "writeNativeHandleNoDup("
Andreas Huber881227d2016-08-02 14:20:21 -070046 << name
Andreas Hubere852c7d2016-08-09 13:12:18 -070047 << ");\n";
Andreas Huber881227d2016-08-02 14:20:21 -070048
49 handleError(out, mode);
50 }
51}
52
53void HandleType::emitReaderWriterEmbedded(
54 Formatter &out,
55 const std::string &name,
56 bool nameIsPointer,
57 const std::string &parcelObj,
58 bool parcelObjIsPointer,
59 bool isReader,
60 ErrorMode mode,
61 const std::string &parentName,
62 const std::string &offsetText) const {
63 if (isReader) {
Iliyan Malchev549e2592016-08-10 08:59:12 -070064 const std::string ptrName = "_hidl_" + name + "_ptr";
Andreas Huber881227d2016-08-02 14:20:21 -070065
66 out << "const native_handle_t *"
67 << ptrName
68 << " = "
69 << parcelObj
70 << (parcelObjIsPointer ? "->" : ".")
71 << "readEmbeddedNativeHandle(\n";
72
73 out.indent();
74 out.indent();
75
76 out << parentName
77 << ",\n"
78 << offsetText
Andreas Huber881227d2016-08-02 14:20:21 -070079 << ");\n\n";
80
81 out.unindent();
82 out.unindent();
83
84 out << "if ("
85 << ptrName
86 << " == nullptr) {\n";
87
88 out.indent();
Iliyan Malchev549e2592016-08-10 08:59:12 -070089 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
Andreas Huber881227d2016-08-02 14:20:21 -070090 handleError2(out, mode);
91 out.unindent();
92 out << "}\n\n";
93 } else {
Iliyan Malchev549e2592016-08-10 08:59:12 -070094 out << "_hidl_err = "
Andreas Huber881227d2016-08-02 14:20:21 -070095 << parcelObj
96 << (parcelObjIsPointer ? "->" : ".")
97 << "writeEmbeddedNativeHandle(\n";
98
99 out.indent();
100 out.indent();
101
Andreas Hubere852c7d2016-08-09 13:12:18 -0700102 out << (nameIsPointer ? ("*" + name) : name)
103 << ",\n"
Andreas Huber881227d2016-08-02 14:20:21 -0700104 << parentName
105 << ",\n"
106 << offsetText
Andreas Huber881227d2016-08-02 14:20:21 -0700107 << ");\n\n";
108
109 out.unindent();
110 out.unindent();
111
112 handleError(out, mode);
113 }
114}
115
116bool HandleType::needsEmbeddedReadWrite() const {
117 return true;
118}
119
Andreas Huberc9410c72016-07-28 12:18:40 -0700120} // namespace android
121