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