Adding {read,write}Embedded{From,To} methods for hidl_handle
This change implements helper functions for serializing/deserializing
hidl_handle types to/from parcels, similar to the other HIDL types
(hidl_string, hild_string).
Bug: 35098567
Test: Ran the hidl_test suite
Change-Id: I5f6720c42d69a7f760a91442fbdeec202cb2ffcd
diff --git a/base/include/hidl/HidlSupport.h b/base/include/hidl/HidlSupport.h
index 7a5183b..2d0dc25 100644
--- a/base/include/hidl/HidlSupport.h
+++ b/base/include/hidl/HidlSupport.h
@@ -116,6 +116,10 @@
// explicit conversion
const native_handle_t *getNativeHandle() const;
+
+ // offsetof(hidl_handle, mHandle) exposed since mHandle is private.
+ static const size_t kOffsetOfNativeHandle;
+
private:
void freeHandle();
diff --git a/transport/HidlBinderSupport.cpp b/transport/HidlBinderSupport.cpp
index a221b46..cd05c3d 100644
--- a/transport/HidlBinderSupport.cpp
+++ b/transport/HidlBinderSupport.cpp
@@ -47,6 +47,30 @@
return mRecipient;
}
+const size_t hidl_handle::kOffsetOfNativeHandle = offsetof(hidl_handle, mHandle);
+static_assert(hidl_handle::kOffsetOfNativeHandle == 0, "wrong offset");
+
+status_t readEmbeddedFromParcel(const hidl_handle& /* handle */,
+ const Parcel &parcel, size_t parentHandle, size_t parentOffset) {
+ const native_handle_t *handle;
+ status_t _hidl_err = parcel.readNullableEmbeddedNativeHandle(
+ parentHandle,
+ parentOffset + hidl_handle::kOffsetOfNativeHandle,
+ &handle);
+
+ return _hidl_err;
+}
+
+status_t writeEmbeddedToParcel(const hidl_handle &handle,
+ Parcel *parcel, size_t parentHandle, size_t parentOffset) {
+ status_t _hidl_err = parcel->writeEmbeddedNativeHandle(
+ handle.getNativeHandle(),
+ parentHandle,
+ parentOffset + hidl_handle::kOffsetOfNativeHandle);
+
+ return _hidl_err;
+}
+
const size_t hidl_memory::kOffsetOfHandle = offsetof(hidl_memory, mHandle);
const size_t hidl_memory::kOffsetOfName = offsetof(hidl_memory, mName);
static_assert(hidl_memory::kOffsetOfHandle == 0, "wrong offset");
@@ -54,6 +78,7 @@
status_t readEmbeddedFromParcel(const hidl_memory& memory,
const Parcel &parcel, size_t parentHandle, size_t parentOffset) {
+ // TODO(b/111883309): Invoke readEmbeddedFromParcel(hidl_handle, ...).
const native_handle_t *handle;
::android::status_t _hidl_err = parcel.readNullableEmbeddedNativeHandle(
parentHandle,
@@ -73,6 +98,7 @@
status_t writeEmbeddedToParcel(const hidl_memory &memory,
Parcel *parcel, size_t parentHandle, size_t parentOffset) {
+ // TODO(b/111883309): Invoke writeEmbeddedToParcel(hidl_handle, ...).
status_t _hidl_err = parcel->writeEmbeddedNativeHandle(
memory.handle(),
parentHandle,
diff --git a/transport/include/hidl/HidlBinderSupport.h b/transport/include/hidl/HidlBinderSupport.h
index 6d45f39..97d185e 100644
--- a/transport/include/hidl/HidlBinderSupport.h
+++ b/transport/include/hidl/HidlBinderSupport.h
@@ -49,6 +49,14 @@
wp<::android::hidl::base::V1_0::IBase> mBase;
};
+// ---------------------- hidl_handle
+
+status_t readEmbeddedFromParcel(const hidl_handle &handle,
+ const Parcel &parcel, size_t parentHandle, size_t parentOffset);
+
+status_t writeEmbeddedToParcel(const hidl_handle &handle,
+ Parcel *parcel, size_t parentHandle, size_t parentOffset);
+
// ---------------------- hidl_memory
status_t readEmbeddedFromParcel(const hidl_memory &memory,