| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "peridot/bin/sessionmgr/message_queue/persistent_queue.h" |
| |
| #include <utility> |
| |
| #include <lib/fxl/files/file.h> |
| #include <lib/fxl/logging.h> |
| |
| #include "peridot/lib/rapidjson/rapidjson.h" |
| |
| namespace modular { |
| |
| PersistentQueue::PersistentQueue(std::string file_name) |
| : file_name_(std::move(file_name)) { |
| std::string contents; |
| if (files::ReadFileToString(file_name_, &contents)) { |
| rapidjson::Document document; |
| document.Parse(contents); |
| if (!document.IsArray()) { |
| FXL_LOG(ERROR) << "Expected " << file_name_ << " to contain a JSON array"; |
| return; |
| } |
| for (rapidjson::Value::ConstValueIterator it = document.Begin(); |
| it != document.End(); ++it) { |
| if (!it->IsString()) { |
| FXL_LOG(ERROR) << "Expected a string but got: " << it; |
| continue; |
| } |
| queue_.emplace_back(it->GetString(), it->GetStringLength()); |
| } |
| } |
| } |
| |
| void PersistentQueue::Save() { |
| rapidjson::Document document; |
| document.SetArray(); |
| for (const auto& it : queue_) { |
| rapidjson::Value value; |
| value.SetString(it.data(), it.size()); |
| document.PushBack(value, document.GetAllocator()); |
| } |
| std::string contents = JsonValueToString(document); |
| if (!files::WriteFile(file_name_, contents.data(), contents.size())) { |
| FXL_LOG(ERROR) << "Failed to write to: " << file_name_; |
| } |
| } |
| |
| } // namespace modular |