OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/renderer_host/media_resource_handler.h" |
| 6 |
| 7 #include "base/process.h" |
| 8 #include "chrome/common/render_messages.h" |
| 9 #include "net/base/load_flags.h" |
| 10 |
| 11 MediaResourceHandler::MediaResourceHandler( |
| 12 ResourceHandler* resource_handler, |
| 13 ResourceDispatcherHost::Receiver* receiver, |
| 14 int render_process_host_id, |
| 15 int routing_id, |
| 16 base::ProcessHandle render_process, |
| 17 ResourceDispatcherHost* resource_dispatcher_host) |
| 18 : receiver_(receiver), |
| 19 render_process_host_id_(render_process_host_id), |
| 20 routing_id_(routing_id), |
| 21 render_process_(render_process), |
| 22 handler_(resource_handler), |
| 23 rdh_(resource_dispatcher_host), |
| 24 has_file_handle_(false), |
| 25 position_(0), |
| 26 size_(-1) { |
| 27 } |
| 28 |
| 29 bool MediaResourceHandler::OnUploadProgress(int request_id, |
| 30 uint64 position, |
| 31 uint64 size) { |
| 32 return handler_->OnUploadProgress(request_id, position, size); |
| 33 } |
| 34 |
| 35 bool MediaResourceHandler::OnRequestRedirected(int request_id, |
| 36 const GURL& new_url) { |
| 37 return handler_->OnRequestRedirected(request_id, new_url); |
| 38 } |
| 39 |
| 40 bool MediaResourceHandler::OnResponseStarted(int request_id, |
| 41 ResourceResponse* response) { |
| 42 #if defined(OS_POSIX) |
| 43 if (response->response_head.response_data_file.fd != |
| 44 base::kInvalidPlatformFileValue) { |
| 45 // On POSIX, we will just set auto_close to true, and the IPC infrastructure |
| 46 // will send this file handle through and close it automatically. |
| 47 response->response_head.response_data_file.auto_close = true; |
| 48 has_file_handle_ = true; |
| 49 } |
| 50 #elif defined(OS_WIN) |
| 51 if (response->response_head.response_data_file != |
| 52 base::kInvalidPlatformFileValue) { |
| 53 // On Windows, we duplicate the file handle for the renderer process and |
| 54 // close the original manually. |
| 55 base::PlatformFile foreign_handle; |
| 56 if (DuplicateHandle(GetCurrentProcess(), |
| 57 response->response_head.response_data_file, |
| 58 render_process_, |
| 59 &foreign_handle, |
| 60 FILE_READ_DATA, // Only allow read access to data. |
| 61 false, // Foreign handle is not inheritable. |
| 62 // Close the file handle after duplication. |
| 63 DUPLICATE_CLOSE_SOURCE)){ |
| 64 response->response_head.response_data_file = foreign_handle; |
| 65 has_file_handle_ = true; |
| 66 } else { |
| 67 has_file_handle_ = false; |
| 68 } |
| 69 } |
| 70 #endif |
| 71 size_ = response->response_head.content_length; |
| 72 return handler_->OnResponseStarted(request_id, response); |
| 73 } |
| 74 |
| 75 bool MediaResourceHandler::OnWillRead(int request_id, |
| 76 net::IOBuffer** buf, int* buf_size, |
| 77 int min_size) { |
| 78 return handler_->OnWillRead(request_id, buf, buf_size, min_size); |
| 79 } |
| 80 |
| 81 bool MediaResourceHandler::OnReadCompleted(int request_id, int* bytes_read) { |
| 82 if (has_file_handle_) { |
| 83 // If we have received a file handle before we will be sending a progress |
| 84 // update for download. |
| 85 // TODO(hclam): rate limit this message so we won't be sending too much to |
| 86 // the renderer process. |
| 87 receiver_->Send( |
| 88 new ViewMsg_Resource_DownloadProgress(routing_id_, request_id, |
| 89 position_, size_)); |
| 90 position_ += *bytes_read; |
| 91 } |
| 92 return handler_->OnReadCompleted(request_id, bytes_read); |
| 93 } |
| 94 |
| 95 bool MediaResourceHandler::OnResponseCompleted(int request_id, |
| 96 const URLRequestStatus& status, const std::string& security_info) { |
| 97 return handler_->OnResponseCompleted(request_id, status, security_info); |
| 98 } |
OLD | NEW |