1 #ifndef ANDROID_PDX_UDS_CLIENT_CHANNEL_H_ 2 #define ANDROID_PDX_UDS_CLIENT_CHANNEL_H_ 3 4 #include <pdx/client_channel.h> 5 6 #include <mutex> 7 8 #include <uds/channel_event_set.h> 9 #include <uds/channel_manager.h> 10 #include <uds/service_endpoint.h> 11 12 namespace android { 13 namespace pdx { 14 namespace uds { 15 16 class ClientChannel : public pdx::ClientChannel { 17 public: 18 ~ClientChannel() override; 19 20 static std::unique_ptr<pdx::ClientChannel> Create( 21 LocalChannelHandle channel_handle); 22 GetIpcTag()23 uint32_t GetIpcTag() const override { return Endpoint::kIpcTag; } 24 event_fd()25 int event_fd() const override { 26 return channel_data_ ? channel_data_->event_receiver.event_fd().Get() : -1; 27 } GetEventMask(int)28 Status<int> GetEventMask(int /*events*/) override { 29 if (channel_data_) 30 return channel_data_->event_receiver.GetPendingEvents(); 31 else 32 return ErrorStatus(EINVAL); 33 } 34 GetChannelHandle()35 LocalChannelHandle& GetChannelHandle() override { return channel_handle_; } 36 void* AllocateTransactionState() override; 37 void FreeTransactionState(void* state) override; 38 39 Status<void> SendImpulse(int opcode, const void* buffer, 40 size_t length) override; 41 42 Status<int> SendWithInt(void* transaction_state, int opcode, 43 const iovec* send_vector, size_t send_count, 44 const iovec* receive_vector, 45 size_t receive_count) override; 46 Status<LocalHandle> SendWithFileHandle(void* transaction_state, int opcode, 47 const iovec* send_vector, 48 size_t send_count, 49 const iovec* receive_vector, 50 size_t receive_count) override; 51 Status<LocalChannelHandle> SendWithChannelHandle( 52 void* transaction_state, int opcode, const iovec* send_vector, 53 size_t send_count, const iovec* receive_vector, 54 size_t receive_count) override; 55 56 FileReference PushFileHandle(void* transaction_state, 57 const LocalHandle& handle) override; 58 FileReference PushFileHandle(void* transaction_state, 59 const BorrowedHandle& handle) override; 60 ChannelReference PushChannelHandle(void* transaction_state, 61 const LocalChannelHandle& handle) override; 62 ChannelReference PushChannelHandle( 63 void* transaction_state, const BorrowedChannelHandle& handle) override; 64 bool GetFileHandle(void* transaction_state, FileReference ref, 65 LocalHandle* handle) const override; 66 bool GetChannelHandle(void* transaction_state, ChannelReference ref, 67 LocalChannelHandle* handle) const override; 68 69 private: 70 explicit ClientChannel(LocalChannelHandle channel_handle); 71 72 Status<int> SendAndReceive(void* transaction_state, int opcode, 73 const iovec* send_vector, size_t send_count, 74 const iovec* receive_vector, size_t receive_count); 75 76 LocalChannelHandle channel_handle_; 77 ChannelManager::ChannelData* channel_data_; 78 std::mutex socket_mutex_; 79 }; 80 81 } // namespace uds 82 } // namespace pdx 83 } // namespace android 84 85 #endif // ANDROID_PDX_UDS_CLIENT_CHANNEL_H_ 86