Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(325)

Side by Side Diff: chrome/browser/download/download_item.cc

Issue 7192016: chrome.experimental.downloads (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: merged db_handle, id; onCreated, onErased Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/download/download_item.h ('k') | chrome/browser/download/download_manager.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #include "chrome/browser/download/download_item.h" 5 #include "chrome/browser/download/download_item.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/format_macros.h" 9 #include "base/format_macros.h"
10 #include "base/i18n/case_conversion.h" 10 #include "base/i18n/case_conversion.h"
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 } 114 }
115 return dangerous_file ? 115 return dangerous_file ?
116 DownloadItem::DANGEROUS_FILE : DownloadItem::NOT_DANGEROUS; 116 DownloadItem::DANGEROUS_FILE : DownloadItem::NOT_DANGEROUS;
117 } 117 }
118 118
119 } // namespace 119 } // namespace
120 120
121 // Constructor for reading from the history service. 121 // Constructor for reading from the history service.
122 DownloadItem::DownloadItem(DownloadManager* download_manager, 122 DownloadItem::DownloadItem(DownloadManager* download_manager,
123 const DownloadHistoryInfo& info) 123 const DownloadHistoryInfo& info)
124 : download_id_(-1), 124 : download_id_(info.id),
125 is_in_history_(true),
125 full_path_(info.path), 126 full_path_(info.path),
126 url_chain_(1, info.url), 127 url_chain_(1, info.url),
127 referrer_url_(info.referrer_url), 128 referrer_url_(info.referrer_url),
128 total_bytes_(info.total_bytes), 129 total_bytes_(info.total_bytes),
129 received_bytes_(info.received_bytes), 130 received_bytes_(info.received_bytes),
130 start_tick_(base::TimeTicks()), 131 start_tick_(base::TimeTicks()),
131 state_(static_cast<DownloadState>(info.state)), 132 state_(static_cast<DownloadState>(info.state)),
132 start_time_(info.start_time), 133 start_time_(info.start_time),
133 db_handle_(info.db_handle),
134 download_manager_(download_manager), 134 download_manager_(download_manager),
135 is_paused_(false), 135 is_paused_(false),
136 open_when_complete_(false), 136 open_when_complete_(false),
137 file_externally_removed_(false), 137 file_externally_removed_(false),
138 safety_state_(SAFE), 138 safety_state_(SAFE),
139 auto_opened_(false), 139 auto_opened_(false),
140 is_otr_(false), 140 is_otr_(false),
141 is_temporary_(false), 141 is_temporary_(false),
142 all_data_saved_(false), 142 all_data_saved_(false),
143 opened_(false), 143 opened_(false),
144 open_enabled_(true) { 144 open_enabled_(true) {
145 if (IsInProgress()) 145 if (IsInProgress())
146 state_ = CANCELLED; 146 state_ = CANCELLED;
147 if (IsComplete()) 147 if (IsComplete())
148 all_data_saved_ = true; 148 all_data_saved_ = true;
149 Init(false /* not actively downloading */); 149 Init(false /* not actively downloading */);
150 } 150 }
151 151
152 // Constructing for a regular download: 152 // Constructing for a regular download:
153 DownloadItem::DownloadItem(DownloadManager* download_manager, 153 DownloadItem::DownloadItem(DownloadManager* download_manager,
154 const DownloadCreateInfo& info, 154 const DownloadCreateInfo& info,
155 bool is_otr) 155 bool is_otr)
156 : state_info_(info.original_name, info.save_info.file_path, 156 : state_info_(info.original_name, info.save_info.file_path,
157 info.has_user_gesture, info.prompt_user_for_save_location, 157 info.has_user_gesture, info.prompt_user_for_save_location,
158 info.path_uniquifier, false, false, 158 info.path_uniquifier, false, false,
159 info.is_extension_install), 159 info.is_extension_install),
160 request_handle_(info.request_handle), 160 request_handle_(info.request_handle),
161 download_id_(info.download_id), 161 download_id_(info.download_id),
162 is_in_history_(false),
162 full_path_(info.path), 163 full_path_(info.path),
163 url_chain_(info.url_chain), 164 url_chain_(info.url_chain),
164 referrer_url_(info.referrer_url), 165 referrer_url_(info.referrer_url),
165 content_disposition_(info.content_disposition), 166 content_disposition_(info.content_disposition),
166 mime_type_(info.mime_type), 167 mime_type_(info.mime_type),
167 original_mime_type_(info.original_mime_type), 168 original_mime_type_(info.original_mime_type),
168 referrer_charset_(info.referrer_charset), 169 referrer_charset_(info.referrer_charset),
169 total_bytes_(info.total_bytes), 170 total_bytes_(info.total_bytes),
170 received_bytes_(0), 171 received_bytes_(0),
171 last_os_error_(0), 172 last_os_error_(0),
172 start_tick_(base::TimeTicks::Now()), 173 start_tick_(base::TimeTicks::Now()),
173 state_(IN_PROGRESS), 174 state_(IN_PROGRESS),
174 start_time_(info.start_time), 175 start_time_(info.start_time),
175 db_handle_(DownloadHistory::kUninitializedHandle),
176 download_manager_(download_manager), 176 download_manager_(download_manager),
177 is_paused_(false), 177 is_paused_(false),
178 open_when_complete_(false), 178 open_when_complete_(false),
179 file_externally_removed_(false), 179 file_externally_removed_(false),
180 safety_state_(SAFE), 180 safety_state_(SAFE),
181 auto_opened_(false), 181 auto_opened_(false),
182 is_otr_(is_otr), 182 is_otr_(is_otr),
183 is_temporary_(!info.save_info.file_path.empty()), 183 is_temporary_(!info.save_info.file_path.empty()),
184 all_data_saved_(false), 184 all_data_saved_(false),
185 opened_(false), 185 opened_(false),
186 open_enabled_(true) { 186 open_enabled_(true) {
187 Init(true /* actively downloading */); 187 Init(true /* actively downloading */);
188 } 188 }
189 189
190 // Constructing for the "Save Page As..." feature: 190 // Constructing for the "Save Page As..." feature:
191 DownloadItem::DownloadItem(DownloadManager* download_manager, 191 DownloadItem::DownloadItem(DownloadManager* download_manager,
192 const FilePath& path, 192 const FilePath& path,
193 const GURL& url, 193 const GURL& url,
194 bool is_otr) 194 bool is_otr)
195 : download_id_(1), 195 : download_id_(-1/*TODO(benjhayden) XXX*/),
196 is_in_history_(false),
196 full_path_(path), 197 full_path_(path),
197 url_chain_(1, url), 198 url_chain_(1, url),
198 referrer_url_(GURL()), 199 referrer_url_(GURL()),
199 total_bytes_(0), 200 total_bytes_(0),
200 received_bytes_(0), 201 received_bytes_(0),
201 last_os_error_(0), 202 last_os_error_(0),
202 start_tick_(base::TimeTicks::Now()), 203 start_tick_(base::TimeTicks::Now()),
203 state_(IN_PROGRESS), 204 state_(IN_PROGRESS),
204 start_time_(base::Time::Now()), 205 start_time_(base::Time::Now()),
205 db_handle_(DownloadHistory::kUninitializedHandle),
206 download_manager_(download_manager), 206 download_manager_(download_manager),
207 is_paused_(false), 207 is_paused_(false),
208 open_when_complete_(false), 208 open_when_complete_(false),
209 file_externally_removed_(false), 209 file_externally_removed_(false),
210 safety_state_(SAFE), 210 safety_state_(SAFE),
211 auto_opened_(false), 211 auto_opened_(false),
212 is_otr_(is_otr), 212 is_otr_(is_otr),
213 is_temporary_(false), 213 is_temporary_(false),
214 all_data_saved_(false), 214 all_data_saved_(false),
215 opened_(false), 215 opened_(false),
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 533
534 void DownloadItem::Remove() { 534 void DownloadItem::Remove() {
535 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. 535 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved.
536 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 536 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
537 537
538 download_manager_->AssertQueueStateConsistent(this); 538 download_manager_->AssertQueueStateConsistent(this);
539 Cancel(true); 539 Cancel(true);
540 download_manager_->AssertQueueStateConsistent(this); 540 download_manager_->AssertQueueStateConsistent(this);
541 541
542 state_ = REMOVING; 542 state_ = REMOVING;
543 download_manager_->RemoveDownload(db_handle_); 543 download_manager_->RemoveDownload(id());
544 // We have now been deleted. 544 // We have now been deleted.
545 } 545 }
546 546
547 bool DownloadItem::TimeRemaining(base::TimeDelta* remaining) const { 547 bool DownloadItem::TimeRemaining(base::TimeDelta* remaining) const {
548 if (total_bytes_ <= 0) 548 if (total_bytes_ <= 0)
549 return false; // We never received the content_length for this download. 549 return false; // We never received the content_length for this download.
550 550
551 int64 speed = CurrentSpeed(); 551 int64 speed = CurrentSpeed();
552 if (speed == 0) 552 if (speed == 0)
553 return false; 553 return false;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 request_handle_.ResumeRequest(); 596 request_handle_.ResumeRequest();
597 else 597 else
598 request_handle_.PauseRequest(); 598 request_handle_.PauseRequest();
599 is_paused_ = !is_paused_; 599 is_paused_ = !is_paused_;
600 UpdateObservers(); 600 UpdateObservers();
601 } 601 }
602 602
603 void DownloadItem::OnDownloadCompleting(DownloadFileManager* file_manager) { 603 void DownloadItem::OnDownloadCompleting(DownloadFileManager* file_manager) {
604 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. 604 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved.
605 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 605 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
606 606 DVLOG(1) << __FUNCTION__ << "()"
607 VLOG(20) << __FUNCTION__ << "()"
608 << " needs rename = " << NeedsRename() 607 << " needs rename = " << NeedsRename()
609 << " " << DebugString(true); 608 << " " << DebugString(true);
610 DCHECK_NE(DANGEROUS, safety_state()); 609 DCHECK_NE(DANGEROUS, safety_state());
611 DCHECK(file_manager); 610 DCHECK(file_manager);
612 611
613 if (NeedsRename()) { 612 if (NeedsRename()) {
614 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 613 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
615 NewRunnableMethod(file_manager, 614 NewRunnableMethod(file_manager,
616 &DownloadFileManager::RenameCompletingDownloadFile, id(), 615 &DownloadFileManager::RenameCompletingDownloadFile, id(),
617 GetTargetFilePath(), safety_state() == SAFE)); 616 GetTargetFilePath(), safety_state() == SAFE));
618 return; 617 return;
619 } 618 }
620 619
621 DCHECK(!is_extension_install()); 620 DCHECK(!is_extension_install());
622 Completed(); 621 Completed();
623 622
624 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 623 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
625 NewRunnableMethod(file_manager, &DownloadFileManager::CompleteDownload, 624 NewRunnableMethod(file_manager, &DownloadFileManager::CompleteDownload,
626 id())); 625 id()));
627 } 626 }
628 627
629 void DownloadItem::OnDownloadRenamedToFinalName(const FilePath& full_path) { 628 void DownloadItem::OnDownloadRenamedToFinalName(const FilePath& full_path) {
630 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved. 629 // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved.
631 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 630 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
632 631
633 VLOG(20) << __FUNCTION__ << "()" 632 DVLOG(1) << __FUNCTION__ << "()"
634 << " full_path = \"" << full_path.value() << "\"" 633 << " full_path = \"" << full_path.value() << "\""
635 << " needed rename = " << NeedsRename() 634 << " needed rename = " << NeedsRename()
636 << " " << DebugString(false); 635 << " " << DebugString(false);
637 DCHECK(NeedsRename()); 636 DCHECK(NeedsRename());
638 637
639 Rename(full_path); 638 Rename(full_path);
640 639
641 if (is_extension_install()) { 640 if (is_extension_install()) {
642 StartCrxInstall(); 641 StartCrxInstall();
643 // Completed() will be called when the installer finishes. 642 // Completed() will be called when the installer finishes.
644 return; 643 return;
645 } 644 }
646 645
647 Completed(); 646 Completed();
647 DVLOG(1) << DebugString(true);
648 } 648 }
649 649
650 bool DownloadItem::MatchesQuery(const string16& query) const { 650 bool DownloadItem::MatchesQuery(const string16& query) const {
651 if (query.empty()) 651 if (query.empty())
652 return true; 652 return true;
653 653
654 DCHECK_EQ(query, base::i18n::ToLower(query)); 654 DCHECK_EQ(query, base::i18n::ToLower(query));
655 655
656 string16 url_raw(base::i18n::ToLower(UTF8ToUTF16(GetURL().spec()))); 656 string16 url_raw(base::i18n::ToLower(UTF8ToUTF16(GetURL().spec())));
657 if (url_raw.find(query) != string16::npos) 657 if (url_raw.find(query) != string16::npos)
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 } 725 }
726 726
727 DownloadHistoryInfo DownloadItem::GetHistoryInfo() const { 727 DownloadHistoryInfo DownloadItem::GetHistoryInfo() const {
728 return DownloadHistoryInfo(full_path(), 728 return DownloadHistoryInfo(full_path(),
729 GetURL(), 729 GetURL(),
730 referrer_url(), 730 referrer_url(),
731 start_time(), 731 start_time(),
732 received_bytes(), 732 received_bytes(),
733 total_bytes(), 733 total_bytes(),
734 state(), 734 state(),
735 db_handle()); 735 id());
736 } 736 }
737 737
738 FilePath DownloadItem::GetTargetFilePath() const { 738 FilePath DownloadItem::GetTargetFilePath() const {
739 return full_path_.DirName().Append(state_info_.target_name); 739 return full_path_.DirName().Append(state_info_.target_name);
740 } 740 }
741 741
742 FilePath DownloadItem::GetFileNameToReportUser() const { 742 FilePath DownloadItem::GetFileNameToReportUser() const {
743 if (state_info_.path_uniquifier > 0) { 743 if (state_info_.path_uniquifier > 0) {
744 FilePath name(state_info_.target_name); 744 FilePath name(state_info_.target_name);
745 download_util::AppendNumberToPath(&name, state_info_.path_uniquifier); 745 download_util::AppendNumberToPath(&name, state_info_.path_uniquifier);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 } 781 }
782 782
783 bool DownloadItem::IsInterrupted() const { 783 bool DownloadItem::IsInterrupted() const {
784 return (state_ == INTERRUPTED); 784 return (state_ == INTERRUPTED);
785 } 785 }
786 786
787 bool DownloadItem::IsComplete() const { 787 bool DownloadItem::IsComplete() const {
788 return (state_ == COMPLETE); 788 return (state_ == COMPLETE);
789 } 789 }
790 790
791 bool DownloadItem::IsInHistory() const {
792 return is_in_history_;
793 }
794
791 const GURL& DownloadItem::GetURL() const { 795 const GURL& DownloadItem::GetURL() const {
792 return url_chain_.empty() ? 796 return url_chain_.empty() ?
793 GURL::EmptyGURL() : url_chain_.back(); 797 GURL::EmptyGURL() : url_chain_.back();
794 } 798 }
795 799
796 std::string DownloadItem::DebugString(bool verbose) const { 800 std::string DownloadItem::DebugString(bool verbose) const {
797 std::string description = 801 std::string description =
798 base::StringPrintf("{ id = %d" 802 base::StringPrintf("{ id = %d"
799 " state = %s", 803 " state = %s",
800 download_id_, 804 id(),
801 DebugDownloadStateString(state())); 805 DebugDownloadStateString(state()));
802 806
803 // Construct a string of the URL chain. 807 // Construct a string of the URL chain.
804 std::string url_list("<none>"); 808 std::string url_list("<none>");
805 if (!url_chain_.empty()) { 809 if (!url_chain_.empty()) {
806 std::vector<GURL>::const_iterator iter = url_chain_.begin(); 810 std::vector<GURL>::const_iterator iter = url_chain_.begin();
807 std::vector<GURL>::const_iterator last = url_chain_.end(); 811 std::vector<GURL>::const_iterator last = url_chain_.end();
808 url_list = (*iter).spec(); 812 url_list = (*iter).spec();
809 ++iter; 813 ++iter;
810 for ( ; verbose && (iter != last); ++iter) { 814 for ( ; verbose && (iter != last); ++iter) {
811 url_list += " ->\n\t"; 815 url_list += " ->\n\t";
812 const GURL& next_url = *iter; 816 const GURL& next_url = *iter;
813 url_list += next_url.spec(); 817 url_list += next_url.spec();
814 } 818 }
815 } 819 }
816 820
817 if (verbose) { 821 if (verbose) {
818 description += base::StringPrintf( 822 description += base::StringPrintf(
819 " db_handle = %" PRId64
820 " total_bytes = %" PRId64 823 " total_bytes = %" PRId64
821 " received_bytes = %" PRId64 824 " received_bytes = %" PRId64
822 " is_paused = %c" 825 " is_paused = %c"
823 " is_extension_install = %c" 826 " is_extension_install = %c"
824 " is_otr = %c" 827 " is_otr = %c"
825 " safety_state = %s" 828 " safety_state = %s"
826 " url_chain = \n\t\"%s\"\n\t" 829 " url_chain = \n\t\"%s\"\n\t"
827 " target_name = \"%" PRFilePath "\"" 830 " target_name = \"%" PRFilePath "\""
828 " full_path = \"%" PRFilePath "\"", 831 " full_path = \"%" PRFilePath "\"",
829 db_handle(),
830 total_bytes(), 832 total_bytes(),
831 received_bytes(), 833 received_bytes(),
832 is_paused() ? 'T' : 'F', 834 is_paused() ? 'T' : 'F',
833 is_extension_install() ? 'T' : 'F', 835 is_extension_install() ? 'T' : 'F',
834 is_otr() ? 'T' : 'F', 836 is_otr() ? 'T' : 'F',
835 DebugSafetyStateString(safety_state()), 837 DebugSafetyStateString(safety_state()),
836 url_list.c_str(), 838 url_list.c_str(),
837 state_info_.target_name.value().c_str(), 839 state_info_.target_name.value().c_str(),
838 full_path().value().c_str()); 840 full_path().value().c_str());
839 } else { 841 } else {
840 description += base::StringPrintf(" url = \"%s\"", url_list.c_str()); 842 description += base::StringPrintf(" url = \"%s\"", url_list.c_str());
841 } 843 }
842 844
843 description += " }"; 845 description += " }";
844 846
845 return description; 847 return description;
846 } 848 }
OLDNEW
« no previous file with comments | « chrome/browser/download/download_item.h ('k') | chrome/browser/download/download_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698