generate C++ interface header, proxy and stub headers and sources.
diff --git a/VectorType.cpp b/VectorType.cpp
index 2343868..903478a 100644
--- a/VectorType.cpp
+++ b/VectorType.cpp
@@ -2,6 +2,8 @@
#include "Formatter.h"
+#include <android-base/logging.h>
+
namespace android {
VectorType::VectorType(Type *elementType)
@@ -14,5 +16,154 @@
out << ">";
}
+std::string VectorType::getCppType(StorageMode mode, std::string *extra) const {
+ const std::string base =
+ "::android::hidl::hidl_vec<"
+ + mElementType->getCppType(extra)
+ + ">";
+
+ CHECK(extra->empty());
+
+ switch (mode) {
+ case StorageMode_Stack:
+ return base;
+
+ case StorageMode_Argument:
+ return "const " + base + "&";
+
+ case StorageMode_Result:
+ return "const " + base + "*";
+ }
+}
+
+void VectorType::emitReaderWriter(
+ Formatter &out,
+ const std::string &name,
+ const std::string &parcelObj,
+ bool parcelObjIsPointer,
+ bool isReader,
+ ErrorMode mode) const {
+ std::string baseExtra;
+ std::string baseType = mElementType->getCppType(&baseExtra);
+
+ const std::string parentName = "_aidl_" + name + "_parent";
+
+ out << "size_t " << parentName << ";\n\n";
+
+ const std::string parcelObjDeref =
+ parcelObj + (parcelObjIsPointer ? "->" : ".");
+
+ if (isReader) {
+ out << name
+ << " = (const ::android::hidl::hidl_vec<"
+ << baseType
+ << "> *)"
+ << parcelObjDeref
+ << "readBuffer(&"
+ << parentName
+ << ");\n\n";
+
+ out << "if (" << name << " == nullptr) {\n";
+
+ out.indent();
+
+ out << "_aidl_err = ::android::UNKNOWN_ERROR;\n";
+ handleError2(out, mode);
+
+ out.unindent();
+ out << "}\n\n";
+ } else {
+ out << "_aidl_err = "
+ << parcelObjDeref
+ << "writeBuffer(&"
+ << name
+ << ", sizeof("
+ << name
+ << "), &"
+ << parentName
+ << ");\n";
+
+ handleError(out, mode);
+ }
+
+ emitReaderWriterEmbedded(
+ out,
+ name,
+ isReader /* nameIsPointer */,
+ parcelObj,
+ parcelObjIsPointer,
+ isReader,
+ mode,
+ parentName,
+ "0 /* parentOffset */");
+}
+
+void VectorType::emitReaderWriterEmbedded(
+ Formatter &out,
+ const std::string &name,
+ bool nameIsPointer,
+ const std::string &parcelObj,
+ bool parcelObjIsPointer,
+ bool isReader,
+ ErrorMode mode,
+ const std::string &parentName,
+ const std::string &offsetText) const {
+ std::string baseExtra;
+ std::string baseType = Type::getCppType(&baseExtra);
+
+ const std::string childName = "_aidl_" + name + "_child";
+ out << "size_t " << childName << ";\n\n";
+
+ emitReaderWriterEmbeddedForTypeName(
+ out,
+ name,
+ nameIsPointer,
+ parcelObj,
+ parcelObjIsPointer,
+ isReader,
+ mode,
+ parentName,
+ offsetText,
+ baseType,
+ childName);
+
+ if (!mElementType->needsEmbeddedReadWrite()) {
+ return;
+ }
+
+ const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
+
+ baseType = mElementType->getCppType(&baseExtra);
+
+ out << "for (size_t _aidl_index = 0; _aidl_index < "
+ << nameDeref
+ << "count; ++_aidl_index) {\n";
+
+ out.indent();
+
+ mElementType->emitReaderWriterEmbedded(
+ out,
+ nameDeref + "buffer[_aidl_index]",
+ false /* nameIsPointer */,
+ parcelObj,
+ parcelObjIsPointer,
+ isReader,
+ mode,
+ childName,
+ "_aidl_index * sizeof(" + baseType + ")");
+
+ out.unindent();
+
+ out << "}\n\n";
+}
+
+bool VectorType::needsEmbeddedReadWrite() const {
+ return true;
+}
+
+bool VectorType::resultNeedsDeref() const {
+ return true;
+}
+
} // namespace android