Index: chrome/browser/download/download_item.h |
diff --git a/chrome/browser/download/download_item.h b/chrome/browser/download/download_item.h |
index 64704dd18debd44601dfb2ca18526e625d2b4170..a496f5323d43f2200e4949e65f442874a0b14286 100644 |
--- a/chrome/browser/download/download_item.h |
+++ b/chrome/browser/download/download_item.h |
@@ -33,6 +33,7 @@ |
class CrxInstaller; |
class DownloadFileManager; |
+class DownloadId; // See the bottom of this file. |
class DownloadManager; |
struct DownloadCreateInfo; |
struct DownloadHistoryInfo; |
@@ -276,6 +277,7 @@ class DownloadItem : public NotificationObserver { |
} |
int64 received_bytes() const { return received_bytes_; } |
int32 id() const { return download_id_; } |
+ DownloadId gid() const; |
base::Time start_time() const { return start_time_; } |
void set_db_handle(int64 handle) { db_handle_ = handle; } |
int64 db_handle() const { return db_handle_; } |
@@ -483,4 +485,54 @@ class DownloadItem : public NotificationObserver { |
DISALLOW_COPY_AND_ASSIGN(DownloadItem); |
}; |
+// DownloadId combines per-profile Download ids with an indication of which |
+// profile in order to be globally unique. DownloadIds are not persistent across |
+// sessions. |
+class DownloadId { |
Randy Smith (Not in Mondays)
2011/07/25 20:20:12
A download id seems like a "lower level" concept t
benjhayden
2011/07/27 19:40:54
Done.
|
+ public: |
+ explicit DownloadId(DownloadManager* m = NULL, int32 i = -1) |
+ : manager_(m), |
+ id_(i) { |
+ } |
+ |
+ // per-profile and persistent |
+ int32 id() const { return id_; } |
+ |
+ bool IsValid() const { return ((manager_ != NULL) && (id_ >= 0)); } |
+ |
+ bool operator==(const DownloadId& that) const { |
Randy Smith (Not in Mondays)
2011/07/25 20:20:12
Chrome biases against creating full types (i.e. su
benjhayden
2011/07/27 19:40:54
Done.
|
+ return ((that.id_ == id_) && |
+ (that.manager_ == manager_)); |
+ } |
+ bool operator<(const DownloadId& that) const { |
+ return ((manager_ < that.manager_) || |
+ (id_ < that.id_)); |
+ } |
+ |
+ size_t hash() const { |
+ // The top half of manager is unlikely to be distinct, and the user is |
+ // unlikely to have >64K downloads. If these assumptions are incorrect, then |
+ // DownloadFileManager's hash_map might have a few collisions, but it will |
+ // use operator== to safely disambiguate. |
+ return reinterpret_cast<size_t>(manager_) + |
+ (static_cast<size_t>(id_) << (4 * sizeof(size_t))); |
+ } |
+ |
+ private: |
+ // DownloadId is used mostly off the UI thread, so manager's methods can't be |
+ // called, but the pointer can be compared. |
+ DownloadManager* manager_; |
+ |
+ int32 id_; |
+ |
+ // Allow copy and assign. |
+}; |
+namespace __gnu_cxx { |
Randy Smith (Not in Mondays)
2011/07/25 20:20:12
This looks like black magic, and it's specifically
benjhayden
2011/07/27 19:40:54
Switched to BASE_HASH_NAMESPACE to afford the othe
|
+template<> struct hash<DownloadId> { |
+ size_t operator()(const DownloadId& did) const { |
+ return did.hash(); |
+ } |
+}; |
+} |
+ |
#endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_H_ |