1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/download/download_status_updater.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/logging.h" 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/download/download_status_updater_delegate.h" 9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/download/download_util.h" 10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenDownloadStatusUpdater::DownloadStatusUpdater() { 12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenDownloadStatusUpdater::~DownloadStatusUpdater() { 15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid DownloadStatusUpdater::AddDelegate( 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DownloadStatusUpdaterDelegate* delegate) { 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delegates_.insert(delegate); 20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Update(); 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid DownloadStatusUpdater::RemoveDelegate( 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DownloadStatusUpdaterDelegate* delegate) { 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delegates_.erase(delegate); 26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Update(); 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid DownloadStatusUpdater::Update() { 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen float progress = 0; 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool progress_known = GetProgress(&progress); 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen download_util::UpdateAppIconDownloadProgress( 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen static_cast<int>(GetInProgressDownloadCount()), 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen progress_known, 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen progress); 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool DownloadStatusUpdater::GetProgress(float* progress) { 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen *progress = 0; 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int64 received_bytes = 0; 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int64 total_bytes = 0; 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (DelegateSet::iterator i = delegates_.begin(); 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen i != delegates_.end(); ++i) { 45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!(*i)->IsDownloadProgressKnown()) 46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return false; 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen received_bytes += (*i)->GetReceivedDownloadBytes(); 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen total_bytes += (*i)->GetTotalDownloadBytes(); 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (total_bytes > 0) 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen *progress = static_cast<float>(received_bytes) / total_bytes; 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenint64 DownloadStatusUpdater::GetInProgressDownloadCount() { 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int64 download_count = 0; 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (DelegateSet::iterator i = delegates_.begin(); 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen i != delegates_.end(); ++i) { 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen download_count += (*i)->GetInProgressDownloadCount(); 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return download_count; 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 65