diff options
author | Jeongik Cha <jeongik@google.com> | 2019-11-14 10:23:44 +0900 |
---|---|---|
committer | Jeongik Cha <jeongik@google.com> | 2019-11-18 14:21:53 +0900 |
commit | 9af82100f733b2392a842b78a11b8771c3b635bd (patch) | |
tree | 3f6d40d2b3b077be6b2b8e09b03ab9f4cdc30e5a | |
parent | 6cea68f9a126090f4c291b1c59a7858a02fc0c56 (diff) | |
download | native-9af82100f733b2392a842b78a11b8771c3b635bd.tar.gz |
Support ParcelFileDescriptor[] in libbinder_ndk
Bug: 144114628
Test: atest CtsNdkBinderTestCases
Change-Id: Icaadc7767bae237b5d72fd922e87a50efaeac42f
-rw-r--r-- | libs/binder/ndk/include_ndk/android/binder_parcel_utils.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/libs/binder/ndk/include_ndk/android/binder_parcel_utils.h b/libs/binder/ndk/include_ndk/android/binder_parcel_utils.h index f3bc31b0bb..787166762b 100644 --- a/libs/binder/ndk/include_ndk/android/binder_parcel_utils.h +++ b/libs/binder/ndk/include_ndk/android/binder_parcel_utils.h @@ -441,6 +441,42 @@ binder_status_t AParcel_readStdVectorParcelableElement(const AParcel* parcel, vo } /** + * Writes a ScopedFileDescriptor object inside a std::vector<ScopedFileDescriptor> at index 'index' + * to 'parcel'. + */ +template <> +inline binder_status_t AParcel_writeStdVectorParcelableElement<ScopedFileDescriptor>( + AParcel* parcel, const void* vectorData, size_t index) { + const std::vector<ScopedFileDescriptor>* vector = + static_cast<const std::vector<ScopedFileDescriptor>*>(vectorData); + int writeFd = vector->at(index).get(); + if (writeFd < 0) { + return STATUS_UNEXPECTED_NULL; + } + return AParcel_writeParcelFileDescriptor(parcel, writeFd); +} + +/** + * Reads a ScopedFileDescriptor object inside a std::vector<ScopedFileDescriptor> at index 'index' + * from 'parcel'. + */ +template <> +inline binder_status_t AParcel_readStdVectorParcelableElement<ScopedFileDescriptor>( + const AParcel* parcel, void* vectorData, size_t index) { + std::vector<ScopedFileDescriptor>* vector = + static_cast<std::vector<ScopedFileDescriptor>*>(vectorData); + int readFd; + binder_status_t status = AParcel_readParcelFileDescriptor(parcel, &readFd); + if (status == STATUS_OK) { + if (readFd < 0) { + return STATUS_UNEXPECTED_NULL; + } + vector->at(index).set(readFd); + } + return status; +} + +/** * Convenience API for writing a std::vector<P> */ template <typename P> |