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
3 // found in the LICENSE file.
5 #include "components/sync_driver/data_type_manager.h"
6 #include "components/sync_driver/data_type_status_table.h"
8 namespace sync_driver {
12 syncer::ModelTypeSet GetTypesFromErrorMap(
13 const DataTypeStatusTable::TypeErrorMap& errors) {
14 syncer::ModelTypeSet result;
15 for (DataTypeStatusTable::TypeErrorMap::const_iterator it = errors.begin();
16 it != errors.end(); ++it) {
17 DCHECK(!result.Has(it->first));
18 result.Put(it->first);
25 DataTypeStatusTable::DataTypeStatusTable() {
28 DataTypeStatusTable::~DataTypeStatusTable() {
31 bool DataTypeStatusTable::UpdateFailedDataTypes(const TypeErrorMap& errors) {
35 DVLOG(1) << "Setting " << errors.size() << " new failed types.";
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::UNSET:
44 case syncer::SyncError::UNRECOVERABLE_ERROR:
45 unrecoverable_errors_.insert(*iter);
47 case syncer::SyncError::DATATYPE_ERROR:
48 case syncer::SyncError::DATATYPE_POLICY_ERROR:
49 data_type_errors_.insert(*iter);
51 case syncer::SyncError::CRYPTO_ERROR:
52 crypto_errors_.insert(*iter);
54 case syncer::SyncError::PERSISTENCE_ERROR:
55 persistence_errors_.insert(*iter);
57 case syncer::SyncError::UNREADY_ERROR:
58 unready_errors_.insert(*iter);
65 void DataTypeStatusTable::Reset() {
66 DVLOG(1) << "Resetting data type errors.";
67 unrecoverable_errors_.clear();
68 data_type_errors_.clear();
69 crypto_errors_.clear();
70 persistence_errors_.clear();
71 unready_errors_.clear();
74 void DataTypeStatusTable::ResetCryptoErrors() {
75 crypto_errors_.clear();
78 void DataTypeStatusTable::ResetPersistenceErrorsFrom(
79 syncer::ModelTypeSet purged_types) {
80 for (syncer::ModelTypeSet::Iterator iter = purged_types.First(); iter.Good();
82 persistence_errors_.erase(iter.Get());
86 bool DataTypeStatusTable::ResetDataTypeErrorFor(syncer::ModelType type) {
87 return data_type_errors_.erase(type) > 0;
90 bool DataTypeStatusTable::ResetUnreadyErrorFor(syncer::ModelType type) {
91 return unready_errors_.erase(type) > 0;
94 DataTypeStatusTable::TypeErrorMap DataTypeStatusTable::GetAllErrors()
97 result.insert(data_type_errors_.begin(), data_type_errors_.end());
98 result.insert(crypto_errors_.begin(), crypto_errors_.end());
99 result.insert(persistence_errors_.begin(), persistence_errors_.end());
100 result.insert(unready_errors_.begin(), unready_errors_.end());
101 result.insert(unrecoverable_errors_.begin(), unrecoverable_errors_.end());
105 syncer::ModelTypeSet DataTypeStatusTable::GetFailedTypes() const {
106 syncer::ModelTypeSet result = GetFatalErrorTypes();
107 result.PutAll(GetCryptoErrorTypes());
108 result.PutAll(GetUnreadyErrorTypes());
112 syncer::ModelTypeSet DataTypeStatusTable::GetFatalErrorTypes()
114 syncer::ModelTypeSet result;
115 result.PutAll(GetTypesFromErrorMap(data_type_errors_));
116 result.PutAll(GetTypesFromErrorMap(unrecoverable_errors_));
120 syncer::ModelTypeSet DataTypeStatusTable::GetCryptoErrorTypes() const {
121 syncer::ModelTypeSet result = GetTypesFromErrorMap(crypto_errors_);
125 syncer::ModelTypeSet DataTypeStatusTable::GetPersistenceErrorTypes() const {
126 syncer::ModelTypeSet result = GetTypesFromErrorMap(persistence_errors_);
130 syncer::ModelTypeSet DataTypeStatusTable::GetUnreadyErrorTypes() const {
131 syncer::ModelTypeSet result = GetTypesFromErrorMap(unready_errors_);
135 syncer::ModelTypeSet DataTypeStatusTable::GetUnrecoverableErrorTypes()
137 syncer::ModelTypeSet result = GetTypesFromErrorMap(unrecoverable_errors_);
141 syncer::SyncError DataTypeStatusTable::GetUnrecoverableError() const {
142 // Just return the first one. It is assumed all the unrecoverable errors
143 // have the same cause. The others are just tracked to know which types
145 return (unrecoverable_errors_.empty()
146 ? syncer::SyncError()
147 : unrecoverable_errors_.begin()->second);
150 bool DataTypeStatusTable::AnyFailedDataType() const {
151 // Note: persistence errors are not failed types. They just trigger automatic
152 // unapply + getupdates, at which point they are associated like normal.
153 return unrecoverable_errors_.empty() ||
154 !data_type_errors_.empty() ||
155 !crypto_errors_.empty();
158 } // namespace sync_driver