1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/download/public/common/all_download_event_notifier.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
namespace download {
AllDownloadEventNotifier::AllDownloadEventNotifier(
SimpleDownloadManagerCoordinator* simple_download_manager_coordinator)
: simple_download_manager_coordinator_(simple_download_manager_coordinator),
download_initialized_(false) {
simple_download_manager_coordinator_->AddObserver(this);
std::vector<raw_ptr<DownloadItem, VectorExperimental>> downloads;
simple_download_manager_coordinator_->GetAllDownloads(&downloads);
for (download::DownloadItem* download : downloads) {
download->AddObserver(this);
observing_.insert(download);
}
}
AllDownloadEventNotifier::~AllDownloadEventNotifier() {
if (simple_download_manager_coordinator_)
simple_download_manager_coordinator_->RemoveObserver(this);
for (auto it = observing_.begin(); it != observing_.end(); ++it) {
(*it)->RemoveObserver(this);
}
observing_.clear();
CHECK(!SimpleDownloadManagerCoordinator::Observer::IsInObserverList());
}
void AllDownloadEventNotifier::AddObserver(Observer* observer) {
observers_.AddObserver(observer);
if (download_initialized_) {
observer->OnDownloadsInitialized(
simple_download_manager_coordinator_,
!simple_download_manager_coordinator_->has_all_history_downloads());
}
}
void AllDownloadEventNotifier::RemoveObserver(Observer* observer) {
observers_.RemoveObserver(observer);
}
void AllDownloadEventNotifier::OnDownloadsInitialized(
bool active_downloads_only) {
download_initialized_ = true;
for (auto& observer : observers_)
observer.OnDownloadsInitialized(simple_download_manager_coordinator_,
active_downloads_only);
}
void AllDownloadEventNotifier::OnManagerGoingDown(
SimpleDownloadManagerCoordinator* manager) {
DCHECK_EQ(manager, simple_download_manager_coordinator_);
for (auto& observer : observers_)
observer.OnManagerGoingDown(simple_download_manager_coordinator_);
simple_download_manager_coordinator_->RemoveObserver(this);
simple_download_manager_coordinator_ = nullptr;
}
void AllDownloadEventNotifier::OnDownloadCreated(DownloadItem* item) {
if (observing_.find(item) != observing_.end())
return;
item->AddObserver(this);
observing_.insert(item);
for (auto& observer : observers_)
observer.OnDownloadCreated(simple_download_manager_coordinator_, item);
}
void AllDownloadEventNotifier::OnDownloadUpdated(DownloadItem* item) {
for (auto& observer : observers_)
observer.OnDownloadUpdated(simple_download_manager_coordinator_, item);
}
void AllDownloadEventNotifier::OnDownloadOpened(DownloadItem* item) {
for (auto& observer : observers_)
observer.OnDownloadOpened(simple_download_manager_coordinator_, item);
}
void AllDownloadEventNotifier::OnDownloadRemoved(DownloadItem* item) {
for (auto& observer : observers_)
observer.OnDownloadRemoved(simple_download_manager_coordinator_, item);
}
void AllDownloadEventNotifier::OnDownloadDestroyed(DownloadItem* item) {
item->RemoveObserver(this);
observing_.erase(item);
}
} // namespace download
|