| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/sync_driver/generic_change_processor.h" | 5 #include "components/sync_driver/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 "components/sync_driver/sync_api_component_factory.h" | 10 #include "components/sync_driver/sync_api_component_factory.h" |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 base::Time(), | 137 base::Time(), |
| 138 empty_list_of_attachment_ids, | 138 empty_list_of_attachment_ids, |
| 139 attachment_service_proxy_))); | 139 attachment_service_proxy_))); |
| 140 } else { | 140 } else { |
| 141 syncer::SyncChange::SyncChangeType action = | 141 syncer::SyncChange::SyncChangeType action = |
| 142 (it->action == syncer::ChangeRecord::ACTION_ADD) ? | 142 (it->action == syncer::ChangeRecord::ACTION_ADD) ? |
| 143 syncer::SyncChange::ACTION_ADD : syncer::SyncChange::ACTION_UPDATE; | 143 syncer::SyncChange::ACTION_ADD : syncer::SyncChange::ACTION_UPDATE; |
| 144 // Need to load specifics from node. | 144 // Need to load specifics from node. |
| 145 syncer::ReadNode read_node(trans); | 145 syncer::ReadNode read_node(trans); |
| 146 if (read_node.InitByIdLookup(it->id) != syncer::BaseNode::INIT_OK) { | 146 if (read_node.InitByIdLookup(it->id) != syncer::BaseNode::INIT_OK) { |
| 147 error_handler()->OnSingleDatatypeUnrecoverableError( | 147 syncer::SyncError error( |
| 148 FROM_HERE, | 148 FROM_HERE, |
| 149 syncer::SyncError::DATATYPE_ERROR, |
| 149 "Failed to look up data for received change with id " + | 150 "Failed to look up data for received change with id " + |
| 150 base::Int64ToString(it->id)); | 151 base::Int64ToString(it->id), |
| 152 syncer::GetModelTypeFromSpecifics(it->specifics)); |
| 153 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 151 return; | 154 return; |
| 152 } | 155 } |
| 153 syncer_changes_.push_back(syncer::SyncChange( | 156 syncer_changes_.push_back(syncer::SyncChange( |
| 154 FROM_HERE, | 157 FROM_HERE, |
| 155 action, | 158 action, |
| 156 BuildRemoteSyncData(it->id, read_node, attachment_service_proxy_))); | 159 BuildRemoteSyncData(it->id, read_node, attachment_service_proxy_))); |
| 157 } | 160 } |
| 158 } | 161 } |
| 159 } | 162 } |
| 160 | 163 |
| 161 void GenericChangeProcessor::CommitChangesFromSyncModel() { | 164 void GenericChangeProcessor::CommitChangesFromSyncModel() { |
| 162 DCHECK(CalledOnValidThread()); | 165 DCHECK(CalledOnValidThread()); |
| 163 if (syncer_changes_.empty()) | 166 if (syncer_changes_.empty()) |
| 164 return; | 167 return; |
| 165 if (!local_service_.get()) { | 168 if (!local_service_.get()) { |
| 166 syncer::ModelType type = syncer_changes_[0].sync_data().GetDataType(); | 169 syncer::ModelType type = syncer_changes_[0].sync_data().GetDataType(); |
| 167 syncer::SyncError error(FROM_HERE, | 170 syncer::SyncError error(FROM_HERE, |
| 168 syncer::SyncError::DATATYPE_ERROR, | 171 syncer::SyncError::DATATYPE_ERROR, |
| 169 "Local service destroyed.", | 172 "Local service destroyed.", |
| 170 type); | 173 type); |
| 171 error_handler()->OnSingleDatatypeUnrecoverableError(error.location(), | 174 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 172 error.message()); | |
| 173 return; | 175 return; |
| 174 } | 176 } |
| 175 syncer::SyncError error = local_service_->ProcessSyncChanges(FROM_HERE, | 177 syncer::SyncError error = local_service_->ProcessSyncChanges(FROM_HERE, |
| 176 syncer_changes_); | 178 syncer_changes_); |
| 177 syncer_changes_.clear(); | 179 syncer_changes_.clear(); |
| 178 if (error.IsSet()) { | 180 if (error.IsSet()) |
| 179 error_handler()->OnSingleDatatypeUnrecoverableError( | 181 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 180 error.location(), error.message()); | |
| 181 } | |
| 182 } | 182 } |
| 183 | 183 |
| 184 syncer::SyncDataList GenericChangeProcessor::GetAllSyncData( | 184 syncer::SyncDataList GenericChangeProcessor::GetAllSyncData( |
| 185 syncer::ModelType type) const { | 185 syncer::ModelType type) const { |
| 186 // This is slow / memory intensive. Should be used sparingly by datatypes. | 186 // This is slow / memory intensive. Should be used sparingly by datatypes. |
| 187 syncer::SyncDataList data; | 187 syncer::SyncDataList data; |
| 188 GetAllSyncDataReturnError(type, &data); | 188 GetAllSyncDataReturnError(type, &data); |
| 189 return data; | 189 return data; |
| 190 } | 190 } |
| 191 | 191 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 syncer::ReadNode root(&trans); | 278 syncer::ReadNode root(&trans); |
| 279 if (root.InitTypeRoot(type) != syncer::BaseNode::INIT_OK) | 279 if (root.InitTypeRoot(type) != syncer::BaseNode::INIT_OK) |
| 280 return 0; | 280 return 0; |
| 281 | 281 |
| 282 // Subtract one to account for type's root node. | 282 // Subtract one to account for type's root node. |
| 283 return root.GetTotalNodeCount() - 1; | 283 return root.GetTotalNodeCount() - 1; |
| 284 } | 284 } |
| 285 | 285 |
| 286 namespace { | 286 namespace { |
| 287 | 287 |
| 288 // TODO(isherman): Investigating http://crbug.com/121592 | |
| 289 // WARNING: this code is sensitive to compiler optimizations. Be careful | 288 // WARNING: this code is sensitive to compiler optimizations. Be careful |
| 290 // modifying any code around an OnSingleDatatypeUnrecoverableError call, else | 289 // modifying any code around an OnSingleDataTypeUnrecoverableError call, else |
| 291 // the compiler attempts to merge it with other calls, losing useful information | 290 // the compiler attempts to merge it with other calls, losing useful information |
| 292 // in breakpad uploads. | 291 // in breakpad uploads. |
| 293 syncer::SyncError LogLookupFailure( | 292 syncer::SyncError LogLookupFailure( |
| 294 syncer::BaseNode::InitByLookupResult lookup_result, | 293 syncer::BaseNode::InitByLookupResult lookup_result, |
| 295 const tracked_objects::Location& from_here, | 294 const tracked_objects::Location& from_here, |
| 296 const std::string& error_prefix, | 295 const std::string& error_prefix, |
| 297 syncer::ModelType type, | 296 syncer::ModelType type, |
| 298 DataTypeErrorHandler* error_handler) { | 297 DataTypeErrorHandler* error_handler) { |
| 299 switch (lookup_result) { | 298 switch (lookup_result) { |
| 300 case syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD: { | 299 case syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD: { |
| 301 syncer::SyncError error; | 300 syncer::SyncError error; |
| 302 error.Reset(from_here, | 301 error.Reset(from_here, |
| 303 error_prefix + | 302 error_prefix + |
| 304 "could not find entry matching the lookup criteria.", | 303 "could not find entry matching the lookup criteria.", |
| 305 type); | 304 type); |
| 306 error_handler->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 305 error_handler->OnSingleDataTypeUnrecoverableError(error); |
| 307 error.message()); | |
| 308 LOG(ERROR) << "Delete: Bad entry."; | 306 LOG(ERROR) << "Delete: Bad entry."; |
| 309 return error; | 307 return error; |
| 310 } | 308 } |
| 311 case syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL: { | 309 case syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL: { |
| 312 syncer::SyncError error; | 310 syncer::SyncError error; |
| 313 error.Reset(from_here, error_prefix + "entry is already deleted.", type); | 311 error.Reset(from_here, error_prefix + "entry is already deleted.", type); |
| 314 error_handler->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 312 error_handler->OnSingleDataTypeUnrecoverableError(error); |
| 315 error.message()); | |
| 316 LOG(ERROR) << "Delete: Deleted entry."; | 313 LOG(ERROR) << "Delete: Deleted entry."; |
| 317 return error; | 314 return error; |
| 318 } | 315 } |
| 319 case syncer::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY: { | 316 case syncer::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY: { |
| 320 syncer::SyncError error; | 317 syncer::SyncError error; |
| 321 error.Reset(from_here, error_prefix + "unable to decrypt", type); | 318 error.Reset(from_here, error_prefix + "unable to decrypt", type); |
| 322 error_handler->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 319 error_handler->OnSingleDataTypeUnrecoverableError(error); |
| 323 error.message()); | |
| 324 LOG(ERROR) << "Delete: Undecryptable entry."; | 320 LOG(ERROR) << "Delete: Undecryptable entry."; |
| 325 return error; | 321 return error; |
| 326 } | 322 } |
| 327 case syncer::BaseNode::INIT_FAILED_PRECONDITION: { | 323 case syncer::BaseNode::INIT_FAILED_PRECONDITION: { |
| 328 syncer::SyncError error; | 324 syncer::SyncError error; |
| 329 error.Reset(from_here, | 325 error.Reset(from_here, |
| 330 error_prefix + "a precondition was not met for calling init.", | 326 error_prefix + "a precondition was not met for calling init.", |
| 331 type); | 327 type); |
| 332 error_handler->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 328 error_handler->OnSingleDataTypeUnrecoverableError(error); |
| 333 error.message()); | |
| 334 LOG(ERROR) << "Delete: Failed precondition."; | 329 LOG(ERROR) << "Delete: Failed precondition."; |
| 335 return error; | 330 return error; |
| 336 } | 331 } |
| 337 default: { | 332 default: { |
| 338 syncer::SyncError error; | 333 syncer::SyncError error; |
| 339 // Should have listed all the possible error cases above. | 334 // Should have listed all the possible error cases above. |
| 340 error.Reset(from_here, error_prefix + "unknown error", type); | 335 error.Reset(from_here, error_prefix + "unknown error", type); |
| 341 error_handler->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 336 error_handler->OnSingleDataTypeUnrecoverableError(error); |
| 342 error.message()); | |
| 343 LOG(ERROR) << "Delete: Unknown error."; | 337 LOG(ERROR) << "Delete: Unknown error."; |
| 344 return error; | 338 return error; |
| 345 } | 339 } |
| 346 } | 340 } |
| 347 } | 341 } |
| 348 | 342 |
| 349 syncer::SyncError AttemptDelete(const syncer::SyncChange& change, | 343 syncer::SyncError AttemptDelete(const syncer::SyncChange& change, |
| 350 syncer::ModelType type, | 344 syncer::ModelType type, |
| 351 const std::string& type_str, | 345 const std::string& type_str, |
| 352 syncer::WriteNode* node, | 346 syncer::WriteNode* node, |
| 353 DataTypeErrorHandler* error_handler) { | 347 DataTypeErrorHandler* error_handler) { |
| 354 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE); | 348 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE); |
| 355 if (change.sync_data().IsLocal()) { | 349 if (change.sync_data().IsLocal()) { |
| 356 const std::string& tag = syncer::SyncDataLocal(change.sync_data()).GetTag(); | 350 const std::string& tag = syncer::SyncDataLocal(change.sync_data()).GetTag(); |
| 357 if (tag.empty()) { | 351 if (tag.empty()) { |
| 358 syncer::SyncError error( | 352 syncer::SyncError error( |
| 359 FROM_HERE, | 353 FROM_HERE, |
| 360 syncer::SyncError::DATATYPE_ERROR, | 354 syncer::SyncError::DATATYPE_ERROR, |
| 361 "Failed to delete " + type_str + " node. Local data, empty tag. " + | 355 "Failed to delete " + type_str + " node. Local data, empty tag. " + |
| 362 change.location().ToString(), | 356 change.location().ToString(), |
| 363 type); | 357 type); |
| 364 error_handler->OnSingleDatatypeUnrecoverableError(error.location(), | 358 error_handler->OnSingleDataTypeUnrecoverableError(error); |
| 365 error.message()); | |
| 366 NOTREACHED(); | 359 NOTREACHED(); |
| 367 return error; | 360 return error; |
| 368 } | 361 } |
| 369 | 362 |
| 370 syncer::BaseNode::InitByLookupResult result = | 363 syncer::BaseNode::InitByLookupResult result = |
| 371 node->InitByClientTagLookup(change.sync_data().GetDataType(), tag); | 364 node->InitByClientTagLookup(change.sync_data().GetDataType(), tag); |
| 372 if (result != syncer::BaseNode::INIT_OK) { | 365 if (result != syncer::BaseNode::INIT_OK) { |
| 373 return LogLookupFailure( | 366 return LogLookupFailure( |
| 374 result, FROM_HERE, | 367 result, FROM_HERE, |
| 375 "Failed to delete " + type_str + " node. Local data. " + | 368 "Failed to delete " + type_str + " node. Local data. " + |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 if (error.IsSet()) { | 450 if (error.IsSet()) { |
| 458 return error; | 451 return error; |
| 459 } | 452 } |
| 460 } else { | 453 } else { |
| 461 syncer::SyncError error( | 454 syncer::SyncError error( |
| 462 FROM_HERE, | 455 FROM_HERE, |
| 463 syncer::SyncError::DATATYPE_ERROR, | 456 syncer::SyncError::DATATYPE_ERROR, |
| 464 "Received unset SyncChange in the change processor, " + | 457 "Received unset SyncChange in the change processor, " + |
| 465 change.location().ToString(), | 458 change.location().ToString(), |
| 466 type); | 459 type); |
| 467 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 460 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 468 error.message()); | |
| 469 NOTREACHED(); | 461 NOTREACHED(); |
| 470 LOG(ERROR) << "Unset sync change."; | 462 LOG(ERROR) << "Unset sync change."; |
| 471 return error; | 463 return error; |
| 472 } | 464 } |
| 473 } | 465 } |
| 474 | 466 |
| 475 if (!new_attachments.empty()) { | 467 if (!new_attachments.empty()) { |
| 476 StoreAttachments(attachment_service_.get(), new_attachments); | 468 StoreAttachments(attachment_service_.get(), new_attachments); |
| 477 } | 469 } |
| 478 | 470 |
| 479 return syncer::SyncError(); | 471 return syncer::SyncError(); |
| 480 } | 472 } |
| 481 | 473 |
| 482 // WARNING: this code is sensitive to compiler optimizations. Be careful | 474 // WARNING: this code is sensitive to compiler optimizations. Be careful |
| 483 // modifying any code around an OnSingleDatatypeUnrecoverableError call, else | 475 // modifying any code around an OnSingleDataTypeUnrecoverableError call, else |
| 484 // the compiler attempts to merge it with other calls, losing useful information | 476 // the compiler attempts to merge it with other calls, losing useful information |
| 485 // in breakpad uploads. | 477 // in breakpad uploads. |
| 486 syncer::SyncError GenericChangeProcessor::HandleActionAdd( | 478 syncer::SyncError GenericChangeProcessor::HandleActionAdd( |
| 487 const syncer::SyncChange& change, | 479 const syncer::SyncChange& change, |
| 488 const std::string& type_str, | 480 const std::string& type_str, |
| 489 const syncer::ModelType& type, | 481 const syncer::ModelType& type, |
| 490 const syncer::WriteTransaction& trans, | 482 const syncer::WriteTransaction& trans, |
| 491 syncer::WriteNode* sync_node, | 483 syncer::WriteNode* sync_node, |
| 492 syncer::AttachmentList* new_attachments) { | 484 syncer::AttachmentList* new_attachments) { |
| 493 // TODO(sync): Handle other types of creation (custom parents, folders, | 485 // TODO(sync): Handle other types of creation (custom parents, folders, |
| 494 // etc.). | 486 // etc.). |
| 495 syncer::ReadNode root_node(&trans); | 487 syncer::ReadNode root_node(&trans); |
| 496 const syncer::SyncDataLocal sync_data_local(change.sync_data()); | 488 const syncer::SyncDataLocal sync_data_local(change.sync_data()); |
| 497 if (root_node.InitTypeRoot(sync_data_local.GetDataType()) != | 489 if (root_node.InitTypeRoot(sync_data_local.GetDataType()) != |
| 498 syncer::BaseNode::INIT_OK) { | 490 syncer::BaseNode::INIT_OK) { |
| 499 syncer::SyncError error(FROM_HERE, | 491 syncer::SyncError error(FROM_HERE, |
| 500 syncer::SyncError::DATATYPE_ERROR, | 492 syncer::SyncError::DATATYPE_ERROR, |
| 501 "Failed to look up root node for type " + type_str, | 493 "Failed to look up root node for type " + type_str, |
| 502 type); | 494 type); |
| 503 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 495 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 504 error.message()); | |
| 505 NOTREACHED(); | 496 NOTREACHED(); |
| 506 LOG(ERROR) << "Create: no root node."; | 497 LOG(ERROR) << "Create: no root node."; |
| 507 return error; | 498 return error; |
| 508 } | 499 } |
| 509 syncer::WriteNode::InitUniqueByCreationResult result = | 500 syncer::WriteNode::InitUniqueByCreationResult result = |
| 510 sync_node->InitUniqueByCreation( | 501 sync_node->InitUniqueByCreation( |
| 511 sync_data_local.GetDataType(), root_node, sync_data_local.GetTag()); | 502 sync_data_local.GetDataType(), root_node, sync_data_local.GetTag()); |
| 512 if (result != syncer::WriteNode::INIT_SUCCESS) { | 503 if (result != syncer::WriteNode::INIT_SUCCESS) { |
| 513 std::string error_prefix = "Failed to create " + type_str + " node: " + | 504 std::string error_prefix = "Failed to create " + type_str + " node: " + |
| 514 change.location().ToString() + ", "; | 505 change.location().ToString() + ", "; |
| 515 switch (result) { | 506 switch (result) { |
| 516 case syncer::WriteNode::INIT_FAILED_EMPTY_TAG: { | 507 case syncer::WriteNode::INIT_FAILED_EMPTY_TAG: { |
| 517 syncer::SyncError error; | 508 syncer::SyncError error; |
| 518 error.Reset(FROM_HERE, error_prefix + "empty tag", type); | 509 error.Reset(FROM_HERE, error_prefix + "empty tag", type); |
| 519 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 510 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 520 error.message()); | |
| 521 LOG(ERROR) << "Create: Empty tag."; | 511 LOG(ERROR) << "Create: Empty tag."; |
| 522 return error; | 512 return error; |
| 523 } | 513 } |
| 524 case syncer::WriteNode::INIT_FAILED_ENTRY_ALREADY_EXISTS: { | 514 case syncer::WriteNode::INIT_FAILED_ENTRY_ALREADY_EXISTS: { |
| 525 syncer::SyncError error; | 515 syncer::SyncError error; |
| 526 error.Reset(FROM_HERE, error_prefix + "entry already exists", type); | 516 error.Reset(FROM_HERE, error_prefix + "entry already exists", type); |
| 527 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 517 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 528 error.message()); | |
| 529 LOG(ERROR) << "Create: Entry exists."; | 518 LOG(ERROR) << "Create: Entry exists."; |
| 530 return error; | 519 return error; |
| 531 } | 520 } |
| 532 case syncer::WriteNode::INIT_FAILED_COULD_NOT_CREATE_ENTRY: { | 521 case syncer::WriteNode::INIT_FAILED_COULD_NOT_CREATE_ENTRY: { |
| 533 syncer::SyncError error; | 522 syncer::SyncError error; |
| 534 error.Reset(FROM_HERE, error_prefix + "failed to create entry", type); | 523 error.Reset(FROM_HERE, error_prefix + "failed to create entry", type); |
| 535 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 524 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 536 error.message()); | |
| 537 LOG(ERROR) << "Create: Could not create entry."; | 525 LOG(ERROR) << "Create: Could not create entry."; |
| 538 return error; | 526 return error; |
| 539 } | 527 } |
| 540 case syncer::WriteNode::INIT_FAILED_SET_PREDECESSOR: { | 528 case syncer::WriteNode::INIT_FAILED_SET_PREDECESSOR: { |
| 541 syncer::SyncError error; | 529 syncer::SyncError error; |
| 542 error.Reset( | 530 error.Reset( |
| 543 FROM_HERE, error_prefix + "failed to set predecessor", type); | 531 FROM_HERE, error_prefix + "failed to set predecessor", type); |
| 544 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 532 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 545 error.message()); | |
| 546 LOG(ERROR) << "Create: Bad predecessor."; | 533 LOG(ERROR) << "Create: Bad predecessor."; |
| 547 return error; | 534 return error; |
| 548 } | 535 } |
| 549 default: { | 536 default: { |
| 550 syncer::SyncError error; | 537 syncer::SyncError error; |
| 551 error.Reset(FROM_HERE, error_prefix + "unknown error", type); | 538 error.Reset(FROM_HERE, error_prefix + "unknown error", type); |
| 552 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 539 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 553 error.message()); | |
| 554 LOG(ERROR) << "Create: Unknown error."; | 540 LOG(ERROR) << "Create: Unknown error."; |
| 555 return error; | 541 return error; |
| 556 } | 542 } |
| 557 } | 543 } |
| 558 } | 544 } |
| 559 sync_node->SetTitle(change.sync_data().GetTitle()); | 545 sync_node->SetTitle(change.sync_data().GetTitle()); |
| 560 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); | 546 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); |
| 561 | 547 |
| 562 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds(); | 548 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds(); |
| 563 SetAttachmentMetadata(attachment_ids, sync_node); | 549 SetAttachmentMetadata(attachment_ids, sync_node); |
| 564 | 550 |
| 565 // Return any newly added attachments. | 551 // Return any newly added attachments. |
| 566 const syncer::AttachmentList& local_attachments_for_upload = | 552 const syncer::AttachmentList& local_attachments_for_upload = |
| 567 sync_data_local.GetLocalAttachmentsForUpload(); | 553 sync_data_local.GetLocalAttachmentsForUpload(); |
| 568 new_attachments->insert(new_attachments->end(), | 554 new_attachments->insert(new_attachments->end(), |
| 569 local_attachments_for_upload.begin(), | 555 local_attachments_for_upload.begin(), |
| 570 local_attachments_for_upload.end()); | 556 local_attachments_for_upload.end()); |
| 571 | 557 |
| 572 if (merge_result_.get()) { | 558 if (merge_result_.get()) { |
| 573 merge_result_->set_num_items_added(merge_result_->num_items_added() + 1); | 559 merge_result_->set_num_items_added(merge_result_->num_items_added() + 1); |
| 574 } | 560 } |
| 575 return syncer::SyncError(); | 561 return syncer::SyncError(); |
| 576 } | 562 } |
| 577 // WARNING: this code is sensitive to compiler optimizations. Be careful | 563 // WARNING: this code is sensitive to compiler optimizations. Be careful |
| 578 // modifying any code around an OnSingleDatatypeUnrecoverableError call, else | 564 // modifying any code around an OnSingleDataTypeUnrecoverableError call, else |
| 579 // the compiler attempts to merge it with other calls, losing useful information | 565 // the compiler attempts to merge it with other calls, losing useful information |
| 580 // in breakpad uploads. | 566 // in breakpad uploads. |
| 581 syncer::SyncError GenericChangeProcessor::HandleActionUpdate( | 567 syncer::SyncError GenericChangeProcessor::HandleActionUpdate( |
| 582 const syncer::SyncChange& change, | 568 const syncer::SyncChange& change, |
| 583 const std::string& type_str, | 569 const std::string& type_str, |
| 584 const syncer::ModelType& type, | 570 const syncer::ModelType& type, |
| 585 const syncer::WriteTransaction& trans, | 571 const syncer::WriteTransaction& trans, |
| 586 syncer::WriteNode* sync_node, | 572 syncer::WriteNode* sync_node, |
| 587 syncer::AttachmentList* new_attachments) { | 573 syncer::AttachmentList* new_attachments) { |
| 588 // TODO(zea): consider having this logic for all possible changes? | 574 // TODO(zea): consider having this logic for all possible changes? |
| 589 | 575 |
| 590 const syncer::SyncDataLocal sync_data_local(change.sync_data()); | 576 const syncer::SyncDataLocal sync_data_local(change.sync_data()); |
| 591 syncer::BaseNode::InitByLookupResult result = | 577 syncer::BaseNode::InitByLookupResult result = |
| 592 sync_node->InitByClientTagLookup(sync_data_local.GetDataType(), | 578 sync_node->InitByClientTagLookup(sync_data_local.GetDataType(), |
| 593 sync_data_local.GetTag()); | 579 sync_data_local.GetTag()); |
| 594 if (result != syncer::BaseNode::INIT_OK) { | 580 if (result != syncer::BaseNode::INIT_OK) { |
| 595 std::string error_prefix = "Failed to load " + type_str + " node. " + | 581 std::string error_prefix = "Failed to load " + type_str + " node. " + |
| 596 change.location().ToString() + ", "; | 582 change.location().ToString() + ", "; |
| 597 if (result == syncer::BaseNode::INIT_FAILED_PRECONDITION) { | 583 if (result == syncer::BaseNode::INIT_FAILED_PRECONDITION) { |
| 598 syncer::SyncError error; | 584 syncer::SyncError error; |
| 599 error.Reset(FROM_HERE, error_prefix + "empty tag", type); | 585 error.Reset(FROM_HERE, error_prefix + "empty tag", type); |
| 600 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 586 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 601 error.message()); | |
| 602 LOG(ERROR) << "Update: Empty tag."; | 587 LOG(ERROR) << "Update: Empty tag."; |
| 603 return error; | 588 return error; |
| 604 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD) { | 589 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD) { |
| 605 syncer::SyncError error; | 590 syncer::SyncError error; |
| 606 error.Reset(FROM_HERE, error_prefix + "bad entry", type); | 591 error.Reset(FROM_HERE, error_prefix + "bad entry", type); |
| 607 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 592 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 608 error.message()); | |
| 609 LOG(ERROR) << "Update: bad entry."; | 593 LOG(ERROR) << "Update: bad entry."; |
| 610 return error; | 594 return error; |
| 611 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL) { | 595 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL) { |
| 612 syncer::SyncError error; | 596 syncer::SyncError error; |
| 613 error.Reset(FROM_HERE, error_prefix + "deleted entry", type); | 597 error.Reset(FROM_HERE, error_prefix + "deleted entry", type); |
| 614 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 598 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 615 error.message()); | |
| 616 LOG(ERROR) << "Update: deleted entry."; | 599 LOG(ERROR) << "Update: deleted entry."; |
| 617 return error; | 600 return error; |
| 618 } else { | 601 } else { |
| 619 syncer::Cryptographer* crypto = trans.GetCryptographer(); | 602 syncer::Cryptographer* crypto = trans.GetCryptographer(); |
| 620 syncer::ModelTypeSet encrypted_types(trans.GetEncryptedTypes()); | 603 syncer::ModelTypeSet encrypted_types(trans.GetEncryptedTypes()); |
| 621 const sync_pb::EntitySpecifics& specifics = | 604 const sync_pb::EntitySpecifics& specifics = |
| 622 sync_node->GetEntry()->GetSpecifics(); | 605 sync_node->GetEntry()->GetSpecifics(); |
| 623 CHECK(specifics.has_encrypted()); | 606 CHECK(specifics.has_encrypted()); |
| 624 const bool can_decrypt = crypto->CanDecrypt(specifics.encrypted()); | 607 const bool can_decrypt = crypto->CanDecrypt(specifics.encrypted()); |
| 625 const bool agreement = encrypted_types.Has(type); | 608 const bool agreement = encrypted_types.Has(type); |
| 626 if (!agreement && !can_decrypt) { | 609 if (!agreement && !can_decrypt) { |
| 627 syncer::SyncError error; | 610 syncer::SyncError error; |
| 628 error.Reset(FROM_HERE, | 611 error.Reset(FROM_HERE, |
| 629 "Failed to load encrypted entry, missing key and " | 612 "Failed to load encrypted entry, missing key and " |
| 630 "nigori mismatch for " + | 613 "nigori mismatch for " + |
| 631 type_str + ".", | 614 type_str + ".", |
| 632 type); | 615 type); |
| 633 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 616 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 634 error.message()); | |
| 635 LOG(ERROR) << "Update: encr case 1."; | 617 LOG(ERROR) << "Update: encr case 1."; |
| 636 return error; | 618 return error; |
| 637 } else if (agreement && can_decrypt) { | 619 } else if (agreement && can_decrypt) { |
| 638 syncer::SyncError error; | 620 syncer::SyncError error; |
| 639 error.Reset(FROM_HERE, | 621 error.Reset(FROM_HERE, |
| 640 "Failed to load encrypted entry, we have the key " | 622 "Failed to load encrypted entry, we have the key " |
| 641 "and the nigori matches (?!) for " + | 623 "and the nigori matches (?!) for " + |
| 642 type_str + ".", | 624 type_str + ".", |
| 643 type); | 625 type); |
| 644 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 626 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 645 error.message()); | |
| 646 LOG(ERROR) << "Update: encr case 2."; | 627 LOG(ERROR) << "Update: encr case 2."; |
| 647 return error; | 628 return error; |
| 648 } else if (agreement) { | 629 } else if (agreement) { |
| 649 syncer::SyncError error; | 630 syncer::SyncError error; |
| 650 error.Reset(FROM_HERE, | 631 error.Reset(FROM_HERE, |
| 651 "Failed to load encrypted entry, missing key and " | 632 "Failed to load encrypted entry, missing key and " |
| 652 "the nigori matches for " + | 633 "the nigori matches for " + |
| 653 type_str + ".", | 634 type_str + ".", |
| 654 type); | 635 type); |
| 655 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 636 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 656 error.message()); | |
| 657 LOG(ERROR) << "Update: encr case 3."; | 637 LOG(ERROR) << "Update: encr case 3."; |
| 658 return error; | 638 return error; |
| 659 } else { | 639 } else { |
| 660 syncer::SyncError error; | 640 syncer::SyncError error; |
| 661 error.Reset(FROM_HERE, | 641 error.Reset(FROM_HERE, |
| 662 "Failed to load encrypted entry, we have the key" | 642 "Failed to load encrypted entry, we have the key" |
| 663 "(?!) and nigori mismatch for " + | 643 "(?!) and nigori mismatch for " + |
| 664 type_str + ".", | 644 type_str + ".", |
| 665 type); | 645 type); |
| 666 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 646 error_handler()->OnSingleDataTypeUnrecoverableError(error); |
| 667 error.message()); | |
| 668 LOG(ERROR) << "Update: encr case 4."; | 647 LOG(ERROR) << "Update: encr case 4."; |
| 669 return error; | 648 return error; |
| 670 } | 649 } |
| 671 } | 650 } |
| 672 } | 651 } |
| 673 | 652 |
| 674 sync_node->SetTitle(change.sync_data().GetTitle()); | 653 sync_node->SetTitle(change.sync_data().GetTitle()); |
| 675 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); | 654 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); |
| 676 SetAttachmentMetadata(sync_data_local.GetAttachmentIds(), sync_node); | 655 SetAttachmentMetadata(sync_data_local.GetAttachmentIds(), sync_node); |
| 677 | 656 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 726 | 705 |
| 727 void GenericChangeProcessor::StartImpl() { | 706 void GenericChangeProcessor::StartImpl() { |
| 728 } | 707 } |
| 729 | 708 |
| 730 syncer::UserShare* GenericChangeProcessor::share_handle() const { | 709 syncer::UserShare* GenericChangeProcessor::share_handle() const { |
| 731 DCHECK(CalledOnValidThread()); | 710 DCHECK(CalledOnValidThread()); |
| 732 return share_handle_; | 711 return share_handle_; |
| 733 } | 712 } |
| 734 | 713 |
| 735 } // namespace sync_driver | 714 } // namespace sync_driver |
| OLD | NEW |