| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/generic_change_processor.h" | 5 #include "chrome/browser/sync/glue/generic_change_processor.h" |
| 6 | 6 |
| 7 #include "base/location.h" | 7 #include "base/location.h" |
| 8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "content/public/browser/browser_thread.h" | 10 #include "content/public/browser/browser_thread.h" |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 } | 76 } |
| 77 } | 77 } |
| 78 } | 78 } |
| 79 | 79 |
| 80 void GenericChangeProcessor::CommitChangesFromSyncModel() { | 80 void GenericChangeProcessor::CommitChangesFromSyncModel() { |
| 81 DCHECK(CalledOnValidThread()); | 81 DCHECK(CalledOnValidThread()); |
| 82 if (syncer_changes_.empty()) | 82 if (syncer_changes_.empty()) |
| 83 return; | 83 return; |
| 84 if (!local_service_.get()) { | 84 if (!local_service_.get()) { |
| 85 syncer::ModelType type = syncer_changes_[0].sync_data().GetDataType(); | 85 syncer::ModelType type = syncer_changes_[0].sync_data().GetDataType(); |
| 86 syncer::SyncError error(FROM_HERE, "Local service destroyed.", type); | 86 syncer::SyncError error(FROM_HERE, |
| 87 syncer::SyncError::DATATYPE_ERROR, |
| 88 "Local service destroyed.", |
| 89 type); |
| 87 error_handler()->OnSingleDatatypeUnrecoverableError(error.location(), | 90 error_handler()->OnSingleDatatypeUnrecoverableError(error.location(), |
| 88 error.message()); | 91 error.message()); |
| 89 return; | 92 return; |
| 90 } | 93 } |
| 91 syncer::SyncError error = local_service_->ProcessSyncChanges(FROM_HERE, | 94 syncer::SyncError error = local_service_->ProcessSyncChanges(FROM_HERE, |
| 92 syncer_changes_); | 95 syncer_changes_); |
| 93 syncer_changes_.clear(); | 96 syncer_changes_.clear(); |
| 94 if (error.IsSet()) { | 97 if (error.IsSet()) { |
| 95 error_handler()->OnSingleDatatypeUnrecoverableError( | 98 error_handler()->OnSingleDatatypeUnrecoverableError( |
| 96 error.location(), error.message()); | 99 error.location(), error.message()); |
| 97 } | 100 } |
| 98 } | 101 } |
| 99 | 102 |
| 100 syncer::SyncError GenericChangeProcessor::GetSyncDataForType( | 103 syncer::SyncError GenericChangeProcessor::GetSyncDataForType( |
| 101 syncer::ModelType type, | 104 syncer::ModelType type, |
| 102 syncer::SyncDataList* current_sync_data) { | 105 syncer::SyncDataList* current_sync_data) { |
| 103 DCHECK(CalledOnValidThread()); | 106 DCHECK(CalledOnValidThread()); |
| 104 std::string type_name = syncer::ModelTypeToString(type); | 107 std::string type_name = syncer::ModelTypeToString(type); |
| 105 syncer::ReadTransaction trans(FROM_HERE, share_handle()); | 108 syncer::ReadTransaction trans(FROM_HERE, share_handle()); |
| 106 syncer::ReadNode root(&trans); | 109 syncer::ReadNode root(&trans); |
| 107 if (root.InitByTagLookup(syncer::ModelTypeToRootTag(type)) != | 110 if (root.InitByTagLookup(syncer::ModelTypeToRootTag(type)) != |
| 108 syncer::BaseNode::INIT_OK) { | 111 syncer::BaseNode::INIT_OK) { |
| 109 syncer::SyncError error(FROM_HERE, | 112 syncer::SyncError error(FROM_HERE, |
| 110 "Server did not create the top-level " + type_name + | 113 syncer::SyncError::DATATYPE_ERROR, |
| 111 " node. We might be running against an out-of-date server.", | 114 "Server did not create the top-level " + type_name + |
| 112 type); | 115 " node. We might be running against an out-of-" |
| 116 "date server.", |
| 117 type); |
| 113 return error; | 118 return error; |
| 114 } | 119 } |
| 115 | 120 |
| 116 // TODO(akalin): We'll have to do a tree traversal for bookmarks. | 121 // TODO(akalin): We'll have to do a tree traversal for bookmarks. |
| 117 DCHECK_NE(type, syncer::BOOKMARKS); | 122 DCHECK_NE(type, syncer::BOOKMARKS); |
| 118 | 123 |
| 119 std::vector<int64> child_ids; | 124 std::vector<int64> child_ids; |
| 120 root.GetChildIds(&child_ids); | 125 root.GetChildIds(&child_ids); |
| 121 | 126 |
| 122 for (std::vector<int64>::iterator it = child_ids.begin(); | 127 for (std::vector<int64>::iterator it = child_ids.begin(); |
| 123 it != child_ids.end(); ++it) { | 128 it != child_ids.end(); ++it) { |
| 124 syncer::ReadNode sync_child_node(&trans); | 129 syncer::ReadNode sync_child_node(&trans); |
| 125 if (sync_child_node.InitByIdLookup(*it) != | 130 if (sync_child_node.InitByIdLookup(*it) != |
| 126 syncer::BaseNode::INIT_OK) { | 131 syncer::BaseNode::INIT_OK) { |
| 127 syncer::SyncError error(FROM_HERE, | 132 syncer::SyncError error(FROM_HERE, |
| 128 "Failed to fetch child node for type " + type_name + ".", | 133 syncer::SyncError::DATATYPE_ERROR, |
| 129 type); | 134 "Failed to fetch child node for type " + |
| 135 type_name + ".", |
| 136 type); |
| 130 return error; | 137 return error; |
| 131 } | 138 } |
| 132 current_sync_data->push_back(syncer::SyncData::CreateRemoteData( | 139 current_sync_data->push_back(syncer::SyncData::CreateRemoteData( |
| 133 sync_child_node.GetId(), sync_child_node.GetEntitySpecifics())); | 140 sync_child_node.GetId(), sync_child_node.GetEntitySpecifics())); |
| 134 } | 141 } |
| 135 return syncer::SyncError(); | 142 return syncer::SyncError(); |
| 136 } | 143 } |
| 137 | 144 |
| 138 int GenericChangeProcessor::GetSyncCountForType(syncer::ModelType type) { | 145 int GenericChangeProcessor::GetSyncCountForType(syncer::ModelType type) { |
| 139 syncer::ReadTransaction trans(FROM_HERE, share_handle()); | 146 syncer::ReadTransaction trans(FROM_HERE, share_handle()); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 syncer::ModelType type, | 221 syncer::ModelType type, |
| 215 const std::string& type_str, | 222 const std::string& type_str, |
| 216 syncer::WriteNode* node, | 223 syncer::WriteNode* node, |
| 217 DataTypeErrorHandler* error_handler) { | 224 DataTypeErrorHandler* error_handler) { |
| 218 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE); | 225 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE); |
| 219 if (change.sync_data().IsLocal()) { | 226 if (change.sync_data().IsLocal()) { |
| 220 const std::string& tag = change.sync_data().GetTag(); | 227 const std::string& tag = change.sync_data().GetTag(); |
| 221 if (tag.empty()) { | 228 if (tag.empty()) { |
| 222 syncer::SyncError error( | 229 syncer::SyncError error( |
| 223 FROM_HERE, | 230 FROM_HERE, |
| 231 syncer::SyncError::DATATYPE_ERROR, |
| 224 "Failed to delete " + type_str + " node. Local data, empty tag. " + | 232 "Failed to delete " + type_str + " node. Local data, empty tag. " + |
| 225 change.location().ToString(), | 233 change.location().ToString(), |
| 226 type); | 234 type); |
| 227 error_handler->OnSingleDatatypeUnrecoverableError(error.location(), | 235 error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
| 228 error.message()); | 236 error.message()); |
| 229 NOTREACHED(); | 237 NOTREACHED(); |
| 230 return error; | 238 return error; |
| 231 } | 239 } |
| 232 | 240 |
| 233 syncer::BaseNode::InitByLookupResult result = | 241 syncer::BaseNode::InitByLookupResult result = |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 merge_result_->num_items_deleted() + 1); | 298 merge_result_->num_items_deleted() + 1); |
| 291 } | 299 } |
| 292 } else if (change.change_type() == syncer::SyncChange::ACTION_ADD) { | 300 } else if (change.change_type() == syncer::SyncChange::ACTION_ADD) { |
| 293 // TODO(sync): Handle other types of creation (custom parents, folders, | 301 // TODO(sync): Handle other types of creation (custom parents, folders, |
| 294 // etc.). | 302 // etc.). |
| 295 syncer::ReadNode root_node(&trans); | 303 syncer::ReadNode root_node(&trans); |
| 296 if (root_node.InitByTagLookup( | 304 if (root_node.InitByTagLookup( |
| 297 syncer::ModelTypeToRootTag(change.sync_data().GetDataType())) != | 305 syncer::ModelTypeToRootTag(change.sync_data().GetDataType())) != |
| 298 syncer::BaseNode::INIT_OK) { | 306 syncer::BaseNode::INIT_OK) { |
| 299 syncer::SyncError error(FROM_HERE, | 307 syncer::SyncError error(FROM_HERE, |
| 300 "Failed to look up root node for type " + type_str, | 308 syncer::SyncError::DATATYPE_ERROR, |
| 301 type); | 309 "Failed to look up root node for type " + |
| 310 type_str, |
| 311 type); |
| 302 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 312 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 303 error.message()); | 313 error.message()); |
| 304 NOTREACHED(); | 314 NOTREACHED(); |
| 305 LOG(ERROR) << "Create: no root node."; | 315 LOG(ERROR) << "Create: no root node."; |
| 306 return error; | 316 return error; |
| 307 } | 317 } |
| 308 syncer::WriteNode::InitUniqueByCreationResult result = | 318 syncer::WriteNode::InitUniqueByCreationResult result = |
| 309 sync_node.InitUniqueByCreation(change.sync_data().GetDataType(), | 319 sync_node.InitUniqueByCreation(change.sync_data().GetDataType(), |
| 310 root_node, | 320 root_node, |
| 311 change.sync_data().GetTag()); | 321 change.sync_data().GetTag()); |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics()); | 464 sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics()); |
| 455 if (merge_result_.get()) { | 465 if (merge_result_.get()) { |
| 456 merge_result_->set_num_items_modified( | 466 merge_result_->set_num_items_modified( |
| 457 merge_result_->num_items_modified() + 1); | 467 merge_result_->num_items_modified() + 1); |
| 458 } | 468 } |
| 459 // TODO(sync): Support updating other parts of the sync node (title, | 469 // TODO(sync): Support updating other parts of the sync node (title, |
| 460 // successor, parent, etc.). | 470 // successor, parent, etc.). |
| 461 } else { | 471 } else { |
| 462 syncer::SyncError error( | 472 syncer::SyncError error( |
| 463 FROM_HERE, | 473 FROM_HERE, |
| 474 syncer::SyncError::DATATYPE_ERROR, |
| 464 "Received unset SyncChange in the change processor, " + | 475 "Received unset SyncChange in the change processor, " + |
| 465 change.location().ToString(), | 476 change.location().ToString(), |
| 466 type); | 477 type); |
| 467 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 478 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 468 error.message()); | 479 error.message()); |
| 469 NOTREACHED(); | 480 NOTREACHED(); |
| 470 LOG(ERROR) << "Unset sync change."; | 481 LOG(ERROR) << "Unset sync change."; |
| 471 return error; | 482 return error; |
| 472 } | 483 } |
| 473 } | 484 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 void GenericChangeProcessor::StartImpl(Profile* profile) { | 522 void GenericChangeProcessor::StartImpl(Profile* profile) { |
| 512 DCHECK(CalledOnValidThread()); | 523 DCHECK(CalledOnValidThread()); |
| 513 } | 524 } |
| 514 | 525 |
| 515 syncer::UserShare* GenericChangeProcessor::share_handle() const { | 526 syncer::UserShare* GenericChangeProcessor::share_handle() const { |
| 516 DCHECK(CalledOnValidThread()); | 527 DCHECK(CalledOnValidThread()); |
| 517 return share_handle_; | 528 return share_handle_; |
| 518 } | 529 } |
| 519 | 530 |
| 520 } // namespace browser_sync | 531 } // namespace browser_sync |
| OLD | NEW |