OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_IMPL_H_ | 5 #ifndef CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_IMPL_H_ |
6 #define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_IMPL_H_ | 6 #define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_IMPL_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <string> | 10 #include <string> |
11 | 11 |
12 #include "base/callback_forward.h" | 12 #include "base/callback_forward.h" |
13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
14 #include "base/macros.h" | 14 #include "base/macros.h" |
15 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
16 #include "base/memory/weak_ptr.h" | 16 #include "base/memory/weak_ptr.h" |
17 #include "base/observer_list.h" | 17 #include "base/observer_list.h" |
18 #include "base/time/time.h" | 18 #include "base/time/time.h" |
| 19 #include "content/browser/download/download_destination_observer.h" |
19 #include "content/browser/download/download_net_log_parameters.h" | 20 #include "content/browser/download/download_net_log_parameters.h" |
20 #include "content/browser/download/download_request_handle.h" | 21 #include "content/browser/download/download_request_handle.h" |
21 #include "content/common/content_export.h" | 22 #include "content/common/content_export.h" |
22 #include "content/public/browser/download_destination_observer.h" | |
23 #include "content/public/browser/download_interrupt_reasons.h" | 23 #include "content/public/browser/download_interrupt_reasons.h" |
24 #include "content/public/browser/download_item.h" | 24 #include "content/public/browser/download_item.h" |
25 #include "net/log/net_log.h" | 25 #include "net/log/net_log.h" |
26 #include "url/gurl.h" | 26 #include "url/gurl.h" |
27 | 27 |
28 namespace content { | 28 namespace content { |
29 class DownloadFile; | 29 class DownloadFile; |
30 class DownloadItemImplDelegate; | 30 class DownloadItemImplDelegate; |
31 | 31 |
32 // See download_item.h for usage. | 32 // See download_item.h for usage. |
(...skipping 25 matching lines...) Expand all Loading... |
58 const std::vector<GURL>& url_chain, | 58 const std::vector<GURL>& url_chain, |
59 const GURL& referrer_url, | 59 const GURL& referrer_url, |
60 const std::string& mime_type, | 60 const std::string& mime_type, |
61 const std::string& original_mime_type, | 61 const std::string& original_mime_type, |
62 const base::Time& start_time, | 62 const base::Time& start_time, |
63 const base::Time& end_time, | 63 const base::Time& end_time, |
64 const std::string& etag, | 64 const std::string& etag, |
65 const std::string& last_modified, | 65 const std::string& last_modified, |
66 int64_t received_bytes, | 66 int64_t received_bytes, |
67 int64_t total_bytes, | 67 int64_t total_bytes, |
| 68 const std::string& hash, |
68 DownloadItem::DownloadState state, | 69 DownloadItem::DownloadState state, |
69 DownloadDangerType danger_type, | 70 DownloadDangerType danger_type, |
70 DownloadInterruptReason interrupt_reason, | 71 DownloadInterruptReason interrupt_reason, |
71 bool opened, | 72 bool opened, |
72 const net::BoundNetLog& bound_net_log); | 73 const net::BoundNetLog& bound_net_log); |
73 | 74 |
74 // Constructing for a regular download. | 75 // Constructing for a regular download. |
75 // |bound_net_log| is constructed externally for our use. | 76 // |bound_net_log| is constructed externally for our use. |
76 // TODO(asanka): Get rid of the DownloadCreateInfo parameter since active | 77 // TODO(asanka): Get rid of the DownloadCreateInfo parameter since active |
77 // downloads end up at Start() immediately after creation. | 78 // downloads end up at Start() immediately after creation. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 ui::PageTransition GetTransitionType() const override; | 127 ui::PageTransition GetTransitionType() const override; |
127 const std::string& GetLastModifiedTime() const override; | 128 const std::string& GetLastModifiedTime() const override; |
128 const std::string& GetETag() const override; | 129 const std::string& GetETag() const override; |
129 bool IsSavePackageDownload() const override; | 130 bool IsSavePackageDownload() const override; |
130 const base::FilePath& GetFullPath() const override; | 131 const base::FilePath& GetFullPath() const override; |
131 const base::FilePath& GetTargetFilePath() const override; | 132 const base::FilePath& GetTargetFilePath() const override; |
132 const base::FilePath& GetForcedFilePath() const override; | 133 const base::FilePath& GetForcedFilePath() const override; |
133 base::FilePath GetFileNameToReportUser() const override; | 134 base::FilePath GetFileNameToReportUser() const override; |
134 TargetDisposition GetTargetDisposition() const override; | 135 TargetDisposition GetTargetDisposition() const override; |
135 const std::string& GetHash() const override; | 136 const std::string& GetHash() const override; |
136 const std::string& GetHashState() const override; | |
137 bool GetFileExternallyRemoved() const override; | 137 bool GetFileExternallyRemoved() const override; |
138 void DeleteFile(const base::Callback<void(bool)>& callback) override; | 138 void DeleteFile(const base::Callback<void(bool)>& callback) override; |
139 bool IsDangerous() const override; | 139 bool IsDangerous() const override; |
140 DownloadDangerType GetDangerType() const override; | 140 DownloadDangerType GetDangerType() const override; |
141 bool TimeRemaining(base::TimeDelta* remaining) const override; | 141 bool TimeRemaining(base::TimeDelta* remaining) const override; |
142 int64_t CurrentSpeed() const override; | 142 int64_t CurrentSpeed() const override; |
143 int PercentComplete() const override; | 143 int PercentComplete() const override; |
144 bool AllDataSaved() const override; | 144 bool AllDataSaved() const override; |
145 int64_t GetTotalBytes() const override; | 145 int64_t GetTotalBytes() const override; |
146 int64_t GetReceivedBytes() const override; | 146 int64_t GetReceivedBytes() const override; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 DestinationObserverAsWeakPtr(); | 198 DestinationObserverAsWeakPtr(); |
199 | 199 |
200 // Get the download's BoundNetLog. | 200 // Get the download's BoundNetLog. |
201 virtual const net::BoundNetLog& GetBoundNetLog() const; | 201 virtual const net::BoundNetLog& GetBoundNetLog() const; |
202 | 202 |
203 // DownloadItemImpl routines only needed by SavePackage ---------------------- | 203 // DownloadItemImpl routines only needed by SavePackage ---------------------- |
204 | 204 |
205 // Called by SavePackage to set the total number of bytes on the item. | 205 // Called by SavePackage to set the total number of bytes on the item. |
206 virtual void SetTotalBytes(int64_t total_bytes); | 206 virtual void SetTotalBytes(int64_t total_bytes); |
207 | 207 |
208 virtual void OnAllDataSaved(const std::string& final_hash); | 208 virtual void OnAllDataSaved(int64_t total_bytes, |
| 209 scoped_ptr<crypto::SecureHash> hash_state); |
209 | 210 |
210 // Called by SavePackage to display progress when the DownloadItem | 211 // Called by SavePackage to display progress when the DownloadItem |
211 // should be considered complete. | 212 // should be considered complete. |
212 virtual void MarkAsComplete(); | 213 virtual void MarkAsComplete(); |
213 | 214 |
214 // DownloadDestinationObserver | 215 // DownloadDestinationObserver |
215 void DestinationUpdate(int64_t bytes_so_far, | 216 void DestinationUpdate(int64_t bytes_so_far, int64_t bytes_per_sec) override; |
216 int64_t bytes_per_sec, | 217 void DestinationError(DownloadInterruptReason reason, |
217 const std::string& hash_state) override; | 218 int64_t bytes_so_far, |
218 void DestinationError(DownloadInterruptReason reason) override; | 219 scoped_ptr<crypto::SecureHash> hash_state) override; |
219 void DestinationCompleted(const std::string& final_hash) override; | 220 void DestinationCompleted(int64_t total_bytes, |
| 221 scoped_ptr<crypto::SecureHash> hash_state) override; |
220 | 222 |
221 private: | 223 private: |
222 // Fine grained states of a download. | 224 // Fine grained states of a download. |
223 // | 225 // |
224 // New downloads can be created in the following states: | 226 // New downloads can be created in the following states: |
225 // | 227 // |
226 // INITIAL_INTERNAL: All active new downloads. | 228 // INITIAL_INTERNAL: All active new downloads. |
227 // | 229 // |
228 // COMPLETE_INTERNAL: Downloads restored from persisted state. | 230 // COMPLETE_INTERNAL: Downloads restored from persisted state. |
229 // CANCELLED_INTERNAL: - do - | 231 // CANCELLED_INTERNAL: - do - |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 // Called if the embedder took over opening a download, to indicate that | 421 // Called if the embedder took over opening a download, to indicate that |
420 // the download has been opened. | 422 // the download has been opened. |
421 void DelayedDownloadOpened(bool auto_opened); | 423 void DelayedDownloadOpened(bool auto_opened); |
422 | 424 |
423 // Called when the entire download operation (including renaming etc.) | 425 // Called when the entire download operation (including renaming etc.) |
424 // is completed. | 426 // is completed. |
425 void Completed(); | 427 void Completed(); |
426 | 428 |
427 // Helper routines ----------------------------------------------------------- | 429 // Helper routines ----------------------------------------------------------- |
428 | 430 |
429 // Indicate that an error has occurred on the download. | 431 // Indicate that an error has occurred on the download. Discards partial |
430 void Interrupt(DownloadInterruptReason reason); | 432 // state. The interrupted download will not be considered continuable, but may |
| 433 // be restarted. |
| 434 void InterruptAndDiscardPartialState(DownloadInterruptReason reason); |
| 435 |
| 436 // Indiates that an error has occurred on the download. The |bytes_so_far| and |
| 437 // |hash_state| should correspond to the state of the DownloadFile. If the |
| 438 // interrupt reason allows, this partial state may be allowed to continue the |
| 439 // interrupted download upon resumption. |
| 440 void InterruptWithPartialState(int64_t bytes_so_far, |
| 441 scoped_ptr<crypto::SecureHash> hash_state, |
| 442 DownloadInterruptReason reason); |
| 443 |
| 444 void UpdateProgress(int64_t bytes_so_far, int64_t bytes_per_sec); |
| 445 |
| 446 // Set |hash_| based on the assumption that |hash_state_| represents the |
| 447 // partial hash state. |
| 448 void UpdatePrefixHash(); |
431 | 449 |
432 // Destroy the DownloadFile object. If |destroy_file| is true, the file is | 450 // Destroy the DownloadFile object. If |destroy_file| is true, the file is |
433 // destroyed with it. Otherwise, DownloadFile::Detach() is called before | 451 // destroyed with it. Otherwise, DownloadFile::Detach() is called before |
434 // object destruction to prevent file destruction. Destroying the file also | 452 // object destruction to prevent file destruction. Destroying the file also |
435 // resets |current_path_|. | 453 // resets |current_path_|. |
436 void ReleaseDownloadFile(bool destroy_file); | 454 void ReleaseDownloadFile(bool destroy_file); |
437 | 455 |
438 // Check if a download is ready for completion. The callback provided | 456 // Check if a download is ready for completion. The callback provided |
439 // may be called at some point in the future if an external entity | 457 // may be called at some point in the future if an external entity |
440 // state has change s.t. this routine should be checked again. | 458 // state has change s.t. this routine should be checked again. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 // The handle to the request information. Used for operations outside the | 497 // The handle to the request information. Used for operations outside the |
480 // download system. | 498 // download system. |
481 scoped_ptr<DownloadRequestHandleInterface> request_handle_; | 499 scoped_ptr<DownloadRequestHandleInterface> request_handle_; |
482 | 500 |
483 uint32_t download_id_ = kInvalidId; | 501 uint32_t download_id_ = kInvalidId; |
484 | 502 |
485 // Display name for the download. If this is empty, then the display name is | 503 // Display name for the download. If this is empty, then the display name is |
486 // considered to be |target_path_.BaseName()|. | 504 // considered to be |target_path_.BaseName()|. |
487 base::FilePath display_name_; | 505 base::FilePath display_name_; |
488 | 506 |
489 // Full path to the downloaded or downloading file. This is the path to the | |
490 // physical file, if one exists. The final target path is specified by | |
491 // |target_path_|. |current_path_| can be empty if the in-progress path hasn't | |
492 // been determined. | |
493 base::FilePath current_path_; | |
494 | |
495 // Target path of an in-progress download. We may be downloading to a | 507 // Target path of an in-progress download. We may be downloading to a |
496 // temporary or intermediate file (specified by |current_path_|. Once the | 508 // temporary or intermediate file (specified by |current_path_|. Once the |
497 // download completes, we will rename the file to |target_path_|. | 509 // download completes, we will rename the file to |target_path_|. |
498 base::FilePath target_path_; | 510 base::FilePath target_path_; |
499 | 511 |
500 // Whether the target should be overwritten, uniquified or prompted for. | 512 // Whether the target should be overwritten, uniquified or prompted for. |
501 TargetDisposition target_disposition_ = TARGET_DISPOSITION_OVERWRITE; | 513 TargetDisposition target_disposition_ = TARGET_DISPOSITION_OVERWRITE; |
502 | 514 |
503 // The chain of redirects that leading up to and including the final URL. | 515 // The chain of redirects that leading up to and including the final URL. |
504 std::vector<GURL> url_chain_; | 516 std::vector<GURL> url_chain_; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 // which may look at the file extension and first few bytes of the file. | 551 // which may look at the file extension and first few bytes of the file. |
540 std::string original_mime_type_; | 552 std::string original_mime_type_; |
541 | 553 |
542 // The remote IP address where the download was fetched from. Copied from | 554 // The remote IP address where the download was fetched from. Copied from |
543 // DownloadCreateInfo::remote_address. | 555 // DownloadCreateInfo::remote_address. |
544 std::string remote_address_; | 556 std::string remote_address_; |
545 | 557 |
546 // Total bytes expected. | 558 // Total bytes expected. |
547 int64_t total_bytes_ = 0; | 559 int64_t total_bytes_ = 0; |
548 | 560 |
549 // Current received bytes. | |
550 int64_t received_bytes_ = 0; | |
551 | |
552 // Current speed. Calculated by the DownloadFile. | |
553 int64_t bytes_per_sec_ = 0; | |
554 | |
555 // Sha256 hash of the content. This might be empty either because | |
556 // the download isn't done yet or because the hash isn't needed | |
557 // (ChromeDownloadManagerDelegate::GenerateFileHash() returned false). | |
558 std::string hash_; | |
559 | |
560 // A blob containing the state of the hash algorithm. Only valid while the | |
561 // download is in progress. | |
562 std::string hash_state_; | |
563 | |
564 // Server's time stamp for the file. | |
565 std::string last_modified_time_; | |
566 | |
567 // Server's ETAG for the file. | |
568 std::string etag_; | |
569 | |
570 // Last reason. | 561 // Last reason. |
571 DownloadInterruptReason last_reason_ = DOWNLOAD_INTERRUPT_REASON_NONE; | 562 DownloadInterruptReason last_reason_ = DOWNLOAD_INTERRUPT_REASON_NONE; |
572 | 563 |
573 // Start time for recording statistics. | 564 // Start time for recording statistics. |
574 base::TimeTicks start_tick_; | 565 base::TimeTicks start_tick_; |
575 | 566 |
576 // The current state of this download. | 567 // The current state of this download. |
577 DownloadInternalState state_ = INITIAL_INTERNAL; | 568 DownloadInternalState state_ = INITIAL_INTERNAL; |
578 | 569 |
579 // Current danger type for the download. | 570 // Current danger type for the download. |
580 DownloadDangerType danger_type_ = DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS; | 571 DownloadDangerType danger_type_ = DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS; |
581 | 572 |
582 // The views of this item in the download shelf and download contents. | 573 // The views of this item in the download shelf and download contents. |
583 base::ObserverList<Observer> observers_; | 574 base::ObserverList<Observer> observers_; |
584 | 575 |
585 // Time the download was started. | 576 // Time the download was started. |
586 base::Time start_time_; | 577 base::Time start_time_; |
587 | 578 |
588 // Time the download completed. | 579 // Time the download completed. |
589 base::Time end_time_; | 580 base::Time end_time_; |
590 | 581 |
591 // Our delegate. | 582 // Our delegate. |
592 DownloadItemImplDelegate* delegate_ = nullptr; | 583 DownloadItemImplDelegate* delegate_ = nullptr; |
593 | 584 |
594 // In progress downloads may be paused by the user, we note it here. | 585 // In progress downloads may be paused by the user, we note it here. |
595 bool is_paused_ = false; | 586 bool is_paused_ = false; |
596 | 587 |
597 // The number of times this download has been resumed automatically. | |
598 int auto_resume_count_ = 0; | |
599 | |
600 // A flag for indicating if the download should be opened at completion. | 588 // A flag for indicating if the download should be opened at completion. |
601 bool open_when_complete_ = false; | 589 bool open_when_complete_ = false; |
602 | 590 |
603 // A flag for indicating if the downloaded file is externally removed. | 591 // A flag for indicating if the downloaded file is externally removed. |
604 bool file_externally_removed_ = false; | 592 bool file_externally_removed_ = false; |
605 | 593 |
606 // True if the download was auto-opened. We set this rather than using | 594 // True if the download was auto-opened. We set this rather than using |
607 // an observer as it's frequently possible for the download to be auto opened | 595 // an observer as it's frequently possible for the download to be auto opened |
608 // before the observer is added. | 596 // before the observer is added. |
609 bool auto_opened_ = false; | 597 bool auto_opened_ = false; |
610 | 598 |
611 // True if the item was downloaded temporarily. | 599 // True if the item was downloaded temporarily. |
612 bool is_temporary_ = false; | 600 bool is_temporary_ = false; |
613 | 601 |
614 // True if we've saved all the data for the download. | |
615 bool all_data_saved_ = false; | |
616 | |
617 // Error return from DestinationError. Stored separately from | |
618 // last_reason_ so that we can avoid handling destination errors until | |
619 // after file name determination has occurred. | |
620 DownloadInterruptReason destination_error_ = DOWNLOAD_INTERRUPT_REASON_NONE; | |
621 | |
622 // Did the user open the item either directly or indirectly (such as by | 602 // Did the user open the item either directly or indirectly (such as by |
623 // setting always open files of this type)? The shelf also sets this field | 603 // setting always open files of this type)? The shelf also sets this field |
624 // when the user closes the shelf before the item has been opened but should | 604 // when the user closes the shelf before the item has been opened but should |
625 // be treated as though the user opened it. | 605 // be treated as though the user opened it. |
626 bool opened_ = false; | 606 bool opened_ = false; |
627 | 607 |
628 // Did the delegate delay calling Complete on this download? | 608 // Did the delegate delay calling Complete on this download? |
629 bool delegate_delayed_complete_ = false; | 609 bool delegate_delayed_complete_ = false; |
630 | 610 |
| 611 // Error return from DestinationError. Stored separately from |
| 612 // last_reason_ so that we can avoid handling destination errors until |
| 613 // after file name determination has occurred. |
| 614 DownloadInterruptReason destination_error_ = DOWNLOAD_INTERRUPT_REASON_NONE; |
| 615 |
| 616 // The following fields describe the current state of the download file. |
| 617 |
631 // DownloadFile associated with this download. Note that this | 618 // DownloadFile associated with this download. Note that this |
632 // pointer may only be used or destroyed on the FILE thread. | 619 // pointer may only be used or destroyed on the FILE thread. |
633 // This pointer will be non-null only while the DownloadItem is in | 620 // This pointer will be non-null only while the DownloadItem is in |
634 // the IN_PROGRESS state. | 621 // the IN_PROGRESS state. |
635 scoped_ptr<DownloadFile> download_file_; | 622 scoped_ptr<DownloadFile> download_file_; |
636 | 623 |
| 624 // Full path to the downloaded or downloading file. This is the path to the |
| 625 // physical file, if one exists. The final target path is specified by |
| 626 // |target_path_|. |current_path_| can be empty if the in-progress path hasn't |
| 627 // been determined. |
| 628 base::FilePath current_path_; |
| 629 |
| 630 // Current received bytes. |
| 631 int64_t received_bytes_ = 0; |
| 632 |
| 633 // Current speed. Calculated by the DownloadFile. |
| 634 int64_t bytes_per_sec_ = 0; |
| 635 |
| 636 // True if we've saved all the data for the download. If true, then the file |
| 637 // at |current_path_| contains |received_bytes_|, which constitute the |
| 638 // entirety of what we expect to save there. A digest of its contents can be |
| 639 // found at |hash_|. |
| 640 bool all_data_saved_ = false; |
| 641 |
| 642 // The number of times this download has been resumed automatically. Will be |
| 643 // reset to 0 if a resumption is performed in response to a Resume() call. |
| 644 int auto_resume_count_ = 0; |
| 645 |
| 646 // SHA256 hash of the possibly partial content. The hash is updated each time |
| 647 // the download is interrupted, or when the all the data has been transferred. |
| 648 std::string hash_; |
| 649 |
| 650 // In the event of an interruption, the DownloadDestinationObserver interface |
| 651 // exposes the partial hash state. This state can be held by the download item |
| 652 // in case it's needed for resumption. |
| 653 scoped_ptr<crypto::SecureHash> hash_state_; |
| 654 |
| 655 // Contents of the Last-Modified header for the most recent server response. |
| 656 std::string last_modified_time_; |
| 657 |
| 658 // Server's ETAG for the file. |
| 659 std::string etag_; |
| 660 |
637 // Net log to use for this download. | 661 // Net log to use for this download. |
638 const net::BoundNetLog bound_net_log_; | 662 const net::BoundNetLog bound_net_log_; |
639 | 663 |
640 base::WeakPtrFactory<DownloadItemImpl> weak_ptr_factory_; | 664 base::WeakPtrFactory<DownloadItemImpl> weak_ptr_factory_; |
641 | 665 |
642 DISALLOW_COPY_AND_ASSIGN(DownloadItemImpl); | 666 DISALLOW_COPY_AND_ASSIGN(DownloadItemImpl); |
643 }; | 667 }; |
644 | 668 |
645 } // namespace content | 669 } // namespace content |
646 | 670 |
647 #endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_IMPL_H_ | 671 #endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_IMPL_H_ |
OLD | NEW |