| // 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/download/download_status_updater.h" |
| |
| #include "base/logging.h" |
| #include "chrome/browser/download/download_status_updater_delegate.h" |
| #include "chrome/browser/download/download_util.h" |
| |
| DownloadStatusUpdater::DownloadStatusUpdater() { |
| } |
| |
| DownloadStatusUpdater::~DownloadStatusUpdater() { |
| } |
| |
| void DownloadStatusUpdater::AddDelegate( |
| DownloadStatusUpdaterDelegate* delegate) { |
| delegates_.insert(delegate); |
| Update(); |
| } |
| |
| void DownloadStatusUpdater::RemoveDelegate( |
| DownloadStatusUpdaterDelegate* delegate) { |
| delegates_.erase(delegate); |
| Update(); |
| } |
| |
| void DownloadStatusUpdater::Update() { |
| float progress = 0; |
| bool progress_known = GetProgress(&progress); |
| download_util::UpdateAppIconDownloadProgress( |
| static_cast<int>(GetInProgressDownloadCount()), |
| progress_known, |
| progress); |
| } |
| |
| bool DownloadStatusUpdater::GetProgress(float* progress) { |
| *progress = 0; |
| |
| int64 received_bytes = 0; |
| int64 total_bytes = 0; |
| for (DelegateSet::iterator i = delegates_.begin(); |
| i != delegates_.end(); ++i) { |
| if (!(*i)->IsDownloadProgressKnown()) |
| return false; |
| received_bytes += (*i)->GetReceivedDownloadBytes(); |
| total_bytes += (*i)->GetTotalDownloadBytes(); |
| } |
| |
| if (total_bytes > 0) |
| *progress = static_cast<float>(received_bytes) / total_bytes; |
| return true; |
| } |
| |
| int64 DownloadStatusUpdater::GetInProgressDownloadCount() { |
| int64 download_count = 0; |
| for (DelegateSet::iterator i = delegates_.begin(); |
| i != delegates_.end(); ++i) { |
| download_count += (*i)->GetInProgressDownloadCount(); |
| } |
| |
| return download_count; |
| } |