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 6c85de91ba0779b2eaa70619ff078c99d95c4c2f..d24d4779c6fb36f10b5a621664c37179e4a5b78d 100644 |
--- a/chrome/browser/sync/glue/generic_change_processor.cc |
+++ b/chrome/browser/sync/glue/generic_change_processor.cc |
@@ -7,6 +7,7 @@ |
#include "base/tracked.h" |
#include "chrome/browser/sync/api/syncable_service.h" |
#include "chrome/browser/sync/api/sync_change.h" |
+#include "chrome/browser/sync/api/sync_error.h" |
#include "chrome/browser/sync/engine/syncapi.h" |
#include "chrome/browser/sync/syncable/nigori_util.h" |
@@ -69,37 +70,45 @@ void GenericChangeProcessor::CommitChangesFromSyncModel() { |
return; |
if (syncer_changes_.empty()) |
return; |
- local_service_->ProcessSyncChanges(FROM_HERE, syncer_changes_); |
+ SyncError error = local_service_->ProcessSyncChanges(FROM_HERE, |
+ syncer_changes_); |
syncer_changes_.clear(); |
+ if (error.IsSet()) { |
+ error_handler()->OnUnrecoverableError(error.location(), error.message()); |
+ } |
} |
-bool GenericChangeProcessor::GetSyncDataForType( |
+SyncError GenericChangeProcessor::GetSyncDataForType( |
syncable::ModelType type, |
SyncDataList* current_sync_data) { |
std::string type_name = syncable::ModelTypeToString(type); |
sync_api::ReadTransaction trans(FROM_HERE, share_handle()); |
sync_api::ReadNode root(&trans); |
if (!root.InitByTagLookup(syncable::ModelTypeToRootTag(type))) { |
- LOG(ERROR) << "Server did not create the top-level " + type_name + " node." |
- << " We might be running against an out-of-date server."; |
- return false; |
+ SyncError error(FROM_HERE, |
+ "Server did not create the top-level " + type_name + |
+ " node. We might be running against an out-of-date server.", |
+ type); |
+ return error; |
} |
int64 sync_child_id = root.GetFirstChildId(); |
while (sync_child_id != sync_api::kInvalidId) { |
sync_api::ReadNode sync_child_node(&trans); |
if (!sync_child_node.InitByIdLookup(sync_child_id)) { |
- LOG(ERROR) << "Failed to fetch child node for type " + type_name + "."; |
- return false; |
+ SyncError error(FROM_HERE, |
+ "Failed to fetch child node for type " + type_name + ".", |
+ type); |
+ return error; |
} |
current_sync_data->push_back(SyncData::CreateRemoteData( |
sync_child_node.GetEntitySpecifics())); |
sync_child_id = sync_child_node.GetSuccessorId(); |
} |
- return true; |
+ return SyncError(); |
} |
-void GenericChangeProcessor::ProcessSyncChanges( |
+SyncError GenericChangeProcessor::ProcessSyncChanges( |
const tracked_objects::Location& from_here, |
const SyncChangeList& list_of_changes) { |
sync_api::WriteTransaction trans(from_here, share_handle()); |
@@ -109,17 +118,20 @@ void GenericChangeProcessor::ProcessSyncChanges( |
++iter) { |
const SyncChange& change = *iter; |
DCHECK_NE(change.sync_data().GetDataType(), syncable::UNSPECIFIED); |
- std::string type_str = syncable::ModelTypeToString( |
- change.sync_data().GetDataType()); |
+ syncable::ModelType type = change.sync_data().GetDataType(); |
+ std::string type_str = syncable::ModelTypeToString(type); |
sync_api::WriteNode sync_node(&trans); |
if (change.change_type() == SyncChange::ACTION_DELETE) { |
if (change.sync_data().GetTag() == "" || |
!sync_node.InitByClientTagLookup(change.sync_data().GetDataType(), |
change.sync_data().GetTag())) { |
NOTREACHED(); |
- error_handler()->OnUnrecoverableError(FROM_HERE, |
- "Failed to delete " + type_str + " node."); |
- return; |
+ SyncError error(FROM_HERE, |
+ "Failed to delete " + type_str + " node.", |
+ type); |
+ error_handler()->OnUnrecoverableError(error.location(), |
+ error.message()); |
+ return error; |
} |
sync_node.Remove(); |
} else if (change.change_type() == SyncChange::ACTION_ADD) { |
@@ -129,16 +141,23 @@ void GenericChangeProcessor::ProcessSyncChanges( |
if (!root_node.InitByTagLookup( |
syncable::ModelTypeToRootTag(change.sync_data().GetDataType()))) { |
NOTREACHED(); |
- error_handler()->OnUnrecoverableError(FROM_HERE, |
- "Failed to look up root node for type " + type_str); |
- return; |
+ SyncError error(FROM_HERE, |
+ "Failed to look up root node for type " + type_str, |
+ type); |
+ error_handler()->OnUnrecoverableError(error.location(), |
+ error.message()); |
+ return error; |
} |
if (!sync_node.InitUniqueByCreation(change.sync_data().GetDataType(), |
root_node, |
change.sync_data().GetTag())) { |
- error_handler()->OnUnrecoverableError(FROM_HERE, |
- "Failed to create " + type_str + " node."); |
- return; |
+ NOTREACHED(); |
+ SyncError error(FROM_HERE, |
+ "Failed to create " + type_str + " node.", |
+ type); |
+ error_handler()->OnUnrecoverableError(error.location(), |
+ error.message()); |
+ return error; |
} |
sync_node.SetTitle(UTF8ToWide(change.sync_data().GetTitle())); |
sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics()); |
@@ -147,9 +166,12 @@ void GenericChangeProcessor::ProcessSyncChanges( |
!sync_node.InitByClientTagLookup(change.sync_data().GetDataType(), |
change.sync_data().GetTag())) { |
NOTREACHED(); |
- error_handler()->OnUnrecoverableError(FROM_HERE, |
- "Failed to update " + type_str + " node"); |
- return; |
+ SyncError error(FROM_HERE, |
+ "Failed to update " + type_str + " node.", |
+ type); |
+ error_handler()->OnUnrecoverableError(error.location(), |
+ error.message()); |
+ return error; |
} |
sync_node.SetTitle(UTF8ToWide(change.sync_data().GetTitle())); |
sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics()); |
@@ -157,11 +179,15 @@ void GenericChangeProcessor::ProcessSyncChanges( |
// successor, parent, etc.). |
} else { |
NOTREACHED(); |
- error_handler()->OnUnrecoverableError(FROM_HERE, |
- "Received unset SyncChange in the change processor."); |
- return; |
+ SyncError error(FROM_HERE, |
+ "Received unset SyncChange in the change processor.", |
+ type); |
+ error_handler()->OnUnrecoverableError(error.location(), |
+ error.message()); |
+ return error; |
} |
} |
+ return SyncError(); |
} |
bool GenericChangeProcessor::SyncModelHasUserCreatedNodes( |