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/browser/loader/resource_controller.h" |
12 #include "content/public/browser/browser_thread.h" | 13 #include "content/public/browser/browser_thread.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 std::unique_ptr<ResourceController> controller) { |
44 final_url_ = redirect_info.new_url; | 45 final_url_ = redirect_info.new_url; |
45 return true; | 46 controller->Resume(); |
46 } | 47 } |
47 | 48 |
48 bool SaveFileResourceHandler::OnResponseStarted(ResourceResponse* response, | 49 void SaveFileResourceHandler::OnResponseStarted( |
49 bool* defer) { | 50 ResourceResponse* response, |
| 51 std::unique_ptr<ResourceController> controller) { |
50 // |save_manager_| consumes (deletes): | 52 // |save_manager_| consumes (deletes): |
51 SaveFileCreateInfo* info = new SaveFileCreateInfo( | 53 SaveFileCreateInfo* info = new SaveFileCreateInfo( |
52 url_, final_url_, save_item_id_, save_package_id_, render_process_id_, | 54 url_, final_url_, save_item_id_, save_package_id_, render_process_id_, |
53 render_frame_routing_id_, GetRequestID(), content_disposition_, | 55 render_frame_routing_id_, GetRequestID(), content_disposition_, |
54 content_length_); | 56 content_length_); |
55 BrowserThread::PostTask( | 57 BrowserThread::PostTask( |
56 BrowserThread::FILE, FROM_HERE, | 58 BrowserThread::FILE, FROM_HERE, |
57 base::Bind(&SaveFileManager::StartSave, save_manager_, info)); | 59 base::Bind(&SaveFileManager::StartSave, save_manager_, info)); |
58 return true; | 60 controller->Resume(); |
59 } | 61 } |
60 | 62 |
61 bool SaveFileResourceHandler::OnWillStart(const GURL& url, bool* defer) { | 63 void SaveFileResourceHandler::OnWillStart( |
62 return authorization_state_ == AuthorizationState::AUTHORIZED; | 64 const GURL& url, |
| 65 std::unique_ptr<ResourceController> controller) { |
| 66 if (authorization_state_ == AuthorizationState::AUTHORIZED) { |
| 67 controller->Resume(); |
| 68 } else { |
| 69 controller->Cancel(); |
| 70 } |
63 } | 71 } |
64 | 72 |
65 bool SaveFileResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, | 73 bool SaveFileResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, |
66 int* buf_size, | 74 int* buf_size, |
67 int min_size) { | 75 int min_size) { |
68 DCHECK_EQ(AuthorizationState::AUTHORIZED, authorization_state_); | 76 DCHECK_EQ(AuthorizationState::AUTHORIZED, authorization_state_); |
69 DCHECK(buf && buf_size); | 77 DCHECK(buf && buf_size); |
70 if (!read_buffer_.get()) { | 78 if (!read_buffer_.get()) { |
71 *buf_size = min_size < 0 ? kReadBufSize : min_size; | 79 *buf_size = min_size < 0 ? kReadBufSize : min_size; |
72 read_buffer_ = new net::IOBuffer(*buf_size); | 80 read_buffer_ = new net::IOBuffer(*buf_size); |
73 } | 81 } |
74 *buf = read_buffer_.get(); | 82 *buf = read_buffer_.get(); |
75 return true; | 83 return true; |
76 } | 84 } |
77 | 85 |
78 bool SaveFileResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { | 86 void SaveFileResourceHandler::OnReadCompleted( |
| 87 int bytes_read, |
| 88 std::unique_ptr<ResourceController> controller) { |
79 DCHECK_EQ(AuthorizationState::AUTHORIZED, authorization_state_); | 89 DCHECK_EQ(AuthorizationState::AUTHORIZED, authorization_state_); |
80 DCHECK(read_buffer_.get()); | 90 DCHECK(read_buffer_.get()); |
81 // We are passing ownership of this buffer to the save file manager. | 91 // We are passing ownership of this buffer to the save file manager. |
82 scoped_refptr<net::IOBuffer> buffer; | 92 scoped_refptr<net::IOBuffer> buffer; |
83 read_buffer_.swap(buffer); | 93 read_buffer_.swap(buffer); |
84 BrowserThread::PostTask( | 94 BrowserThread::PostTask( |
85 BrowserThread::FILE, FROM_HERE, | 95 BrowserThread::FILE, FROM_HERE, |
86 base::Bind(&SaveFileManager::UpdateSaveProgress, save_manager_, | 96 base::Bind(&SaveFileManager::UpdateSaveProgress, save_manager_, |
87 save_item_id_, base::RetainedRef(buffer), bytes_read)); | 97 save_item_id_, base::RetainedRef(buffer), bytes_read)); |
88 return true; | 98 controller->Resume(); |
89 } | 99 } |
90 | 100 |
91 void SaveFileResourceHandler::OnResponseCompleted( | 101 void SaveFileResourceHandler::OnResponseCompleted( |
92 const net::URLRequestStatus& status, | 102 const net::URLRequestStatus& status, |
93 bool* defer) { | 103 std::unique_ptr<ResourceController> controller) { |
94 if (authorization_state_ != AuthorizationState::AUTHORIZED) | 104 if (authorization_state_ != AuthorizationState::AUTHORIZED) |
95 DCHECK(!status.is_success()); | 105 DCHECK(!status.is_success()); |
96 | 106 |
97 BrowserThread::PostTask( | 107 BrowserThread::PostTask( |
98 BrowserThread::FILE, FROM_HERE, | 108 BrowserThread::FILE, FROM_HERE, |
99 base::Bind(&SaveFileManager::SaveFinished, save_manager_, save_item_id_, | 109 base::Bind(&SaveFileManager::SaveFinished, save_manager_, save_item_id_, |
100 save_package_id_, | 110 save_package_id_, |
101 status.is_success() && !status.is_io_pending())); | 111 status.is_success() && !status.is_io_pending())); |
102 read_buffer_ = NULL; | 112 read_buffer_ = nullptr; |
| 113 controller->Resume(); |
103 } | 114 } |
104 | 115 |
105 void SaveFileResourceHandler::OnDataDownloaded(int bytes_downloaded) { | 116 void SaveFileResourceHandler::OnDataDownloaded(int bytes_downloaded) { |
106 NOTREACHED(); | 117 NOTREACHED(); |
107 } | 118 } |
108 | 119 |
109 void SaveFileResourceHandler::set_content_length( | 120 void SaveFileResourceHandler::set_content_length( |
110 const std::string& content_length) { | 121 const std::string& content_length) { |
111 base::StringToInt64(content_length, &content_length_); | 122 base::StringToInt64(content_length, &content_length_); |
112 } | 123 } |
113 | 124 |
114 } // namespace content | 125 } // namespace content |
OLD | NEW |