1#include "include/private/dvr/buffer_hub_queue_parcelable.h" 2 3#include <binder/Parcel.h> 4#include <pdx/default_transport/channel_parcelable.h> 5 6namespace android { 7namespace dvr { 8 9template <BufferHubQueueParcelableMagic Magic> 10bool BufferHubQueueParcelable<Magic>::IsValid() const { 11 return !!channel_parcelable_ && channel_parcelable_->IsValid(); 12} 13 14template <BufferHubQueueParcelableMagic Magic> 15pdx::LocalChannelHandle BufferHubQueueParcelable<Magic>::TakeChannelHandle() { 16 if (!IsValid()) { 17 ALOGE( 18 "BufferHubQueueParcelable::TakeChannelHandle: Invalid channel parcel."); 19 return {}; // Returns an empty channel handle. 20 } 21 22 // Take channel handle out of the parcelable and reset the parcelable. 23 pdx::LocalChannelHandle handle = channel_parcelable_->TakeChannelHandle(); 24 // Now channel_parcelable_ should already be invalid, but reset it to release 25 // the invalid parcelable object from unique_ptr. 26 channel_parcelable_ = nullptr; 27 return handle; 28} 29 30template <BufferHubQueueParcelableMagic Magic> 31status_t BufferHubQueueParcelable<Magic>::writeToParcel(Parcel* parcel) const { 32 if (!IsValid()) { 33 ALOGE("BufferHubQueueParcelable::writeToParcel: Invalid channel."); 34 return -EINVAL; 35 } 36 37 status_t res = parcel->writeUint32(Magic); 38 if (res != NO_ERROR) { 39 ALOGE("BufferHubQueueParcelable::writeToParcel: Cannot write magic."); 40 return res; 41 } 42 43 return channel_parcelable_->writeToParcel(parcel); 44} 45 46template <BufferHubQueueParcelableMagic Magic> 47status_t BufferHubQueueParcelable<Magic>::readFromParcel(const Parcel* parcel) { 48 if (IsValid()) { 49 ALOGE( 50 "BufferHubQueueParcelable::readFromParcel: This parcelable object has " 51 "been initialized already."); 52 return -EINVAL; 53 } 54 55 uint32_t out_magic = 0; 56 status_t res = NO_ERROR; 57 58 res = parcel->readUint32(&out_magic); 59 if (res != NO_ERROR) 60 return res; 61 62 if (out_magic != Magic) { 63 ALOGE( 64 "BufferHubQueueParcelable::readFromParcel: Unexpected magic: 0x%x, " 65 "epxected: 0x%x", 66 out_magic, Magic); 67 return -EINVAL; 68 } 69 70 // (Re)Alocate channel parcelable object. 71 channel_parcelable_ = 72 std::make_unique<pdx::default_transport::ChannelParcelable>(); 73 return channel_parcelable_->readFromParcel(parcel); 74} 75 76template class BufferHubQueueParcelable< 77 BufferHubQueueParcelableMagic::Producer>; 78template class BufferHubQueueParcelable< 79 BufferHubQueueParcelableMagic::Consumer>; 80 81} // namespace dvr 82} // namespace android 83