/* */ #include "SocketBuffer.h" #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() {} void SocketBuffer::pushBytes(unsigned char* bytes, size_t len) { _bufq.push_back(BufEntry::createBytes(bytes, len)); } void SocketBuffer::feedSendBuffer(const std::string& data) { _bufq.push_back(BufEntry::createStr(data)); } ssize_t SocketBuffer::feedAndSend(const std::string& data) { feedSendBuffer(data); return send(); } 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