Chromium Code Reviews| 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,109 @@ |
| +// 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() { |
| + ClearDownloadItems(); |
|
asanka
2012/08/07 23:29:59
If you are going to delete |this| in ManagerGoingD
ananta
2012/08/07 23:44:25
Done.
|
| +} |
| + |
| +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); |
|
asanka
2012/08/07 23:29:59
Did you intend to delete |this| here?
ananta
2012/08/07 23:44:25
Yeah. Thanks for catching 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()); |
| + } |
| + } |
| + if (ContainsKey(download_items_, download)) { |
|
asanka
2012/08/07 23:29:59
Nit: This should be a DCHECK() and the .erase() an
ananta
2012/08/07 23:44:25
Done. Yeah. We should not be receiving status upda
|
| + download_items_.erase(download); |
| + download->RemoveObserver(this); |
| + } |
| + break; |
| + } |
| + |
| + case DownloadItem::REMOVING: |
| + case DownloadItem::INTERRUPTED: |
| + case DownloadItem::CANCELLED: { |
| + if (ContainsKey(download_items_, download)) { |
|
asanka
2012/08/07 23:29:59
Ditto.
ananta
2012/08/07 23:44:25
Done.
|
| + 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 |