OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "sync/notifier/invalidator_registrar.h" |
| 6 |
| 7 #include <cstddef> |
| 8 #include <iterator> |
| 9 #include <utility> |
| 10 |
| 11 #include "base/logging.h" |
| 12 #include "sync/notifier/object_id_invalidation_map.h" |
| 13 |
| 14 namespace syncer { |
| 15 |
| 16 InvalidatorRegistrar::InvalidatorRegistrar() |
| 17 : state_(DEFAULT_INVALIDATION_ERROR) {} |
| 18 |
| 19 InvalidatorRegistrar::~InvalidatorRegistrar() { |
| 20 DCHECK(thread_checker_.CalledOnValidThread()); |
| 21 CHECK(!handlers_.might_have_observers()); |
| 22 CHECK(handler_to_ids_map_.empty()); |
| 23 } |
| 24 |
| 25 void InvalidatorRegistrar::RegisterHandler(InvalidationHandler* handler) { |
| 26 DCHECK(thread_checker_.CalledOnValidThread()); |
| 27 CHECK(handler); |
| 28 CHECK(!handlers_.HasObserver(handler)); |
| 29 handlers_.AddObserver(handler); |
| 30 } |
| 31 |
| 32 void InvalidatorRegistrar::UpdateRegisteredIds( |
| 33 InvalidationHandler* handler, |
| 34 const ObjectIdSet& ids) { |
| 35 DCHECK(thread_checker_.CalledOnValidThread()); |
| 36 CHECK(handler); |
| 37 CHECK(handlers_.HasObserver(handler)); |
| 38 |
| 39 for (HandlerIdsMap::const_iterator it = handler_to_ids_map_.begin(); |
| 40 it != handler_to_ids_map_.end(); ++it) { |
| 41 if (it->first == handler) { |
| 42 continue; |
| 43 } |
| 44 |
| 45 std::vector<invalidation::ObjectId> intersection; |
| 46 std::set_intersection( |
| 47 it->second.begin(), it->second.end(), |
| 48 ids.begin(), ids.end(), |
| 49 std::inserter(intersection, intersection.end()), |
| 50 ObjectIdLessThan()); |
| 51 CHECK(intersection.empty()) |
| 52 << "Duplicate registration: trying to register " |
| 53 << ObjectIdToString(*intersection.begin()) << " for " |
| 54 << handler << " when it's already registered for " |
| 55 << it->first; |
| 56 } |
| 57 |
| 58 if (ids.empty()) { |
| 59 handler_to_ids_map_.erase(handler); |
| 60 } else { |
| 61 handler_to_ids_map_[handler] = ids; |
| 62 } |
| 63 } |
| 64 |
| 65 void InvalidatorRegistrar::UnregisterHandler(InvalidationHandler* handler) { |
| 66 DCHECK(thread_checker_.CalledOnValidThread()); |
| 67 CHECK(handler); |
| 68 CHECK(handlers_.HasObserver(handler)); |
| 69 handlers_.RemoveObserver(handler); |
| 70 handler_to_ids_map_.erase(handler); |
| 71 } |
| 72 |
| 73 ObjectIdSet InvalidatorRegistrar::GetRegisteredIds( |
| 74 InvalidationHandler* handler) const { |
| 75 DCHECK(thread_checker_.CalledOnValidThread()); |
| 76 HandlerIdsMap::const_iterator lookup = handler_to_ids_map_.find(handler); |
| 77 if (lookup != handler_to_ids_map_.end()) { |
| 78 return lookup->second; |
| 79 } else { |
| 80 return ObjectIdSet(); |
| 81 } |
| 82 } |
| 83 |
| 84 ObjectIdSet InvalidatorRegistrar::GetAllRegisteredIds() const { |
| 85 DCHECK(thread_checker_.CalledOnValidThread()); |
| 86 ObjectIdSet registered_ids; |
| 87 for (HandlerIdsMap::const_iterator it = handler_to_ids_map_.begin(); |
| 88 it != handler_to_ids_map_.end(); ++it) { |
| 89 registered_ids.insert(it->second.begin(), it->second.end()); |
| 90 } |
| 91 return registered_ids; |
| 92 } |
| 93 |
| 94 void InvalidatorRegistrar::DispatchInvalidationsToHandlers( |
| 95 const ObjectIdInvalidationMap& invalidation_map) { |
| 96 DCHECK(thread_checker_.CalledOnValidThread()); |
| 97 // If we have no handlers, there's nothing to do. |
| 98 if (!handlers_.might_have_observers()) { |
| 99 return; |
| 100 } |
| 101 |
| 102 for (HandlerIdsMap::iterator it = handler_to_ids_map_.begin(); |
| 103 it != handler_to_ids_map_.end(); ++it) { |
| 104 ObjectIdInvalidationMap to_emit = |
| 105 invalidation_map.GetSubsetWithObjectIds(it->second); |
| 106 if (!to_emit.Empty()) { |
| 107 it->first->OnIncomingInvalidation(to_emit); |
| 108 } |
| 109 } |
| 110 } |
| 111 |
| 112 void InvalidatorRegistrar::UpdateInvalidatorState(InvalidatorState state) { |
| 113 DCHECK(thread_checker_.CalledOnValidThread()); |
| 114 DVLOG(1) << "New invalidator state: " << InvalidatorStateToString(state_) |
| 115 << " -> " << InvalidatorStateToString(state); |
| 116 state_ = state; |
| 117 FOR_EACH_OBSERVER(InvalidationHandler, handlers_, |
| 118 OnInvalidatorStateChange(state)); |
| 119 } |
| 120 |
| 121 InvalidatorState InvalidatorRegistrar::GetInvalidatorState() const { |
| 122 DCHECK(thread_checker_.CalledOnValidThread()); |
| 123 return state_; |
| 124 } |
| 125 |
| 126 std::map<std::string, ObjectIdSet> |
| 127 InvalidatorRegistrar::GetSanitizedHandlersIdsMap() { |
| 128 DCHECK(thread_checker_.CalledOnValidThread()); |
| 129 std::map<std::string, ObjectIdSet> clean_handlers_to_ids; |
| 130 for (HandlerIdsMap::const_iterator it = handler_to_ids_map_.begin(); |
| 131 it != handler_to_ids_map_.end(); |
| 132 ++it) { |
| 133 clean_handlers_to_ids[it->first->GetOwnerName()] = ObjectIdSet(it->second); |
| 134 } |
| 135 return clean_handlers_to_ids; |
| 136 } |
| 137 |
| 138 bool InvalidatorRegistrar::IsHandlerRegisteredForTest( |
| 139 InvalidationHandler* handler) const { |
| 140 DCHECK(thread_checker_.CalledOnValidThread()); |
| 141 return handlers_.HasObserver(handler); |
| 142 } |
| 143 |
| 144 void InvalidatorRegistrar::DetachFromThreadForTest() { |
| 145 DCHECK(thread_checker_.CalledOnValidThread()); |
| 146 thread_checker_.DetachFromThread(); |
| 147 } |
| 148 |
| 149 } // namespace syncer |
OLD | NEW |