| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/sync/glue/generic_change_processor.h" | 5 #include "chrome/browser/sync/glue/generic_change_processor.h" |
| 6 | 6 |
| 7 #include "base/location.h" | 7 #include "base/location.h" |
| 8 #include "base/string_number_conversions.h" | 8 #include "base/string_number_conversions.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "content/public/browser/browser_thread.h" | 10 #include "content/public/browser/browser_thread.h" |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 syncer::ModelType type, | 201 syncer::ModelType type, |
| 202 const std::string& type_str, | 202 const std::string& type_str, |
| 203 syncer::WriteNode* node, | 203 syncer::WriteNode* node, |
| 204 DataTypeErrorHandler* error_handler) { | 204 DataTypeErrorHandler* error_handler) { |
| 205 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE); | 205 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE); |
| 206 if (change.sync_data().IsLocal()) { | 206 if (change.sync_data().IsLocal()) { |
| 207 const std::string& tag = change.sync_data().GetTag(); | 207 const std::string& tag = change.sync_data().GetTag(); |
| 208 if (tag.empty()) { | 208 if (tag.empty()) { |
| 209 syncer::SyncError error( | 209 syncer::SyncError error( |
| 210 FROM_HERE, | 210 FROM_HERE, |
| 211 "Failed to delete " + type_str + " node. Local data, empty tag.", | 211 "Failed to delete " + type_str + " node. Local data, empty tag. " + |
| 212 change.location().ToString(), |
| 212 type); | 213 type); |
| 213 error_handler->OnSingleDatatypeUnrecoverableError(error.location(), | 214 error_handler->OnSingleDatatypeUnrecoverableError(error.location(), |
| 214 error.message()); | 215 error.message()); |
| 215 NOTREACHED(); | 216 NOTREACHED(); |
| 216 return error; | 217 return error; |
| 217 } | 218 } |
| 218 | 219 |
| 219 syncer::BaseNode::InitByLookupResult result = | 220 syncer::BaseNode::InitByLookupResult result = |
| 220 node->InitByClientTagLookup(change.sync_data().GetDataType(), tag); | 221 node->InitByClientTagLookup(change.sync_data().GetDataType(), tag); |
| 221 if (result != syncer::BaseNode::INIT_OK) { | 222 if (result != syncer::BaseNode::INIT_OK) { |
| 222 return LogLookupFailure( | 223 return LogLookupFailure( |
| 223 result, FROM_HERE, | 224 result, FROM_HERE, |
| 224 "Failed to delete " + type_str + " node. Local data, ", | 225 "Failed to delete " + type_str + " node. Local data. " + |
| 226 change.location().ToString(), |
| 225 type, error_handler); | 227 type, error_handler); |
| 226 } | 228 } |
| 227 } else { | 229 } else { |
| 228 syncer::BaseNode::InitByLookupResult result = | 230 syncer::BaseNode::InitByLookupResult result = |
| 229 node->InitByIdLookup(change.sync_data().GetRemoteId()); | 231 node->InitByIdLookup(change.sync_data().GetRemoteId()); |
| 230 if (result != syncer::BaseNode::INIT_OK) { | 232 if (result != syncer::BaseNode::INIT_OK) { |
| 231 return LogLookupFailure( | 233 return LogLookupFailure( |
| 232 result, FROM_HERE, | 234 result, FROM_HERE, |
| 233 "Failed to delete " + type_str + " node. Non-local data, ", | 235 "Failed to delete " + type_str + " node. Non-local data. " + |
| 236 change.location().ToString(), |
| 234 type, error_handler); | 237 type, error_handler); |
| 235 } | 238 } |
| 236 } | 239 } |
| 237 node->Remove(); | 240 node->Remove(); |
| 238 return syncer::SyncError(); | 241 return syncer::SyncError(); |
| 239 } | 242 } |
| 240 | 243 |
| 241 } // namespace | 244 } // namespace |
| 242 | 245 |
| 243 // WARNING: this code is sensitive to compiler optimizations. Be careful | 246 // WARNING: this code is sensitive to compiler optimizations. Be careful |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 error.message()); | 283 error.message()); |
| 281 NOTREACHED(); | 284 NOTREACHED(); |
| 282 LOG(ERROR) << "Create: no root node."; | 285 LOG(ERROR) << "Create: no root node."; |
| 283 return error; | 286 return error; |
| 284 } | 287 } |
| 285 syncer::WriteNode::InitUniqueByCreationResult result = | 288 syncer::WriteNode::InitUniqueByCreationResult result = |
| 286 sync_node.InitUniqueByCreation(change.sync_data().GetDataType(), | 289 sync_node.InitUniqueByCreation(change.sync_data().GetDataType(), |
| 287 root_node, | 290 root_node, |
| 288 change.sync_data().GetTag()); | 291 change.sync_data().GetTag()); |
| 289 if (result != syncer::WriteNode::INIT_SUCCESS) { | 292 if (result != syncer::WriteNode::INIT_SUCCESS) { |
| 290 std::string error_prefix = "Failed to create " + type_str + " node: "; | 293 std::string error_prefix = "Failed to create " + type_str + " node: " + |
| 294 change.location().ToString() + ", "; |
| 291 switch (result) { | 295 switch (result) { |
| 292 case syncer::WriteNode::INIT_FAILED_EMPTY_TAG: { | 296 case syncer::WriteNode::INIT_FAILED_EMPTY_TAG: { |
| 293 syncer::SyncError error; | 297 syncer::SyncError error; |
| 294 error.Reset(FROM_HERE, error_prefix + "empty tag", type); | 298 error.Reset(FROM_HERE, error_prefix + "empty tag", type); |
| 295 error_handler()->OnSingleDatatypeUnrecoverableError( | 299 error_handler()->OnSingleDatatypeUnrecoverableError( |
| 296 FROM_HERE, error.message()); | 300 FROM_HERE, error.message()); |
| 297 LOG(ERROR) << "Create: Empty tag."; | 301 LOG(ERROR) << "Create: Empty tag."; |
| 298 return error; | 302 return error; |
| 299 } | 303 } |
| 300 case syncer::WriteNode::INIT_FAILED_ENTRY_ALREADY_EXISTS: { | 304 case syncer::WriteNode::INIT_FAILED_ENTRY_ALREADY_EXISTS: { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 } | 338 } |
| 335 } | 339 } |
| 336 sync_node.SetTitle(UTF8ToWide(change.sync_data().GetTitle())); | 340 sync_node.SetTitle(UTF8ToWide(change.sync_data().GetTitle())); |
| 337 sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics()); | 341 sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics()); |
| 338 } else if (change.change_type() == syncer::SyncChange::ACTION_UPDATE) { | 342 } else if (change.change_type() == syncer::SyncChange::ACTION_UPDATE) { |
| 339 // TODO(zea): consider having this logic for all possible changes? | 343 // TODO(zea): consider having this logic for all possible changes? |
| 340 syncer::BaseNode::InitByLookupResult result = | 344 syncer::BaseNode::InitByLookupResult result = |
| 341 sync_node.InitByClientTagLookup(change.sync_data().GetDataType(), | 345 sync_node.InitByClientTagLookup(change.sync_data().GetDataType(), |
| 342 change.sync_data().GetTag()); | 346 change.sync_data().GetTag()); |
| 343 if (result != syncer::BaseNode::INIT_OK) { | 347 if (result != syncer::BaseNode::INIT_OK) { |
| 348 std::string error_prefix = "Failed to load " + type_str + " node. " + |
| 349 change.location().ToString() + ", "; |
| 344 if (result == syncer::BaseNode::INIT_FAILED_PRECONDITION) { | 350 if (result == syncer::BaseNode::INIT_FAILED_PRECONDITION) { |
| 345 syncer::SyncError error; | 351 syncer::SyncError error; |
| 346 error.Reset(FROM_HERE, | 352 error.Reset(FROM_HERE, |
| 347 "Failed to load entry w/empty tag for " + type_str + ".", | 353 error_prefix + "empty tag", |
| 348 type); | 354 type); |
| 349 error_handler()->OnSingleDatatypeUnrecoverableError( | 355 error_handler()->OnSingleDatatypeUnrecoverableError( |
| 350 FROM_HERE, error.message()); | 356 FROM_HERE, error.message()); |
| 351 LOG(ERROR) << "Update: Empty tag."; | 357 LOG(ERROR) << "Update: Empty tag."; |
| 352 return error; | 358 return error; |
| 353 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD) { | 359 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_NOT_GOOD) { |
| 354 syncer::SyncError error; | 360 syncer::SyncError error; |
| 355 error.Reset(FROM_HERE, | 361 error.Reset(FROM_HERE, |
| 356 "Failed to load bad entry for " + type_str + ".", | 362 error_prefix + "bad entry", |
| 357 type); | 363 type); |
| 358 error_handler()->OnSingleDatatypeUnrecoverableError( | 364 error_handler()->OnSingleDatatypeUnrecoverableError( |
| 359 FROM_HERE, error.message()); | 365 FROM_HERE, error.message()); |
| 360 LOG(ERROR) << "Update: bad entry."; | 366 LOG(ERROR) << "Update: bad entry."; |
| 361 return error; | 367 return error; |
| 362 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL) { | 368 } else if (result == syncer::BaseNode::INIT_FAILED_ENTRY_IS_DEL) { |
| 363 syncer::SyncError error; | 369 syncer::SyncError error; |
| 364 error.Reset(FROM_HERE, | 370 error.Reset(FROM_HERE, |
| 365 "Failed to load deleted entry for " + type_str + ".", | 371 error_prefix + "deleted entry", |
| 366 type); | 372 type); |
| 367 error_handler()->OnSingleDatatypeUnrecoverableError( | 373 error_handler()->OnSingleDatatypeUnrecoverableError( |
| 368 FROM_HERE, error.message()); | 374 FROM_HERE, error.message()); |
| 369 LOG(ERROR) << "Update: deleted entry."; | 375 LOG(ERROR) << "Update: deleted entry."; |
| 370 return error; | 376 return error; |
| 371 } else { | 377 } else { |
| 372 syncer::Cryptographer* crypto = trans.GetCryptographer(); | 378 syncer::Cryptographer* crypto = trans.GetCryptographer(); |
| 373 syncer::ModelTypeSet encrypted_types(crypto->GetEncryptedTypes()); | 379 syncer::ModelTypeSet encrypted_types(crypto->GetEncryptedTypes()); |
| 374 const sync_pb::EntitySpecifics& specifics = | 380 const sync_pb::EntitySpecifics& specifics = |
| 375 sync_node.GetEntry()->Get(syncer::syncable::SPECIFICS); | 381 sync_node.GetEntry()->Get(syncer::syncable::SPECIFICS); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 } | 426 } |
| 421 } else { | 427 } else { |
| 422 sync_node.SetTitle(UTF8ToWide(change.sync_data().GetTitle())); | 428 sync_node.SetTitle(UTF8ToWide(change.sync_data().GetTitle())); |
| 423 sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics()); | 429 sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics()); |
| 424 // TODO(sync): Support updating other parts of the sync node (title, | 430 // TODO(sync): Support updating other parts of the sync node (title, |
| 425 // successor, parent, etc.). | 431 // successor, parent, etc.). |
| 426 } | 432 } |
| 427 } else { | 433 } else { |
| 428 syncer::SyncError error( | 434 syncer::SyncError error( |
| 429 FROM_HERE, | 435 FROM_HERE, |
| 430 "Received unset syncer::SyncChange in the change processor.", | 436 "Received unset SyncChange in the change processor, " + |
| 437 change.location().ToString(), |
| 431 type); | 438 type); |
| 432 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 439 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, |
| 433 error.message()); | 440 error.message()); |
| 434 NOTREACHED(); | 441 NOTREACHED(); |
| 435 LOG(ERROR) << "Unset sync change."; | 442 LOG(ERROR) << "Unset sync change."; |
| 436 return error; | 443 return error; |
| 437 } | 444 } |
| 438 } | 445 } |
| 439 return syncer::SyncError(); | 446 return syncer::SyncError(); |
| 440 } | 447 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 480 void GenericChangeProcessor::StopImpl() { | 487 void GenericChangeProcessor::StopImpl() { |
| 481 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 488 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 482 } | 489 } |
| 483 | 490 |
| 484 syncer::UserShare* GenericChangeProcessor::share_handle() const { | 491 syncer::UserShare* GenericChangeProcessor::share_handle() const { |
| 485 DCHECK(CalledOnValidThread()); | 492 DCHECK(CalledOnValidThread()); |
| 486 return share_handle_; | 493 return share_handle_; |
| 487 } | 494 } |
| 488 | 495 |
| 489 } // namespace browser_sync | 496 } // namespace browser_sync |
| OLD | NEW |