#include "include/private/dvr/buffer_hub_queue_parcelable.h" #include <binder/Parcel.h> #include <pdx/default_transport/channel_parcelable.h> namespace android { namespace dvr { template <BufferHubQueueParcelableMagic Magic> bool BufferHubQueueParcelable<Magic>::IsValid() const { return !!channel_parcelable_ && channel_parcelable_->IsValid(); } template <BufferHubQueueParcelableMagic Magic> pdx::LocalChannelHandle BufferHubQueueParcelable<Magic>::TakeChannelHandle() { if (!IsValid()) { ALOGE( "BufferHubQueueParcelable::TakeChannelHandle: Invalid channel parcel."); return {}; // Returns an empty channel handle. } // Take channel handle out of the parcelable and reset the parcelable. pdx::LocalChannelHandle handle = channel_parcelable_->TakeChannelHandle(); // Now channel_parcelable_ should already be invalid, but reset it to release // the invalid parcelable object from unique_ptr. channel_parcelable_ = nullptr; return handle; } template <BufferHubQueueParcelableMagic Magic> status_t BufferHubQueueParcelable<Magic>::writeToParcel(Parcel* parcel) const { if (!IsValid()) { ALOGE("BufferHubQueueParcelable::writeToParcel: Invalid channel."); return -EINVAL; } status_t res = parcel->writeUint32(Magic); if (res != OK) { ALOGE("BufferHubQueueParcelable::writeToParcel: Cannot write magic."); return res; } return channel_parcelable_->writeToParcel(parcel); } template <BufferHubQueueParcelableMagic Magic> status_t BufferHubQueueParcelable<Magic>::readFromParcel(const Parcel* parcel) { if (IsValid()) { ALOGE( "BufferHubQueueParcelable::readFromParcel: This parcelable object has " "been initialized already."); return -EINVAL; } uint32_t out_magic = 0; status_t res = OK; res = parcel->readUint32(&out_magic); if (res != OK) return res; if (out_magic != Magic) { ALOGE( "BufferHubQueueParcelable::readFromParcel: Unexpected magic: 0x%x, " "epxected: 0x%x", out_magic, Magic); return -EINVAL; } // (Re)Alocate channel parcelable object. channel_parcelable_ = std::make_unique<pdx::default_transport::ChannelParcelable>(); return channel_parcelable_->readFromParcel(parcel); } template class BufferHubQueueParcelable< BufferHubQueueParcelableMagic::Producer>; template class BufferHubQueueParcelable< BufferHubQueueParcelableMagic::Consumer>; } // namespace dvr } // namespace android