Merge "Use new read(Embedded)Buffer API."
diff --git a/ArrayType.cpp b/ArrayType.cpp
index 79d3e79..306cb9d 100644
--- a/ArrayType.cpp
+++ b/ArrayType.cpp
@@ -144,25 +144,16 @@
         parcelObj + (parcelObjIsPointer ? "->" : ".");
 
     if (isReader) {
-
-        out << name
-            << " = ("
-            << getCppResultType()
-            << ")"
+        out << "_hidl_err = "
             << parcelObjDeref
             << "readBuffer(&"
             << parentName
-            << ");\n\n";
+            << ", "
+            << " reinterpret_cast<const void **>("
+            << "&" << name
+            << "));\n\n";
 
-        out << "if (" << name << " == nullptr) {\n";
-
-        out.indent();
-
-        out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
-        handleError2(out, mode);
-
-        out.unindent();
-        out << "}\n\n";
+        handleError(out, mode);
     } else {
         size_t numArrayElements = 1;
         for (auto size : mSizes) {
diff --git a/CompoundType.cpp b/CompoundType.cpp
index 19abea4..64e588a 100644
--- a/CompoundType.cpp
+++ b/CompoundType.cpp
@@ -132,26 +132,17 @@
         parcelObj + (parcelObjIsPointer ? "->" : ".");
 
     if (isReader) {
-        out << name
-            << " = (const "
-            << fullName()
-            << " *)"
+        out << "_hidl_err = "
             << parcelObjDeref
             << "readBuffer("
             << "&"
             << parentName
-            << ");\n";
+            << ", "
+            << " reinterpret_cast<const void **>("
+            << "&" << name
+            << "));\n";
 
-        out << "if ("
-            << name
-            << " == nullptr) {\n";
-
-        out.indent([&]{
-            out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
-            handleError2(out, mode);
-        });
-
-        out << "}\n\n";
+        handleError(out, mode);
     } else {
         out << "_hidl_err = "
             << parcelObjDeref
diff --git a/FmqType.cpp b/FmqType.cpp
index c22fd55..2f410f7 100644
--- a/FmqType.cpp
+++ b/FmqType.cpp
@@ -68,27 +68,16 @@
         parcelObj + (parcelObjIsPointer ? "->" : ".");
 
     if (isReader) {
-        out << name
-            << " = (const "
-            << fullName()
-            << " *)"
+        out << "_hidl_err = "
             << parcelObjDeref
-            << "readBuffer("
-            << "&"
+            << "readBuffer(&"
             << parentName
-            << ");\n";
+            << ", "
+            << " reinterpret_cast<const void **>("
+            << "&" << name
+            << "));\n\n";
 
-        out << "if ("
-            << name
-            << " == nullptr) {\n";
-
-        out.indent();
-
-        out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
-        handleError2(out, mode);
-
-        out.unindent();
-        out << "}\n\n";
+        handleError(out, mode);
     } else {
         out << "_hidl_err = "
             << parcelObjDeref
diff --git a/HandleType.cpp b/HandleType.cpp
index 72c3c46..6acecbc 100644
--- a/HandleType.cpp
+++ b/HandleType.cpp
@@ -64,22 +64,18 @@
         parcelObj + (parcelObjIsPointer ? "->" : ".");
 
     if (isReader) {
-        out << name
-            << " = "
+        out << "const native_handle_t *"
+            << name << "_ptr;\n\n";
+
+        out << "_hidl_err = "
             << parcelObjDeref
-            << "readNativeHandleNoDup();\n\n";
+            << "readNativeHandleNoDup("
+            << "&" << name << "_ptr"
+            << ");\n\n";
 
-        out << "if ("
-            << name
-            << " == nullptr) {\n";
+        handleError(out, mode);
 
-        out.indent();
-
-        out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
-        handleError2(out, mode);
-
-        out.unindent();
-        out << "}\n\n";
+        out << name << " = " << name << "_ptr;\n";
     } else {
         out << "_hidl_err = ";
         out << parcelObjDeref
@@ -111,8 +107,8 @@
         const std::string ptrName = "_hidl_" + sanitizedName  + "_ptr";
 
         out << "const native_handle_t *"
-            << ptrName
-            << " = "
+            << ptrName << ";\n"
+            << "_hidl_err = "
             << parcelObj
             << (parcelObjIsPointer ? "->" : ".")
             << "readEmbeddedNativeHandle(\n";
@@ -123,20 +119,15 @@
         out << parentName
             << ",\n"
             << offsetText
+            << ",\n"
+            << "&" << ptrName
+            << "\n"
             << ");\n\n";
 
         out.unindent();
         out.unindent();
 
-        out << "if ("
-            << ptrName
-            << " == nullptr) {\n";
-
-        out.indent();
-        out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
-        handleError2(out, mode);
-        out.unindent();
-        out << "}\n\n";
+        handleError(out, mode);
     } else {
         out << "_hidl_err = "
             << parcelObj
diff --git a/MemoryType.cpp b/MemoryType.cpp
index 857bf05..3243cd4 100644
--- a/MemoryType.cpp
+++ b/MemoryType.cpp
@@ -63,25 +63,16 @@
         parcelObj + (parcelObjIsPointer ? "->" : ".");
 
     if (isReader) {
-        out << name
-            << " = (const ::android::hardware::hidl_memory *)"
+        out << "_hidl_err = "
             << parcelObjDeref
-            << "readBuffer("
-            << "&"
+            << "readBuffer(&"
             << parentName
-            << ");\n";
+            << ", "
+            << " reinterpret_cast<const void **>("
+            << "&" << name
+            << "));\n\n";
 
-        out << "if ("
-            << name
-            << " == nullptr) {\n";
-
-        out.indent();
-
-        out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
-        handleError2(out, mode);
-
-        out.unindent();
-        out << "}\n\n";
+        handleError(out, mode);
     } else {
         out << "_hidl_err = "
             << parcelObjDeref
diff --git a/StringType.cpp b/StringType.cpp
index c366391..f093b65 100644
--- a/StringType.cpp
+++ b/StringType.cpp
@@ -78,25 +78,16 @@
         parcelObj + (parcelObjIsPointer ? "->" : ".");
 
     if (isReader) {
-        out << name
-            << " = (const ::android::hardware::hidl_string *)"
+        out << "_hidl_err = "
             << parcelObjDeref
-            << "readBuffer("
-            << "&"
+            << "readBuffer(&"
             << parentName
-            << ");\n";
+            << ", "
+            << " reinterpret_cast<const void **>("
+            << "&" << name
+            << "));\n\n";
 
-        out << "if ("
-            << name
-            << " == nullptr) {\n";
-
-        out.indent();
-
-        out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
-        handleError2(out, mode);
-
-        out.unindent();
-        out << "}\n\n";
+        handleError(out, mode);
     } else {
         out << "_hidl_err = "
             << parcelObjDeref
diff --git a/Type.cpp b/Type.cpp
index 54135e0..7e67702 100644
--- a/Type.cpp
+++ b/Type.cpp
@@ -274,34 +274,6 @@
     }
 }
 
-void Type::handleError2(Formatter &out, ErrorMode mode) const {
-    switch (mode) {
-        case ErrorMode_Goto:
-        {
-            out << "goto _hidl_error;\n";
-            break;
-        }
-
-        case ErrorMode_Break:
-        {
-            out << "break;\n";
-            break;
-        }
-
-        case ErrorMode_Ignore:
-        {
-            out << "/* ignoring _hidl_error! */";
-            break;
-        }
-
-        case ErrorMode_Return:
-        {
-            out << "return _hidl_err;\n";
-            break;
-        }
-    }
-}
-
 void Type::emitReaderWriterEmbeddedForTypeName(
         Formatter &out,
         const std::string &name,
diff --git a/Type.h b/Type.h
index c60ed8b..007b114 100644
--- a/Type.h
+++ b/Type.h
@@ -217,7 +217,6 @@
 
 protected:
     void handleError(Formatter &out, ErrorMode mode) const;
-    void handleError2(Formatter &out, ErrorMode mode) const;
 
     void emitReaderWriterEmbeddedForTypeName(
             Formatter &out,
diff --git a/VectorType.cpp b/VectorType.cpp
index ff21994..1c1271a 100644
--- a/VectorType.cpp
+++ b/VectorType.cpp
@@ -149,24 +149,16 @@
         parcelObj + (parcelObjIsPointer ? "->" : ".");
 
     if (isReader) {
-        out << name
-            << " = (const ::android::hardware::hidl_vec<"
-            << baseType
-            << "> *)"
+        out << "_hidl_err = "
             << parcelObjDeref
             << "readBuffer(&"
             << parentName
-            << ");\n\n";
+            << ", "
+            << " reinterpret_cast<const void **>("
+            << "&" << name
+            << "));\n\n";
 
-        out << "if (" << name << " == nullptr) {\n";
-
-        out.indent();
-
-        out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
-        handleError2(out, mode);
-
-        out.unindent();
-        out << "}\n\n";
+        handleError(out, mode);
     } else {
         out << "_hidl_err = "
             << parcelObjDeref