1#ifndef ANDROID_DVR_BUFFER_HUB_QUEUE_PARCELABLE_H_
2#define ANDROID_DVR_BUFFER_HUB_QUEUE_PARCELABLE_H_
3
4#if defined(__clang__)
5#pragma clang diagnostic push
6#pragma clang diagnostic ignored "-Weverything"
7#endif
8
9// The following headers are included without checking every warning.
10// TODO(b/72172820): Remove the workaround once we have enforced -Weverything
11// in these headers and their dependencies.
12#include <pdx/channel_parcelable.h>
13
14#if defined(__clang__)
15#pragma clang diagnostic pop
16#endif
17
18namespace android {
19namespace dvr {
20
21enum BufferHubQueueParcelableMagic : uint32_t {
22  Producer = 0x62687170,  // 'bhqp'
23  Consumer = 0x62687163,  // 'bhqc'
24};
25
26template <BufferHubQueueParcelableMagic Magic>
27class BufferHubQueueParcelable : public Parcelable {
28 public:
29  BufferHubQueueParcelable() = default;
30
31  BufferHubQueueParcelable(BufferHubQueueParcelable&& other) = default;
32  BufferHubQueueParcelable& operator=(BufferHubQueueParcelable&& other) {
33    channel_parcelable_ = std::move(other.channel_parcelable_);
34    return *this;
35  }
36
37  // Constructs an parcelable contains the channel parcelable.
38  BufferHubQueueParcelable(
39      std::unique_ptr<pdx::ChannelParcelable> channel_parcelable)
40      : channel_parcelable_(std::move(channel_parcelable)) {}
41
42  BufferHubQueueParcelable(const BufferHubQueueParcelable&) = delete;
43  void operator=(const BufferHubQueueParcelable&) = delete;
44
45  bool IsValid() const;
46
47  // Returns a channel handle constructed from this parcelable object and takes
48  // the ownership of all resources from the parcelable object.
49  pdx::LocalChannelHandle TakeChannelHandle();
50
51  // Serializes the queue parcelable into the given parcel. Note that no system
52  // resources are getting duplicated, nor did the parcel takes ownership of the
53  // queue parcelable. Thus, the parcelable object must remain valid for the
54  // lifetime of the parcel.
55  status_t writeToParcel(Parcel* parcel) const override;
56
57  // Deserialize the queue parcelable from the given parcel. Note that system
58  // resources are duplicated from the parcel into the queue parcelable. Returns
59  // error if the targeting parcelable object is already valid.
60  status_t readFromParcel(const Parcel* parcel) override;
61
62 private:
63  std::unique_ptr<pdx::ChannelParcelable> channel_parcelable_;
64};
65
66using ProducerQueueParcelable =
67    BufferHubQueueParcelable<BufferHubQueueParcelableMagic::Producer>;
68using ConsumerQueueParcelable =
69    BufferHubQueueParcelable<BufferHubQueueParcelableMagic::Consumer>;
70
71}  // namespace dvr
72}  // namespace android
73
74#endif  // ANDROID_DVR_BUFFER_HUB_QUEUE_PARCELABLE_H_
75