Home | History | Annotate | Download | only in download
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_H_
      6 #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/callback_forward.h"
     10 #include "base/memory/ref_counted.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "components/browser_context_keyed_service/browser_context_keyed_service.h"
     13 
     14 class ChromeDownloadManagerDelegate;
     15 class DownloadHistory;
     16 class DownloadUIController;
     17 class ExtensionDownloadsEventRouter;
     18 class Profile;
     19 
     20 namespace content {
     21 class DownloadManager;
     22 }
     23 
     24 // Owning class for ChromeDownloadManagerDelegate.
     25 class DownloadService : public BrowserContextKeyedService {
     26  public:
     27   explicit DownloadService(Profile* profile);
     28   virtual ~DownloadService();
     29 
     30   // Get the download manager delegate, creating it if it doesn't already exist.
     31   ChromeDownloadManagerDelegate* GetDownloadManagerDelegate();
     32 
     33   // Get the interface to the history system. Returns NULL if profile is
     34   // incognito or if the DownloadManager hasn't been created yet or if there is
     35   // no HistoryService for profile.
     36   DownloadHistory* GetDownloadHistory();
     37 
     38 #if !defined(OS_ANDROID)
     39   ExtensionDownloadsEventRouter* GetExtensionEventRouter() {
     40     return extension_event_router_.get();
     41   }
     42 #endif
     43 
     44   // Has a download manager been created?
     45   bool HasCreatedDownloadManager();
     46 
     47   // Number of downloads associated with this instance of the service.
     48   int DownloadCount() const;
     49 
     50   // Number of downloads associated with all profiles.
     51   static int DownloadCountAllProfiles();
     52 
     53   // Sets the DownloadManagerDelegate associated with this object and
     54   // its DownloadManager.  Takes ownership of |delegate|, and destroys
     55   // the previous delegate.  For testing.
     56   void SetDownloadManagerDelegateForTesting(
     57       ChromeDownloadManagerDelegate* delegate);
     58 
     59   // Will be called to release references on other services as part
     60   // of Profile shutdown.
     61   virtual void Shutdown() OVERRIDE;
     62 
     63   // Returns false if at least one extension has disabled the shelf, true
     64   // otherwise.
     65   bool IsShelfEnabled();
     66 
     67  private:
     68   bool download_manager_created_;
     69   Profile* profile_;
     70 
     71   // ChromeDownloadManagerDelegate may be the target of callbacks from
     72   // the history service/DB thread and must be kept alive for those
     73   // callbacks.
     74   scoped_refptr<ChromeDownloadManagerDelegate> manager_delegate_;
     75 
     76   scoped_ptr<DownloadHistory> download_history_;
     77 
     78   // The UI controller is responsible for observing the download manager and
     79   // notifying the UI of any new downloads. Its lifetime matches that of the
     80   // associated download manager.
     81   scoped_ptr<DownloadUIController> download_ui_;
     82 
     83   // On Android, GET downloads are not handled by the DownloadManager.
     84   // Once we have extensions on android, we probably need the EventRouter
     85   // in ContentViewDownloadDelegate which knows about both GET and POST
     86   // downloads.
     87 #if !defined(OS_ANDROID)
     88   // The ExtensionDownloadsEventRouter dispatches download creation, change, and
     89   // erase events to extensions. Like ChromeDownloadManagerDelegate, it's a
     90   // chrome-level concept and its lifetime should match DownloadManager. There
     91   // should be a separate EDER for on-record and off-record managers.
     92   // There does not appear to be a separate ExtensionSystem for on-record and
     93   // off-record profiles, so ExtensionSystem cannot own the EDER.
     94   scoped_ptr<ExtensionDownloadsEventRouter> extension_event_router_;
     95 #endif
     96 
     97   DISALLOW_COPY_AND_ASSIGN(DownloadService);
     98 };
     99 
    100 #endif  // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_H_
    101