1 // Copyright (c) 2011 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 5 #ifndef CHROME_BROWSER_SYNC_GLUE_PREFERENCE_MODEL_ASSOCIATOR_H_ 6 #define CHROME_BROWSER_SYNC_GLUE_PREFERENCE_MODEL_ASSOCIATOR_H_ 7 #pragma once 8 9 #include <map> 10 #include <set> 11 #include <string> 12 13 #include "base/basictypes.h" 14 #include "chrome/browser/prefs/pref_service.h" 15 #include "chrome/browser/sync/glue/model_associator.h" 16 #include "chrome/browser/sync/unrecoverable_error_handler.h" 17 18 class ProfileSyncService; 19 class Value; 20 21 namespace sync_api { 22 class WriteNode; 23 class WriteTransaction; 24 } 25 26 namespace browser_sync { 27 28 class PreferenceChangeProcessor; 29 30 static const char kPreferencesTag[] = "google_chrome_preferences"; 31 32 // Contains all model association related logic: 33 // * Algorithm to associate preferences model and sync model. 34 class PreferenceModelAssociator 35 : public PerDataTypeAssociatorInterface<PrefService::Preference, 36 std::string> { 37 public: 38 static syncable::ModelType model_type() { return syncable::PREFERENCES; } 39 explicit PreferenceModelAssociator(ProfileSyncService* sync_service); 40 virtual ~PreferenceModelAssociator(); 41 42 // Returns the list of preference names that should be monitored for 43 // changes. Only preferences that are registered will be in this 44 // list. 45 const std::set<std::string>& synced_preferences() { 46 return synced_preferences_; 47 } 48 49 // Create an association for a given preference. A sync node is created if 50 // necessary and the value is read from or written to the node as appropriate. 51 bool InitPrefNodeAndAssociate(sync_api::WriteTransaction* trans, 52 const sync_api::BaseNode& root, 53 const PrefService::Preference* pref); 54 55 // PerDataTypeAssociatorInterface implementation. 56 // 57 // Iterates through the sync model looking for matched pairs of items. 58 virtual bool AssociateModels(); 59 60 // Clears all associations. 61 virtual bool DisassociateModels(); 62 63 // Returns whether the sync model has nodes other than the permanent tagged 64 // nodes. 65 virtual bool SyncModelHasUserCreatedNodes(bool* has_nodes); 66 67 virtual void AbortAssociation() { 68 // No implementation needed, this associator runs on the main 69 // thread. 70 } 71 72 // See ModelAssociator interface. 73 virtual bool CryptoReadyIfNecessary(); 74 75 // Not implemented. 76 virtual const PrefService::Preference* GetChromeNodeFromSyncId(int64 sync_id); 77 78 // Not implemented. 79 virtual bool InitSyncNodeFromChromeId(const std::string& node_id, 80 sync_api::BaseNode* sync_node); 81 82 // Returns the sync id for the given preference name, or sync_api::kInvalidId 83 // if the preference name is not associated to any sync id. 84 virtual int64 GetSyncIdFromChromeId(const std::string& node_id); 85 86 // Associates the given preference name with the given sync id. 87 virtual void Associate(const PrefService::Preference* node, int64 sync_id); 88 89 // Remove the association that corresponds to the given sync id. 90 virtual void Disassociate(int64 sync_id); 91 92 // Returns whether a node with the given permanent tag was found and update 93 // |sync_id| with that node's id. 94 virtual bool GetSyncIdForTaggedNode(const std::string& tag, int64* sync_id); 95 96 // Merges the value of local_pref into the supplied server_value and 97 // returns the result (caller takes ownership). If there is a 98 // conflict, the server value always takes precedence. Note that 99 // only certain preferences will actually be merged, all others will 100 // return a copy of the server value. See the method's 101 // implementation for details. 102 static Value* MergePreference(const PrefService::Preference& local_pref, 103 const Value& server_value); 104 105 // Writes the value of pref into the specified node. Returns true 106 // upon success. 107 static bool WritePreferenceToNode(const std::string& name, 108 const Value& value, 109 sync_api::WriteNode* node); 110 111 // Perform any additional operations that need to happen after a preference 112 // has been updated. 113 void AfterUpdateOperations(const std::string& pref_name); 114 115 private: 116 typedef std::map<std::string, int64> PreferenceNameToSyncIdMap; 117 typedef std::map<int64, std::string> SyncIdToPreferenceNameMap; 118 119 static Value* MergeListValues(const Value& from_value, const Value& to_value); 120 static Value* MergeDictionaryValues(const Value& from_value, 121 const Value& to_value); 122 123 ProfileSyncService* sync_service_; 124 std::set<std::string> synced_preferences_; 125 int64 preferences_node_id_; 126 127 PreferenceNameToSyncIdMap id_map_; 128 SyncIdToPreferenceNameMap id_map_inverse_; 129 130 DISALLOW_COPY_AND_ASSIGN(PreferenceModelAssociator); 131 }; 132 133 } // namespace browser_sync 134 135 #endif // CHROME_BROWSER_SYNC_GLUE_PREFERENCE_MODEL_ASSOCIATOR_H_ 136