| Index: chrome/browser/download/download_status_updater_win.cc
|
| diff --git a/chrome/browser/download/download_status_updater_win.cc b/chrome/browser/download/download_status_updater_win.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3e28d6ff4a4549a4f03084c570f15540adfebf10
|
| --- /dev/null
|
| +++ b/chrome/browser/download/download_status_updater_win.cc
|
| @@ -0,0 +1,123 @@
|
| +// Copyright (c) 2012 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 <string>
|
| +#include <shobjidl.h>
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/stl_util.h"
|
| +#include "base/string_number_conversions.h"
|
| +#include "base/win/metro.h"
|
| +#include "base/win/scoped_comptr.h"
|
| +#include "base/win/windows_version.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| +#include "chrome/browser/ui/browser_list.h"
|
| +#include "chrome/browser/ui/browser_window.h"
|
| +#include "googleurl/src/gurl.h"
|
| +#include "grit/generated_resources.h"
|
| +#include "ui/base/l10n/l10n_util.h"
|
| +
|
| +// This code doesn't compile with Aura on. TODO(avi): hook it up so that
|
| +// win_aura can do platform integration.
|
| +#if !defined(USE_AURA)
|
| +
|
| +namespace {
|
| +
|
| +const char kDownloadNotificationPrefix[] = "DownloadNotification";
|
| +int g_next_notification_id = 0;
|
| +
|
| +void UpdateTaskbarProgressBar(int download_count,
|
| + bool progress_known,
|
| + float progress) {
|
| + // Taskbar progress bar is only supported on Win7.
|
| + if (base::win::GetVersion() < base::win::VERSION_WIN7)
|
| + return;
|
| +
|
| + base::win::ScopedComPtr<ITaskbarList3> taskbar;
|
| + HRESULT result = taskbar.CreateInstance(CLSID_TaskbarList, NULL,
|
| + CLSCTX_INPROC_SERVER);
|
| + if (FAILED(result)) {
|
| + VLOG(1) << "Failed creating a TaskbarList object: " << result;
|
| + return;
|
| + }
|
| +
|
| + result = taskbar->HrInit();
|
| + if (FAILED(result)) {
|
| + LOG(ERROR) << "Failed initializing an ITaskbarList3 interface.";
|
| + return;
|
| + }
|
| +
|
| + // Iterate through all the browser windows, and draw the progress bar.
|
| + for (BrowserList::const_iterator browser_iterator = BrowserList::begin();
|
| + browser_iterator != BrowserList::end(); browser_iterator++) {
|
| + Browser* browser = *browser_iterator;
|
| + BrowserWindow* window = browser->window();
|
| + if (!window)
|
| + continue;
|
| + HWND frame = window->GetNativeWindow();
|
| + if (download_count == 0 || progress == 1.0f)
|
| + taskbar->SetProgressState(frame, TBPF_NOPROGRESS);
|
| + else if (!progress_known)
|
| + taskbar->SetProgressState(frame, TBPF_INDETERMINATE);
|
| + else
|
| + taskbar->SetProgressValue(frame, static_cast<int>(progress * 100), 100);
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +void DownloadStatusUpdater::UpdateAppIconDownloadProgress(
|
| + content::DownloadItem* download) {
|
| +
|
| + // Always update overall progress.
|
| +
|
| + float progress = 0;
|
| + int download_count = 0;
|
| + bool progress_known = GetProgress(&progress, &download_count);
|
| + UpdateTaskbarProgressBar(download_count, progress_known, progress);
|
| +
|
| + // Fire notifications when downloads complete.
|
| +
|
| + if (!base::win::IsMetroProcess())
|
| + return;
|
| +
|
| + if (download->GetState() != content::DownloadItem::COMPLETE)
|
| + return;
|
| +
|
| + if (download->GetOpenWhenComplete() ||
|
| + download->ShouldOpenFileBasedOnExtension() ||
|
| + download->IsTemporary() ||
|
| + download->GetAutoOpened())
|
| + return;
|
| +
|
| + // In Windows 8 metro mode display a metro style notification which
|
| + // informs the user that the download is complete.
|
| + HMODULE metro = base::win::GetMetroModule();
|
| + base::win::MetroNotification display_notification =
|
| + reinterpret_cast<base::win::MetroNotification>(
|
| + ::GetProcAddress(metro, "DisplayNotification"));
|
| + DCHECK(display_notification);
|
| + if (display_notification) {
|
| + string16 title = l10n_util::GetStringUTF16(
|
| + IDS_METRO_DOWNLOAD_COMPLETE_NOTIFICATION_TITLE);
|
| + string16 body = l10n_util::GetStringUTF16(
|
| + IDS_METRO_DOWNLOAD_COMPLETE_NOTIFICATION);
|
| +
|
| + // Dummy notification id. Every metro style notification needs a
|
| + // unique notification id.
|
| + std::string notification_id = kDownloadNotificationPrefix;
|
| + notification_id += base::IntToString(g_next_notification_id++);
|
| +
|
| + display_notification(download->GetURL().spec().c_str(),
|
| + "",
|
| + title.c_str(),
|
| + body.c_str(),
|
| + L"",
|
| + notification_id.c_str());
|
| + }
|
| +}
|
| +
|
| +#endif // !USE_AURA
|
|
|