blob: 7a5ddf40eb8f9ee0af6776c800545bdcf67e29b1 [file] [log] [blame]
#ifndef ANDROID_PDX_UDS_CLIENT_CHANNEL_H_
#define ANDROID_PDX_UDS_CLIENT_CHANNEL_H_
#include <pdx/client_channel.h>
#include <mutex>
#include <uds/channel_event_set.h>
#include <uds/channel_manager.h>
#include <uds/service_endpoint.h>
namespace android {
namespace pdx {
namespace uds {
class ClientChannel : public pdx::ClientChannel {
public:
~ClientChannel() override;
static std::unique_ptr<pdx::ClientChannel> Create(
LocalChannelHandle channel_handle);
uint32_t GetIpcTag() const override { return Endpoint::kIpcTag; }
int event_fd() const override {
return channel_data_ ? channel_data_->event_fd().Get() : -1;
}
std::vector<EventSource> GetEventSources() const override {
if (channel_data_)
return channel_data_->GetEventSources();
else
return {};
}
Status<int> GetEventMask(int /*events*/) override {
if (channel_data_)
return channel_data_->GetPendingEvents();
else
return ErrorStatus(EINVAL);
}
LocalChannelHandle& GetChannelHandle() override { return channel_handle_; }
void* AllocateTransactionState() override;
void FreeTransactionState(void* state) override;
Status<void> SendImpulse(int opcode, const void* buffer,
size_t length) override;
Status<int> SendWithInt(void* transaction_state, int opcode,
const iovec* send_vector, size_t send_count,
const iovec* receive_vector,
size_t receive_count) override;
Status<LocalHandle> SendWithFileHandle(void* transaction_state, int opcode,
const iovec* send_vector,
size_t send_count,
const iovec* receive_vector,
size_t receive_count) override;
Status<LocalChannelHandle> SendWithChannelHandle(
void* transaction_state, int opcode, const iovec* send_vector,
size_t send_count, const iovec* receive_vector,
size_t receive_count) override;
FileReference PushFileHandle(void* transaction_state,
const LocalHandle& handle) override;
FileReference PushFileHandle(void* transaction_state,
const BorrowedHandle& handle) override;
ChannelReference PushChannelHandle(void* transaction_state,
const LocalChannelHandle& handle) override;
ChannelReference PushChannelHandle(
void* transaction_state, const BorrowedChannelHandle& handle) override;
bool GetFileHandle(void* transaction_state, FileReference ref,
LocalHandle* handle) const override;
bool GetChannelHandle(void* transaction_state, ChannelReference ref,
LocalChannelHandle* handle) const override;
private:
explicit ClientChannel(LocalChannelHandle channel_handle);
Status<int> SendAndReceive(void* transaction_state, int opcode,
const iovec* send_vector, size_t send_count,
const iovec* receive_vector, size_t receive_count);
LocalChannelHandle channel_handle_;
ChannelEventReceiver* channel_data_;
std::mutex socket_mutex_;
};
} // namespace uds
} // namespace pdx
} // namespace android
#endif // ANDROID_PDX_UDS_CLIENT_CHANNEL_H_