move read/writeEmbeddedFrom/ToParcel from hidl_string, hidl_vec, MQDescriptor

Test: mma
Test: hidl_test

Bug: 32756130

Change-Id: I7e9bc359bbffca10474fca883ddd49d3b5e1f716
diff --git a/include/hidl/HidlSupport.h b/include/hidl/HidlSupport.h
index f203ccc..1c468ed 100644
--- a/include/hidl/HidlSupport.h
+++ b/include/hidl/HidlSupport.h
@@ -73,12 +73,6 @@
     // for the lifetime of this hidl_string.
     void setToExternal(const char *data, size_t size);
 
-    status_t readEmbeddedFromParcel(
-            const Parcel &parcel, size_t parentHandle, size_t parentOffset);
-
-    status_t writeEmbeddedToParcel(
-            Parcel *parcel, size_t parentHandle, size_t parentOffset) const;
-
     // offsetof(hidl_string, mBuffer) exposed since mBuffer is private.
     static const size_t kOffsetOfBuffer;
 
@@ -94,6 +88,12 @@
     void moveFrom(hidl_string &&);
 };
 
+status_t readEmbeddedFromParcel(hidl_string *string,
+        const Parcel &parcel, size_t parentHandle, size_t parentOffset);
+
+status_t writeEmbeddedToParcel(const hidl_string &string,
+        Parcel *parcel, size_t parentHandle, size_t parentOffset);
+
 inline bool operator==(const hidl_string &hs, const char *s) {
     return strcmp(hs.c_str(), s) == 0;
 }
@@ -236,23 +236,12 @@
         mOwnsBuffer = true;
     }
 
-    status_t readEmbeddedFromParcel(
-            const Parcel &parcel,
-            size_t parentHandle,
-            size_t parentOffset,
-            size_t *handle);
-
-    status_t writeEmbeddedToParcel(
-            Parcel *parcel,
-            size_t parentHandle,
-            size_t parentOffset,
-            size_t *handle) const;
-
     status_t findInParcel(const Parcel &parcel, size_t *handle) const {
         return parcel.quickFindBuffer(mBuffer, handle);
     }
 
-
+    // offsetof(hidl_string, mBuffer) exposed since mBuffer is private.
+    static const size_t kOffsetOfBuffer;
 private:
     T *mBuffer;
     size_t mSize;
@@ -274,6 +263,39 @@
     }
 };
 
