// 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.
#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_H_
#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_H_
#include "base/basictypes.h"
#include "base/callback_forward.h"
#include "base/memory/scoped_ptr.h"
#include "components/keyed_service/core/keyed_service.h"
class ChromeDownloadManagerDelegate;
class DownloadHistory;
class DownloadUIController;
class ExtensionDownloadsEventRouter;
class Profile;
namespace content {
class DownloadManager;
}
namespace extensions {
class ExtensionDownloadsEventRouter;
}
// Owning class for ChromeDownloadManagerDelegate.
class DownloadService : public KeyedService {
public:
explicit DownloadService(Profile* profile);
virtual ~DownloadService();
// Get the download manager delegate, creating it if it doesn't already exist.
ChromeDownloadManagerDelegate* GetDownloadManagerDelegate();
// Get the interface to the history system. Returns NULL if profile is
// incognito or if the DownloadManager hasn't been created yet or if there is
// no HistoryService for profile. Virtual for testing.
virtual DownloadHistory* GetDownloadHistory();
#if defined(ENABLE_EXTENSIONS)
extensions::ExtensionDownloadsEventRouter* GetExtensionEventRouter() {
return extension_event_router_.get();
}
#endif
// Has a download manager been created?
bool HasCreatedDownloadManager();
// Number of non-malicious downloads associated with this instance of the
// service.
int NonMaliciousDownloadCount() const;
// Cancels all in-progress downloads for this profile.
void CancelDownloads();
// Number of non-malicious downloads associated with all profiles.
static int NonMaliciousDownloadCountAllProfiles();
// Cancels all in-progress downloads for all profiles.
static void CancelAllDownloads();
// Sets the DownloadManagerDelegate associated with this object and
// its DownloadManager. Takes ownership of |delegate|, and destroys
// the previous delegate. For testing.
void SetDownloadManagerDelegateForTesting(
scoped_ptr<ChromeDownloadManagerDelegate> delegate);
// Will be called to release references on other services as part
// of Profile shutdown.
virtual void Shutdown() OVERRIDE;
// Returns false if at least one extension has disabled the shelf, true
// otherwise.
bool IsShelfEnabled();
private:
bool download_manager_created_;
Profile* profile_;
// ChromeDownloadManagerDelegate may be the target of callbacks from
// the history service/DB thread and must be kept alive for those
// callbacks.
scoped_ptr<ChromeDownloadManagerDelegate> manager_delegate_;
scoped_ptr<DownloadHistory> download_history_;
// The UI controller is responsible for observing the download manager and
// notifying the UI of any new downloads. Its lifetime matches that of the
// associated download manager.
// Note on destruction order: download_ui_ depends on download_history_ and
// should be destroyed before the latter.
scoped_ptr<DownloadUIController> download_ui_;
// On Android, GET downloads are not handled by the DownloadManager.
// Once we have extensions on android, we probably need the EventRouter
// in ContentViewDownloadDelegate which knows about both GET and POST
// downloads.
#if defined(ENABLE_EXTENSIONS)
// The ExtensionDownloadsEventRouter dispatches download creation, change, and
// erase events to extensions. Like ChromeDownloadManagerDelegate, it's a
// chrome-level concept and its lifetime should match DownloadManager. There
// should be a separate EDER for on-record and off-record managers.
// There does not appear to be a separate ExtensionSystem for on-record and
// off-record profiles, so ExtensionSystem cannot own the EDER.
scoped_ptr<extensions::ExtensionDownloadsEventRouter> extension_event_router_;
#endif
DISALLOW_COPY_AND_ASSIGN(DownloadService);
};
#endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_H_