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