1/*
2 * libjingle
3 * Copyright 2004--2005, Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 *  1. Redistributions of source code must retain the above copyright notice,
9 *     this list of conditions and the following disclaimer.
10 *  2. Redistributions in binary form must reproduce the above copyright notice,
11 *     this list of conditions and the following disclaimer in the documentation
12 *     and/or other materials provided with the distribution.
13 *  3. The name of the author may not be used to endorse or promote products
14 *     derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#ifndef TALK_BASE_BYTEBUFFER_H_
29#define TALK_BASE_BYTEBUFFER_H_
30
31#include <string>
32
33#include "talk/base/basictypes.h"
34#include "talk/base/constructormagic.h"
35
36namespace talk_base {
37
38class ByteBuffer {
39 public:
40  ByteBuffer();
41  ByteBuffer(const char* bytes, size_t len);
42  explicit ByteBuffer(const char* bytes);  // uses strlen
43  ~ByteBuffer();
44
45  const char* Data() const { return bytes_ + start_; }
46  size_t Length() const { return end_ - start_; }
47  size_t Capacity() const { return size_ - start_; }
48
49  bool ReadUInt8(uint8* val);
50  bool ReadUInt16(uint16* val);
51  bool ReadUInt24(uint32* val);
52  bool ReadUInt32(uint32* val);
53  bool ReadUInt64(uint64* val);
54  bool ReadString(std::string* val, size_t len);  // append to val
55  bool ReadBytes(char* val, size_t len);
56
57  void WriteUInt8(uint8 val);
58  void WriteUInt16(uint16 val);
59  void WriteUInt24(uint32 val);
60  void WriteUInt32(uint32 val);
61  void WriteUInt64(uint64 val);
62  void WriteString(const std::string& val);
63  void WriteBytes(const char* val, size_t len);
64
65  void Resize(size_t size);
66  void Consume(size_t size);
67  void Shift(size_t size);
68
69 private:
70  char* bytes_;
71  size_t size_;
72  size_t start_;
73  size_t end_;
74
75  // There are sensible ways to define these, but they aren't needed in our code
76  // base.
77  DISALLOW_COPY_AND_ASSIGN(ByteBuffer);
78};
79
80}  // namespace talk_base
81
82#endif  // TALK_BASE_BYTEBUFFER_H_
83