// Copyright (c) 2011 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.
#ifndef CHROME_BROWSER_SYNC_GLUE_PREFERENCE_MODEL_ASSOCIATOR_H_
#define CHROME_BROWSER_SYNC_GLUE_PREFERENCE_MODEL_ASSOCIATOR_H_
#pragma once
#include <map>
#include <set>
#include <string>
#include "base/basictypes.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/sync/glue/model_associator.h"
#include "chrome/browser/sync/unrecoverable_error_handler.h"
class ProfileSyncService;
class Value;
namespace sync_api {
class WriteNode;
class WriteTransaction;
}
namespace browser_sync {
class PreferenceChangeProcessor;
static const char kPreferencesTag[] = "google_chrome_preferences";
// Contains all model association related logic:
// * Algorithm to associate preferences model and sync model.
class PreferenceModelAssociator
: public PerDataTypeAssociatorInterface<PrefService::Preference,
std::string> {
public:
static syncable::ModelType model_type() { return syncable::PREFERENCES; }
explicit PreferenceModelAssociator(ProfileSyncService* sync_service);
virtual ~PreferenceModelAssociator();
// Returns the list of preference names that should be monitored for
// changes. Only preferences that are registered will be in this
// list.
const std::set<std::string>& synced_preferences() {
return synced_preferences_;
}
// Create an association for a given preference. A sync node is created if
// necessary and the value is read from or written to the node as appropriate.
bool InitPrefNodeAndAssociate(sync_api::WriteTransaction* trans,
const sync_api::BaseNode& root,
const PrefService::Preference* pref);
// PerDataTypeAssociatorInterface implementation.
//
// Iterates through the sync model looking for matched pairs of items.
virtual bool AssociateModels();
// Clears all associations.
virtual bool DisassociateModels();
// Returns whether the sync model has nodes other than the permanent tagged
// nodes.
virtual bool SyncModelHasUserCreatedNodes(bool* has_nodes);
virtual void AbortAssociation() {
// No implementation needed, this associator runs on the main
// thread.
}
// See ModelAssociator interface.
virtual bool CryptoReadyIfNecessary();
// Not implemented.
virtual const PrefService::Preference* GetChromeNodeFromSyncId(int64 sync_id);
// Not implemented.
virtual bool InitSyncNodeFromChromeId(const std::string& node_id,
sync_api::BaseNode* sync_node);
// Returns the sync id for the given preference name, or sync_api::kInvalidId
// if the preference name is not associated to any sync id.
virtual int64 GetSyncIdFromChromeId(const std::string& node_id);
// Associates the given preference name with the given sync id.
virtual void Associate(const PrefService::Preference* node, int64 sync_id);
// Remove the association that corresponds to the given sync id.
virtual void Disassociate(int64 sync_id);
// Returns whether a node with the given permanent tag was found and update
// |sync_id| with that node's id.
virtual bool GetSyncIdForTaggedNode(const std::string& tag, int64* sync_id);
// Merges the value of local_pref into the supplied server_value and
// returns the result (caller takes ownership). If there is a
// conflict, the server value always takes precedence. Note that
// only certain preferences will actually be merged, all others will
// return a copy of the server value. See the method's
// implementation for details.
static Value* MergePreference(const PrefService::Preference& local_pref,
const Value& server_value);
// Writes the value of pref into the specified node. Returns true
// upon success.
static bool WritePreferenceToNode(const std::string& name,
const Value& value,
sync_api::WriteNode* node);
// Perform any additional operations that need to happen after a preference
// has been updated.
void AfterUpdateOperations(const std::string& pref_name);
private:
typedef std::map<std::string, int64> PreferenceNameToSyncIdMap;
typedef std::map<int64, std::string> SyncIdToPreferenceNameMap;
static Value* MergeListValues(const Value& from_value, const Value& to_value);
static Value* MergeDictionaryValues(const Value& from_value,
const Value& to_value);
ProfileSyncService* sync_service_;
std::set<std::string> synced_preferences_;
int64 preferences_node_id_;
PreferenceNameToSyncIdMap id_map_;
SyncIdToPreferenceNameMap id_map_inverse_;
DISALLOW_COPY_AND_ASSIGN(PreferenceModelAssociator);
};
} // namespace browser_sync
#endif // CHROME_BROWSER_SYNC_GLUE_PREFERENCE_MODEL_ASSOCIATOR_H_