Index: chrome/browser/sync/glue/generic_change_processor.cc |
diff --git a/chrome/browser/sync/glue/generic_change_processor.cc b/chrome/browser/sync/glue/generic_change_processor.cc |
index 3317c89cfe2d6d5c4b1de96b03e7540977fd3d29..5a624dc6a2ea3bdcb2a8bb9f0fe5d014112c6125 100644 |
--- a/chrome/browser/sync/glue/generic_change_processor.cc |
+++ b/chrome/browser/sync/glue/generic_change_processor.cc |
@@ -128,26 +128,119 @@ SyncError GenericChangeProcessor::GetSyncDataForType( |
namespace { |
-bool AttemptDelete(const SyncChange& change, sync_api::WriteNode* node) { |
+// TODO(isherman): Investigating http://crbug.com/121592 |
+SyncError AttemptDelete(const SyncChange& change, |
+ syncable::ModelType type, |
+ std::string type_str, |
+ sync_api::WriteNode* node, |
+ DataTypeErrorHandler* error_handler) { |
DCHECK_EQ(change.change_type(), SyncChange::ACTION_DELETE); |
if (change.sync_data().IsLocal()) { |
const std::string& tag = change.sync_data().GetTag(); |
if (tag.empty()) { |
- return false; |
+ SyncError error( |
+ FROM_HERE, |
+ "Failed to delete " + type_str + " node. Local data, empty tag.", |
+ type); |
+ error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
+ error.message()); |
+ return error; |
} |
- if (node->InitByClientTagLookup( |
- change.sync_data().GetDataType(), tag) != |
- sync_api::BaseNode::INIT_OK) { |
- return false; |
+ |
+ sync_api::BaseNode::InitByLookupResult result = |
+ node->InitByClientTagLookup(change.sync_data().GetDataType(), tag); |
+ if (result != sync_api::BaseNode::INIT_OK) { |
+ SyncError error; |
+ switch (result) { |
+ case sync_api::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD: |
+ error.Reset(FROM_HERE, |
+ "Failed to delete " + type_str + " node. Local data, " |
+ "could not find entry matching the lookup criteria.", |
+ type); |
+ error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
+ error.message()); |
+ case sync_api::BaseNode::INIT_FAILED_ENTRY_IS_DEL: |
tim (not reviewing)
2012/05/16 17:19:37
You need to add good old break/return statements i
Ilya Sherman
2012/05/16 21:10:01
Done.
|
+ error.Reset(FROM_HERE, |
+ "Failed to delete " + type_str + " node. Local data, " |
+ "entry is already deleted.", |
+ type); |
+ error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
+ error.message()); |
+ case sync_api::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY: |
+ error.Reset(FROM_HERE, |
+ "Failed to delete " + type_str + " node. Local data, " |
+ "unable to decrypt", |
+ type); |
+ error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
+ error.message()); |
+ case sync_api::BaseNode::INIT_FAILED_PRECONDITION: |
+ error.Reset(FROM_HERE, |
+ "Failed to delete " + type_str + " node. Local data, " |
+ "a precondition was not met for calling init.", |
+ type); |
+ error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
+ error.message()); |
+ default: |
+ // Should have listed all the possible error cases above. |
+ NOTREACHED(); |
+ error.Reset(FROM_HERE, |
+ "Failed to delete " + type_str + " node. Local data, " |
+ "unknown error", |
+ type); |
+ error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
+ error.message()); |
+ } |
+ return error; |
} |
} else { |
- if (node->InitByIdLookup(change.sync_data().GetRemoteId()) != |
- sync_api::BaseNode::INIT_OK) { |
- return false; |
+ sync_api::BaseNode::InitByLookupResult result = |
+ node->InitByIdLookup(change.sync_data().GetRemoteId()); |
+ if (result != sync_api::BaseNode::INIT_OK) { |
+ SyncError error; |
+ switch (result) { |
+ case sync_api::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD: |
tim (not reviewing)
2012/05/16 17:19:37
One possible way we could reduce the code explosio
tim (not reviewing)
2012/05/16 17:23:30
Doh, I guess that will neuter the FROM_HERE in the
Ilya Sherman
2012/05/16 21:10:01
Good call, done.
|
+ error.Reset(FROM_HERE, |
+ "Failed to delete " + type_str + " node. Non-local data, " |
+ "could not find entry matching the lookup criteria.", |
+ type); |
+ error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
+ error.message()); |
+ case sync_api::BaseNode::INIT_FAILED_ENTRY_IS_DEL: |
+ error.Reset(FROM_HERE, |
+ "Failed to delete " + type_str + " node. Non-local data, " |
+ "entry is already deleted.", |
+ type); |
+ error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
+ error.message()); |
+ case sync_api::BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY: |
+ error.Reset(FROM_HERE, |
+ "Failed to delete " + type_str + " node. Non-local data, " |
+ "unable to decrypt", |
+ type); |
+ error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
+ error.message()); |
+ case sync_api::BaseNode::INIT_FAILED_PRECONDITION: |
+ error.Reset(FROM_HERE, |
+ "Failed to delete " + type_str + " node. Non-local data, " |
+ "a precondition was not met for calling init.", |
+ type); |
+ error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
+ error.message()); |
+ default: |
+ // Should have listed all the possible error cases above. |
+ NOTREACHED(); |
+ error.Reset(FROM_HERE, |
+ "Failed to delete " + type_str + " node. Non-local data, " |
+ "unknown error", |
+ type); |
+ error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
+ error.message()); |
+ } |
+ return error; |
} |
} |
node->Remove(); |
- return true; |
+ return SyncError(); |
} |
} // namespace |
@@ -167,13 +260,10 @@ SyncError GenericChangeProcessor::ProcessSyncChanges( |
std::string type_str = syncable::ModelTypeToString(type); |
sync_api::WriteNode sync_node(&trans); |
if (change.change_type() == SyncChange::ACTION_DELETE) { |
- if (!AttemptDelete(change, &sync_node)) { |
+ SyncError error = AttemptDelete(change, type, type_str, &sync_node, |
+ error_handler()); |
+ if (error.IsSet()) { |
NOTREACHED(); |
- SyncError error(FROM_HERE, |
- "Failed to delete " + type_str + " node.", |
- type); |
- error_handler()->OnSingleDatatypeUnrecoverableError(error.location(), |
- error.message()); |
return error; |
} |
} else if (change.change_type() == SyncChange::ACTION_ADD) { |