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