1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/* 2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * 4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */ 10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/bytebuffer.h" 12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <assert.h> 14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <string.h> 15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <algorithm> 17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/basictypes.h" 19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/byteorder.h" 20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc { 22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstatic const int DEFAULT_SIZE = 4096; 24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::ByteBuffer() { 26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Construct(NULL, DEFAULT_SIZE, ORDER_NETWORK); 27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::ByteBuffer(ByteOrder byte_order) { 30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Construct(NULL, DEFAULT_SIZE, byte_order); 31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::ByteBuffer(const char* bytes, size_t len) { 34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Construct(bytes, len, ORDER_NETWORK); 35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::ByteBuffer(const char* bytes, size_t len, ByteOrder byte_order) { 38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Construct(bytes, len, byte_order); 39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::ByteBuffer(const char* bytes) { 42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Construct(bytes, strlen(bytes), ORDER_NETWORK); 43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 459478437fdea4eb31b92ffe0c10368fe5bc9b9e16Karl WibergByteBuffer::ByteBuffer(const Buffer& buf) { 469478437fdea4eb31b92ffe0c10368fe5bc9b9e16Karl Wiberg Construct(buf.data<char>(), buf.size(), ORDER_NETWORK); 479478437fdea4eb31b92ffe0c10368fe5bc9b9e16Karl Wiberg} 489478437fdea4eb31b92ffe0c10368fe5bc9b9e16Karl Wiberg 49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid ByteBuffer::Construct(const char* bytes, size_t len, 50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ByteOrder byte_order) { 51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org version_ = 0; 52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org start_ = 0; 53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org size_ = len; 54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org byte_order_ = byte_order; 55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bytes_ = new char[size_]; 56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (bytes) { 58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org end_ = len; 59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org memcpy(bytes_, bytes, end_); 60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org end_ = 0; 62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::~ByteBuffer() { 66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org delete[] bytes_; 67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 690c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool ByteBuffer::ReadUInt8(uint8_t* val) { 70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!val) return false; 71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return ReadBytes(reinterpret_cast<char*>(val), 1); 73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 750c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool ByteBuffer::ReadUInt16(uint16_t* val) { 76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!val) return false; 77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 780c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint16_t v; 79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!ReadBytes(reinterpret_cast<char*>(&v), 2)) { 80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return false; 81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *val = (byte_order_ == ORDER_NETWORK) ? NetworkToHost16(v) : v; 83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return true; 84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 870c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool ByteBuffer::ReadUInt24(uint32_t* val) { 88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!val) return false; 89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 900c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint32_t v = 0; 91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char* read_into = reinterpret_cast<char*>(&v); 92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (byte_order_ == ORDER_NETWORK || IsHostBigEndian()) { 93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ++read_into; 94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!ReadBytes(read_into, 3)) { 97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return false; 98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *val = (byte_order_ == ORDER_NETWORK) ? NetworkToHost32(v) : v; 100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return true; 101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1040c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool ByteBuffer::ReadUInt32(uint32_t* val) { 105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!val) return false; 106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1070c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint32_t v; 108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!ReadBytes(reinterpret_cast<char*>(&v), 4)) { 109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return false; 110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *val = (byte_order_ == ORDER_NETWORK) ? NetworkToHost32(v) : v; 112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return true; 113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1160c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmbool ByteBuffer::ReadUInt64(uint64_t* val) { 117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!val) return false; 118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1190c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint64_t v; 120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!ReadBytes(reinterpret_cast<char*>(&v), 8)) { 121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return false; 122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *val = (byte_order_ == ORDER_NETWORK) ? NetworkToHost64(v) : v; 124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return true; 125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool ByteBuffer::ReadString(std::string* val, size_t len) { 129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (!val) return false; 130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (len > Length()) { 132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return false; 133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org val->append(bytes_ + start_, len); 135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org start_ += len; 136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return true; 137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool ByteBuffer::ReadBytes(char* val, size_t len) { 141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (len > Length()) { 142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return false; 143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org memcpy(val, bytes_ + start_, len); 145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org start_ += len; 146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return true; 147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1500c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmvoid ByteBuffer::WriteUInt8(uint8_t val) { 151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org WriteBytes(reinterpret_cast<const char*>(&val), 1); 152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1540c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmvoid ByteBuffer::WriteUInt16(uint16_t val) { 1550c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint16_t v = (byte_order_ == ORDER_NETWORK) ? HostToNetwork16(val) : val; 156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org WriteBytes(reinterpret_cast<const char*>(&v), 2); 157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1590c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmvoid ByteBuffer::WriteUInt24(uint32_t val) { 1600c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint32_t v = (byte_order_ == ORDER_NETWORK) ? HostToNetwork32(val) : val; 161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char* start = reinterpret_cast<char*>(&v); 162f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (byte_order_ == ORDER_NETWORK || IsHostBigEndian()) { 163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ++start; 164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org WriteBytes(start, 3); 166f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1680c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmvoid ByteBuffer::WriteUInt32(uint32_t val) { 1690c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint32_t v = (byte_order_ == ORDER_NETWORK) ? HostToNetwork32(val) : val; 170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org WriteBytes(reinterpret_cast<const char*>(&v), 4); 171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 1730c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmvoid ByteBuffer::WriteUInt64(uint64_t val) { 1740c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint64_t v = (byte_order_ == ORDER_NETWORK) ? HostToNetwork64(val) : val; 175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org WriteBytes(reinterpret_cast<const char*>(&v), 8); 176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid ByteBuffer::WriteString(const std::string& val) { 179f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org WriteBytes(val.c_str(), val.size()); 180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 181f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid ByteBuffer::WriteBytes(const char* val, size_t len) { 183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org memcpy(ReserveWriteBuffer(len), val, len); 184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 186f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgchar* ByteBuffer::ReserveWriteBuffer(size_t len) { 187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (Length() + len > Capacity()) 188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Resize(Length() + len); 189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char* start = bytes_ + end_; 191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org end_ += len; 192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return start; 193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid ByteBuffer::Resize(size_t size) { 196ff689be3c0c59c1be29aaa0697aa0f762566d6c6andresp@webrtc.org size_t len = std::min(end_ - start_, size); 197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (size <= size_) { 198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Don't reallocate, just move data backwards 199f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org memmove(bytes_, bytes_ + start_, len); 200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } else { 201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Reallocate a larger buffer. 202ff689be3c0c59c1be29aaa0697aa0f762566d6c6andresp@webrtc.org size_ = std::max(size, 3 * size_ / 2); 203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char* new_bytes = new char[size_]; 204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org memcpy(new_bytes, bytes_ + start_, len); 205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org delete [] bytes_; 206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bytes_ = new_bytes; 207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org start_ = 0; 209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org end_ = len; 210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ++version_; 211f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 212f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool ByteBuffer::Consume(size_t size) { 214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (size > Length()) 215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return false; 216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org start_ += size; 217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return true; 218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgByteBuffer::ReadPosition ByteBuffer::GetReadPosition() const { 221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return ReadPosition(start_, version_); 222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 224f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool ByteBuffer::SetReadPosition(const ReadPosition &position) { 225f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (position.version_ != version_) { 226f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return false; 227f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 228f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org start_ = position.start_; 229f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return true; 230f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 231f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid ByteBuffer::Clear() { 233f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org memset(bytes_, 0, size_); 234f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org start_ = end_ = 0; 235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ++version_; 236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} 237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} // namespace rtc 239