#include "tcp_socket_impl.h"
using namespace NAsio;
TSocketOperation::TSocketOperation(TTcpSocket::TImpl& s, TPollType pt, TInstant deadline)
: TFdOperation(s.Fd(), pt, deadline)
, S_(s)
{
}
bool TOperationWrite::Execute(int errorCode) {
if (errorCode) {
H_(errorCode, Written_, *this);
return true; //op. completed
}
TErrorCode ec;
TContIOVector& iov = *Buffs_->GetIOvec();
size_t n = S_.WriteSome(iov, ec);
if (ec && ec.Value() != EAGAIN && ec.Value() != EWOULDBLOCK) {
H_(ec, Written_ + n, *this);
return true;
}
if (n) {
Written_ += n;
iov.Proceed(n);
if (!iov.Bytes()) {
H_(ec, Written_, *this);
return true; //op. completed
}
}
return false; //operation not compleled
}
bool TOperationWriteVector::Execute(int errorCode) {
if (errorCode) {
H_(errorCode, Written_, *this);
return true; //op. completed
}
TErrorCode ec;
size_t n = S_.WriteSome(V_, ec);
if (ec && ec.Value() != EAGAIN && ec.Value() != EWOULDBLOCK) {
H_(ec, Written_ + n, *this);
return true;
}
if (n) {
Written_ += n;
V_.Proceed(n);
if (!V_.Bytes()) {
H_(ec, Written_, *this);
return true; //op. completed
}
}
return false; //operation not compleled
}
bool TOperationReadSome::Execute(int errorCode) {
if (errorCode) {
H_(errorCode, 0, *this);
return true; //op. completed
}
TErrorCode ec;
H_(ec, S_.ReadSome(Buff_, Size_, ec), *this);
return true;
}
bool TOperationRead::Execute(int errorCode) {
if (errorCode) {
H_(errorCode, Read_, *this);
return true; //op. completed
}
TErrorCode ec;
size_t n = S_.ReadSome(Buff_, Size_, ec);
Read_ += n;
if (ec && ec.Value() != EAGAIN && ec.Value() != EWOULDBLOCK) {
H_(ec, Read_, *this);
return true; //op. completed
}
if (n) {
Size_ -= n;
if (!Size_) {
H_(ec, Read_, *this);
return true;
}
Buff_ += n;
} else if (!ec) { // EOF while read not all
H_(ec, Read_, *this);
return true;
}
return false;
}