Split ByteBuffer into writer/reader objects.

This allows the reader to reference data, thus avoiding unnecessary
allocations and memory copies.

BUG=webrtc:5155,webrtc:5670

Review URL: https://codereview.webrtc.org/1821083002

Cr-Commit-Position: refs/heads/master@{#12160}
diff --git a/webrtc/libjingle/xmpp/xmppsocket.cc b/webrtc/libjingle/xmpp/xmppsocket.cc
index fd07828..9c1bf8b 100644
--- a/webrtc/libjingle/xmpp/xmppsocket.cc
+++ b/webrtc/libjingle/xmpp/xmppsocket.cc
@@ -77,10 +77,13 @@
 
 void XmppSocket::OnWriteEvent(rtc::AsyncSocket * socket) {
   // Write bytes if there are any
-  while (buffer_.Length() != 0) {
-    int written = cricket_socket_->Send(buffer_.Data(), buffer_.Length());
+  while (buffer_.size() > 0) {
+    int written = cricket_socket_->Send(buffer_.data(), buffer_.size());
     if (written > 0) {
-      buffer_.Consume(written);
+      ASSERT(static_cast<size_t>(written) <= buffer_.size());
+      memmove(buffer_.data(), buffer_.data() + written,
+          buffer_.size() - written);
+      buffer_.SetSize(buffer_.size() - written);
       continue;
     }
     if (!cricket_socket_->IsBlocking())
@@ -127,11 +130,11 @@
     SignalRead();
   if ((events & rtc::SE_WRITE)) {
     // Write bytes if there are any
-    while (buffer_.Length() != 0) {
+    while (buffer_.size() > 0) {
       rtc::StreamResult result;
       size_t written;
       int error;
-      result = stream_->Write(buffer_.Data(), buffer_.Length(),
+      result = stream_->Write(buffer_.data(), buffer_.size(),
                               &written, &error);
       if (result == rtc::SR_ERROR) {
         LOG(LS_ERROR) << "Send error: " << error;
@@ -141,7 +144,10 @@
         return;
       ASSERT(result == rtc::SR_SUCCESS);
       ASSERT(written > 0);
-      buffer_.Shift(written);
+      ASSERT(written <= buffer_.size());
+      memmove(buffer_.data(), buffer_.data() + written,
+          buffer_.size() - written);
+      buffer_.SetSize(buffer_.size() - written);
     }
   }
   if ((events & rtc::SE_CLOSE))
@@ -187,7 +193,7 @@
 }
 
 bool XmppSocket::Write(const char * data, size_t len) {
-  buffer_.WriteBytes(data, len);
+  buffer_.AppendData(data, len);
 #ifndef USE_SSLSTREAM
   OnWriteEvent(cricket_socket_);
 #else  // USE_SSLSTREAM