| OLD | NEW |
| 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync/glue/preference_change_processor.h" | 5 #include "chrome/browser/sync/glue/preference_change_processor.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 | 54 |
| 55 // Do not pollute sync data with values coming from policy. | 55 // Do not pollute sync data with values coming from policy. |
| 56 if (preference->IsManaged()) | 56 if (preference->IsManaged()) |
| 57 return; | 57 return; |
| 58 | 58 |
| 59 sync_api::WriteTransaction trans(share_handle()); | 59 sync_api::WriteTransaction trans(share_handle()); |
| 60 sync_api::WriteNode node(&trans); | 60 sync_api::WriteNode node(&trans); |
| 61 | 61 |
| 62 int64 sync_id = model_associator_->GetSyncIdFromChromeId(*name); | 62 int64 sync_id = model_associator_->GetSyncIdFromChromeId(*name); |
| 63 if (sync_api::kInvalidId == sync_id) { | 63 if (sync_api::kInvalidId == sync_id) { |
| 64 LOG(ERROR) << "Unexpected notification for: " << *name; | 64 std::wstring err = L"Unexpected notification for: " + *name; |
| 65 error_handler()->OnUnrecoverableError(); | 65 error_handler()->OnUnrecoverableError(FROM_HERE, WideToUTF8(err)); |
| 66 return; | 66 return; |
| 67 } else { | 67 } else { |
| 68 if (!node.InitByIdLookup(sync_id)) { | 68 if (!node.InitByIdLookup(sync_id)) { |
| 69 LOG(ERROR) << "Preference node lookup failed."; | 69 error_handler()->OnUnrecoverableError(FROM_HERE, |
| 70 error_handler()->OnUnrecoverableError(); | 70 "Preference node lookup failed."); |
| 71 return; | 71 return; |
| 72 } | 72 } |
| 73 } | 73 } |
| 74 | 74 |
| 75 if (!WritePreference(&node, *name, preference->GetValue())) { | 75 if (!WritePreference(&node, *name, preference->GetValue())) { |
| 76 LOG(ERROR) << "Failed to update preference node."; | 76 error_handler()->OnUnrecoverableError(FROM_HERE, |
| 77 error_handler()->OnUnrecoverableError(); | 77 "Failed to update preference node."); |
| 78 return; | 78 return; |
| 79 } | 79 } |
| 80 } | 80 } |
| 81 | 81 |
| 82 void PreferenceChangeProcessor::ApplyChangesFromSyncModel( | 82 void PreferenceChangeProcessor::ApplyChangesFromSyncModel( |
| 83 const sync_api::BaseTransaction* trans, | 83 const sync_api::BaseTransaction* trans, |
| 84 const sync_api::SyncManager::ChangeRecord* changes, | 84 const sync_api::SyncManager::ChangeRecord* changes, |
| 85 int change_count) { | 85 int change_count) { |
| 86 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); | 86 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
| 87 if (!running()) | 87 if (!running()) |
| 88 return; | 88 return; |
| 89 StopObserving(); | 89 StopObserving(); |
| 90 | 90 |
| 91 for (int i = 0; i < change_count; ++i) { | 91 for (int i = 0; i < change_count; ++i) { |
| 92 sync_api::ReadNode node(trans); | 92 sync_api::ReadNode node(trans); |
| 93 // TODO(ncarter): Can't look up the name for deletions: lookup of | 93 // TODO(ncarter): Can't look up the name for deletions: lookup of |
| 94 // deleted items fails at the syncapi layer. However, the node should | 94 // deleted items fails at the syncapi layer. However, the node should |
| 95 // generally still exist in the syncable database; we just need to | 95 // generally still exist in the syncable database; we just need to |
| 96 // plumb the syncapi so that it succeeds. | 96 // plumb the syncapi so that it succeeds. |
| 97 if (sync_api::SyncManager::ChangeRecord::ACTION_DELETE == | 97 if (sync_api::SyncManager::ChangeRecord::ACTION_DELETE == |
| 98 changes[i].action) { | 98 changes[i].action) { |
| 99 // Until the above is fixed, we have no choice but to ignore deletions. | 99 // Until the above is fixed, we have no choice but to ignore deletions. |
| 100 LOG(ERROR) << "No way to handle pref deletion"; | 100 LOG(ERROR) << "No way to handle pref deletion"; |
| 101 continue; | 101 continue; |
| 102 } | 102 } |
| 103 | 103 |
| 104 if (!node.InitByIdLookup(changes[i].id)) { | 104 if (!node.InitByIdLookup(changes[i].id)) { |
| 105 LOG(ERROR) << "Preference node lookup failed."; | 105 error_handler()->OnUnrecoverableError(FROM_HERE, |
| 106 error_handler()->OnUnrecoverableError(); | 106 "Preference node lookup failed."); |
| 107 return; | 107 return; |
| 108 } | 108 } |
| 109 DCHECK(syncable::PREFERENCES == node.GetModelType()); | 109 DCHECK(syncable::PREFERENCES == node.GetModelType()); |
| 110 | 110 |
| 111 std::wstring name; | 111 std::wstring name; |
| 112 scoped_ptr<Value> value(ReadPreference(&node, &name)); | 112 scoped_ptr<Value> value(ReadPreference(&node, &name)); |
| 113 // Skip values we can't deserialize. | 113 // Skip values we can't deserialize. |
| 114 if (!value.get()) | 114 if (!value.get()) |
| 115 continue; | 115 continue; |
| 116 | 116 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 147 StartObserving(); | 147 StartObserving(); |
| 148 } | 148 } |
| 149 | 149 |
| 150 bool PreferenceChangeProcessor::WritePreference( | 150 bool PreferenceChangeProcessor::WritePreference( |
| 151 sync_api::WriteNode* node, | 151 sync_api::WriteNode* node, |
| 152 const std::wstring& name, | 152 const std::wstring& name, |
| 153 const Value* value) { | 153 const Value* value) { |
| 154 std::string serialized; | 154 std::string serialized; |
| 155 JSONStringValueSerializer json(&serialized); | 155 JSONStringValueSerializer json(&serialized); |
| 156 if (!json.Serialize(*value)) { | 156 if (!json.Serialize(*value)) { |
| 157 LOG(ERROR) << "Failed to serialize preference value."; | 157 error_handler()->OnUnrecoverableError(FROM_HERE, |
| 158 error_handler()->OnUnrecoverableError(); | 158 "Failed to serialize preference value."); |
| 159 return false; | 159 return false; |
| 160 } | 160 } |
| 161 | 161 |
| 162 sync_pb::PreferenceSpecifics preference; | 162 sync_pb::PreferenceSpecifics preference; |
| 163 preference.set_name(WideToUTF8(name)); | 163 preference.set_name(WideToUTF8(name)); |
| 164 preference.set_value(serialized); | 164 preference.set_value(serialized); |
| 165 node->SetPreferenceSpecifics(preference); | 165 node->SetPreferenceSpecifics(preference); |
| 166 node->SetTitle(name); | 166 node->SetTitle(name); |
| 167 return true; | 167 return true; |
| 168 } | 168 } |
| 169 | 169 |
| 170 Value* PreferenceChangeProcessor::ReadPreference( | 170 Value* PreferenceChangeProcessor::ReadPreference( |
| 171 sync_api::ReadNode* node, | 171 sync_api::ReadNode* node, |
| 172 std::wstring* name) { | 172 std::wstring* name) { |
| 173 const sync_pb::PreferenceSpecifics& preference( | 173 const sync_pb::PreferenceSpecifics& preference( |
| 174 node->GetPreferenceSpecifics()); | 174 node->GetPreferenceSpecifics()); |
| 175 base::JSONReader reader; | 175 base::JSONReader reader; |
| 176 scoped_ptr<Value> value(reader.JsonToValue(preference.value(), false, false)); | 176 scoped_ptr<Value> value(reader.JsonToValue(preference.value(), false, false)); |
| 177 if (!value.get()) { | 177 if (!value.get()) { |
| 178 LOG(ERROR) << "Failed to deserialize preference value: " | 178 std::string err = "Failed to deserialize preference value: " + |
| 179 << reader.GetErrorMessage(); | 179 reader.GetErrorMessage(); |
| 180 error_handler()->OnUnrecoverableError(); | 180 error_handler()->OnUnrecoverableError(FROM_HERE, err); |
| 181 return NULL; | 181 return NULL; |
| 182 } | 182 } |
| 183 *name = UTF8ToWide(preference.name()); | 183 *name = UTF8ToWide(preference.name()); |
| 184 return value.release(); | 184 return value.release(); |
| 185 } | 185 } |
| 186 | 186 |
| 187 void PreferenceChangeProcessor::StartImpl(Profile* profile) { | 187 void PreferenceChangeProcessor::StartImpl(Profile* profile) { |
| 188 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); | 188 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
| 189 pref_service_ = profile->GetPrefs(); | 189 pref_service_ = profile->GetPrefs(); |
| 190 StartObserving(); | 190 StartObserving(); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 209 void PreferenceChangeProcessor::StopObserving() { | 209 void PreferenceChangeProcessor::StopObserving() { |
| 210 DCHECK(pref_service_); | 210 DCHECK(pref_service_); |
| 211 for (std::set<std::wstring>::const_iterator it = | 211 for (std::set<std::wstring>::const_iterator it = |
| 212 model_associator_->synced_preferences().begin(); | 212 model_associator_->synced_preferences().begin(); |
| 213 it != model_associator_->synced_preferences().end(); ++it) { | 213 it != model_associator_->synced_preferences().end(); ++it) { |
| 214 pref_service_->RemovePrefObserver((*it).c_str(), this); | 214 pref_service_->RemovePrefObserver((*it).c_str(), this); |
| 215 } | 215 } |
| 216 } | 216 } |
| 217 | 217 |
| 218 } // namespace browser_sync | 218 } // namespace browser_sync |
| OLD | NEW |