Java support for passing vec<STRUCT-TYPE> and STRUCT-TYPE[] to and from methods.

Bug: 31380705
Change-Id: I7374538d0bc2b3562c997710bfa4ed1f95950589
diff --git a/CompoundType.cpp b/CompoundType.cpp
index 051ed60..de35137 100644
--- a/CompoundType.cpp
+++ b/CompoundType.cpp
@@ -17,6 +17,7 @@
 #include "CompoundType.h"
 
 #include "Formatter.h"
+#include "VectorType.h"
 
 #include <android-base/logging.h>
 
@@ -57,6 +58,10 @@
     return true;
 }
 
+bool CompoundType::isCompoundType() const {
+    return true;
+}
+
 std::string CompoundType::getCppType(
         StorageMode mode,
         std::string *extra,
@@ -329,6 +334,71 @@
     out.unindent();
     out << "}\n\n";
 
+    ////////////////////////////////////////////////////////////////////////////
+
+    out << "public static final "
+        << localName()
+        << "[] readArrayFromParcel(HwParcel parcel, int size) {\n";
+    out.indent();
+
+    out << localName()
+        << "[] _hidl_array = new "
+        << localName()
+        << "[size];\n";
+
+    out << "HwBlob _hidl_blob = parcel.readBuffer();\n\n";
+
+    out << "for (int _hidl_index = 0; _hidl_index < size; ++_hidl_index) {\n";
+    out.indent();
+
+    out << "_hidl_array[_hidl_index] = new "
+        << localName()
+        << "();\n";
+
+    size_t structAlign, structSize;
+    getAlignmentAndSize(&structAlign, &structSize);
+
+    out << "_hidl_array[_hidl_index].readEmbeddedFromParcel(\n";
+    out.indent();
+    out.indent();
+    out << "parcel, _hidl_blob, _hidl_index * "
+        << structSize
+        << " /* parentOffset */);\n";
+
+    out.unindent();
+    out.unindent();
+    out.unindent();
+
+    out << "}\nreturn _hidl_array;\n";
+
+    out.unindent();
+    out << "}\n\n";
+
+    ////////////////////////////////////////////////////////////////////////////
+
+    out << "public static final "
+        << localName()
+        << "[] readVectorFromParcel(HwParcel parcel) {\n";
+    out.indent();
+
+    out << "Vector<"
+        << localName()
+        << "> _hidl_vec = new Vector();\n";
+
+    out << "HwBlob _hidl_blob = parcel.readBuffer();\n\n";
+
+    VectorType::EmitJavaFieldReaderWriterForElementType(
+            out, this, "_hidl_blob", "_hidl_vec", "0", true /* isReader */);
+
+    out << "\nreturn _hidl_vec.toArray(new "
+        << localName()
+        << "[_hidl_vec.size()]);\n";
+
+    out.unindent();
+    out << "}\n\n";
+
+    ////////////////////////////////////////////////////////////////////////////
+
     out << "public final void readEmbeddedFromParcel(\n";
     out.indent();
     out.indent();
@@ -358,12 +428,11 @@
     out.unindent();
     out << "}\n\n";
 
+    ////////////////////////////////////////////////////////////////////////////
+
     out << "public final void writeToParcel(HwParcel parcel) {\n";
     out.indent();
 
-    size_t structAlign, structSize;
-    getAlignmentAndSize(&structAlign, &structSize);
-
     out << "HwBlob _hidl_blob = new HwBlob("
         << structSize
         << " /* size */);\n";
@@ -374,6 +443,66 @@
     out.unindent();
     out << "}\n\n";
 
+    ////////////////////////////////////////////////////////////////////////////
+
+    out << "public static final void writeArrayToParcel(\n";
+    out.indent();
+    out.indent();
+    out << "HwParcel parcel, int size, "
+        << localName()
+        << "[] _hidl_array) {\n";
+    out.unindent();
+
+    out << "HwBlob _hidl_blob = new HwBlob("
+        << "size * "
+        << structSize
+        << " /* size */);\n";
+
+    out << "for (int _hidl_index = 0; _hidl_index < size; ++_hidl_index) {\n";
+    out.indent();
+
+    out << "_hidl_array[_hidl_index].writeEmbeddedToBlob(\n";
+    out.indent();
+    out.indent();
+    out << "_hidl_blob, _hidl_index * "
+        << structSize
+        << " /* parentOffset */);\n";
+
+    out.unindent();
+    out.unindent();
+    out.unindent();
+
+    out << "}\nparcel.writeBuffer(_hidl_blob);\n";
+
+    out.unindent();
+    out << "}\n\n";
+
+    ////////////////////////////////////////////////////////////////////////////
+
+    out << "public static final void writeVectorToParcel(\n";
+    out.indent();
+    out.indent();
+    out << "HwParcel parcel, "
+        << localName()
+        << "[] _hidl_array) {\n";
+    out.unindent();
+
+    out << "Vector<"
+        << localName()
+        << "> _hidl_vec = new Vector(Arrays.asList(_hidl_array));\n";
+
+    out << "HwBlob _hidl_blob = new HwBlob(24 /* sizeof(hidl_vec<T>) */);\n";
+
+    VectorType::EmitJavaFieldReaderWriterForElementType(
+            out, this, "_hidl_blob", "_hidl_vec", "0", false /* isReader */);
+
+    out << "\nparcel.writeBuffer(_hidl_blob);\n";
+
+    out.unindent();
+    out << "}\n\n";
+
+    ////////////////////////////////////////////////////////////////////////////
+
     out << "public final void writeEmbeddedToBlob(\n";
     out.indent();
     out.indent();