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 |