1 // Copyright 2019 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 "components/download/public/common/all_download_event_notifier.h"
6 
7 namespace download {
8 
AllDownloadEventNotifier(SimpleDownloadManagerCoordinator * simple_download_manager_coordinator)9 AllDownloadEventNotifier::AllDownloadEventNotifier(
10     SimpleDownloadManagerCoordinator* simple_download_manager_coordinator)
11     : simple_download_manager_coordinator_(simple_download_manager_coordinator),
12       download_initialized_(false) {
13   simple_download_manager_coordinator_->AddObserver(this);
14   std::vector<DownloadItem*> downloads;
15   simple_download_manager_coordinator_->GetAllDownloads(&downloads);
16   for (auto* download : downloads) {
17     download->AddObserver(this);
18     observing_.insert(download);
19   }
20 }
21 
~AllDownloadEventNotifier()22 AllDownloadEventNotifier::~AllDownloadEventNotifier() {
23   if (simple_download_manager_coordinator_)
24     simple_download_manager_coordinator_->RemoveObserver(this);
25   for (auto it = observing_.begin(); it != observing_.end(); ++it) {
26     (*it)->RemoveObserver(this);
27   }
28   observing_.clear();
29 }
30 
AddObserver(Observer * observer)31 void AllDownloadEventNotifier::AddObserver(Observer* observer) {
32   observers_.AddObserver(observer);
33   if (download_initialized_) {
34     observer->OnDownloadsInitialized(
35         simple_download_manager_coordinator_,
36         !simple_download_manager_coordinator_->has_all_history_downloads());
37   }
38 }
39 
RemoveObserver(Observer * observer)40 void AllDownloadEventNotifier::RemoveObserver(Observer* observer) {
41   observers_.RemoveObserver(observer);
42 }
43 
OnDownloadsInitialized(bool active_downloads_only)44 void AllDownloadEventNotifier::OnDownloadsInitialized(
45     bool active_downloads_only) {
46   download_initialized_ = true;
47   for (auto& observer : observers_)
48     observer.OnDownloadsInitialized(simple_download_manager_coordinator_,
49                                     active_downloads_only);
50 }
51 
OnManagerGoingDown(SimpleDownloadManagerCoordinator * manager)52 void AllDownloadEventNotifier::OnManagerGoingDown(
53     SimpleDownloadManagerCoordinator* manager) {
54   DCHECK_EQ(manager, simple_download_manager_coordinator_);
55   for (auto& observer : observers_)
56     observer.OnManagerGoingDown(simple_download_manager_coordinator_);
57   simple_download_manager_coordinator_->RemoveObserver(this);
58   simple_download_manager_coordinator_ = nullptr;
59 }
60 
OnDownloadCreated(DownloadItem * item)61 void AllDownloadEventNotifier::OnDownloadCreated(DownloadItem* item) {
62   if (observing_.find(item) != observing_.end())
63     return;
64   item->AddObserver(this);
65   observing_.insert(item);
66   for (auto& observer : observers_)
67     observer.OnDownloadCreated(simple_download_manager_coordinator_, item);
68 }
69 
OnDownloadUpdated(DownloadItem * item)70 void AllDownloadEventNotifier::OnDownloadUpdated(DownloadItem* item) {
71   for (auto& observer : observers_)
72     observer.OnDownloadUpdated(simple_download_manager_coordinator_, item);
73 }
74 
OnDownloadOpened(DownloadItem * item)75 void AllDownloadEventNotifier::OnDownloadOpened(DownloadItem* item) {
76   for (auto& observer : observers_)
77     observer.OnDownloadOpened(simple_download_manager_coordinator_, item);
78 }
79 
OnDownloadRemoved(DownloadItem * item)80 void AllDownloadEventNotifier::OnDownloadRemoved(DownloadItem* item) {
81   for (auto& observer : observers_)
82     observer.OnDownloadRemoved(simple_download_manager_coordinator_, item);
83 }
84 
OnDownloadDestroyed(DownloadItem * item)85 void AllDownloadEventNotifier::OnDownloadDestroyed(DownloadItem* item) {
86   item->RemoveObserver(this);
87   observing_.erase(item);
88 }
89 
90 }  // namespace download
91