settings_sync_util.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/storage/settings_sync_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/app_setting_specifics.pb.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/extension_setting_specifics.pb.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync.pb.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace settings_sync_util {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PopulateExtensionSettingSpecifics(
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Value& value,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::ExtensionSettingSpecifics* specifics) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  specifics->set_extension_id(extension_id);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  specifics->set_key(key);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string value_as_json;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONWriter::Write(&value, &value_as_json);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    specifics->set_value(value_as_json);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PopulateAppSettingSpecifics(
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Value& value,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::AppSettingSpecifics* specifics) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PopulateExtensionSettingSpecifics(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_id, key, value, specifics->mutable_extension_setting());
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncData CreateData(
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Value& value,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ModelType type) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::EntitySpecifics specifics;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::EXTENSION_SETTINGS:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PopulateExtensionSettingSpecifics(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extension_id,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          key,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          value,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          specifics.mutable_extension_setting());
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::APP_SETTINGS:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PopulateAppSettingSpecifics(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extension_id,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          key,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          value,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          specifics.mutable_app_setting());
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::SyncData::CreateLocalData(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_id + "/" + key, key, specifics);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncChange CreateAdd(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Value& value,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ModelType type) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::SyncChange(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncChange::ACTION_ADD,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateData(extension_id, key, value, type));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncChange CreateUpdate(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Value& value,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ModelType type) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::SyncChange(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncChange::ACTION_UPDATE,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateData(extension_id, key, value, type));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncChange CreateDelete(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ModelType type) {
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue no_value;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::SyncChange(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncChange::ACTION_DELETE,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateData(extension_id, key, no_value, type));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace settings_sync_util
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
111