/* */ #include "SocketBuffer.h" #include #include #include "SocketCore.h" #include "DlAbortEx.h" #include "message.h" #include "StringFormat.h" namespace aria2 { SocketBuffer::SocketBuffer(const SharedHandle& socket): socket_(socket), offset_(0) {} SocketBuffer::~SocketBuffer() { std::for_each(bufq_.begin(), bufq_.end(), std::mem_fun_ref(&BufEntry::deleteBuf)); } void SocketBuffer::pushBytes(unsigned char* bytes, size_t len) { bufq_.push_back(BufEntry(bytes, len)); } void SocketBuffer::pushStr(const std::string& data) { bufq_.push_back(BufEntry(data)); } ssize_t SocketBuffer::send() { size_t totalslen = 0; while(!bufq_.empty()) { BufEntry& buf = bufq_[0]; const char* data; ssize_t r; if(buf.type == TYPE_BYTES) { data = reinterpret_cast(buf.bytes); r = buf.bytesLen-offset_; } else { const std::string& str = *buf.str; data = str.data(); r = str.size()-offset_; } ssize_t slen = socket_->writeData(data+offset_, r); if(slen == 0 && !socket_->wantRead() && !socket_->wantWrite()) { throw DL_ABORT_EX(StringFormat(EX_SOCKET_SEND, "Connection closed.").str()); } totalslen += slen; if(slen < r) { offset_ += slen; break; } else { offset_ = 0; buf.deleteBuf(); bufq_.pop_front(); } } return totalslen; } bool SocketBuffer::sendBufferIsEmpty() const { return bufq_.empty(); } } // namespace aria2