Index: webrtc/base/asynctcpsocket.cc |
diff --git a/webrtc/base/asynctcpsocket.cc b/webrtc/base/asynctcpsocket.cc |
index 7ec6dc8bc284053bab81782c0c7d235504c57f2f..31dec92367fc1c876e1b1c4fba1c92eb49b8c91f 100644 |
--- a/webrtc/base/asynctcpsocket.cc |
+++ b/webrtc/base/asynctcpsocket.cc |
@@ -55,12 +55,10 @@ AsyncTCPSocketBase::AsyncTCPSocketBase(AsyncSocket* socket, bool listen, |
listen_(listen), |
insize_(max_packet_size), |
inpos_(0), |
- outsize_(max_packet_size), |
- outpos_(0) { |
+ max_outsize_(max_packet_size) { |
if (!listen_) { |
// Listening sockets don't send/receive data, so they don't need buffers. |
inbuf_.reset(new char[insize_]); |
- outbuf_.reset(new char[outsize_]); |
} |
RTC_DCHECK(socket_.get() != NULL); |
@@ -138,41 +136,39 @@ int AsyncTCPSocketBase::SendTo(const void *pv, size_t cb, |
} |
int AsyncTCPSocketBase::SendRaw(const void * pv, size_t cb) { |
- if (outpos_ + cb > outsize_) { |
+ if (outbuf_.size() + cb > max_outsize_) { |
socket_->SetError(EMSGSIZE); |
return -1; |
} |
- RTC_DCHECK(outbuf_.get()); |
- memcpy(outbuf_.get() + outpos_, pv, cb); |
- outpos_ += cb; |
+ RTC_DCHECK(!listen_); |
+ outbuf_.AppendData(static_cast<const uint8_t*>(pv), cb); |
return FlushOutBuffer(); |
} |
int AsyncTCPSocketBase::FlushOutBuffer() { |
- RTC_DCHECK(outbuf_.get()); |
- int res = socket_->Send(outbuf_.get(), outpos_); |
+ RTC_DCHECK(!listen_); |
+ int res = socket_->Send(outbuf_.data(), outbuf_.size()); |
if (res <= 0) { |
return res; |
} |
- if (static_cast<size_t>(res) <= outpos_) { |
- outpos_ -= res; |
- } else { |
+ if (static_cast<size_t>(res) > outbuf_.size()) { |
RTC_NOTREACHED(); |
return -1; |
} |
- if (outpos_ > 0) { |
- memmove(outbuf_.get(), outbuf_.get() + res, outpos_); |
+ size_t new_size = outbuf_.size() - res; |
+ if (new_size > 0) { |
+ memmove(outbuf_.data(), outbuf_.data() + res, new_size); |
} |
+ outbuf_.SetSize(new_size); |
return res; |
} |
void AsyncTCPSocketBase::AppendToOutBuffer(const void* pv, size_t cb) { |
- RTC_DCHECK(outpos_ + cb < outsize_); |
- RTC_DCHECK(outbuf_.get()); |
- memcpy(outbuf_.get() + outpos_, pv, cb); |
- outpos_ += cb; |
+ RTC_DCHECK(outbuf_.size() + cb <= max_outsize_); |
+ RTC_DCHECK(!listen_); |
+ outbuf_.AppendData(static_cast<const uint8_t*>(pv), cb); |
} |
void AsyncTCPSocketBase::OnConnectEvent(AsyncSocket* socket) { |
@@ -222,11 +218,11 @@ void AsyncTCPSocketBase::OnReadEvent(AsyncSocket* socket) { |
void AsyncTCPSocketBase::OnWriteEvent(AsyncSocket* socket) { |
RTC_DCHECK(socket_.get() == socket); |
- if (outpos_ > 0) { |
+ if (outbuf_.size() > 0) { |
FlushOutBuffer(); |
} |
- if (outpos_ == 0) { |
+ if (outbuf_.size() == 0) { |
SignalReadyToSend(this); |
} |
} |