1 // Copyright 2017 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 COMPONENTS_DOWNLOAD_CONTENT_PUBLIC_ALL_DOWNLOAD_ITEM_NOTIFIER_H_
6 #define COMPONENTS_DOWNLOAD_CONTENT_PUBLIC_ALL_DOWNLOAD_ITEM_NOTIFIER_H_
7 
8 #include <set>
9 
10 #include "base/macros.h"
11 #include "components/download/public/common/download_item.h"
12 #include "content/public/browser/download_manager.h"
13 
14 // AllDownloadItemNotifier observes ALL the DownloadItems on a given
15 // DownloadManager.
16 // Clients should use GetManager() instead of storing their own pointer to the
17 // manager so that they can be sensitive to managers that have gone down.
18 
19 // Example Usage:
20 // class DownloadSystemConsumer : public AllDownloadItemNotifier::Observer {
21 //  public:
22 //   DownloadSystemConsumer(DownloadManager* original_manager,
23 //            DownloadManager* incognito_manager)
24 //     : original_notifier_(original_manager, this),
25 //       incognito_notifier_(incognito_manager, this) {
26 //   }
27 //
28 //   virtual void OnDownloadUpdated(
29 //     DownloadManager* manager, DownloadItem* item) { ... }
30 //
31 //  private:
32 //   AllDownloadItemNotifier original_notifier_;
33 //   AllDownloadItemNotifier incognito_notifier_;
34 // };
35 
36 namespace download {
37 
38 class AllDownloadItemNotifier : public content::DownloadManager::Observer,
39                                 public DownloadItem::Observer {
40  public:
41   // All of the methods take the DownloadManager so that subclasses can observe
42   // multiple managers at once and easily distinguish which manager a given item
43   // belongs to.
44   class Observer {
45    public:
Observer()46     Observer() {}
~Observer()47     virtual ~Observer() {}
48 
OnManagerInitialized(content::DownloadManager * manager)49     virtual void OnManagerInitialized(content::DownloadManager* manager) {}
OnManagerGoingDown(content::DownloadManager * manager)50     virtual void OnManagerGoingDown(content::DownloadManager* manager) {}
OnDownloadCreated(content::DownloadManager * manager,download::DownloadItem * item)51     virtual void OnDownloadCreated(content::DownloadManager* manager,
52                                    download::DownloadItem* item) {}
OnDownloadUpdated(content::DownloadManager * manager,download::DownloadItem * item)53     virtual void OnDownloadUpdated(content::DownloadManager* manager,
54                                    download::DownloadItem* item) {}
OnDownloadOpened(content::DownloadManager * manager,download::DownloadItem * item)55     virtual void OnDownloadOpened(content::DownloadManager* manager,
56                                   download::DownloadItem* item) {}
OnDownloadRemoved(content::DownloadManager * manager,download::DownloadItem * item)57     virtual void OnDownloadRemoved(content::DownloadManager* manager,
58                                    download::DownloadItem* item) {}
59 
60    private:
61     DISALLOW_COPY_AND_ASSIGN(Observer);
62   };
63 
64   AllDownloadItemNotifier(content::DownloadManager* manager,
65                           Observer* observer);
66 
67   ~AllDownloadItemNotifier() override;
68 
69   // Returns NULL if the manager has gone down.
GetManager()70   content::DownloadManager* GetManager() const { return manager_; }
71 
72   // Returns the estimate of dynamically allocated memory in bytes.
73   size_t EstimateMemoryUsage() const;
74 
75  private:
76   // DownloadManager::Observer
77   void OnManagerInitialized() override;
78   void ManagerGoingDown(content::DownloadManager* manager) override;
79   void OnDownloadCreated(content::DownloadManager* manager,
80                          download::DownloadItem* item) override;
81 
82   // DownloadItem::Observer
83   void OnDownloadUpdated(DownloadItem* item) override;
84   void OnDownloadOpened(DownloadItem* item) override;
85   void OnDownloadRemoved(DownloadItem* item) override;
86   void OnDownloadDestroyed(DownloadItem* item) override;
87 
88   content::DownloadManager* manager_;
89   AllDownloadItemNotifier::Observer* observer_;
90   std::set<DownloadItem*> observing_;
91 
92   DISALLOW_COPY_AND_ASSIGN(AllDownloadItemNotifier);
93 };
94 
95 }  // namespace download
96 
97 #endif  // COMPONENTS_DOWNLOAD_CONTENT_PUBLIC_ALL_DOWNLOAD_ITEM_NOTIFIER_H_
98