aboutsummaryrefslogtreecommitdiff
path: root/pw_persistent_ram/public
diff options
context:
space:
mode:
Diffstat (limited to 'pw_persistent_ram/public')
-rw-r--r--pw_persistent_ram/public/pw_persistent_ram/flat_file_system_entry.h73
-rw-r--r--pw_persistent_ram/public/pw_persistent_ram/persistent.h2
2 files changed, 74 insertions, 1 deletions
diff --git a/pw_persistent_ram/public/pw_persistent_ram/flat_file_system_entry.h b/pw_persistent_ram/public/pw_persistent_ram/flat_file_system_entry.h
new file mode 100644
index 000000000..4d0e04019
--- /dev/null
+++ b/pw_persistent_ram/public/pw_persistent_ram/flat_file_system_entry.h
@@ -0,0 +1,73 @@
+// Copyright 2023 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+#pragma once
+
+#include "pw_file/flat_file_system.h"
+#include "pw_persistent_ram/persistent_buffer.h"
+
+namespace pw::persistent_ram {
+
+template <size_t kMaxSizeBytes>
+class FlatFileSystemPersistentBufferEntry final
+ : public file::FlatFileSystemService::Entry {
+ public:
+ FlatFileSystemPersistentBufferEntry(
+ std::string_view file_name,
+ file::FlatFileSystemService::Entry::Id file_id,
+ file::FlatFileSystemService::Entry::FilePermissions permissions,
+ PersistentBuffer<kMaxSizeBytes>& persistent_buffer)
+ : file_name_(file_name),
+ file_id_(file_id),
+ permissions_(permissions),
+ persistent_buffer_(persistent_buffer) {}
+
+ StatusWithSize Name(span<char> dest) final {
+ if (file_name_.empty() || !persistent_buffer_.has_value()) {
+ return StatusWithSize(Status::NotFound(), 0);
+ }
+
+ size_t bytes_to_copy = std::min(dest.size_bytes(), file_name_.size());
+ std::memcpy(dest.data(), file_name_.data(), bytes_to_copy);
+ if (bytes_to_copy != file_name_.size()) {
+ return StatusWithSize(Status::ResourceExhausted(), bytes_to_copy);
+ }
+
+ return StatusWithSize(OkStatus(), bytes_to_copy);
+ }
+
+ size_t SizeBytes() final { return persistent_buffer_.size(); }
+
+ Status Delete() final {
+ persistent_buffer_.clear();
+ return pw::OkStatus();
+ }
+
+ file::FlatFileSystemService::Entry::FilePermissions Permissions()
+ const final {
+ return permissions_;
+ }
+
+ file::FlatFileSystemService::Entry::Id FileId() const final {
+ return file_id_;
+ }
+
+ private:
+ const std::string_view file_name_;
+ const file::FlatFileSystemService::Entry::Id file_id_;
+ const file::FlatFileSystemService::Entry::FilePermissions permissions_;
+ PersistentBuffer<kMaxSizeBytes>& persistent_buffer_;
+};
+
+} // namespace pw::persistent_ram
diff --git a/pw_persistent_ram/public/pw_persistent_ram/persistent.h b/pw_persistent_ram/public/pw_persistent_ram/persistent.h
index eb8e5a76e..553f6923f 100644
--- a/pw_persistent_ram/public/pw_persistent_ram/persistent.h
+++ b/pw_persistent_ram/public/pw_persistent_ram/persistent.h
@@ -48,7 +48,7 @@ PW_MODIFY_DIAGNOSTIC_GCC(ignored, "-Wmaybe-uninitialized");
// WARNING: Unlike a DoubleBufferedPersistent, a Persistent will be lost if a
// write/set operation is interrupted or otherwise not completed.
//
-// TODO(b/235277454): Consider a different integrity check implementation which
+// TODO: b/235277454 - Consider a different integrity check implementation which
// does not use a 512B lookup table.
template <typename T>
class Persistent {