1201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// found in the LICENSE file.
4201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
5201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/notifications/balloon_collection_base.h"
6201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
7201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/stl_util-inl.h"
8201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/notifications/balloon.h"
9201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/notifications/notification.h"
10201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "googleurl/src/gurl.h"
11201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
12201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBalloonCollectionBase::BalloonCollectionBase() {
13201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
15201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBalloonCollectionBase::~BalloonCollectionBase() {
16201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  STLDeleteElements(&balloons_);
17201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
19201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BalloonCollectionBase::Add(Balloon* balloon) {
20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  balloons_.push_back(balloon);
21201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
22201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
23201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BalloonCollectionBase::Remove(Balloon* balloon) {
24201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Free after removing.
25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  scoped_ptr<Balloon> to_delete(balloon);
26201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Balloons::iterator iter;
27201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (iter = balloons_.begin(); iter != balloons_.end(); ++iter) {
28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if ((*iter) == balloon) {
29201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      balloons_.erase(iter);
30201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return;
31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
32201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
35201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BalloonCollectionBase::CloseById(const std::string& id) {
36201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Use a local list of balloons to close to avoid breaking
37201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // iterator changes on each close.
38201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Balloons to_close;
39201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Balloons::iterator iter;
40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (iter = balloons_.begin(); iter != balloons_.end(); ++iter) {
41201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if ((*iter)->notification().notification_id() == id)
42201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      to_close.push_back(*iter);
43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
44201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (iter = to_close.begin(); iter != to_close.end(); ++iter)
45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    (*iter)->CloseByScript();
46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return !to_close.empty();
48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
50201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BalloonCollectionBase::CloseAllBySourceOrigin(
51201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const GURL& source_origin) {
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Use a local list of balloons to close to avoid breaking
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // iterator changes on each close.
54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Balloons to_close;
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Balloons::iterator iter;
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (iter = balloons_.begin(); iter != balloons_.end(); ++iter) {
57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if ((*iter)->notification().origin_url() == source_origin)
58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      to_close.push_back(*iter);
59201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
60201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (iter = to_close.begin(); iter != to_close.end(); ++iter)
61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    (*iter)->CloseByScript();
62201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
63201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return !to_close.empty();
64201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BalloonCollectionBase::CloseAll() {
67201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Use a local list of balloons to close to avoid breaking
68201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // iterator changes on each close.
69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Balloons to_close = balloons_;
70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (Balloons::iterator iter = to_close.begin();
71201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch       iter != to_close.end(); ++iter)
72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    (*iter)->CloseByScript();
73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
74201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
75201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBalloon* BalloonCollectionBase::FindBalloon(
76201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const Notification& notification) {
77201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Balloons::iterator iter;
78201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (iter = balloons_.begin(); iter != balloons_.end(); ++iter) {
79201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if ((*iter)->notification().notification_id() ==
80201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        notification.notification_id()) {
81201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return *iter;
82201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
83201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return NULL;
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
86