blob: b5c4902e2b77d23d759e6b9e3ee8cd864eaa709a [file] [log] [blame]
brians343bc112013-02-10 01:53:46 +00001#ifndef __CRIO_SHARED_LIBS_BYTE_BUFFER_H_
2#define __CRIO_SHARED_LIBS_BYTE_BUFFER_H_
3
4#include "aos/common/network/ReceiveSocket.h"
5#include <algorithm>
6
7namespace aos {
8
9class ByteBuffer {
10 public:
11 int m_size;
12 int m_length;
13 int m_i;
14 char *m_buffer;
15 bool recv_from_sock(ReceiveSocket *sock) {
16 m_length = sock->Recv(m_buffer, m_size, 40000);
17 if (m_length < 0) {
18 m_length = 0;
19 }
20 m_i = 0;
21 return m_length != 0;
22 }
23 ByteBuffer(int size) {
24 m_buffer = new char(size);
25 m_size = size;
26 }
27 ~ByteBuffer() {
28 delete m_buffer;
29 }
30 // Reads an uint32_t into *number and returns true on success. *number is
31 // unmodified on failure.
32 bool read_uint32(uint32_t *number) {
33 uint32_t vals[4];
34 if (m_i + 4 > m_length) {
35 m_i = m_length;
36 return false;
37 }
38 for (int i = 0; i < 4; ++i) {
39 vals[i] = read_char();
40 }
41 *number = vals[3] + (vals[2] << 8) + (vals[1] << 16) + (vals[0] << 24);
42 return true;
43 }
44 float read_float() {
45 if (m_i + 4 <= m_length) {
46 float r;
47 memcpy(&r, &m_buffer[m_i], 4);
48 m_i += 4;
49 return r;
50 } else {
51 return 1.0 / 0.0;
52 }
53 }
54 int read_char() {
55 if (m_i < m_length) {
56 int val = m_buffer[m_i];
57 m_i ++;
58 return val;
59 } else {
60 return -1;
61 }
62 }
63
64 int read_string(char *buf, size_t max_len) {
65 int data_len = read_char();
66 if (data_len <= 0) {
67 return -1;
68 }
69 size_t to_read = std::min<size_t>(static_cast<uint8_t>(data_len), max_len);
70 memcpy(buf, &m_buffer[m_i], to_read);
71 m_i += to_read;
72 return 0;
73 }
74 // Returns success or not.
75 bool read_bytes(void *buf, size_t bytes) {
76 if (m_length - m_i < static_cast<ssize_t>(bytes)) return false;
77 memcpy(buf, &m_buffer[m_i], bytes);
78 m_i += bytes;
79 return true;
80 }
81 char *get_bytes(size_t number) {
82 if (m_length - m_i < static_cast<ssize_t>(number)) return NULL;
83 m_i += number;
84 return &m_buffer[m_i - number];
85 }
86};
87
88} // namespace aos
89
90#endif
91