#include "io_service_impl.h" #include "deadline_timer_impl.h" #include "tcp_socket_impl.h" #include "tcp_acceptor_impl.h" using namespace NDns; using namespace NAsio; namespace NAsio { TIOService::TWork::TWork(TWork& w) : Srv_(w.Srv_) { Srv_.GetImpl().WorkStarted(); } TIOService::TWork::TWork(TIOService& srv) : Srv_(srv) { Srv_.GetImpl().WorkStarted(); } TIOService::TWork::~TWork() { Srv_.GetImpl().WorkFinished(); } TIOService::TIOService() : Impl_(new TImpl()) { } TIOService::~TIOService() { } void TIOService::Run() { Impl_->Run(); } size_t TIOService::GetOpQueueSize() noexcept { return Impl_->GetOpQueueSize(); } void TIOService::Post(TCompletionHandler h) { Impl_->Post(std::move(h)); } void TIOService::Abort() { Impl_->Abort(); } TDeadlineTimer::TDeadlineTimer(TIOService& srv) noexcept : Srv_(srv) , Impl_(nullptr) { } TDeadlineTimer::~TDeadlineTimer() { if (Impl_) { Srv_.GetImpl().ScheduleOp(new TUnregisterTimerOperation(Impl_)); } } void TDeadlineTimer::AsyncWaitExpireAt(TDeadline deadline, THandler h) { if (!Impl_) { Impl_ = new TDeadlineTimer::TImpl(Srv_.GetImpl()); Srv_.GetImpl().ScheduleOp(new TRegisterTimerOperation(Impl_)); } Impl_->AsyncWaitExpireAt(deadline, h); } void TDeadlineTimer::Cancel() { Impl_->Cancel(); } TTcpSocket::TTcpSocket(TIOService& srv) noexcept : Srv_(srv) , Impl_(new TImpl(srv.GetImpl())) { } TTcpSocket::~TTcpSocket() { } void TTcpSocket::AsyncConnect(const TEndpoint& ep, TTcpSocket::TConnectHandler h, TDeadline deadline) { Impl_->AsyncConnect(ep, h, deadline); } void TTcpSocket::AsyncWrite(TSendedData& d, TTcpSocket::TWriteHandler h, TDeadline deadline) { Impl_->AsyncWrite(d, h, deadline); } void TTcpSocket::AsyncWrite(TContIOVector* vec, TWriteHandler h, TDeadline deadline) { Impl_->AsyncWrite(vec, h, deadline); } void TTcpSocket::AsyncWrite(const void* data, size_t size, TWriteHandler h, TDeadline deadline) { class TBuffers: public IBuffers { public: TBuffers(const void* theData, size_t theSize) : Part(theData, theSize) , IOVec(&Part, 1) { } TContIOVector* GetIOvec() override { return &IOVec; } IOutputStream::TPart Part; TContIOVector IOVec; }; TSendedData d(new TBuffers(data, size)); Impl_->AsyncWrite(d, h, deadline); } void TTcpSocket::AsyncRead(void* buff, size_t size, TTcpSocket::TReadHandler h, TDeadline deadline) { Impl_->AsyncRead(buff, size, h, deadline); } void TTcpSocket::AsyncReadSome(void* buff, size_t size, TTcpSocket::TReadHandler h, TDeadline deadline) { Impl_->AsyncReadSome(buff, size, h, deadline); } void TTcpSocket::AsyncPollRead(TTcpSocket::TPollHandler h, TDeadline deadline) { Impl_->AsyncPollRead(h, deadline); } void TTcpSocket::AsyncPollWrite(TTcpSocket::TPollHandler h, TDeadline deadline) { Impl_->AsyncPollWrite(h, deadline); } void TTcpSocket::AsyncCancel() { return Impl_->AsyncCancel(); } size_t TTcpSocket::WriteSome(TContIOVector& d, TErrorCode& ec) noexcept { return Impl_->WriteSome(d, ec); } size_t TTcpSocket::WriteSome(const void* buff, size_t size, TErrorCode& ec) noexcept { return Impl_->WriteSome(buff, size, ec); } size_t TTcpSocket::ReadSome(void* buff, size_t size, TErrorCode& ec) noexcept { return Impl_->ReadSome(buff, size, ec); } bool TTcpSocket::IsOpen() const noexcept { return Native() != INVALID_SOCKET; } void TTcpSocket::Shutdown(TShutdownMode what, TErrorCode& ec) { return Impl_->Shutdown(what, ec); } SOCKET TTcpSocket::Native() const noexcept { return Impl_->Fd(); } TEndpoint TTcpSocket::RemoteEndpoint() const { return Impl_->RemoteEndpoint(); } ////////////////////////////////// TTcpAcceptor::TTcpAcceptor(TIOService& srv) noexcept : Srv_(srv) , Impl_(new TImpl(srv.GetImpl())) { } TTcpAcceptor::~TTcpAcceptor() { } void TTcpAcceptor::Bind(TEndpoint& ep, TErrorCode& ec) noexcept { return Impl_->Bind(ep, ec); } void TTcpAcceptor::Listen(int backlog, TErrorCode& ec) noexcept { return Impl_->Listen(backlog, ec); } void TTcpAcceptor::AsyncAccept(TTcpSocket& s, TTcpAcceptor::TAcceptHandler h, TDeadline deadline) { return Impl_->AsyncAccept(s, h, deadline); } void TTcpAcceptor::AsyncCancel() { Impl_->AsyncCancel(); } }