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