Index: chrome/browser/renderer_host/media_resource_handler.cc |
diff --git a/chrome/browser/renderer_host/media_resource_handler.cc b/chrome/browser/renderer_host/media_resource_handler.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ca79b0d3e4df199e0b0a46c7986632e3ff9f935f |
--- /dev/null |
+++ b/chrome/browser/renderer_host/media_resource_handler.cc |
@@ -0,0 +1,98 @@ |
+// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/renderer_host/media_resource_handler.h" |
+ |
+#include "base/process.h" |
+#include "chrome/common/render_messages.h" |
+#include "net/base/load_flags.h" |
+ |
+MediaResourceHandler::MediaResourceHandler( |
+ ResourceHandler* resource_handler, |
+ ResourceDispatcherHost::Receiver* receiver, |
+ int render_process_host_id, |
+ int routing_id, |
+ base::ProcessHandle render_process, |
+ ResourceDispatcherHost* resource_dispatcher_host) |
+ : receiver_(receiver), |
+ render_process_host_id_(render_process_host_id), |
+ routing_id_(routing_id), |
+ render_process_(render_process), |
+ handler_(resource_handler), |
+ rdh_(resource_dispatcher_host), |
+ has_file_handle_(false), |
+ position_(0), |
+ size_(-1) { |
+} |
+ |
+bool MediaResourceHandler::OnUploadProgress(int request_id, |
+ uint64 position, |
+ uint64 size) { |
+ return handler_->OnUploadProgress(request_id, position, size); |
+} |
+ |
+bool MediaResourceHandler::OnRequestRedirected(int request_id, |
+ const GURL& new_url) { |
+ return handler_->OnRequestRedirected(request_id, new_url); |
+} |
+ |
+bool MediaResourceHandler::OnResponseStarted(int request_id, |
+ ResourceResponse* response) { |
+#if defined(OS_POSIX) |
+ if (response->response_head.response_data_file.fd != |
+ base::kInvalidPlatformFileValue) { |
+ // On POSIX, we will just set auto_close to true, and the IPC infrastructure |
+ // will send this file handle through and close it automatically. |
+ response->response_head.response_data_file.auto_close = true; |
+ has_file_handle_ = true; |
+ } |
+#elif defined(OS_WIN) |
+ if (response->response_head.response_data_file != |
+ base::kInvalidPlatformFileValue) { |
+ // On Windows, we duplicate the file handle for the renderer process and |
+ // close the original manually. |
+ base::PlatformFile foreign_handle; |
+ if (DuplicateHandle(GetCurrentProcess(), |
+ response->response_head.response_data_file, |
+ render_process_, |
+ &foreign_handle, |
+ FILE_READ_DATA, // Only allow read access to data. |
+ false, // Foreign handle is not inheritable. |
+ // Close the file handle after duplication. |
+ DUPLICATE_CLOSE_SOURCE)){ |
+ response->response_head.response_data_file = foreign_handle; |
+ has_file_handle_ = true; |
+ } else { |
+ has_file_handle_ = false; |
+ } |
+ } |
+#endif |
+ size_ = response->response_head.content_length; |
+ return handler_->OnResponseStarted(request_id, response); |
+} |
+ |
+bool MediaResourceHandler::OnWillRead(int request_id, |
+ net::IOBuffer** buf, int* buf_size, |
+ int min_size) { |
+ return handler_->OnWillRead(request_id, buf, buf_size, min_size); |
+} |
+ |
+bool MediaResourceHandler::OnReadCompleted(int request_id, int* bytes_read) { |
+ if (has_file_handle_) { |
+ // If we have received a file handle before we will be sending a progress |
+ // update for download. |
+ // TODO(hclam): rate limit this message so we won't be sending too much to |
+ // the renderer process. |
+ receiver_->Send( |
+ new ViewMsg_Resource_DownloadProgress(routing_id_, request_id, |
+ position_, size_)); |
+ position_ += *bytes_read; |
+ } |
+ return handler_->OnReadCompleted(request_id, bytes_read); |
+} |
+ |
+bool MediaResourceHandler::OnResponseCompleted(int request_id, |
+ const URLRequestStatus& status, const std::string& security_info) { |
+ return handler_->OnResponseCompleted(request_id, status, security_info); |
+} |