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