desk_model.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 "components/desks_storage/core/desk_model.h"
  5. #include "ash/public/cpp/desk_template.h"
  6. #include "base/guid.h"
  7. #include "base/json/json_reader.h"
  8. #include "base/json/json_writer.h"
  9. #include "base/logging.h"
  10. #include "components/desks_storage/core/desk_model_observer.h"
  11. #include "components/desks_storage/core/desk_template_conversion.h"
  12. #include "third_party/abseil-cpp/absl/types/optional.h"
  13. namespace desks_storage {
  14. namespace {
  15. DeskModel::GetTemplateJsonStatus ConvertGetEntryStatusToTemplateJsonStatus(
  16. const DeskModel::GetEntryByUuidStatus status) {
  17. switch (status) {
  18. case DeskModel::GetEntryByUuidStatus::kOk:
  19. return DeskModel::GetTemplateJsonStatus::kOk;
  20. case DeskModel::GetEntryByUuidStatus::kFailure:
  21. return DeskModel::GetTemplateJsonStatus::kFailure;
  22. case DeskModel::GetEntryByUuidStatus::kNotFound:
  23. return DeskModel::GetTemplateJsonStatus::kNotFound;
  24. case DeskModel::GetEntryByUuidStatus::kInvalidUuid:
  25. return DeskModel::GetTemplateJsonStatus::kInvalidUuid;
  26. }
  27. }
  28. } // namespace
  29. DeskModel::DeskModel() = default;
  30. DeskModel::~DeskModel() {
  31. for (DeskModelObserver& observer : observers_)
  32. observer.OnDeskModelDestroying();
  33. }
  34. DeskModel::GetAllEntriesResult::GetAllEntriesResult(
  35. GetAllEntriesStatus status,
  36. std::vector<const ash::DeskTemplate*> entries)
  37. : status(status), entries(std::move(entries)) {}
  38. DeskModel::GetAllEntriesResult::~GetAllEntriesResult() = default;
  39. void DeskModel::AddObserver(DeskModelObserver* observer) {
  40. DCHECK(observer);
  41. observers_.AddObserver(observer);
  42. }
  43. void DeskModel::RemoveObserver(DeskModelObserver* observer) {
  44. observers_.RemoveObserver(observer);
  45. }
  46. void DeskModel::GetTemplateJson(const std::string& uuid,
  47. apps::AppRegistryCache* app_cache,
  48. GetTemplateJsonCallback callback) {
  49. GetEntryByUUID(
  50. uuid,
  51. base::BindOnce(&DeskModel::HandleTemplateConversionToPolicyJson,
  52. base::Unretained(this), std::move(callback), app_cache));
  53. }
  54. void DeskModel::SetPolicyDeskTemplates(const std::string& policy_json) {
  55. policy_entries_.clear();
  56. base::StringPiece raw_json = base::StringPiece(policy_json);
  57. auto parsed_list = base::JSONReader::ReadAndReturnValueWithError(raw_json);
  58. if (!parsed_list.has_value())
  59. return;
  60. if (!parsed_list->is_list()) {
  61. LOG(WARNING) << "Expected JSON list in admin templates policy.";
  62. return;
  63. }
  64. for (auto& desk_template : parsed_list->GetListDeprecated()) {
  65. std::unique_ptr<ash::DeskTemplate> dt =
  66. desk_template_conversion::ParseDeskTemplateFromSource(
  67. desk_template, ash::DeskTemplateSource::kPolicy);
  68. if (dt) {
  69. policy_entries_.push_back(std::move(dt));
  70. } else {
  71. LOG(WARNING) << "Failed to parse admin template from JSON: "
  72. << desk_template;
  73. }
  74. }
  75. }
  76. void DeskModel::RemovePolicyDeskTemplates() {
  77. policy_entries_.clear();
  78. }
  79. std::unique_ptr<ash::DeskTemplate> DeskModel::GetAdminDeskTemplateByUUID(
  80. const std::string& uuid_str) const {
  81. const base::GUID uuid = base::GUID::ParseCaseInsensitive(uuid_str);
  82. for (const std::unique_ptr<ash::DeskTemplate>& policy_entry :
  83. policy_entries_) {
  84. if (policy_entry->uuid() == uuid)
  85. return policy_entry->Clone();
  86. }
  87. return nullptr;
  88. }
  89. void DeskModel::HandleTemplateConversionToPolicyJson(
  90. GetTemplateJsonCallback callback,
  91. apps::AppRegistryCache* app_cache,
  92. GetEntryByUuidStatus status,
  93. std::unique_ptr<ash::DeskTemplate> entry) {
  94. if (status != GetEntryByUuidStatus::kOk) {
  95. std::move(callback).Run(ConvertGetEntryStatusToTemplateJsonStatus(status),
  96. "");
  97. return;
  98. }
  99. std::string raw_json;
  100. base::Value template_list(base::Value::Type::LIST);
  101. template_list.Append(desk_template_conversion::SerializeDeskTemplateAsPolicy(
  102. entry.get(), app_cache));
  103. const bool conversion_success =
  104. base::JSONWriter::Write(template_list, &raw_json);
  105. if (conversion_success)
  106. std::move(callback).Run(GetTemplateJsonStatus::kOk, raw_json);
  107. else
  108. std::move(callback).Run(GetTemplateJsonStatus::kFailure, "");
  109. }
  110. } // namespace desks_storage