[email protected] | 3d833de | 2012-05-30 23:32:06 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 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_HISTORY_H_ |
| 6 | #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_HISTORY_H_ |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 7 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 8 | #include <set> |
| 9 | #include <vector> |
[email protected] | 8800800 | 2011-05-24 23:14:15 | [diff] [blame] | 10 | |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 11 | #include "base/basictypes.h" |
[email protected] | a309407 | 2011-10-10 17:14:05 | [diff] [blame] | 12 | #include "base/callback.h" |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 13 | #include "base/memory/weak_ptr.h" |
| 14 | #include "base/observer_list.h" |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 15 | #include "chrome/browser/download/all_download_item_notifier.h" |
[email protected] | 6a2c09f | 2013-01-25 04:50:07 | [diff] [blame] | 16 | #include "chrome/browser/history/history_service.h" |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 17 | #include "content/public/browser/download_item.h" |
| 18 | #include "content/public/browser/download_manager.h" |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 19 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 20 | namespace history { |
| 21 | struct DownloadRow; |
| 22 | } // namespace history |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 23 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 24 | // Observes a single DownloadManager and all its DownloadItems, keeping the |
| 25 | // DownloadDatabase up to date. |
| 26 | class DownloadHistory : public AllDownloadItemNotifier::Observer { |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 27 | public: |
[email protected] | 530047e | 2013-07-12 17:02:25 | [diff] [blame] | 28 | typedef std::set<uint32> IdSet; |
[email protected] | 8800800 | 2011-05-24 23:14:15 | [diff] [blame] | 29 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 30 | // Caller must guarantee that HistoryService outlives HistoryAdapter. |
| 31 | class HistoryAdapter { |
| 32 | public: |
| 33 | explicit HistoryAdapter(HistoryService* history); |
| 34 | virtual ~HistoryAdapter(); |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 35 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 36 | virtual void QueryDownloads( |
| 37 | const HistoryService::DownloadQueryCallback& callback); |
[email protected] | eda5840 | 2011-09-21 19:32:02 | [diff] [blame] | 38 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 39 | virtual void CreateDownload( |
| 40 | const history::DownloadRow& info, |
| 41 | const HistoryService::DownloadCreateCallback& callback); |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 42 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 43 | virtual void UpdateDownload(const history::DownloadRow& data); |
[email protected] | 8800800 | 2011-05-24 23:14:15 | [diff] [blame] | 44 | |
[email protected] | 530047e | 2013-07-12 17:02:25 | [diff] [blame] | 45 | virtual void RemoveDownloads(const std::set<uint32>& ids); |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 46 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 47 | private: |
| 48 | HistoryService* history_; |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 49 | DISALLOW_COPY_AND_ASSIGN(HistoryAdapter); |
| 50 | }; |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 51 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 52 | class Observer { |
| 53 | public: |
| 54 | Observer(); |
| 55 | virtual ~Observer(); |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 56 | |
[email protected] | 530047e | 2013-07-12 17:02:25 | [diff] [blame] | 57 | // Fires when a download is added to or updated in the database, just after |
| 58 | // the task is posted to the history thread. |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 59 | virtual void OnDownloadStored(content::DownloadItem* item, |
[email protected] | 530047e | 2013-07-12 17:02:25 | [diff] [blame] | 60 | const history::DownloadRow& info) {} |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 61 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 62 | // Fires when RemoveDownloads messages are sent to the DB thread. |
| 63 | virtual void OnDownloadsRemoved(const IdSet& ids) {} |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 64 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 65 | // Fires when the DownloadHistory is being destroyed so that implementors |
| 66 | // can RemoveObserver() and nullify their DownloadHistory*s. |
| 67 | virtual void OnDownloadHistoryDestroyed() {} |
| 68 | }; |
| 69 | |
[email protected] | 9dd188f | 2014-05-15 18:35:20 | [diff] [blame] | 70 | // Returns true if the download is persisted. Not reliable when called from |
| 71 | // within a DownloadManager::Observer::OnDownloadCreated handler since the |
| 72 | // persisted state may not yet have been updated for a download that was |
| 73 | // restored from history. |
| 74 | static bool IsPersisted(const content::DownloadItem* item); |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 75 | |
| 76 | // Neither |manager| nor |history| may be NULL. |
| 77 | // DownloadService creates DownloadHistory some time after DownloadManager is |
| 78 | // created and destroys DownloadHistory as DownloadManager is shutting down. |
| 79 | DownloadHistory( |
| 80 | content::DownloadManager* manager, |
| 81 | scoped_ptr<HistoryAdapter> history); |
| 82 | |
dcheng | 0c8ba27e | 2014-10-21 12:00:53 | [diff] [blame^] | 83 | ~DownloadHistory() override; |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 84 | |
| 85 | void AddObserver(Observer* observer); |
| 86 | void RemoveObserver(Observer* observer); |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 87 | |
[email protected] | 9dd188f | 2014-05-15 18:35:20 | [diff] [blame] | 88 | // Returns true if the download was restored from history. Safe to call from |
| 89 | // within a DownloadManager::Observer::OnDownloadCreated handler and can be |
| 90 | // used to distinguish between downloads that were created due to new requests |
| 91 | // vs. downloads that were created due to being restored from history. Note |
| 92 | // that the return value is only reliable for downloads that were restored by |
| 93 | // this specific DownloadHistory instance. |
| 94 | bool WasRestoredFromHistory(const content::DownloadItem* item) const; |
| 95 | |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 96 | private: |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 97 | typedef std::set<content::DownloadItem*> ItemSet; |
[email protected] | 8800800 | 2011-05-24 23:14:15 | [diff] [blame] | 98 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 99 | // Callback from |history_| containing all entries in the downloads database |
| 100 | // table. |
| 101 | void QueryCallback( |
[email protected] | 7798731 | 2012-12-07 22:56:03 | [diff] [blame] | 102 | scoped_ptr<std::vector<history::DownloadRow> > infos); |
[email protected] | 8800800 | 2011-05-24 23:14:15 | [diff] [blame] | 103 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 104 | // May add |item| to |history_|. |
| 105 | void MaybeAddToHistory(content::DownloadItem* item); |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 106 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 107 | // Callback from |history_| when an item was successfully inserted into the |
| 108 | // database. |
[email protected] | 530047e | 2013-07-12 17:02:25 | [diff] [blame] | 109 | void ItemAdded(uint32 id, bool success); |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 110 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 111 | // AllDownloadItemNotifier::Observer |
dcheng | 0c8ba27e | 2014-10-21 12:00:53 | [diff] [blame^] | 112 | void OnDownloadCreated(content::DownloadManager* manager, |
| 113 | content::DownloadItem* item) override; |
| 114 | void OnDownloadUpdated(content::DownloadManager* manager, |
| 115 | content::DownloadItem* item) override; |
| 116 | void OnDownloadOpened(content::DownloadManager* manager, |
| 117 | content::DownloadItem* item) override; |
| 118 | void OnDownloadRemoved(content::DownloadManager* manager, |
| 119 | content::DownloadItem* item) override; |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 120 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 121 | // Schedule a record to be removed from |history_| the next time |
| 122 | // RemoveDownloadsBatch() runs. Schedule RemoveDownloadsBatch() to be run soon |
| 123 | // if it isn't already scheduled. |
[email protected] | 530047e | 2013-07-12 17:02:25 | [diff] [blame] | 124 | void ScheduleRemoveDownload(uint32 download_id); |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 125 | |
[email protected] | 530047e | 2013-07-12 17:02:25 | [diff] [blame] | 126 | // Removes all |removing_ids_| from |history_|. |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 127 | void RemoveDownloadsBatch(); |
| 128 | |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 129 | AllDownloadItemNotifier notifier_; |
| 130 | |
| 131 | scoped_ptr<HistoryAdapter> history_; |
| 132 | |
[email protected] | 530047e | 2013-07-12 17:02:25 | [diff] [blame] | 133 | // Identifier of the item being created in QueryCallback(), matched up with |
| 134 | // created items in OnDownloadCreated() so that the item is not re-added to |
| 135 | // the database. |
| 136 | uint32 loading_id_; |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 137 | |
[email protected] | 530047e | 2013-07-12 17:02:25 | [diff] [blame] | 138 | // Identifiers of items that are scheduled for removal from history, to |
| 139 | // facilitate batching removals together for database efficiency. |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 140 | IdSet removing_ids_; |
| 141 | |
| 142 | // |GetId()|s of items that were removed while they were being added, so that |
[email protected] | 530047e | 2013-07-12 17:02:25 | [diff] [blame] | 143 | // they can be removed when the database finishes adding them. |
| 144 | // TODO(benjhayden) Can this be removed now that it doesn't need to wait for |
| 145 | // the db_handle, and can rely on PostTask sequentiality? |
[email protected] | 3d95e54 | 2012-11-20 00:52:08 | [diff] [blame] | 146 | IdSet removed_while_adding_; |
| 147 | |
| 148 | // Count the number of items in the history for UMA. |
| 149 | int64 history_size_; |
| 150 | |
| 151 | ObserverList<Observer> observers_; |
| 152 | |
| 153 | base::WeakPtrFactory<DownloadHistory> weak_ptr_factory_; |
[email protected] | 8800800 | 2011-05-24 23:14:15 | [diff] [blame] | 154 | |
[email protected] | 82f37b0 | 2010-07-29 22:04:57 | [diff] [blame] | 155 | DISALLOW_COPY_AND_ASSIGN(DownloadHistory); |
| 156 | }; |
| 157 | |
| 158 | #endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_HISTORY_H_ |