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