15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/*
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004--2005, Google Inc.
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met:
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer.
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer in the documentation
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     and/or other materials provided with the distribution.
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  3. The name of the author may not be used to endorse or promote products
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     derived from this software without specific prior written permission.
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/bytebuffer.h"
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <algorithm>
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <cassert>
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <cstring>
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/basictypes.h"
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/byteorder.h"
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base {
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const int DEFAULT_SIZE = 4096;
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgByteBuffer::ByteBuffer() {
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Construct(NULL, DEFAULT_SIZE, ORDER_NETWORK);
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgByteBuffer::ByteBuffer(ByteOrder byte_order) {
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Construct(NULL, DEFAULT_SIZE, byte_order);
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgByteBuffer::ByteBuffer(const char* bytes, size_t len) {
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Construct(bytes, len, ORDER_NETWORK);
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgByteBuffer::ByteBuffer(const char* bytes, size_t len, ByteOrder byte_order) {
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Construct(bytes, len, byte_order);
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgByteBuffer::ByteBuffer(const char* bytes) {
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Construct(bytes, strlen(bytes), ORDER_NETWORK);
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid ByteBuffer::Construct(const char* bytes, size_t len,
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                           ByteOrder byte_order) {
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  version_ = 0;
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  start_ = 0;
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  size_ = len;
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  byte_order_ = byte_order;
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bytes_ = new char[size_];
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (bytes) {
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    end_ = len;
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    memcpy(bytes_, bytes, end_);
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    end_ = 0;
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgByteBuffer::~ByteBuffer() {
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  delete[] bytes_;
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ByteBuffer::ReadUInt8(uint8* val) {
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!val) return false;
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return ReadBytes(reinterpret_cast<char*>(val), 1);
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ByteBuffer::ReadUInt16(uint16* val) {
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!val) return false;
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  uint16 v;
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!ReadBytes(reinterpret_cast<char*>(&v), 2)) {
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *val = (byte_order_ == ORDER_NETWORK) ? NetworkToHost16(v) : v;
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ByteBuffer::ReadUInt24(uint32* val) {
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!val) return false;
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  uint32 v = 0;
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  char* read_into = reinterpret_cast<char*>(&v);
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (byte_order_ == ORDER_NETWORK || IsHostBigEndian()) {
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ++read_into;
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!ReadBytes(read_into, 3)) {
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *val = (byte_order_ == ORDER_NETWORK) ? NetworkToHost32(v) : v;
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ByteBuffer::ReadUInt32(uint32* val) {
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!val) return false;
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  uint32 v;
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!ReadBytes(reinterpret_cast<char*>(&v), 4)) {
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *val = (byte_order_ == ORDER_NETWORK) ? NetworkToHost32(v) : v;
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ByteBuffer::ReadUInt64(uint64* val) {
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!val) return false;
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  uint64 v;
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!ReadBytes(reinterpret_cast<char*>(&v), 8)) {
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *val = (byte_order_ == ORDER_NETWORK) ? NetworkToHost64(v) : v;
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ByteBuffer::ReadString(std::string* val, size_t len) {
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!val) return false;
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (len > Length()) {
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    val->append(bytes_ + start_, len);
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    start_ += len;
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ByteBuffer::ReadBytes(char* val, size_t len) {
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (len > Length()) {
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    memcpy(val, bytes_ + start_, len);
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    start_ += len;
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid ByteBuffer::WriteUInt8(uint8 val) {
1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  WriteBytes(reinterpret_cast<const char*>(&val), 1);
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid ByteBuffer::WriteUInt16(uint16 val) {
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  uint16 v = (byte_order_ == ORDER_NETWORK) ? HostToNetwork16(val) : val;
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  WriteBytes(reinterpret_cast<const char*>(&v), 2);
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid ByteBuffer::WriteUInt24(uint32 val) {
1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  uint32 v = (byte_order_ == ORDER_NETWORK) ? HostToNetwork32(val) : val;
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  char* start = reinterpret_cast<char*>(&v);
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (byte_order_ == ORDER_NETWORK || IsHostBigEndian()) {
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ++start;
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  WriteBytes(start, 3);
1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid ByteBuffer::WriteUInt32(uint32 val) {
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  uint32 v = (byte_order_ == ORDER_NETWORK) ? HostToNetwork32(val) : val;
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  WriteBytes(reinterpret_cast<const char*>(&v), 4);
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid ByteBuffer::WriteUInt64(uint64 val) {
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  uint64 v = (byte_order_ == ORDER_NETWORK) ? HostToNetwork64(val) : val;
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  WriteBytes(reinterpret_cast<const char*>(&v), 8);
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid ByteBuffer::WriteString(const std::string& val) {
1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  WriteBytes(val.c_str(), val.size());
1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid ByteBuffer::WriteBytes(const char* val, size_t len) {
1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  memcpy(ReserveWriteBuffer(len), val, len);
1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgchar* ByteBuffer::ReserveWriteBuffer(size_t len) {
1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (Length() + len > Capacity())
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    Resize(Length() + len);
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  char* start = bytes_ + end_;
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  end_ += len;
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return start;
2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid ByteBuffer::Resize(size_t size) {
2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  size_t len = _min(end_ - start_, size);
2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (size <= size_) {
2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    // Don't reallocate, just move data backwards
2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    memmove(bytes_, bytes_ + start_, len);
2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    // Reallocate a larger buffer.
2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    size_ = _max(size, 3 * size_ / 2);
2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    char* new_bytes = new char[size_];
2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    memcpy(new_bytes, bytes_ + start_, len);
2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    delete [] bytes_;
2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    bytes_ = new_bytes;
2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  start_ = 0;
2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  end_ = len;
2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ++version_;
2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ByteBuffer::Consume(size_t size) {
2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (size > Length())
2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  start_ += size;
2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return true;
2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgByteBuffer::ReadPosition ByteBuffer::GetReadPosition() const {
2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return ReadPosition(start_, version_);
2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool ByteBuffer::SetReadPosition(const ReadPosition &position) {
2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (position.version_ != version_) {
2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  start_ = position.start_;
2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return true;
2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid ByteBuffer::Clear() {
2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  memset(bytes_, 0, size_);
2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  start_ = end_ = 0;
2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ++version_;
2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // namespace talk_base
251