16890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka#ifndef ANDROID_PDX_UDS_CHANNEL_EVENT_SET_H_
26890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka#define ANDROID_PDX_UDS_CHANNEL_EVENT_SET_H_
36890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
452ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka#include <vector>
56890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
652ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka#include <pdx/client_channel.h>
76890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka#include <pdx/file_handle.h>
86890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka#include <pdx/status.h>
96890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
106890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabakanamespace android {
116890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabakanamespace pdx {
126890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabakanamespace uds {
136890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
146890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabakaclass ChannelEventSet {
156890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka public:
166890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  ChannelEventSet();
176890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  ChannelEventSet(ChannelEventSet&&) = default;
186890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  ChannelEventSet& operator=(ChannelEventSet&&) = default;
196890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
2052ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  BorrowedHandle pollin_event_fd() const { return pollin_event_fd_.Borrow(); }
2152ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  BorrowedHandle pollhup_event_fd() const { return pollhup_event_fd_.Borrow(); }
226890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
2352ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  explicit operator bool() const {
2452ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka    return !!pollin_event_fd_ && !!pollhup_event_fd_;
2552ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  }
266890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
276890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  int ModifyEvents(int clear_mask, int set_mask);
286890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
296890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka private:
3052ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  LocalHandle pollin_event_fd_;
3152ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  LocalHandle pollhup_event_fd_;
326890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  uint32_t event_bits_ = 0;
336890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
346890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  ChannelEventSet(const ChannelEventSet&) = delete;
356890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  void operator=(const ChannelEventSet&) = delete;
366890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka};
376890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
386890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabakaclass ChannelEventReceiver {
396890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka public:
406890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  ChannelEventReceiver() = default;
4152ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  ChannelEventReceiver(LocalHandle data_fd, LocalHandle pollin_event_fd,
4252ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka                       LocalHandle pollhup_event_fd);
436890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  ChannelEventReceiver(ChannelEventReceiver&&) = default;
446890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  ChannelEventReceiver& operator=(ChannelEventReceiver&&) = default;
456890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
4652ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  explicit operator bool() const {
4752ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka    return !!pollin_event_fd_ && !!pollhup_event_fd_ && !!data_fd_ &&
4852ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka           !!epoll_fd_;
4952ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  }
5052ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka
516890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  BorrowedHandle event_fd() const { return epoll_fd_.Borrow(); }
5252ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka
5352ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  BorrowedHandle pollin_event_fd() const { return pollin_event_fd_.Borrow(); }
5452ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  BorrowedHandle pollhup_event_fd() const { return pollhup_event_fd_.Borrow(); }
5552ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  BorrowedHandle data_fd() const { return data_fd_.Borrow(); }
5652ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka
576890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  Status<int> GetPendingEvents() const;
5852ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  Status<int> PollPendingEvents(int timeout_ms) const;
5952ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka
6052ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  std::vector<ClientChannel::EventSource> GetEventSources() const;
616890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
626890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka private:
6352ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  LocalHandle data_fd_;
6452ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  LocalHandle pollin_event_fd_;
6552ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  LocalHandle pollhup_event_fd_;
666890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  LocalHandle epoll_fd_;
676890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
686890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  ChannelEventReceiver(const ChannelEventReceiver&) = delete;
696890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  void operator=(const ChannelEventReceiver&) = delete;
706890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka};
716890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
726890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka}  // namespace uds
736890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka}  // namespace pdx
746890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka}  // namespace android
756890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
766890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka#endif  // ANDROID_PDX_UDS_CHANNEL_EVENT_SET_H_
77