| 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 "content/browser/download/save_file_resource_handler.h" | 5 #include "content/browser/download/save_file_resource_handler.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| 11 #include "content/browser/download/save_file_manager.h" | 11 #include "content/browser/download/save_file_manager.h" |
| 12 #include "content/public/browser/browser_thread.h" | 12 #include "content/public/browser/browser_thread.h" |
| 13 #include "content/public/browser/resource_controller.h" |
| 13 #include "net/base/io_buffer.h" | 14 #include "net/base/io_buffer.h" |
| 14 #include "net/url_request/redirect_info.h" | 15 #include "net/url_request/redirect_info.h" |
| 15 #include "net/url_request/url_request_status.h" | 16 #include "net/url_request/url_request_status.h" |
| 16 | 17 |
| 17 namespace content { | 18 namespace content { |
| 18 | 19 |
| 19 SaveFileResourceHandler::SaveFileResourceHandler( | 20 SaveFileResourceHandler::SaveFileResourceHandler( |
| 20 net::URLRequest* request, | 21 net::URLRequest* request, |
| 21 SaveItemId save_item_id, | 22 SaveItemId save_item_id, |
| 22 SavePackageId save_package_id, | 23 SavePackageId save_package_id, |
| 23 int render_process_host_id, | 24 int render_process_host_id, |
| 24 int render_frame_routing_id, | 25 int render_frame_routing_id, |
| 25 const GURL& url, | 26 const GURL& url, |
| 26 AuthorizationState authorization_state) | 27 AuthorizationState authorization_state) |
| 27 : ResourceHandler(request), | 28 : ResourceHandler(request), |
| 28 save_item_id_(save_item_id), | 29 save_item_id_(save_item_id), |
| 29 save_package_id_(save_package_id), | 30 save_package_id_(save_package_id), |
| 30 render_process_id_(render_process_host_id), | 31 render_process_id_(render_process_host_id), |
| 31 render_frame_routing_id_(render_frame_routing_id), | 32 render_frame_routing_id_(render_frame_routing_id), |
| 32 url_(url), | 33 url_(url), |
| 33 content_length_(0), | 34 content_length_(0), |
| 34 save_manager_(SaveFileManager::Get()), | 35 save_manager_(SaveFileManager::Get()), |
| 35 authorization_state_(authorization_state) {} | 36 authorization_state_(authorization_state) {} |
| 36 | 37 |
| 37 SaveFileResourceHandler::~SaveFileResourceHandler() { | 38 SaveFileResourceHandler::~SaveFileResourceHandler() { |
| 38 } | 39 } |
| 39 | 40 |
| 40 bool SaveFileResourceHandler::OnRequestRedirected( | 41 void SaveFileResourceHandler::OnRequestRedirected( |
| 41 const net::RedirectInfo& redirect_info, | 42 const net::RedirectInfo& redirect_info, |
| 42 ResourceResponse* response, | 43 ResourceResponse* response, |
| 43 bool* defer) { | 44 bool* defer_or_cancel) { |
| 44 final_url_ = redirect_info.new_url; | 45 final_url_ = redirect_info.new_url; |
| 45 return true; | |
| 46 } | 46 } |
| 47 | 47 |
| 48 bool SaveFileResourceHandler::OnResponseStarted(ResourceResponse* response, | 48 void SaveFileResourceHandler::OnResponseStarted(ResourceResponse* response, |
| 49 bool* defer) { | 49 bool* defer_or_cancel) { |
| 50 // |save_manager_| consumes (deletes): | 50 // |save_manager_| consumes (deletes): |
| 51 SaveFileCreateInfo* info = new SaveFileCreateInfo( | 51 SaveFileCreateInfo* info = new SaveFileCreateInfo( |
| 52 url_, final_url_, save_item_id_, save_package_id_, render_process_id_, | 52 url_, final_url_, save_item_id_, save_package_id_, render_process_id_, |
| 53 render_frame_routing_id_, GetRequestID(), content_disposition_, | 53 render_frame_routing_id_, GetRequestID(), content_disposition_, |
| 54 content_length_); | 54 content_length_); |
| 55 BrowserThread::PostTask( | 55 BrowserThread::PostTask( |
| 56 BrowserThread::FILE, FROM_HERE, | 56 BrowserThread::FILE, FROM_HERE, |
| 57 base::Bind(&SaveFileManager::StartSave, save_manager_, info)); | 57 base::Bind(&SaveFileManager::StartSave, save_manager_, info)); |
| 58 return true; | |
| 59 } | 58 } |
| 60 | 59 |
| 61 bool SaveFileResourceHandler::OnWillStart(const GURL& url, bool* defer) { | 60 void SaveFileResourceHandler::OnWillStart(const GURL& url, |
| 62 return authorization_state_ == AuthorizationState::AUTHORIZED; | 61 bool* defer_or_cancel) { |
| 62 if (authorization_state_ != AuthorizationState::AUTHORIZED) { |
| 63 controller()->Cancel(); |
| 64 *defer_or_cancel = true; |
| 65 } |
| 63 } | 66 } |
| 64 | 67 |
| 65 bool SaveFileResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, | 68 bool SaveFileResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, |
| 66 int* buf_size, | 69 int* buf_size, |
| 67 int min_size) { | 70 int min_size) { |
| 68 DCHECK_EQ(AuthorizationState::AUTHORIZED, authorization_state_); | 71 DCHECK_EQ(AuthorizationState::AUTHORIZED, authorization_state_); |
| 69 DCHECK(buf && buf_size); | 72 DCHECK(buf && buf_size); |
| 70 if (!read_buffer_.get()) { | 73 if (!read_buffer_.get()) { |
| 71 *buf_size = min_size < 0 ? kReadBufSize : min_size; | 74 *buf_size = min_size < 0 ? kReadBufSize : min_size; |
| 72 read_buffer_ = new net::IOBuffer(*buf_size); | 75 read_buffer_ = new net::IOBuffer(*buf_size); |
| 73 } | 76 } |
| 74 *buf = read_buffer_.get(); | 77 *buf = read_buffer_.get(); |
| 75 return true; | 78 return true; |
| 76 } | 79 } |
| 77 | 80 |
| 78 bool SaveFileResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { | 81 void SaveFileResourceHandler::OnReadCompleted(int bytes_read, |
| 82 bool* defer_or_cancel) { |
| 79 DCHECK_EQ(AuthorizationState::AUTHORIZED, authorization_state_); | 83 DCHECK_EQ(AuthorizationState::AUTHORIZED, authorization_state_); |
| 80 DCHECK(read_buffer_.get()); | 84 DCHECK(read_buffer_.get()); |
| 81 // We are passing ownership of this buffer to the save file manager. | 85 // We are passing ownership of this buffer to the save file manager. |
| 82 scoped_refptr<net::IOBuffer> buffer; | 86 scoped_refptr<net::IOBuffer> buffer; |
| 83 read_buffer_.swap(buffer); | 87 read_buffer_.swap(buffer); |
| 84 BrowserThread::PostTask( | 88 BrowserThread::PostTask( |
| 85 BrowserThread::FILE, FROM_HERE, | 89 BrowserThread::FILE, FROM_HERE, |
| 86 base::Bind(&SaveFileManager::UpdateSaveProgress, save_manager_, | 90 base::Bind(&SaveFileManager::UpdateSaveProgress, save_manager_, |
| 87 save_item_id_, base::RetainedRef(buffer), bytes_read)); | 91 save_item_id_, base::RetainedRef(buffer), bytes_read)); |
| 88 return true; | |
| 89 } | 92 } |
| 90 | 93 |
| 91 void SaveFileResourceHandler::OnResponseCompleted( | 94 void SaveFileResourceHandler::OnResponseCompleted( |
| 92 const net::URLRequestStatus& status, | 95 const net::URLRequestStatus& status, |
| 93 bool* defer) { | 96 bool* defer) { |
| 94 if (authorization_state_ != AuthorizationState::AUTHORIZED) | 97 if (authorization_state_ != AuthorizationState::AUTHORIZED) |
| 95 DCHECK(!status.is_success()); | 98 DCHECK(!status.is_success()); |
| 96 | 99 |
| 97 BrowserThread::PostTask( | 100 BrowserThread::PostTask( |
| 98 BrowserThread::FILE, FROM_HERE, | 101 BrowserThread::FILE, FROM_HERE, |
| 99 base::Bind(&SaveFileManager::SaveFinished, save_manager_, save_item_id_, | 102 base::Bind(&SaveFileManager::SaveFinished, save_manager_, save_item_id_, |
| 100 save_package_id_, | 103 save_package_id_, |
| 101 status.is_success() && !status.is_io_pending())); | 104 status.is_success() && !status.is_io_pending())); |
| 102 read_buffer_ = NULL; | 105 read_buffer_ = NULL; |
| 103 } | 106 } |
| 104 | 107 |
| 105 void SaveFileResourceHandler::OnDataDownloaded(int bytes_downloaded) { | 108 void SaveFileResourceHandler::OnDataDownloaded(int bytes_downloaded) { |
| 106 NOTREACHED(); | 109 NOTREACHED(); |
| 107 } | 110 } |
| 108 | 111 |
| 109 void SaveFileResourceHandler::set_content_length( | 112 void SaveFileResourceHandler::set_content_length( |
| 110 const std::string& content_length) { | 113 const std::string& content_length) { |
| 111 base::StringToInt64(content_length, &content_length_); | 114 base::StringToInt64(content_length, &content_length_); |
| 112 } | 115 } |
| 113 | 116 |
| 114 } // namespace content | 117 } // namespace content |
| OLD | NEW |