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