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"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/api/storage/sync_value_store_cache.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/api/storage/storage_frontend.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/app_setting_specifics.pb.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/extension_setting_specifics.pb.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync.pb.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using content::BrowserThread;
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace settings_sync_util {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PopulateExtensionSettingSpecifics(
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key,
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Value& value,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::ExtensionSettingSpecifics* specifics) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  specifics->set_extension_id(extension_id);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  specifics->set_key(key);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string value_as_json;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONWriter::Write(&value, &value_as_json);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    specifics->set_value(value_as_json);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PopulateAppSettingSpecifics(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key,
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Value& value,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::AppSettingSpecifics* specifics) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PopulateExtensionSettingSpecifics(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_id, key, value, specifics->mutable_extension_setting());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncData CreateData(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key,
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Value& value,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ModelType type) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::EntitySpecifics specifics;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::EXTENSION_SETTINGS:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PopulateExtensionSettingSpecifics(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extension_id,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          key,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          value,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          specifics.mutable_extension_setting());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::APP_SETTINGS:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PopulateAppSettingSpecifics(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          extension_id,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          key,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          value,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          specifics.mutable_app_setting());
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::SyncData::CreateLocalData(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_id + "/" + key, key, specifics);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncChange CreateAdd(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key,
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Value& value,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ModelType type) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::SyncChange(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncChange::ACTION_ADD,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateData(extension_id, key, value, type));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncChange CreateUpdate(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key,
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Value& value,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ModelType type) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::SyncChange(
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncChange::ACTION_UPDATE,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateData(extension_id, key, value, type));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncChange CreateDelete(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& key,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ModelType type) {
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue no_value;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::SyncChange(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::SyncChange::ACTION_DELETE,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateData(extension_id, key, no_value, type));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)syncer::SyncableService* GetSyncableService(content::BrowserContext* context,
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            syncer::ModelType type) {
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(type == syncer::APP_SETTINGS || type == syncer::EXTENSION_SETTINGS);
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  StorageFrontend* frontend = StorageFrontend::Get(context);
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SyncValueStoreCache* sync_cache = static_cast<SyncValueStoreCache*>(
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      frontend->GetValueStoreCache(settings_namespace::SYNC));
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return sync_cache->GetSyncableService(type);
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace settings_sync_util
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
126