diff options
Diffstat (limited to 'chrome/common/notification_registrar.cc')
-rw-r--r-- | chrome/common/notification_registrar.cc | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/chrome/common/notification_registrar.cc b/chrome/common/notification_registrar.cc new file mode 100644 index 0000000..fdedde4 --- /dev/null +++ b/chrome/common/notification_registrar.cc @@ -0,0 +1,54 @@ +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <algorithm> + +#include "chrome/common/notification_registrar.h" + +NotificationRegistrar::NotificationRegistrar() { +} + +NotificationRegistrar::~NotificationRegistrar() { + RemoveAll(); +} + +void NotificationRegistrar::Add(NotificationObserver* observer, + NotificationType type, + NotificationSource source) { + Record record = { observer, type, source }; + DCHECK(std::find(registered_.begin(), registered_.end(), record) == + registered_.end()) << "Duplicate registration."; + registered_.push_back(record); + + NotificationService::current()->AddObserver(observer, type, source); +} + +void NotificationRegistrar::Remove(NotificationObserver* observer, + NotificationType type, + NotificationSource source) { + Record record = { observer, type, source }; + RecordVector::iterator found = std::find( + registered_.begin(), registered_.end(), record); + if (found != registered_.end()) { + registered_.erase(found); + } else { + // Fall through to passing the removal through to the notification service. + // If it really isn't registered, it will also assert and do nothing, but + // we might as well catch the case where the class is trying to unregister + // for something they registered without going through us. + NOTREACHED(); + } + + NotificationService::current()->RemoveObserver(observer, type, source); +} + +void NotificationRegistrar::RemoveAll() { + NotificationService* service = NotificationService::current(); + for (size_t i = 0; i < registered_.size(); i++) { + service->RemoveObserver(registered_[i].observer, + registered_[i].type, + registered_[i].source); + } + registered_.clear(); +} |