blob: fc689757fa689bd0a92a4910848065649925e799 [file] [log] [blame]
// Copyright 2020 The Chromium 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 "components/full_restore/restore_data.h"
#include <utility>
#include "base/strings/string_number_conversions.h"
#include "base/values.h"
#include "components/full_restore/app_launch_info.h"
namespace full_restore {
RestoreData::RestoreData() = default;
RestoreData::RestoreData(std::unique_ptr<base::Value> restore_data_value) {
base::DictionaryValue* restore_data_dict = nullptr;
if (!restore_data_value || !restore_data_value->is_dict() ||
!restore_data_value->GetAsDictionary(&restore_data_dict) ||
!restore_data_dict) {
DVLOG(0) << "Fail to parse full restore data. "
<< "Cannot find the full restore data dict.";
return;
}
for (base::DictionaryValue::Iterator iter(*restore_data_dict);
!iter.IsAtEnd(); iter.Advance()) {
const std::string& app_id = iter.key();
base::Value* value = restore_data_dict->FindDictKey(app_id);
base::DictionaryValue* data_dict = nullptr;
if (!value || !value->is_dict() || !value->GetAsDictionary(&data_dict) ||
!data_dict) {
DVLOG(0) << "Fail to parse full restore data. "
<< "Cannot find the app restore data dict.";
continue;
}
for (base::DictionaryValue::Iterator data_iter(*data_dict);
!data_iter.IsAtEnd(); data_iter.Advance()) {
int id = 0;
if (!base::StringToInt(data_iter.key(), &id)) {
DVLOG(0) << "Fail to parse full restore data. "
<< "Cannot find the valid id.";
continue;
}
app_id_to_launch_list_[app_id][id] = std::make_unique<AppRestoreData>(
std::move(*data_dict->FindDictKey(data_iter.key())));
}
}
}
RestoreData::~RestoreData() = default;
std::unique_ptr<RestoreData> RestoreData::Clone() const {
std::unique_ptr<RestoreData> restore_data = std::make_unique<RestoreData>();
for (const auto& it : app_id_to_launch_list_) {
for (const auto& data_it : it.second) {
restore_data->app_id_to_launch_list_[it.first][data_it.first] =
data_it.second->Clone();
}
}
return restore_data;
}
base::Value RestoreData::ConvertToValue() const {
base::Value restore_data_dict(base::Value::Type::DICTIONARY);
for (const auto& it : app_id_to_launch_list_) {
if (it.second.empty())
continue;
base::Value info_dict(base::Value::Type::DICTIONARY);
for (const auto& data : it.second) {
info_dict.SetKey(base::NumberToString(data.first),
data.second->ConvertToValue());
}
restore_data_dict.SetKey(it.first, std::move(info_dict));
}
return restore_data_dict;
}
void RestoreData::AddAppLaunchInfo(
std::unique_ptr<AppLaunchInfo> app_launch_info) {
if (!app_launch_info || !app_launch_info->id.has_value())
return;
const std::string app_id = app_launch_info->app_id;
const int32_t id = app_launch_info->id.value();
app_id_to_launch_list_[app_id][id] =
std::make_unique<AppRestoreData>(std::move(app_launch_info));
}
} // namespace full_restore