file_host_settings.cc 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "remoting/base/file_host_settings.h"
  5. #include "base/files/file_util.h"
  6. #include "base/files/important_file_writer.h"
  7. #include "base/json/json_file_value_serializer.h"
  8. #include "base/json/json_string_value_serializer.h"
  9. #include "base/logging.h"
  10. #include "base/threading/sequenced_task_runner_handle.h"
  11. #include "base/values.h"
  12. #include "remoting/base/logging.h"
  13. namespace remoting {
  14. FileHostSettings::FileHostSettings(const base::FilePath& settings_file)
  15. : settings_file_(settings_file) {}
  16. FileHostSettings::~FileHostSettings() = default;
  17. void FileHostSettings::InitializeInstance() {
  18. // TODO(yuweih): Make FileHostSettings detect changes of the settings file.
  19. if (settings_) {
  20. return;
  21. }
  22. if (!base::PathIsReadable(settings_file_)) {
  23. HOST_LOG << "Host settings file " << settings_file_ << " does not exist.";
  24. return;
  25. }
  26. JSONFileValueDeserializer deserializer(settings_file_);
  27. int error_code;
  28. std::string error_message;
  29. settings_ = deserializer.Deserialize(&error_code, &error_message);
  30. if (!settings_) {
  31. LOG(WARNING) << "Failed to load " << settings_file_
  32. << ". Code: " << error_code << ", message: " << error_message;
  33. return;
  34. }
  35. HOST_LOG << "Host settings loaded.";
  36. }
  37. std::string FileHostSettings::GetString(
  38. const HostSettingKey key,
  39. const std::string& default_value) const {
  40. #if !defined(NDEBUG)
  41. if (task_runner_for_checking_sequence_) {
  42. DCHECK(task_runner_for_checking_sequence_->RunsTasksInCurrentSequence());
  43. }
  44. #endif
  45. if (!settings_) {
  46. VLOG(1) << "Either Initialize() has not been called, or the settings file "
  47. "doesn't exist.";
  48. return default_value;
  49. }
  50. std::string* string_value = settings_->FindStringKey(key);
  51. if (!string_value) {
  52. return default_value;
  53. }
  54. return *string_value;
  55. }
  56. void FileHostSettings::SetString(const HostSettingKey key,
  57. const std::string& value) {
  58. #if !defined(NDEBUG)
  59. if (task_runner_for_checking_sequence_) {
  60. DCHECK(task_runner_for_checking_sequence_->RunsTasksInCurrentSequence());
  61. } else {
  62. task_runner_for_checking_sequence_ = base::SequencedTaskRunnerHandle::Get();
  63. }
  64. #endif
  65. if (!settings_) {
  66. VLOG(1) << "Settings file didn't exist. New file will be created.";
  67. settings_ = std::make_unique<base::Value>(base::Value::Type::DICTIONARY);
  68. }
  69. settings_->SetStringKey(key, value);
  70. std::string json;
  71. JSONStringValueSerializer serializer(&json);
  72. if (!serializer.Serialize(*settings_)) {
  73. LOG(ERROR) << "Failed to serialize host settings JSON";
  74. return;
  75. }
  76. if (!base::ImportantFileWriter::WriteFileAtomically(settings_file_, json)) {
  77. LOG(ERROR) << "Can't write host settings file to " << settings_file_;
  78. }
  79. }
  80. } // namespace remoting