| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <string> | 10 #include <string> |
| 11 #include <utility> | 11 #include <utility> |
| 12 | 12 |
| 13 #include "base/location.h" | 13 #include "base/location.h" |
| 14 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
| 15 #include "base/strings/utf_string_conversions.h" | 15 #include "base/strings/utf_string_conversions.h" |
| 16 #include "base/threading/thread_task_runner_handle.h" | 16 #include "base/threading/thread_task_runner_handle.h" |
| 17 #include "components/sync/api/data_type_error_handler.h" |
| 17 #include "components/sync/api/sync_change.h" | 18 #include "components/sync/api/sync_change.h" |
| 18 #include "components/sync/api/sync_error.h" | 19 #include "components/sync/api/sync_error.h" |
| 19 #include "components/sync/api/syncable_service.h" | 20 #include "components/sync/api/syncable_service.h" |
| 20 #include "components/sync/base/unrecoverable_error_handler.h" | 21 #include "components/sync/base/unrecoverable_error_handler.h" |
| 21 #include "components/sync/core/base_node.h" | 22 #include "components/sync/core/base_node.h" |
| 22 #include "components/sync/core/change_record.h" | 23 #include "components/sync/core/change_record.h" |
| 23 #include "components/sync/core/data_type_error_handler.h" | |
| 24 #include "components/sync/core/read_node.h" | 24 #include "components/sync/core/read_node.h" |
| 25 #include "components/sync/core/read_transaction.h" | 25 #include "components/sync/core/read_transaction.h" |
| 26 #include "components/sync/core/write_node.h" | 26 #include "components/sync/core/write_node.h" |
| 27 #include "components/sync/core/write_transaction.h" | 27 #include "components/sync/core/write_transaction.h" |
| 28 #include "components/sync/driver/sync_api_component_factory.h" | 28 #include "components/sync/driver/sync_api_component_factory.h" |
| 29 #include "components/sync/driver/sync_client.h" | 29 #include "components/sync/driver/sync_client.h" |
| 30 #include "components/sync/syncable/entry.h" // TODO(tim): Bug 123674. | 30 #include "components/sync/syncable/entry.h" // TODO(tim): Bug 123674. |
| 31 | 31 |
| 32 namespace sync_driver { | 32 namespace sync_driver { |
| 33 | 33 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 sync_id, read_node.GetEntitySpecifics(), | 101 sync_id, read_node.GetEntitySpecifics(), |
| 102 read_node.GetModificationTime(), attachment_ids, | 102 read_node.GetModificationTime(), attachment_ids, |
| 103 attachment_service_proxy); | 103 attachment_service_proxy); |
| 104 } | 104 } |
| 105 } | 105 } |
| 106 | 106 |
| 107 } // namespace | 107 } // namespace |
| 108 | 108 |
| 109 GenericChangeProcessor::GenericChangeProcessor( | 109 GenericChangeProcessor::GenericChangeProcessor( |
| 110 syncer::ModelType type, | 110 syncer::ModelType type, |
| 111 syncer::DataTypeErrorHandler* error_handler, | 111 std::unique_ptr<syncer::DataTypeErrorHandler> error_handler, |
| 112 const base::WeakPtr<syncer::SyncableService>& local_service, | 112 const base::WeakPtr<syncer::SyncableService>& local_service, |
| 113 const base::WeakPtr<syncer::SyncMergeResult>& merge_result, | 113 const base::WeakPtr<syncer::SyncMergeResult>& merge_result, |
| 114 syncer::UserShare* user_share, | 114 syncer::UserShare* user_share, |
| 115 SyncClient* sync_client, | 115 SyncClient* sync_client, |
| 116 std::unique_ptr<syncer::AttachmentStoreForSync> attachment_store) | 116 std::unique_ptr<syncer::AttachmentStoreForSync> attachment_store) |
| 117 : ChangeProcessor(error_handler), | 117 : ChangeProcessor(std::move(error_handler)), |
| 118 type_(type), | 118 type_(type), |
| 119 local_service_(local_service), | 119 local_service_(local_service), |
| 120 merge_result_(merge_result), | 120 merge_result_(merge_result), |
| 121 share_handle_(user_share), | 121 share_handle_(user_share), |
| 122 weak_ptr_factory_(this) { | 122 weak_ptr_factory_(this) { |
| 123 DCHECK(CalledOnValidThread()); | 123 DCHECK(CalledOnValidThread()); |
| 124 DCHECK_NE(type_, syncer::UNSPECIFIED); | 124 DCHECK_NE(type_, syncer::UNSPECIFIED); |
| 125 if (attachment_store) { | 125 if (attachment_store) { |
| 126 std::string store_birthday; | 126 std::string store_birthday; |
| 127 { | 127 { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 ? syncer::SyncChange::ACTION_ADD | 179 ? syncer::SyncChange::ACTION_ADD |
| 180 : syncer::SyncChange::ACTION_UPDATE; | 180 : syncer::SyncChange::ACTION_UPDATE; |
| 181 // Need to load specifics from node. | 181 // Need to load specifics from node. |
| 182 syncer::ReadNode read_node(trans); | 182 syncer::ReadNode read_node(trans); |
| 183 if (read_node.InitByIdLookup(it->id) != syncer::BaseNode::INIT_OK) { | 183 if (read_node.InitByIdLookup(it->id) != syncer::BaseNode::INIT_OK) { |
| 184 syncer::SyncError error( | 184 syncer::SyncError error( |
| 185 FROM_HERE, syncer::SyncError::DATATYPE_ERROR, | 185 FROM_HERE, syncer::SyncError::DATATYPE_ERROR, |
| 186 "Failed to look up data for received change with id " + | 186 "Failed to look up data for received change with id " + |
| 187 base::Int64ToString(it->id), | 187 base::Int64ToString(it->id), |
| 188 syncer::GetModelTypeFromSpecifics(it->specifics)); | 188 syncer::GetModelTypeFromSpecifics(it->specifics)); |
| 189 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 189 error_handler()->OnUnrecoverableError(error); |
| 190 return; | 190 return; |
| 191 } | 191 } |
| 192 syncer_changes_.push_back(syncer::SyncChange( | 192 syncer_changes_.push_back(syncer::SyncChange( |
| 193 FROM_HERE, action, | 193 FROM_HERE, action, |
| 194 BuildRemoteSyncData(it->id, read_node, attachment_service_proxy_))); | 194 BuildRemoteSyncData(it->id, read_node, attachment_service_proxy_))); |
| 195 } | 195 } |
| 196 } | 196 } |
| 197 } | 197 } |
| 198 | 198 |
| 199 void GenericChangeProcessor::CommitChangesFromSyncModel() { | 199 void GenericChangeProcessor::CommitChangesFromSyncModel() { |
| 200 DCHECK(CalledOnValidThread()); | 200 DCHECK(CalledOnValidThread()); |
| 201 if (syncer_changes_.empty()) | 201 if (syncer_changes_.empty()) |
| 202 return; | 202 return; |
| 203 if (!local_service_.get()) { | 203 if (!local_service_.get()) { |
| 204 syncer::ModelType type = syncer_changes_[0].sync_data().GetDataType(); | 204 syncer::ModelType type = syncer_changes_[0].sync_data().GetDataType(); |
| 205 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, | 205 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, |
| 206 "Local service destroyed.", type); | 206 "Local service destroyed.", type); |
| 207 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 207 error_handler()->OnUnrecoverableError(error); |
| 208 return; | 208 return; |
| 209 } | 209 } |
| 210 syncer::SyncError error = | 210 syncer::SyncError error = |
| 211 local_service_->ProcessSyncChanges(FROM_HERE, syncer_changes_); | 211 local_service_->ProcessSyncChanges(FROM_HERE, syncer_changes_); |
| 212 syncer_changes_.clear(); | 212 syncer_changes_.clear(); |
| 213 if (error.IsSet()) | 213 if (error.IsSet()) |
| 214 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 214 error_handler()->OnUnrecoverableError(error); |
| 215 } | 215 } |
| 216 | 216 |
| 217 syncer::SyncDataList GenericChangeProcessor::GetAllSyncData( | 217 syncer::SyncDataList GenericChangeProcessor::GetAllSyncData( |
| 218 syncer::ModelType type) const { | 218 syncer::ModelType type) const { |
| 219 DCHECK_EQ(type_, type); | 219 DCHECK_EQ(type_, type); |
| 220 // This is slow / memory intensive. Should be used sparingly by datatypes. | 220 // This is slow / memory intensive. Should be used sparingly by datatypes. |
| 221 syncer::SyncDataList data; | 221 syncer::SyncDataList data; |
| 222 GetAllSyncDataReturnError(&data); | 222 GetAllSyncDataReturnError(&data); |
| 223 return data; | 223 return data; |
| 224 } | 224 } |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 if (root.InitTypeRoot(type_) != syncer::BaseNode::INIT_OK) | 305 if (root.InitTypeRoot(type_) != syncer::BaseNode::INIT_OK) |
| 306 return 0; | 306 return 0; |
| 307 | 307 |
| 308 // Subtract one to account for type's root node. | 308 // Subtract one to account for type's root node. |
| 309 return root.GetTotalNodeCount() - 1; | 309 return root.GetTotalNodeCount() - 1; |
| 310 } | 310 } |
| 311 | 311 |
| 312 namespace { | 312 namespace { |
| 313 | 313 |
| 314 // WARNING: this code is sensitive to compiler optimizations. Be careful | 314 // WARNING: this code is sensitive to compiler optimizations. Be careful |
| 315 // modifying any code around an OnSingleDataTypeUnrecoverableError call, else | 315 // modifying any code around an OnUnrecoverableError call, else the compiler |
| 316 // the compiler attempts to merge it with other calls, losing useful information | 316 // attempts to merge it with other calls, losing useful information in |
| 317 // in breakpad uploads. | 317 // breakpad uploads. |
| 318 syncer::SyncError LogLookupFailure( | 318 syncer::SyncError LogLookupFailure( |
| 319 syncer::BaseNode::InitByLookupResult lookup_result, | 319 syncer::BaseNode::InitByLookupResult lookup_result, |
| 320 const tracked_objects::Location& from_here, | 320 const tracked_objects::Location& from_here, |
| 321 const std::string& error_prefix, | 321 const std::string& error_prefix, |
| 322 syncer::ModelType type, | 322 syncer::ModelType type, |
| 323 syncer::DataTypeErrorHandler* error_handler) { | 323 syncer::DataTypeErrorHandler* error_handler) { |
| 324 switch (lookup_result) { | 324 switch (lookup_result) { |
| 325 case syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD: { | 325 case syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD: { |
| 326 syncer::SyncError error; | 326 syncer::SyncError error; |
| 327 error.Reset( | 327 error.Reset( |
| 328 from_here, | 328 from_here, |
| 329 error_prefix + "could not find entry matching the lookup criteria.", | 329 error_prefix + "could not find entry matching the lookup criteria.", |
| 330 type); | 330 type); |
| 331 error_handler->OnSingleDataTypeUnrecoverableError(error); | 331 error_handler->OnUnrecoverableError(error); |
| 332 LOG(ERROR) << "Delete: Bad entry."; | 332 LOG(ERROR) << "Delete: Bad entry."; |
| 333 return error; | 333 return error; |
| 334 } | 334 } |
| 335 case syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL: { | 335 case syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL: { |
| 336 syncer::SyncError error; | 336 syncer::SyncError error; |
| 337 error.Reset(from_here, error_prefix + "entry is already deleted.", type); | 337 error.Reset(from_here, error_prefix + "entry is already deleted.", type); |
| 338 error_handler->OnSingleDataTypeUnrecoverableError(error); | 338 error_handler->OnUnrecoverableError(error); |
| 339 LOG(ERROR) << "Delete: Deleted entry."; | 339 LOG(ERROR) << "Delete: Deleted entry."; |
| 340 return error; | 340 return error; |
| 341 } | 341 } |
| 342 case syncer::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY: { | 342 case syncer::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY: { |
| 343 syncer::SyncError error; | 343 syncer::SyncError error; |
| 344 error.Reset(from_here, error_prefix + "unable to decrypt", type); | 344 error.Reset(from_here, error_prefix + "unable to decrypt", type); |
| 345 error_handler->OnSingleDataTypeUnrecoverableError(error); | 345 error_handler->OnUnrecoverableError(error); |
| 346 LOG(ERROR) << "Delete: Undecryptable entry."; | 346 LOG(ERROR) << "Delete: Undecryptable entry."; |
| 347 return error; | 347 return error; |
| 348 } | 348 } |
| 349 case syncer::BaseNode::INIT_FAILED_PRECONDITION: { | 349 case syncer::BaseNode::INIT_FAILED_PRECONDITION: { |
| 350 syncer::SyncError error; | 350 syncer::SyncError error; |
| 351 error.Reset(from_here, | 351 error.Reset(from_here, |
| 352 error_prefix + "a precondition was not met for calling init.", | 352 error_prefix + "a precondition was not met for calling init.", |
| 353 type); | 353 type); |
| 354 error_handler->OnSingleDataTypeUnrecoverableError(error); | 354 error_handler->OnUnrecoverableError(error); |
| 355 LOG(ERROR) << "Delete: Failed precondition."; | 355 LOG(ERROR) << "Delete: Failed precondition."; |
| 356 return error; | 356 return error; |
| 357 } | 357 } |
| 358 default: { | 358 default: { |
| 359 syncer::SyncError error; | 359 syncer::SyncError error; |
| 360 // Should have listed all the possible error cases above. | 360 // Should have listed all the possible error cases above. |
| 361 error.Reset(from_here, error_prefix + "unknown error", type); | 361 error.Reset(from_here, error_prefix + "unknown error", type); |
| 362 error_handler->OnSingleDataTypeUnrecoverableError(error); | 362 error_handler->OnUnrecoverableError(error); |
| 363 LOG(ERROR) << "Delete: Unknown error."; | 363 LOG(ERROR) << "Delete: Unknown error."; |
| 364 return error; | 364 return error; |
| 365 } | 365 } |
| 366 } | 366 } |
| 367 } | 367 } |
| 368 | 368 |
| 369 syncer::SyncError AttemptDelete(const syncer::SyncChange& change, | 369 syncer::SyncError AttemptDelete(const syncer::SyncChange& change, |
| 370 syncer::ModelType type, | 370 syncer::ModelType type, |
| 371 const std::string& type_str, | 371 const std::string& type_str, |
| 372 syncer::WriteNode* node, | 372 syncer::WriteNode* node, |
| 373 syncer::DataTypeErrorHandler* error_handler) { | 373 syncer::DataTypeErrorHandler* error_handler) { |
| 374 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE); | 374 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE); |
| 375 if (change.sync_data().IsLocal()) { | 375 if (change.sync_data().IsLocal()) { |
| 376 const std::string& tag = syncer::SyncDataLocal(change.sync_data()).GetTag(); | 376 const std::string& tag = syncer::SyncDataLocal(change.sync_data()).GetTag(); |
| 377 if (tag.empty()) { | 377 if (tag.empty()) { |
| 378 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, | 378 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, |
| 379 "Failed to delete " + type_str + | 379 "Failed to delete " + type_str + |
| 380 " node. Local data, empty tag. " + | 380 " node. Local data, empty tag. " + |
| 381 change.location().ToString(), | 381 change.location().ToString(), |
| 382 type); | 382 type); |
| 383 error_handler->OnSingleDataTypeUnrecoverableError(error); | 383 error_handler->OnUnrecoverableError(error); |
| 384 NOTREACHED(); | 384 NOTREACHED(); |
| 385 return error; | 385 return error; |
| 386 } | 386 } |
| 387 | 387 |
| 388 syncer::BaseNode::InitByLookupResult result = | 388 syncer::BaseNode::InitByLookupResult result = |
| 389 node->InitByClientTagLookup(change.sync_data().GetDataType(), tag); | 389 node->InitByClientTagLookup(change.sync_data().GetDataType(), tag); |
| 390 if (result != syncer::BaseNode::INIT_OK) { | 390 if (result != syncer::BaseNode::INIT_OK) { |
| 391 return LogLookupFailure(result, FROM_HERE, | 391 return LogLookupFailure(result, FROM_HERE, |
| 392 "Failed to delete " + type_str + | 392 "Failed to delete " + type_str + |
| 393 " node. Local data. " + | 393 " node. Local data. " + |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 change, type_str, trans, &sync_node, &new_attachments); | 458 change, type_str, trans, &sync_node, &new_attachments); |
| 459 if (error.IsSet()) { | 459 if (error.IsSet()) { |
| 460 return error; | 460 return error; |
| 461 } | 461 } |
| 462 } else { | 462 } else { |
| 463 syncer::SyncError error( | 463 syncer::SyncError error( |
| 464 FROM_HERE, syncer::SyncError::DATATYPE_ERROR, | 464 FROM_HERE, syncer::SyncError::DATATYPE_ERROR, |
| 465 "Received unset SyncChange in the change processor, " + | 465 "Received unset SyncChange in the change processor, " + |
| 466 change.location().ToString(), | 466 change.location().ToString(), |
| 467 type_); | 467 type_); |
| 468 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 468 error_handler()->OnUnrecoverableError(error); |
| 469 NOTREACHED(); | 469 NOTREACHED(); |
| 470 LOG(ERROR) << "Unset sync change."; | 470 LOG(ERROR) << "Unset sync change."; |
| 471 return error; | 471 return error; |
| 472 } | 472 } |
| 473 } | 473 } |
| 474 | 474 |
| 475 if (!new_attachments.empty()) { | 475 if (!new_attachments.empty()) { |
| 476 // If datatype uses attachments it should have supplied attachment store | 476 // If datatype uses attachments it should have supplied attachment store |
| 477 // which would initialize attachment_service_. Fail if it isn't so. | 477 // which would initialize attachment_service_. Fail if it isn't so. |
| 478 if (!attachment_service_.get()) { | 478 if (!attachment_service_.get()) { |
| 479 syncer::SyncError error( | 479 syncer::SyncError error( |
| 480 FROM_HERE, syncer::SyncError::DATATYPE_ERROR, | 480 FROM_HERE, syncer::SyncError::DATATYPE_ERROR, |
| 481 "Datatype performs attachment operation without initializing " | 481 "Datatype performs attachment operation without initializing " |
| 482 "attachment store", | 482 "attachment store", |
| 483 type_); | 483 type_); |
| 484 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 484 error_handler()->OnUnrecoverableError(error); |
| 485 NOTREACHED(); | 485 NOTREACHED(); |
| 486 return error; | 486 return error; |
| 487 } | 487 } |
| 488 syncer::AttachmentIdList ids_to_upload; | 488 syncer::AttachmentIdList ids_to_upload; |
| 489 ids_to_upload.reserve(new_attachments.size()); | 489 ids_to_upload.reserve(new_attachments.size()); |
| 490 std::copy(new_attachments.begin(), new_attachments.end(), | 490 std::copy(new_attachments.begin(), new_attachments.end(), |
| 491 std::back_inserter(ids_to_upload)); | 491 std::back_inserter(ids_to_upload)); |
| 492 attachment_service_->UploadAttachments(ids_to_upload); | 492 attachment_service_->UploadAttachments(ids_to_upload); |
| 493 } | 493 } |
| 494 | 494 |
| 495 return syncer::SyncError(); | 495 return syncer::SyncError(); |
| 496 } | 496 } |
| 497 | 497 |
| 498 // WARNING: this code is sensitive to compiler optimizations. Be careful | 498 // WARNING: this code is sensitive to compiler optimizations. Be careful |
| 499 // modifying any code around an OnSingleDataTypeUnrecoverableError call, else | 499 // modifying any code around an OnUnrecoverableError call, else the compiler |
| 500 // the compiler attempts to merge it with other calls, losing useful information | 500 // attempts to merge it with other calls, losing useful information in |
| 501 // in breakpad uploads. | 501 // breakpad uploads. |
| 502 syncer::SyncError GenericChangeProcessor::HandleActionAdd( | 502 syncer::SyncError GenericChangeProcessor::HandleActionAdd( |
| 503 const syncer::SyncChange& change, | 503 const syncer::SyncChange& change, |
| 504 const std::string& type_str, | 504 const std::string& type_str, |
| 505 const syncer::WriteTransaction& trans, | 505 const syncer::WriteTransaction& trans, |
| 506 syncer::WriteNode* sync_node, | 506 syncer::WriteNode* sync_node, |
| 507 syncer::AttachmentIdSet* new_attachments) { | 507 syncer::AttachmentIdSet* new_attachments) { |
| 508 // TODO(sync): Handle other types of creation (custom parents, folders, | 508 // TODO(sync): Handle other types of creation (custom parents, folders, |
| 509 // etc.). | 509 // etc.). |
| 510 const syncer::SyncDataLocal sync_data_local(change.sync_data()); | 510 const syncer::SyncDataLocal sync_data_local(change.sync_data()); |
| 511 syncer::WriteNode::InitUniqueByCreationResult result = | 511 syncer::WriteNode::InitUniqueByCreationResult result = |
| 512 sync_node->InitUniqueByCreation(sync_data_local.GetDataType(), | 512 sync_node->InitUniqueByCreation(sync_data_local.GetDataType(), |
| 513 sync_data_local.GetTag()); | 513 sync_data_local.GetTag()); |
| 514 if (result != syncer::WriteNode::INIT_SUCCESS) { | 514 if (result != syncer::WriteNode::INIT_SUCCESS) { |
| 515 std::string error_prefix = "Failed to create " + type_str + " node: " + | 515 std::string error_prefix = "Failed to create " + type_str + " node: " + |
| 516 change.location().ToString() + ", "; | 516 change.location().ToString() + ", "; |
| 517 switch (result) { | 517 switch (result) { |
| 518 case syncer::WriteNode::INIT_FAILED_EMPTY_TAG: { | 518 case syncer::WriteNode::INIT_FAILED_EMPTY_TAG: { |
| 519 syncer::SyncError error; | 519 syncer::SyncError error; |
| 520 error.Reset(FROM_HERE, error_prefix + "empty tag", type_); | 520 error.Reset(FROM_HERE, error_prefix + "empty tag", type_); |
| 521 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 521 error_handler()->OnUnrecoverableError(error); |
| 522 LOG(ERROR) << "Create: Empty tag."; | 522 LOG(ERROR) << "Create: Empty tag."; |
| 523 return error; | 523 return error; |
| 524 } | 524 } |
| 525 case syncer::WriteNode::INIT_FAILED_COULD_NOT_CREATE_ENTRY: { | 525 case syncer::WriteNode::INIT_FAILED_COULD_NOT_CREATE_ENTRY: { |
| 526 syncer::SyncError error; | 526 syncer::SyncError error; |
| 527 error.Reset(FROM_HERE, error_prefix + "failed to create entry", type_); | 527 error.Reset(FROM_HERE, error_prefix + "failed to create entry", type_); |
| 528 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 528 error_handler()->OnUnrecoverableError(error); |
| 529 LOG(ERROR) << "Create: Could not create entry."; | 529 LOG(ERROR) << "Create: Could not create entry."; |
| 530 return error; | 530 return error; |
| 531 } | 531 } |
| 532 case syncer::WriteNode::INIT_FAILED_SET_PREDECESSOR: { | 532 case syncer::WriteNode::INIT_FAILED_SET_PREDECESSOR: { |
| 533 syncer::SyncError error; | 533 syncer::SyncError error; |
| 534 error.Reset(FROM_HERE, error_prefix + "failed to set predecessor", | 534 error.Reset(FROM_HERE, error_prefix + "failed to set predecessor", |
| 535 type_); | 535 type_); |
| 536 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 536 error_handler()->OnUnrecoverableError(error); |
| 537 LOG(ERROR) << "Create: Bad predecessor."; | 537 LOG(ERROR) << "Create: Bad predecessor."; |
| 538 return error; | 538 return error; |
| 539 } | 539 } |
| 540 case syncer::WriteNode::INIT_FAILED_DECRYPT_EXISTING_ENTRY: { | 540 case syncer::WriteNode::INIT_FAILED_DECRYPT_EXISTING_ENTRY: { |
| 541 syncer::SyncError error; | 541 syncer::SyncError error; |
| 542 error.Reset(FROM_HERE, error_prefix + "failed to decrypt", type_); | 542 error.Reset(FROM_HERE, error_prefix + "failed to decrypt", type_); |
| 543 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 543 error_handler()->OnUnrecoverableError(error); |
| 544 LOG(ERROR) << "Create: Failed to decrypt."; | 544 LOG(ERROR) << "Create: Failed to decrypt."; |
| 545 return error; | 545 return error; |
| 546 } | 546 } |
| 547 default: { | 547 default: { |
| 548 syncer::SyncError error; | 548 syncer::SyncError error; |
| 549 error.Reset(FROM_HERE, error_prefix + "unknown error", type_); | 549 error.Reset(FROM_HERE, error_prefix + "unknown error", type_); |
| 550 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 550 error_handler()->OnUnrecoverableError(error); |
| 551 LOG(ERROR) << "Create: Unknown error."; | 551 LOG(ERROR) << "Create: Unknown error."; |
| 552 return error; | 552 return error; |
| 553 } | 553 } |
| 554 } | 554 } |
| 555 } | 555 } |
| 556 sync_node->SetTitle(change.sync_data().GetTitle()); | 556 sync_node->SetTitle(change.sync_data().GetTitle()); |
| 557 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); | 557 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); |
| 558 | 558 |
| 559 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds(); | 559 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds(); |
| 560 SetAttachmentMetadata(attachment_ids, sync_node); | 560 SetAttachmentMetadata(attachment_ids, sync_node); |
| 561 | 561 |
| 562 // Return any newly added attachments. | 562 // Return any newly added attachments. |
| 563 new_attachments->insert(attachment_ids.begin(), attachment_ids.end()); | 563 new_attachments->insert(attachment_ids.begin(), attachment_ids.end()); |
| 564 if (merge_result_.get()) { | 564 if (merge_result_.get()) { |
| 565 merge_result_->set_num_items_added(merge_result_->num_items_added() + 1); | 565 merge_result_->set_num_items_added(merge_result_->num_items_added() + 1); |
| 566 } | 566 } |
| 567 return syncer::SyncError(); | 567 return syncer::SyncError(); |
| 568 } | 568 } |
| 569 // WARNING: this code is sensitive to compiler optimizations. Be careful | 569 // WARNING: this code is sensitive to compiler optimizations. Be careful |
| 570 // modifying any code around an OnSingleDataTypeUnrecoverableError call, else | 570 // modifying any code around an OnUnrecoverableError call, else the compiler |
| 571 // the compiler attempts to merge it with other calls, losing useful information | 571 // attempts to merge it with other calls, losing useful information in |
| 572 // in breakpad uploads. | 572 // breakpad uploads. |
| 573 syncer::SyncError GenericChangeProcessor::HandleActionUpdate( | 573 syncer::SyncError GenericChangeProcessor::HandleActionUpdate( |
| 574 const syncer::SyncChange& change, | 574 const syncer::SyncChange& change, |
| 575 const std::string& type_str, | 575 const std::string& type_str, |
| 576 const syncer::WriteTransaction& trans, | 576 const syncer::WriteTransaction& trans, |
| 577 syncer::WriteNode* sync_node, | 577 syncer::WriteNode* sync_node, |
| 578 syncer::AttachmentIdSet* new_attachments) { | 578 syncer::AttachmentIdSet* new_attachments) { |
| 579 const syncer::SyncDataLocal sync_data_local(change.sync_data()); | 579 const syncer::SyncDataLocal sync_data_local(change.sync_data()); |
| 580 syncer::BaseNode::InitByLookupResult result = | 580 syncer::BaseNode::InitByLookupResult result = |
| 581 sync_node->InitByClientTagLookup(sync_data_local.GetDataType(), | 581 sync_node->InitByClientTagLookup(sync_data_local.GetDataType(), |
| 582 sync_data_local.GetTag()); | 582 sync_data_local.GetTag()); |
| 583 if (result != syncer::BaseNode::INIT_OK) { | 583 if (result != syncer::BaseNode::INIT_OK) { |
| 584 std::string error_prefix = "Failed to load " + type_str + " node. " + | 584 std::string error_prefix = "Failed to load " + type_str + " node. " + |
| 585 change.location().ToString() + ", "; | 585 change.location().ToString() + ", "; |
| 586 if (result == syncer::BaseNode::INIT_FAILED_PRECONDITION) { | 586 if (result == syncer::BaseNode::INIT_FAILED_PRECONDITION) { |
| 587 syncer::SyncError error; | 587 syncer::SyncError error; |
| 588 error.Reset(FROM_HERE, error_prefix + "empty tag", type_); | 588 error.Reset(FROM_HERE, error_prefix + "empty tag", type_); |
| 589 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 589 error_handler()->OnUnrecoverableError(error); |
| 590 LOG(ERROR) << "Update: Empty tag."; | 590 LOG(ERROR) << "Update: Empty tag."; |
| 591 return error; | 591 return error; |
| 592 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD) { | 592 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD) { |
| 593 syncer::SyncError error; | 593 syncer::SyncError error; |
| 594 error.Reset(FROM_HERE, error_prefix + "bad entry", type_); | 594 error.Reset(FROM_HERE, error_prefix + "bad entry", type_); |
| 595 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 595 error_handler()->OnUnrecoverableError(error); |
| 596 LOG(ERROR) << "Update: bad entry."; | 596 LOG(ERROR) << "Update: bad entry."; |
| 597 return error; | 597 return error; |
| 598 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL) { | 598 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL) { |
| 599 syncer::SyncError error; | 599 syncer::SyncError error; |
| 600 error.Reset(FROM_HERE, error_prefix + "deleted entry", type_); | 600 error.Reset(FROM_HERE, error_prefix + "deleted entry", type_); |
| 601 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 601 error_handler()->OnUnrecoverableError(error); |
| 602 LOG(ERROR) << "Update: deleted entry."; | 602 LOG(ERROR) << "Update: deleted entry."; |
| 603 return error; | 603 return error; |
| 604 } else if (result == syncer::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY) { | 604 } else if (result == syncer::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY) { |
| 605 syncer::SyncError error; | 605 syncer::SyncError error; |
| 606 error.Reset(FROM_HERE, error_prefix + "failed to decrypt", type_); | 606 error.Reset(FROM_HERE, error_prefix + "failed to decrypt", type_); |
| 607 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 607 error_handler()->OnUnrecoverableError(error); |
| 608 LOG(ERROR) << "Update: Failed to decrypt."; | 608 LOG(ERROR) << "Update: Failed to decrypt."; |
| 609 return error; | 609 return error; |
| 610 } else { | 610 } else { |
| 611 NOTREACHED(); | 611 NOTREACHED(); |
| 612 syncer::SyncError error; | 612 syncer::SyncError error; |
| 613 error.Reset(FROM_HERE, error_prefix + "unknown error", type_); | 613 error.Reset(FROM_HERE, error_prefix + "unknown error", type_); |
| 614 error_handler()->OnSingleDataTypeUnrecoverableError(error); | 614 error_handler()->OnUnrecoverableError(error); |
| 615 LOG(ERROR) << "Update: Unknown error."; | 615 LOG(ERROR) << "Update: Unknown error."; |
| 616 return error; | 616 return error; |
| 617 } | 617 } |
| 618 } | 618 } |
| 619 | 619 |
| 620 sync_node->SetTitle(change.sync_data().GetTitle()); | 620 sync_node->SetTitle(change.sync_data().GetTitle()); |
| 621 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); | 621 SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node); |
| 622 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds(); | 622 syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds(); |
| 623 SetAttachmentMetadata(attachment_ids, sync_node); | 623 SetAttachmentMetadata(attachment_ids, sync_node); |
| 624 | 624 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 } | 683 } |
| 684 } | 684 } |
| 685 | 685 |
| 686 std::unique_ptr<syncer::AttachmentService> | 686 std::unique_ptr<syncer::AttachmentService> |
| 687 GenericChangeProcessor::GetAttachmentService() const { | 687 GenericChangeProcessor::GetAttachmentService() const { |
| 688 return std::unique_ptr<syncer::AttachmentService>( | 688 return std::unique_ptr<syncer::AttachmentService>( |
| 689 new syncer::AttachmentServiceProxy(attachment_service_proxy_)); | 689 new syncer::AttachmentServiceProxy(attachment_service_proxy_)); |
| 690 } | 690 } |
| 691 | 691 |
| 692 } // namespace sync_driver | 692 } // namespace sync_driver |
| OLD | NEW |