Home | History | Annotate | Download | only in uds
      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 
     23   uint32_t GetIpcTag() const override { return Endpoint::kIpcTag; }
     24 
     25   int event_fd() const override {
     26     return channel_data_ ? channel_data_->event_fd().Get() : -1;
     27   }
     28 
     29   std::vector<EventSource> GetEventSources() const override {
     30     if (channel_data_)
     31       return channel_data_->GetEventSources();
     32     else
     33       return {};
     34   }
     35 
     36   Status<int> GetEventMask(int /*events*/) override {
     37     if (channel_data_)
     38       return channel_data_->GetPendingEvents();
     39     else
     40       return ErrorStatus(EINVAL);
     41   }
     42 
     43   LocalChannelHandle& GetChannelHandle() override { return channel_handle_; }
     44   const LocalChannelHandle& GetChannelHandle() const override {
     45     return channel_handle_;
     46   }
     47   void* AllocateTransactionState() override;
     48   void FreeTransactionState(void* state) override;
     49 
     50   Status<void> SendImpulse(int opcode, const void* buffer,
     51                            size_t length) override;
     52 
     53   Status<int> SendWithInt(void* transaction_state, int opcode,
     54                           const iovec* send_vector, size_t send_count,
     55                           const iovec* receive_vector,
     56                           size_t receive_count) override;
     57   Status<LocalHandle> SendWithFileHandle(void* transaction_state, int opcode,
     58                                          const iovec* send_vector,
     59                                          size_t send_count,
     60                                          const iovec* receive_vector,
     61                                          size_t receive_count) override;
     62   Status<LocalChannelHandle> SendWithChannelHandle(
     63       void* transaction_state, int opcode, const iovec* send_vector,
     64       size_t send_count, const iovec* receive_vector,
     65       size_t receive_count) override;
     66 
     67   FileReference PushFileHandle(void* transaction_state,
     68                                const LocalHandle& handle) override;
     69   FileReference PushFileHandle(void* transaction_state,
     70                                const BorrowedHandle& handle) override;
     71   ChannelReference PushChannelHandle(void* transaction_state,
     72                                      const LocalChannelHandle& handle) override;
     73   ChannelReference PushChannelHandle(
     74       void* transaction_state, const BorrowedChannelHandle& handle) override;
     75   bool GetFileHandle(void* transaction_state, FileReference ref,
     76                      LocalHandle* handle) const override;
     77   bool GetChannelHandle(void* transaction_state, ChannelReference ref,
     78                         LocalChannelHandle* handle) const override;
     79 
     80   std::unique_ptr<pdx::ChannelParcelable> TakeChannelParcelable() override;
     81 
     82  private:
     83   explicit ClientChannel(LocalChannelHandle channel_handle);
     84 
     85   Status<int> SendAndReceive(void* transaction_state, int opcode,
     86                              const iovec* send_vector, size_t send_count,
     87                              const iovec* receive_vector, size_t receive_count);
     88 
     89   LocalChannelHandle channel_handle_;
     90   ChannelEventReceiver* channel_data_;
     91   std::mutex socket_mutex_;
     92 };
     93 
     94 }  // namespace uds
     95 }  // namespace pdx
     96 }  // namespace android
     97 
     98 #endif  // ANDROID_PDX_UDS_CLIENT_CHANNEL_H_
     99