// Copyright (c) 2010 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 "chrome/browser/notifications/balloon_collection_base.h"
#include "base/stl_util-inl.h"
#include "chrome/browser/notifications/balloon.h"
#include "chrome/browser/notifications/notification.h"
#include "googleurl/src/gurl.h"
BalloonCollectionBase::BalloonCollectionBase() {
}
BalloonCollectionBase::~BalloonCollectionBase() {
STLDeleteElements(&balloons_);
}
void BalloonCollectionBase::Add(Balloon* balloon) {
balloons_.push_back(balloon);
}
void BalloonCollectionBase::Remove(Balloon* balloon) {
// Free after removing.
scoped_ptr<Balloon> to_delete(balloon);
Balloons::iterator iter;
for (iter = balloons_.begin(); iter != balloons_.end(); ++iter) {
if ((*iter) == balloon) {
balloons_.erase(iter);
return;
}
}
}
bool BalloonCollectionBase::CloseById(const std::string& id) {
// Use a local list of balloons to close to avoid breaking
// iterator changes on each close.
Balloons to_close;
Balloons::iterator iter;
for (iter = balloons_.begin(); iter != balloons_.end(); ++iter) {
if ((*iter)->notification().notification_id() == id)
to_close.push_back(*iter);
}
for (iter = to_close.begin(); iter != to_close.end(); ++iter)
(*iter)->CloseByScript();
return !to_close.empty();
}
bool BalloonCollectionBase::CloseAllBySourceOrigin(
const GURL& source_origin) {
// Use a local list of balloons to close to avoid breaking
// iterator changes on each close.
Balloons to_close;
Balloons::iterator iter;
for (iter = balloons_.begin(); iter != balloons_.end(); ++iter) {
if ((*iter)->notification().origin_url() == source_origin)
to_close.push_back(*iter);
}
for (iter = to_close.begin(); iter != to_close.end(); ++iter)
(*iter)->CloseByScript();
return !to_close.empty();
}
void BalloonCollectionBase::CloseAll() {
// Use a local list of balloons to close to avoid breaking
// iterator changes on each close.
Balloons to_close = balloons_;
for (Balloons::iterator iter = to_close.begin();
iter != to_close.end(); ++iter)
(*iter)->CloseByScript();
}
Balloon* BalloonCollectionBase::FindBalloon(
const Notification& notification) {
Balloons::iterator iter;
for (iter = balloons_.begin(); iter != balloons_.end(); ++iter) {
if ((*iter)->notification().notification_id() ==
notification.notification_id()) {
return *iter;
}
}
return NULL;
}