Add PeekMessage/ConsumeMessage to SpanReader

We have log files with duplicate headers on the front of them.
Considering they have useful data, add a flag which enables support for
detecting and recovering.

Change-Id: I30a85c7023b71dfa8ecce63fb8288565d5a01737
Signed-off-by: Austin Schuh <austin.schuh@bluerivertech.com>
diff --git a/aos/events/logging/logfile_utils.cc b/aos/events/logging/logfile_utils.cc
index f008ac6..f32b337 100644
--- a/aos/events/logging/logfile_utils.cc
+++ b/aos/events/logging/logfile_utils.cc
@@ -325,7 +325,7 @@
   }
 }
 
-absl::Span<const uint8_t> SpanReader::ReadMessage() {
+absl::Span<const uint8_t> SpanReader::PeekMessage() {
   // Make sure we have enough for the size.
   if (data_.size() - consumed_data_ < sizeof(flatbuffers::uoffset_t)) {
     if (!ReadBlock()) {
@@ -355,11 +355,23 @@
   // And return it, consuming the data.
   const uint8_t *data_ptr = data_.data() + consumed_data_;
 
-  consumed_data_ += data_size;
-
   return absl::Span<const uint8_t>(data_ptr, data_size);
 }
 
+void SpanReader::ConsumeMessage() {
+  consumed_data_ +=
+      flatbuffers::GetPrefixedSize(data_.data() + consumed_data_) +
+      sizeof(flatbuffers::uoffset_t);
+}
+
+absl::Span<const uint8_t> SpanReader::ReadMessage() {
+  absl::Span<const uint8_t> result = PeekMessage();
+  if (result != absl::Span<const uint8_t>()) {
+    ConsumeMessage();
+  }
+  return result;
+}
+
 bool SpanReader::ReadBlock() {
   // This is the amount of data we grab at a time. Doing larger chunks minimizes
   // syscalls and helps decompressors batch things more efficiently.