OLD | NEW |
---|---|
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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
125 referrer_url_(info.referrer_url), | 125 referrer_url_(info.referrer_url), |
126 total_bytes_(info.total_bytes), | 126 total_bytes_(info.total_bytes), |
127 received_bytes_(info.received_bytes), | 127 received_bytes_(info.received_bytes), |
128 start_tick_(base::TimeTicks()), | 128 start_tick_(base::TimeTicks()), |
129 state_(static_cast<DownloadState>(info.state)), | 129 state_(static_cast<DownloadState>(info.state)), |
130 start_time_(info.start_time), | 130 start_time_(info.start_time), |
131 db_handle_(info.db_handle), | 131 db_handle_(info.db_handle), |
132 download_manager_(download_manager), | 132 download_manager_(download_manager), |
133 is_paused_(false), | 133 is_paused_(false), |
134 open_when_complete_(false), | 134 open_when_complete_(false), |
135 file_externally_removed_(false), | |
135 safety_state_(SAFE), | 136 safety_state_(SAFE), |
136 auto_opened_(false), | 137 auto_opened_(false), |
137 is_otr_(false), | 138 is_otr_(false), |
138 is_temporary_(false), | 139 is_temporary_(false), |
139 all_data_saved_(false), | 140 all_data_saved_(false), |
140 opened_(false), | 141 opened_(false), |
141 open_enabled_(true) { | 142 open_enabled_(true) { |
142 if (IsInProgress()) | 143 if (IsInProgress()) |
143 state_ = CANCELLED; | 144 state_ = CANCELLED; |
144 if (IsComplete()) | 145 if (IsComplete()) |
(...skipping 21 matching lines...) Expand all Loading... | |
166 total_bytes_(info.total_bytes), | 167 total_bytes_(info.total_bytes), |
167 received_bytes_(0), | 168 received_bytes_(0), |
168 last_os_error_(0), | 169 last_os_error_(0), |
169 start_tick_(base::TimeTicks::Now()), | 170 start_tick_(base::TimeTicks::Now()), |
170 state_(IN_PROGRESS), | 171 state_(IN_PROGRESS), |
171 start_time_(info.start_time), | 172 start_time_(info.start_time), |
172 db_handle_(DownloadHistory::kUninitializedHandle), | 173 db_handle_(DownloadHistory::kUninitializedHandle), |
173 download_manager_(download_manager), | 174 download_manager_(download_manager), |
174 is_paused_(false), | 175 is_paused_(false), |
175 open_when_complete_(false), | 176 open_when_complete_(false), |
177 file_externally_removed_(false), | |
176 safety_state_(SAFE), | 178 safety_state_(SAFE), |
177 auto_opened_(false), | 179 auto_opened_(false), |
178 is_otr_(is_otr), | 180 is_otr_(is_otr), |
179 is_temporary_(!info.save_info.file_path.empty()), | 181 is_temporary_(!info.save_info.file_path.empty()), |
180 all_data_saved_(false), | 182 all_data_saved_(false), |
181 opened_(false), | 183 opened_(false), |
182 open_enabled_(true) { | 184 open_enabled_(true) { |
183 Init(true /* actively downloading */); | 185 Init(true /* actively downloading */); |
184 } | 186 } |
185 | 187 |
186 // Constructing for the "Save Page As..." feature: | 188 // Constructing for the "Save Page As..." feature: |
187 DownloadItem::DownloadItem(DownloadManager* download_manager, | 189 DownloadItem::DownloadItem(DownloadManager* download_manager, |
188 const FilePath& path, | 190 const FilePath& path, |
189 const GURL& url, | 191 const GURL& url, |
190 bool is_otr) | 192 bool is_otr) |
191 : download_id_(1), | 193 : download_id_(1), |
192 full_path_(path), | 194 full_path_(path), |
193 url_chain_(1, url), | 195 url_chain_(1, url), |
194 referrer_url_(GURL()), | 196 referrer_url_(GURL()), |
195 total_bytes_(0), | 197 total_bytes_(0), |
196 received_bytes_(0), | 198 received_bytes_(0), |
197 last_os_error_(0), | 199 last_os_error_(0), |
198 start_tick_(base::TimeTicks::Now()), | 200 start_tick_(base::TimeTicks::Now()), |
199 state_(IN_PROGRESS), | 201 state_(IN_PROGRESS), |
200 start_time_(base::Time::Now()), | 202 start_time_(base::Time::Now()), |
201 db_handle_(DownloadHistory::kUninitializedHandle), | 203 db_handle_(DownloadHistory::kUninitializedHandle), |
202 download_manager_(download_manager), | 204 download_manager_(download_manager), |
203 is_paused_(false), | 205 is_paused_(false), |
204 open_when_complete_(false), | 206 open_when_complete_(false), |
207 file_externally_removed_(false), | |
205 safety_state_(SAFE), | 208 safety_state_(SAFE), |
206 auto_opened_(false), | 209 auto_opened_(false), |
207 is_otr_(is_otr), | 210 is_otr_(is_otr), |
208 is_temporary_(false), | 211 is_temporary_(false), |
209 all_data_saved_(false), | 212 all_data_saved_(false), |
210 opened_(false), | 213 opened_(false), |
211 open_enabled_(true) { | 214 open_enabled_(true) { |
212 Init(true /* actively downloading */); | 215 Init(true /* actively downloading */); |
213 } | 216 } |
214 | 217 |
215 DownloadItem::~DownloadItem() { | 218 DownloadItem::~DownloadItem() { |
216 state_ = REMOVING; | 219 state_ = REMOVING; |
217 UpdateObservers(); | 220 UpdateObservers(); |
218 } | 221 } |
219 | 222 |
220 void DownloadItem::AddObserver(Observer* observer) { | 223 void DownloadItem::AddObserver(Observer* observer) { |
221 observers_.AddObserver(observer); | 224 observers_.AddObserver(observer); |
222 } | 225 } |
223 | 226 |
224 void DownloadItem::RemoveObserver(Observer* observer) { | 227 void DownloadItem::RemoveObserver(Observer* observer) { |
225 observers_.RemoveObserver(observer); | 228 observers_.RemoveObserver(observer); |
226 } | 229 } |
227 | 230 |
228 void DownloadItem::UpdateObservers() { | 231 void DownloadItem::UpdateObservers() { |
229 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadUpdated(this)); | 232 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadUpdated(this)); |
230 } | 233 } |
231 | 234 |
235 bool DownloadItem::CanShowInFolder() { | |
236 return !IsCancelled() && !file_externally_removed_; | |
237 } | |
238 | |
232 bool DownloadItem::CanOpenDownload() { | 239 bool DownloadItem::CanOpenDownload() { |
233 return !Extension::IsExtension(state_info_.target_name); | 240 return !Extension::IsExtension(state_info_.target_name); |
Paweł Hajdan Jr.
2011/06/08 09:58:41
Shouldn't you check file_externally_removed_ here?
haraken1
2011/06/08 10:35:07
I fixed it.
(However, we may not have to check |
| |
234 } | 241 } |
235 | 242 |
236 bool DownloadItem::ShouldOpenFileBasedOnExtension() { | 243 bool DownloadItem::ShouldOpenFileBasedOnExtension() { |
237 return download_manager_->ShouldOpenFileBasedOnExtension( | 244 return download_manager_->ShouldOpenFileBasedOnExtension( |
238 GetUserVerifiedFilePath()); | 245 GetUserVerifiedFilePath()); |
239 } | 246 } |
240 | 247 |
241 void DownloadItem::OpenFilesBasedOnExtension(bool open) { | 248 void DownloadItem::OpenFilesBasedOnExtension(bool open) { |
242 DownloadPrefs* prefs = download_manager_->download_prefs(); | 249 DownloadPrefs* prefs = download_manager_->download_prefs(); |
243 if (open) | 250 if (open) |
244 prefs->EnableAutoOpenBasedOnExtension(GetUserVerifiedFilePath()); | 251 prefs->EnableAutoOpenBasedOnExtension(GetUserVerifiedFilePath()); |
245 else | 252 else |
246 prefs->DisableAutoOpenBasedOnExtension(GetUserVerifiedFilePath()); | 253 prefs->DisableAutoOpenBasedOnExtension(GetUserVerifiedFilePath()); |
247 } | 254 } |
248 | 255 |
249 void DownloadItem::OpenDownload() { | 256 void DownloadItem::OpenDownload() { |
250 if (IsPartialDownload()) { | 257 if (IsPartialDownload()) { |
251 open_when_complete_ = !open_when_complete_; | 258 open_when_complete_ = !open_when_complete_; |
252 } else if (IsComplete()) { | 259 } else if (IsComplete() && !file_externally_removed_) { |
260 // Ideally, we want to detect errors in opening and report them, but we | |
261 // don't generally have the proper interface for that to the external | |
262 // program that opens the file. So instead we spawn a check to update | |
263 // the UI if the file has been deleted in parallel with the open. | |
264 download_manager_->CheckForFileRemoval(this); | |
253 opened_ = true; | 265 opened_ = true; |
254 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadOpened(this)); | 266 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadOpened(this)); |
255 | 267 |
256 // For testing: If download opening is disabled on this item, | 268 // For testing: If download opening is disabled on this item, |
257 // make the rest of the routine a no-op. | 269 // make the rest of the routine a no-op. |
258 if (!open_enabled_) | 270 if (!open_enabled_) |
259 return; | 271 return; |
260 | 272 |
261 if (is_extension_install()) { | 273 if (is_extension_install()) { |
262 download_util::OpenChromeExtension(download_manager_->profile(), *this); | 274 download_util::OpenChromeExtension(download_manager_->profile(), *this); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
346 UpdateObservers(); | 358 UpdateObservers(); |
347 } | 359 } |
348 | 360 |
349 void DownloadItem::OnAllDataSaved(int64 size) { | 361 void DownloadItem::OnAllDataSaved(int64 size) { |
350 DCHECK(!all_data_saved_); | 362 DCHECK(!all_data_saved_); |
351 all_data_saved_ = true; | 363 all_data_saved_ = true; |
352 UpdateSize(size); | 364 UpdateSize(size); |
353 StopProgressTimer(); | 365 StopProgressTimer(); |
354 } | 366 } |
355 | 367 |
368 void DownloadItem::OnDownloadedFileRemoved() { | |
369 file_externally_removed_ = true; | |
370 UpdateObservers(); | |
371 } | |
372 | |
356 void DownloadItem::Completed() { | 373 void DownloadItem::Completed() { |
357 VLOG(20) << __FUNCTION__ << "() " << DebugString(false); | 374 VLOG(20) << __FUNCTION__ << "() " << DebugString(false); |
358 | 375 |
359 DCHECK(all_data_saved_); | 376 DCHECK(all_data_saved_); |
360 state_ = COMPLETE; | 377 state_ = COMPLETE; |
361 UpdateObservers(); | 378 UpdateObservers(); |
362 download_manager_->DownloadCompleted(id()); | 379 download_manager_->DownloadCompleted(id()); |
363 download_util::RecordDownloadCompleted(start_tick_); | 380 download_util::RecordDownloadCompleted(start_tick_); |
364 | 381 |
365 if (is_extension_install()) { | 382 if (is_extension_install()) { |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
720 state_info_.target_name.value().c_str(), | 737 state_info_.target_name.value().c_str(), |
721 full_path().value().c_str()); | 738 full_path().value().c_str()); |
722 } else { | 739 } else { |
723 description += base::StringPrintf(" url = \"%s\"", url_list.c_str()); | 740 description += base::StringPrintf(" url = \"%s\"", url_list.c_str()); |
724 } | 741 } |
725 | 742 |
726 description += " }"; | 743 description += " }"; |
727 | 744 |
728 return description; | 745 return description; |
729 } | 746 } |
OLD | NEW |