Add interface to access log files

The final goal is to use it to play logs directly from memory.

Change-Id: I82349b9542fd83c92014ceec37f11a832189bdd6
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/events/logging/log_backend.cc b/aos/events/logging/log_backend.cc
index 918a6e6..ad97f7d 100644
--- a/aos/events/logging/log_backend.cc
+++ b/aos/events/logging/log_backend.cc
@@ -4,9 +4,11 @@
 
 #include <filesystem>
 
+#include "absl/strings/match.h"
 #include "absl/strings/str_cat.h"
 #include "glog/logging.h"
 
+#include "aos/events/logging/file_operations.h"
 #include "aos/util/file.h"
 
 DEFINE_bool(direct, false,
@@ -334,6 +336,31 @@
   return std::make_unique<FileHandler>(filename);
 }
 
+std::vector<std::string> FileBackend::ListFiles() const {
+  std::filesystem::path directory(base_name_);
+  if (!is_directory(directory)) {
+    directory = directory.parent_path();
+  }
+  internal::LocalFileOperations operations(directory.string());
+  std::vector<std::string> files;
+  operations.FindLogs(&files);
+
+  std::vector<std::string> names;
+  const std::string prefix = absl::StrCat(base_name_, separator_);
+  for (const auto &file : files) {
+    CHECK(absl::StartsWith(file, prefix));
+    names.push_back(file.substr(prefix.size()));
+  }
+  return names;
+}
+
+std::unique_ptr<DataDecoder> FileBackend::GetDecoder(
+    std::string_view id) const {
+  const std::string filename = absl::StrCat(base_name_, separator_, id);
+  CHECK(std::filesystem::exists(filename));
+  return std::make_unique<DummyDecoder>(filename);
+}
+
 RenamableFileBackend::RenamableFileBackend(std::string_view base_name)
     : base_name_(base_name), separator_(base_name_.back() == '/' ? "" : "_") {}