1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/*
2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle
3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2005, Google Inc.
4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *
5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without
6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met:
7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *
8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *  1. Redistributions of source code must retain the above copyright notice,
9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     this list of conditions and the following disclaimer.
10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *  2. Redistributions in binary form must reproduce the above copyright notice,
11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     this list of conditions and the following disclaimer in the documentation
12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     and/or other materials provided with the distribution.
13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *  3. The name of the author may not be used to endorse or promote products
14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *     derived from this software without specific prior written permission.
15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *
16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */
27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/bytebuffer.h"
29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <algorithm>
31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <cassert>
32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <cstring>
33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/basictypes.h"
35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/byteorder.h"
36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace talk_base {
38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochstatic const int DEFAULT_SIZE = 4096;
40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochByteBuffer::ByteBuffer() {
42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  start_ = 0;
43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  end_   = 0;
44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  size_  = DEFAULT_SIZE;
45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  bytes_ = new char[size_];
46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochByteBuffer::ByteBuffer(const char* bytes, size_t len) {
49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  start_ = 0;
50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  end_   = len;
51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  size_  = len;
52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  bytes_ = new char[size_];
53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  memcpy(bytes_, bytes, end_);
54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochByteBuffer::ByteBuffer(const char* bytes) {
57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  start_ = 0;
58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  end_   = strlen(bytes);
59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  size_  = end_;
60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  bytes_ = new char[size_];
61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  memcpy(bytes_, bytes, end_);
62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochByteBuffer::~ByteBuffer() {
65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  delete[] bytes_;
66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool ByteBuffer::ReadUInt8(uint8* val) {
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!val) return false;
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return ReadBytes(reinterpret_cast<char*>(val), 1);
72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool ByteBuffer::ReadUInt16(uint16* val) {
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!val) return false;
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  uint16 v;
78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  if (!ReadBytes(reinterpret_cast<char*>(&v), 2)) {
79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return false;
80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  } else {
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    *val = NetworkToHost16(v);
82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return true;
83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool ByteBuffer::ReadUInt24(uint32* val) {
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!val) return false;
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  uint32 v = 0;
90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  if (!ReadBytes(reinterpret_cast<char*>(&v) + 1, 3)) {
91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return false;
92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  } else {
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    *val = NetworkToHost32(v);
94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return true;
95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool ByteBuffer::ReadUInt32(uint32* val) {
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!val) return false;
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  uint32 v;
102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  if (!ReadBytes(reinterpret_cast<char*>(&v), 4)) {
103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return false;
104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  } else {
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    *val = NetworkToHost32(v);
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return true;
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool ByteBuffer::ReadUInt64(uint64* val) {
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!val) return false;
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  uint64 v;
1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!ReadBytes(reinterpret_cast<char*>(&v), 8)) {
1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return false;
1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    *val = NetworkToHost64(v);
118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return true;
119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool ByteBuffer::ReadString(std::string* val, size_t len) {
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!val) return false;
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  if (len > Length()) {
126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return false;
127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  } else {
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    val->append(bytes_ + start_, len);
129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    start_ += len;
130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return true;
131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochbool ByteBuffer::ReadBytes(char* val, size_t len) {
135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  if (len > Length()) {
136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return false;
137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  } else {
138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    memcpy(val, bytes_ + start_, len);
139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    start_ += len;
140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return true;
141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  }
142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid ByteBuffer::WriteUInt8(uint8 val) {
145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  WriteBytes(reinterpret_cast<const char*>(&val), 1);
146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
148f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid ByteBuffer::WriteUInt16(uint16 val) {
149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  uint16 v = HostToNetwork16(val);
150f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  WriteBytes(reinterpret_cast<const char*>(&v), 2);
151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid ByteBuffer::WriteUInt24(uint32 val) {
154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  uint32 v = HostToNetwork32(val);
155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  WriteBytes(reinterpret_cast<const char*>(&v) + 1, 3);
156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid ByteBuffer::WriteUInt32(uint32 val) {
159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  uint32 v = HostToNetwork32(val);
160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  WriteBytes(reinterpret_cast<const char*>(&v), 4);
161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ByteBuffer::WriteUInt64(uint64 val) {
1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  uint64 v = HostToNetwork64(val);
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  WriteBytes(reinterpret_cast<const char*>(&v), 8);
1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid ByteBuffer::WriteString(const std::string& val) {
169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  WriteBytes(val.c_str(), val.size());
170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid ByteBuffer::WriteBytes(const char* val, size_t len) {
173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  if (Length() + len > Capacity())
174f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    Resize(Length() + len);
175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  memcpy(bytes_ + end_, val, len);
177f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  end_ += len;
178f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
179f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
180f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid ByteBuffer::Resize(size_t size) {
181f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  if (size > size_)
182f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    size = _max(size, 3 * size_ / 2);
183f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
184f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  size_t len = _min(end_ - start_, size);
185f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  char* new_bytes = new char[size];
186f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  memcpy(new_bytes, bytes_ + start_, len);
187f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  delete [] bytes_;
188f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
189f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  start_ = 0;
190f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  end_   = len;
191f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  size_  = size;
192f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  bytes_ = new_bytes;
193f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
194f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
195f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid ByteBuffer::Consume(size_t size) {
196f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  if (size > Length())
197f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return;
198f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
199f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  start_ += size;
200f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
201f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
202f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid ByteBuffer::Shift(size_t size) {
203f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  if (size > Length())
204f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch    return;
205f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
206f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  end_ = Length() - size;
207f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  memmove(bytes_, bytes_ + start_ + size, end_);
208f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch  start_ = 0;
209f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}
210f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace talk_base
212