1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifndef ANDROID_PDX_CLIENT_CHANNEL_H_
2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define ANDROID_PDX_CLIENT_CHANNEL_H_
3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
452ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka#include <vector>
552ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka
6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/channel_handle.h>
7a88e3ee3a33a60e72bd976cfb5b9fc0bd15a1078Jiwen 'Steve' Cai#include <pdx/channel_parcelable.h>
8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/file_handle.h>
9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/status.h>
10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostruct iovec;
12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android {
14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace pdx {
15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass ClientChannel {
17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public:
18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual ~ClientChannel() = default;
19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Returns a tag that uniquely identifies a specific underlying IPC transport.
21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual uint32_t GetIpcTag() const = 0;
22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual int event_fd() const = 0;
246890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka  virtual Status<int> GetEventMask(int events) = 0;
256890d95ec8b96970202518b439bfa8ab2d9dbf77Corey Tabaka
2652ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  struct EventSource {
2752ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka    int event_fd;
2852ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka    int event_mask;
2952ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  };
3052ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka
3152ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  // Returns a set of event-generating fds with and event mask for each. These
3252ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  // fds are owned by the ClientChannel and must never be closed by the caller.
3352ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  virtual std::vector<EventSource> GetEventSources() const = 0;
3452ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka
35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual LocalChannelHandle& GetChannelHandle() = 0;
36a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  virtual const LocalChannelHandle& GetChannelHandle() const = 0;
37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual void* AllocateTransactionState() = 0;
38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual void FreeTransactionState(void* state) = 0;
39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual Status<void> SendImpulse(int opcode, const void* buffer,
41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                   size_t length) = 0;
42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual Status<int> SendWithInt(void* transaction_state, int opcode,
44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                  const iovec* send_vector, size_t send_count,
45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                  const iovec* receive_vector,
46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                  size_t receive_count) = 0;
47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual Status<LocalHandle> SendWithFileHandle(
48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      void* transaction_state, int opcode, const iovec* send_vector,
49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      size_t send_count, const iovec* receive_vector, size_t receive_count) = 0;
50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual Status<LocalChannelHandle> SendWithChannelHandle(
51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      void* transaction_state, int opcode, const iovec* send_vector,
52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      size_t send_count, const iovec* receive_vector, size_t receive_count) = 0;
53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual FileReference PushFileHandle(void* transaction_state,
55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                       const LocalHandle& handle) = 0;
56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual FileReference PushFileHandle(void* transaction_state,
57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                       const BorrowedHandle& handle) = 0;
58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual ChannelReference PushChannelHandle(
59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      void* transaction_state, const LocalChannelHandle& handle) = 0;
60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual ChannelReference PushChannelHandle(
61e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      void* transaction_state, const BorrowedChannelHandle& handle) = 0;
62e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual bool GetFileHandle(void* transaction_state, FileReference ref,
63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                             LocalHandle* handle) const = 0;
64e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  virtual bool GetChannelHandle(void* transaction_state, ChannelReference ref,
65e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                LocalChannelHandle* handle) const = 0;
66a88e3ee3a33a60e72bd976cfb5b9fc0bd15a1078Jiwen 'Steve' Cai
67a88e3ee3a33a60e72bd976cfb5b9fc0bd15a1078Jiwen 'Steve' Cai  // Returns the internal state of the channel as a parcelable object. The
68a88e3ee3a33a60e72bd976cfb5b9fc0bd15a1078Jiwen 'Steve' Cai  // ClientChannel is invalidated however, the channel is kept alive by the
69a88e3ee3a33a60e72bd976cfb5b9fc0bd15a1078Jiwen 'Steve' Cai  // parcelable object and may be transferred to another process.
70a88e3ee3a33a60e72bd976cfb5b9fc0bd15a1078Jiwen 'Steve' Cai  virtual std::unique_ptr<ChannelParcelable> TakeChannelParcelable() = 0;
71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
72e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
73e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace pdx
74e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace android
75e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
76e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif  // ANDROID_PDX_CLIENT_CHANNEL_H_
77