blob: 5c1d4b2950e3c61dd8a0a2228a4e2a3e582a50dc [file] [log] [blame]
Brian Silvermanf51499a2020-09-21 12:49:08 -07001#include "aos/events/logging/buffer_encoder.h"
2
3#include <fcntl.h>
4#include <sys/stat.h>
5#include <sys/types.h>
6
Austin Schuh48d10d62022-10-16 22:19:23 -07007#include "aos/flatbuffers.h"
Brian Silvermanf51499a2020-09-21 12:49:08 -07008#include "glog/logging.h"
9
10namespace aos::logger {
11
Austin Schuh8bdfc492023-02-11 12:53:13 -080012DummyEncoder::DummyEncoder(size_t /*max_message_size*/, size_t buffer_size) {
Austin Schuh48d10d62022-10-16 22:19:23 -070013 // Round up to the nearest page size.
Austin Schuh8bdfc492023-02-11 12:53:13 -080014 input_buffer_.reserve(buffer_size);
Austin Schuh48d10d62022-10-16 22:19:23 -070015 return_queue_.resize(1);
16}
Brian Silvermanf51499a2020-09-21 12:49:08 -070017
Austin Schuh8bdfc492023-02-11 12:53:13 -080018size_t DummyEncoder::space() const {
19 return input_buffer_.capacity() - input_buffer_.size();
Austin Schuh48d10d62022-10-16 22:19:23 -070020}
21
Austin Schuh8bdfc492023-02-11 12:53:13 -080022bool DummyEncoder::HasSpace(size_t request) const { return request <= space(); }
23
24size_t DummyEncoder::Encode(Copier *copy, size_t start_byte) {
Austin Schuh48d10d62022-10-16 22:19:23 -070025 const size_t input_buffer_initial_size = input_buffer_.size();
26
Austin Schuh8bdfc492023-02-11 12:53:13 -080027 size_t expected_write_size =
28 std::min(input_buffer_.capacity() - input_buffer_initial_size,
29 copy->size() - start_byte);
30 input_buffer_.resize(input_buffer_initial_size + expected_write_size);
31 const size_t written_size =
32 copy->Copy(input_buffer_.data() + input_buffer_initial_size, start_byte,
33 expected_write_size + start_byte);
Austin Schuh48d10d62022-10-16 22:19:23 -070034
35 total_bytes_ += written_size;
Austin Schuh8bdfc492023-02-11 12:53:13 -080036
37 return written_size;
Brian Silvermanf51499a2020-09-21 12:49:08 -070038}
39
40void DummyEncoder::Clear(const int n) {
41 CHECK_GE(n, 0);
42 CHECK_LE(static_cast<size_t>(n), queue_size());
Austin Schuh48d10d62022-10-16 22:19:23 -070043 if (n != 0) {
44 input_buffer_.resize(0u);
45 }
Brian Silvermanf51499a2020-09-21 12:49:08 -070046}
47
Austin Schuh48d10d62022-10-16 22:19:23 -070048absl::Span<const absl::Span<const uint8_t>> DummyEncoder::queue() {
49 if (input_buffer_.size() != 0) {
50 return_queue_[0] =
51 absl::Span<const uint8_t>(input_buffer_.data(), input_buffer_.size());
52 return return_queue_;
53 } else {
54 return absl::Span<const absl::Span<const uint8_t>>();
Brian Silvermanf51499a2020-09-21 12:49:08 -070055 }
Brian Silvermanf51499a2020-09-21 12:49:08 -070056}
57
Austin Schuh48d10d62022-10-16 22:19:23 -070058size_t DummyEncoder::queued_bytes() const { return input_buffer_.size(); }
Brian Silvermanf51499a2020-09-21 12:49:08 -070059
60DummyDecoder::DummyDecoder(std::string_view filename)
Tyler Chatow2015bc62021-08-04 21:15:09 -070061 : filename_(filename), fd_(open(filename_.c_str(), O_RDONLY | O_CLOEXEC)) {
Brian Silvermanf51499a2020-09-21 12:49:08 -070062 PCHECK(fd_ != -1) << ": Failed to open " << filename;
63}
64
65DummyDecoder::~DummyDecoder() {
66 int status = close(fd_);
67 if (status != 0) {
68 PLOG(ERROR) << "DummyDecoder: Failed to close file";
69 }
70}
71
72size_t DummyDecoder::Read(uint8_t *begin, uint8_t *end) {
73 if (end_of_file_) {
74 return 0;
75 }
76 const ssize_t count = read(fd_, begin, end - begin);
77 PCHECK(count >= 0) << ": Failed to read from file";
78 if (count == 0) {
79 end_of_file_ = true;
80 }
81 return static_cast<size_t>(count);
82}
83
84} // namespace aos::logger