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 #include "build/build_config.h" | 5 #include "build/build_config.h" |
6 | 6 |
7 #include "content/browser/download/save_file_manager.h" | 7 #include "content/browser/download/save_file_manager.h" |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 const Referrer& referrer, | 67 const Referrer& referrer, |
68 int render_process_host_id, | 68 int render_process_host_id, |
69 int render_view_routing_id, | 69 int render_view_routing_id, |
70 int render_frame_routing_id, | 70 int render_frame_routing_id, |
71 SaveFileCreateInfo::SaveFileSource save_source, | 71 SaveFileCreateInfo::SaveFileSource save_source, |
72 const base::FilePath& file_full_path, | 72 const base::FilePath& file_full_path, |
73 ResourceContext* context, | 73 ResourceContext* context, |
74 SavePackage* save_package) { | 74 SavePackage* save_package) { |
75 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 75 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
76 | 76 |
| 77 // Insert started saving job to tracking list. |
| 78 DCHECK(packages_.find(save_item_id) == packages_.end()); |
| 79 packages_[save_item_id] = save_package; |
| 80 |
77 // Register a saving job. | 81 // Register a saving job. |
78 if (save_source == SaveFileCreateInfo::SAVE_FILE_FROM_NET) { | 82 if (save_source == SaveFileCreateInfo::SAVE_FILE_FROM_NET) { |
79 DCHECK(url.is_valid()); | 83 DCHECK(url.is_valid()); |
80 | 84 |
81 BrowserThread::PostTask( | 85 BrowserThread::PostTask( |
82 BrowserThread::IO, FROM_HERE, | 86 BrowserThread::IO, FROM_HERE, |
83 base::Bind(&SaveFileManager::OnSaveURL, this, url, referrer, | 87 base::Bind(&SaveFileManager::OnSaveURL, this, url, referrer, |
84 save_item_id, save_package->id(), render_process_host_id, | 88 save_item_id, save_package->id(), render_process_host_id, |
85 render_view_routing_id, render_frame_routing_id, context)); | 89 render_view_routing_id, render_frame_routing_id, context)); |
86 } else { | 90 } else { |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 // The IO thread will call this when saving is completed or it got error when | 198 // The IO thread will call this when saving is completed or it got error when |
195 // fetching data. We forward the message to OnSaveFinished in UI thread. | 199 // fetching data. We forward the message to OnSaveFinished in UI thread. |
196 void SaveFileManager::SaveFinished(SaveItemId save_item_id, | 200 void SaveFileManager::SaveFinished(SaveItemId save_item_id, |
197 SavePackageId save_package_id, | 201 SavePackageId save_package_id, |
198 bool is_success) { | 202 bool is_success) { |
199 DVLOG(20) << " " << __FUNCTION__ << "()" | 203 DVLOG(20) << " " << __FUNCTION__ << "()" |
200 << " save_item_id = " << save_item_id | 204 << " save_item_id = " << save_item_id |
201 << " save_package_id = " << save_package_id | 205 << " save_package_id = " << save_package_id |
202 << " is_success = " << is_success; | 206 << " is_success = " << is_success; |
203 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 207 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
| 208 |
| 209 int64_t bytes_so_far; |
204 SaveFile* save_file = LookupSaveFile(save_item_id); | 210 SaveFile* save_file = LookupSaveFile(save_item_id); |
205 if (save_file != nullptr) { | 211 if (save_file != nullptr) { |
206 DCHECK(save_file->InProgress()); | 212 DCHECK(save_file->InProgress()); |
207 DVLOG(20) << " " << __FUNCTION__ << "()" | 213 DVLOG(20) << " " << __FUNCTION__ << "()" |
208 << " save_file = " << save_file->DebugString(); | 214 << " save_file = " << save_file->DebugString(); |
209 BrowserThread::PostTask( | 215 bytes_so_far = save_file->BytesSoFar(); |
210 BrowserThread::UI, FROM_HERE, | |
211 base::Bind(&SaveFileManager::OnSaveFinished, this, save_item_id, | |
212 save_file->BytesSoFar(), is_success)); | |
213 | |
214 save_file->Finish(); | 216 save_file->Finish(); |
215 save_file->Detach(); | 217 save_file->Detach(); |
| 218 } else { |
| 219 // We got called before StartSave - this should only happen if |
| 220 // ResourceHandler failed before it got a chance to parse headers |
| 221 // and metadata. |
| 222 DCHECK(!is_success); |
| 223 |
| 224 bytes_so_far = 0; |
216 } | 225 } |
| 226 |
| 227 BrowserThread::PostTask( |
| 228 BrowserThread::UI, FROM_HERE, |
| 229 base::Bind(&SaveFileManager::OnSaveFinished, this, save_item_id, |
| 230 bytes_so_far, is_success)); |
217 } | 231 } |
218 | 232 |
219 // Notifications sent from the file thread and run on the UI thread. | 233 // Notifications sent from the file thread and run on the UI thread. |
220 | 234 |
221 void SaveFileManager::OnStartSave(const SaveFileCreateInfo& info) { | 235 void SaveFileManager::OnStartSave(const SaveFileCreateInfo& info) { |
222 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 236 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
223 SavePackage* save_package = GetSavePackageFromRenderIds( | 237 SavePackage* save_package = GetSavePackageFromRenderIds( |
224 info.render_process_id, info.render_frame_routing_id); | 238 info.render_process_id, info.render_frame_routing_id); |
225 if (!save_package) { | 239 if (!save_package) { |
226 // Cancel this request. | 240 // Cancel this request. |
227 SendCancelRequest(info.save_item_id); | 241 SendCancelRequest(info.save_item_id); |
228 return; | 242 return; |
229 } | 243 } |
230 | 244 |
231 // Insert started saving job to tracking list. | |
232 DCHECK(packages_.find(info.save_item_id) == packages_.end()); | |
233 packages_[info.save_item_id] = save_package; | |
234 | |
235 // Forward this message to SavePackage. | 245 // Forward this message to SavePackage. |
236 save_package->StartSave(&info); | 246 save_package->StartSave(&info); |
237 } | 247 } |
238 | 248 |
239 void SaveFileManager::OnUpdateSaveProgress(SaveItemId save_item_id, | 249 void SaveFileManager::OnUpdateSaveProgress(SaveItemId save_item_id, |
240 int64_t bytes_so_far, | 250 int64_t bytes_so_far, |
241 bool write_success) { | 251 bool write_success) { |
242 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 252 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
243 SavePackage* package = LookupPackage(save_item_id); | 253 SavePackage* package = LookupPackage(save_item_id); |
244 if (package) | 254 if (package) |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 SaveFile* save_file = it->second; | 421 SaveFile* save_file = it->second; |
412 DCHECK(!save_file->InProgress()); | 422 DCHECK(!save_file->InProgress()); |
413 base::DeleteFile(save_file->FullPath(), false); | 423 base::DeleteFile(save_file->FullPath(), false); |
414 delete save_file; | 424 delete save_file; |
415 save_file_map_.erase(it); | 425 save_file_map_.erase(it); |
416 } | 426 } |
417 } | 427 } |
418 } | 428 } |
419 | 429 |
420 } // namespace content | 430 } // namespace content |
OLD | NEW |