blob: f1cf60ade4b0c8aafdacbdf773f6d01c54d4e197 [file] [log] [blame]
#ifndef AOS_CRIO_SHARED_LIBS_BYTE_BUFFER_H_
#define AOS_CRIO_SHARED_LIBS_BYTE_BUFFER_H_
#include <algorithm>
#include "aos/common/network/ReceiveSocket.h"
namespace aos {
class ByteBuffer {
public:
int m_size;
int m_length;
int m_i;
char *m_buffer;
bool recv_from_sock(ReceiveSocket *sock) {
m_length = sock->Recv(m_buffer, m_size, 40000);
if (m_length < 0) {
m_length = 0;
}
m_i = 0;
return m_length != 0;
}
ByteBuffer(int size) {
m_buffer = new char(size);
m_size = size;
}
~ByteBuffer() {
delete m_buffer;
}
// Reads an uint32_t into *number and returns true on success. *number is
// unmodified on failure.
bool read_uint32(uint32_t *number) {
uint32_t vals[4];
if (m_i + 4 > m_length) {
m_i = m_length;
return false;
}
for (int i = 0; i < 4; ++i) {
vals[i] = read_char();
}
*number = vals[3] + (vals[2] << 8) + (vals[1] << 16) + (vals[0] << 24);
return true;
}
float read_float() {
if (m_i + 4 <= m_length) {
float r;
memcpy(&r, &m_buffer[m_i], 4);
m_i += 4;
return r;
} else {
return 1.0 / 0.0;
}
}
int read_char() {
if (m_i < m_length) {
int val = m_buffer[m_i];
m_i ++;
return val;
} else {
return -1;
}
}
int read_string(char *buf, size_t max_len) {
int data_len = read_char();
if (data_len <= 0) {
return -1;
}
size_t to_read = std::min<size_t>(static_cast<uint8_t>(data_len), max_len);
memcpy(buf, &m_buffer[m_i], to_read);
m_i += to_read;
return 0;
}
// Returns success or not.
bool read_bytes(void *buf, size_t bytes) {
if (m_length - m_i < static_cast<ssize_t>(bytes)) return false;
memcpy(buf, &m_buffer[m_i], bytes);
m_i += bytes;
return true;
}
char *get_bytes(size_t number) {
if (m_length - m_i < static_cast<ssize_t>(number)) return NULL;
m_i += number;
return &m_buffer[m_i - number];
}
};
} // namespace aos
#endif // AOS_CRIO_SHARED_LIBS_BYTE_BUFFER_H_