+template <typename T>
+const size_t hidl_vec<T>::kOffsetOfBuffer = offsetof(hidl_vec<T>, mBuffer);
+
+template<typename T>
+status_t readEmbeddedFromParcel(
+        hidl_vec<T> * /*vec*/,
+        const Parcel &parcel,
+        size_t parentHandle,
+        size_t parentOffset,
+        size_t *handle) {
+    const void *ptr = parcel.readEmbeddedBuffer(
+            handle,
+            parentHandle,
+            parentOffset + hidl_vec<T>::kOffsetOfBuffer);
+
+    return ptr != NULL ? OK : UNKNOWN_ERROR;
+}
+
+template<typename T>
+status_t writeEmbeddedToParcel(
+        const hidl_vec<T> &vec,
+        Parcel *parcel,
+        size_t parentHandle,
+        size_t parentOffset,
+        size_t *handle) {
+    return parcel->writeEmbeddedBuffer(
+            vec.data(),
+            sizeof(T) * vec.size(),
+            handle,
+            parentHandle,
+            parentOffset + hidl_vec<T>::kOffsetOfBuffer);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 
 namespace details {
@@ -398,36 +420,6 @@
     T mBuffer[SIZE1];
 };
 
-////////////////////////////////////////////////////////////////////////////////
-
-template<typename T>
-status_t hidl_vec<T>::readEmbeddedFromParcel(
-        const Parcel &parcel,
-        size_t parentHandle,
-        size_t parentOffset,
-        size_t *handle) {
-    const void *ptr = parcel.readEmbeddedBuffer(
-            handle,
-            parentHandle,
-            parentOffset + offsetof(hidl_vec<T>, mBuffer));
-
-    return ptr != NULL ? OK : UNKNOWN_ERROR;
-}
-
-template<typename T>
-status_t hidl_vec<T>::writeEmbeddedToParcel(
-        Parcel *parcel,
-        size_t parentHandle,
-        size_t parentOffset,
-        size_t *handle) const {
-    return parcel->writeEmbeddedBuffer(
-            mBuffer,
-            sizeof(T) * mSize,
-            handle,
-            parentHandle,
-            parentOffset + offsetof(hidl_vec<T>, mBuffer));
-}
-
 ///////////////////////////// pointers for HIDL
 
 template <typename T>
diff --git a/include/hidl/MQDescriptor.h b/include/hidl/MQDescriptor.h
index 6e43749..f323834 100644
--- a/include/hidl/MQDescriptor.h
+++ b/include/hidl/MQDescriptor.h
@@ -69,20 +69,29 @@
 
     int32_t getFlags() const;
 
-    ::android::status_t readEmbeddedFromParcel(
-            const ::android::hardware::Parcel &parcel,
-            size_t parentHandle,
-            size_t parentOffset);
-
-    ::android::status_t writeEmbeddedToParcel(
-            ::android::hardware::Parcel *parcel,
-            size_t parentHandle,
-            size_t parentOffset) const;
-
     bool isHandleValid() const { return mHandle != nullptr; }
     size_t countGrantors() const { return mGrantors.size(); }
     std::vector<GrantorDescriptor> getGrantors() const;
     const sp<NativeHandle> getNativeHandle() const;
+
+    inline const ::android::hardware::hidl_vec<GrantorDescriptor> &grantors() const {
+        return mGrantors;
+    }
+
+    inline ::android::hardware::hidl_vec<GrantorDescriptor> &grantors() {
+        return mGrantors;
+    }
+
+    inline const ::native_handle_t *handle() const {
+        return mHandle;
+    }
+
+    inline ::native_handle_t *handle() {
+        return mHandle;
+    }
+
+    static const size_t kOffsetOfGrantors;
+    static const size_t kOffsetOfHandle;
     /*
      * There should atleast be GrantorDescriptors for the read counter, write
      * counter and data buffer.
@@ -96,6 +105,12 @@
     uint32_t mFlags;
 };
 
+template<MQFlavor flavor>
+const size_t MQDescriptor<flavor>::kOffsetOfGrantors = offsetof(MQDescriptor<flavor>, mGrantors);
+
+template<MQFlavor flavor>
+const size_t MQDescriptor<flavor>::kOffsetOfHandle = offsetof(MQDescriptor<flavor>, mHandle);
+
 /*
  * MQDescriptorSync will describe the wait-free synchronized
  * flavor of FMQ.
@@ -179,26 +194,27 @@
 }
 
 template<MQFlavor flavor>
-::android::status_t MQDescriptor<flavor>::readEmbeddedFromParcel(
-    const Parcel &parcel,
-    size_t parentHandle,
-    size_t parentOffset) {
+::android::status_t readEmbeddedFromParcel(
+        MQDescriptor<flavor> *obj,
+        const ::android::hardware::Parcel &parcel,
+        size_t parentHandle,
+        size_t parentOffset) {
     ::android::status_t _hidl_err = ::android::OK;
 
     size_t _hidl_grantors_child;
 
-    _hidl_err = const_cast<hidl_vec<GrantorDescriptor> *>(
-            &mGrantors)->readEmbeddedFromParcel(
+    _hidl_err = ::android::hardware::readEmbeddedFromParcel(
+                &obj->grantors(),
                 parcel,
                 parentHandle,
-                parentOffset + offsetof(MQDescriptor, mGrantors),
+                parentOffset + MQDescriptor<flavor>::kOffsetOfGrantors,
                 &_hidl_grantors_child);
 
     if (_hidl_err != ::android::OK) { return _hidl_err; }
 
     const native_handle_t *_hidl_mq_handle_ptr = parcel.readEmbeddedNativeHandle(
             parentHandle,
-            parentOffset + offsetof(MQDescriptor, mHandle));
+            parentOffset + MQDescriptor<flavor>::kOffsetOfHandle);
 
     if (_hidl_mq_handle_ptr == nullptr) {
         _hidl_err = ::android::UNKNOWN_ERROR;
@@ -209,26 +225,28 @@
 }
 
 template<MQFlavor flavor>
-::android::status_t MQDescriptor<flavor>::writeEmbeddedToParcel(
-    Parcel *parcel,
-    size_t parentHandle,
-    size_t parentOffset) const {
+::android::status_t writeEmbeddedToParcel(
+        const MQDescriptor<flavor> &obj,
+        ::android::hardware::Parcel *parcel,
+        size_t parentHandle,
+        size_t parentOffset) {
     ::android::status_t _hidl_err = ::android::OK;
 
     size_t _hidl_grantors_child;
 
-    _hidl_err = mGrantors.writeEmbeddedToParcel(
+    _hidl_err = ::android::hardware::writeEmbeddedToParcel(
+            obj.grantors(),
             parcel,
             parentHandle,
-            parentOffset + offsetof(MQDescriptor, mGrantors),
+            parentOffset + MQDescriptor<flavor>::kOffsetOfGrantors,
             &_hidl_grantors_child);
 
     if (_hidl_err != ::android::OK) { return _hidl_err; }
 
     _hidl_err = parcel->writeEmbeddedNativeHandle(
-            mHandle,
+            obj.handle(),
             parentHandle,
-            parentOffset + offsetof(MQDescriptor, mHandle));
+            parentOffset + MQDescriptor<flavor>::kOffsetOfHandle);
 
     if (_hidl_err != ::android::OK) { return _hidl_err; }