Index: chrome/browser/download/download_completion_observer_win.cc |
=================================================================== |
--- chrome/browser/download/download_completion_observer_win.cc (revision 0) |
+++ chrome/browser/download/download_completion_observer_win.cc (revision 0) |
@@ -0,0 +1,108 @@ |
+// 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_completion_observer_win.h" |
+ |
+#include <string> |
+ |
+#include "base/logging.h" |
+#include "base/stl_util.h" |
+#include "base/string_number_conversions.h" |
+#include "base/win/metro.h" |
+#include "googleurl/src/gurl.h" |
+#include "grit/generated_resources.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+using content::DownloadItem; |
+using content::DownloadManager; |
+ |
+static const char kDownloadNotificationPrefix[] = "DownloadNotification"; |
+int g_next_notification_id = 0; |
+ |
+DownloadCompletionObserver::DownloadCompletionObserver( |
+ DownloadManager* manager) { |
+ manager->AddObserver(this); |
+} |
+ |
+DownloadCompletionObserver::~DownloadCompletionObserver() { |
+ DCHECK(download_items_.empty()); |
+} |
+ |
+void DownloadCompletionObserver::OnDownloadCreated(DownloadManager* manager, |
+ DownloadItem* download) { |
+ if (download->IsInProgress()) { |
+ download_items_.insert(download); |
+ download->AddObserver(this); |
+ } |
+} |
+ |
+void DownloadCompletionObserver::ManagerGoingDown(DownloadManager* manager) { |
+ ClearDownloadItems(); |
+ manager->RemoveObserver(this); |
+ delete this; |
+} |
+ |
+void DownloadCompletionObserver::OnDownloadUpdated(DownloadItem* download) { |
+ if (!base::win::IsMetroProcess()) |
+ return; |
+ |
+ switch (download->GetState()) { |
+ case DownloadItem::COMPLETE: { |
+ if (!download->GetOpenWhenComplete() && |
+ !download->ShouldOpenFileBasedOnExtension() && |
+ !download->IsTemporary() && |
+ !download->GetAutoOpened()) { |
+ // 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()); |
+ } |
+ } |
+ DCHECK(ContainsKey(download_items_, download)); |
+ download_items_.erase(download); |
+ download->RemoveObserver(this); |
+ break; |
+ } |
+ |
+ case DownloadItem::REMOVING: |
+ case DownloadItem::INTERRUPTED: |
+ case DownloadItem::CANCELLED: { |
+ DCHECK(ContainsKey(download_items_, download)); |
+ download_items_.erase(download); |
+ download->RemoveObserver(this); |
+ break; |
+ } |
+ |
+ default: |
+ break; |
+ } |
+} |
+ |
+void DownloadCompletionObserver::ClearDownloadItems() { |
+ for (std::set<DownloadItem*>::iterator it = download_items_.begin(); |
+ it != download_items_.end(); ++it) { |
+ (*it)->RemoveObserver(this); |
+ } |
+ download_items_.clear(); |
+} |
Property changes on: chrome\browser\download\download_completion_observer_win.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |