MessageBuffer: add ConsumeNextMessage()
This new method gives us the ability to read
messages out of the MessageBuffer.
Of course, include unit tests for this new
ability, as well.
Bug: 31653003
Test: ./runtests.sh (on bullhead)
Change-Id: I34476fae10e5a234330efa0d4535d92c885a2d1d
diff --git a/message_buffer.cpp b/message_buffer.cpp
index bb509ed..ccbb41f 100644
--- a/message_buffer.cpp
+++ b/message_buffer.cpp
@@ -25,7 +25,7 @@
namespace wifilogd {
MessageBuffer::MessageBuffer(size_t size)
- : data_(new uint8_t[size]), capacity_(size), write_pos_(0) {
+ : data_(new uint8_t[size]), capacity_(size), read_pos_(0), write_pos_(0) {
CHECK(size > GetHeaderSize());
}
@@ -47,6 +47,24 @@
GetFreeSize() - GetHeaderSize() >= length;
}
+std::tuple<const uint8_t*, size_t> MessageBuffer::ConsumeNextMessage() {
+ if (read_pos_ >= write_pos_) {
+ return {nullptr, 0};
+ }
+
+ LengthHeader header;
+ const uint8_t* header_start = data_.get() + read_pos_;
+ CHECK(header_start + sizeof(header) <= data_.get() + capacity_);
+ std::memcpy(&header, header_start, sizeof(header));
+ read_pos_ += sizeof(header);
+
+ const uint8_t* payload_start = data_.get() + read_pos_;
+ read_pos_ += header.payload_len;
+ CHECK(read_pos_ <= capacity_);
+
+ return {payload_start, header.payload_len};
+}
+
// Private methods below.
void MessageBuffer::AppendHeader(uint16_t message_len) {