1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/sync/glue/data_type_manager.h"
6 #include "chrome/browser/sync/glue/failed_data_types_handler.h"
8 using browser_sync::DataTypeManager;
10 namespace browser_sync {
14 syncer::ModelTypeSet GetTypesFromErrorMap(
15 const FailedDataTypesHandler::TypeErrorMap& errors) {
16 syncer::ModelTypeSet result;
17 for (FailedDataTypesHandler::TypeErrorMap::const_iterator it = errors.begin();
18 it != errors.end(); ++it) {
19 DCHECK(!result.Has(it->first));
20 result.Put(it->first);
27 FailedDataTypesHandler::FailedDataTypesHandler() {
30 FailedDataTypesHandler::~FailedDataTypesHandler() {
33 bool FailedDataTypesHandler::UpdateFailedDataTypes(const TypeErrorMap& errors) {
37 for (TypeErrorMap::const_iterator iter = errors.begin(); iter != errors.end();
39 syncer::SyncError::ErrorType failure_type = iter->second.error_type();
40 switch (failure_type) {
41 case syncer::SyncError::UNRECOVERABLE_ERROR:
42 case syncer::SyncError::DATATYPE_ERROR:
43 fatal_errors_.insert(*iter);
45 case syncer::SyncError::CRYPTO_ERROR:
46 crypto_errors_.insert(*iter);
48 case syncer::SyncError::PERSISTENCE_ERROR:
49 persistence_errors_.insert(*iter);
58 void FailedDataTypesHandler::Reset() {
59 fatal_errors_.clear();
60 crypto_errors_.clear();
61 persistence_errors_.clear();
64 void FailedDataTypesHandler::ResetCryptoErrors() {
65 crypto_errors_.clear();
68 void FailedDataTypesHandler::ResetPersistenceErrorsFrom(
69 syncer::ModelTypeSet purged_types) {
70 for (syncer::ModelTypeSet::Iterator iter = purged_types.First(); iter.Good();
72 persistence_errors_.erase(iter.Get());
76 FailedDataTypesHandler::TypeErrorMap FailedDataTypesHandler::GetAllErrors()
80 if (AnyFailedDataType()) {
81 result = fatal_errors_;
82 result.insert(crypto_errors_.begin(), crypto_errors_.end());
83 result.insert(persistence_errors_.begin(), persistence_errors_.end());
88 syncer::ModelTypeSet FailedDataTypesHandler::GetFailedTypes() const {
89 syncer::ModelTypeSet result = GetFatalErrorTypes();
90 result.PutAll(GetCryptoErrorTypes());
94 syncer::ModelTypeSet FailedDataTypesHandler::GetFatalErrorTypes() const {
95 return GetTypesFromErrorMap(fatal_errors_);;
98 syncer::ModelTypeSet FailedDataTypesHandler::GetCryptoErrorTypes() const {
99 syncer::ModelTypeSet result = GetTypesFromErrorMap(crypto_errors_);
103 syncer::ModelTypeSet FailedDataTypesHandler::GetPersistenceErrorTypes() const {
104 syncer::ModelTypeSet result = GetTypesFromErrorMap(persistence_errors_);
108 bool FailedDataTypesHandler::AnyFailedDataType() const {
109 // Note: persistence errors are not failed types. They just trigger automatic
110 // unapply + getupdates, at which point they are associated like normal.
111 return !fatal_errors_.empty() || !crypto_errors_.empty();
114 } // namespace browser_sync