Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "ppapi/proxy/ppb_url_loader_proxy.h" | 5 #include "ppapi/proxy/ppb_url_loader_proxy.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "build/build_config.h" | 12 #include "build/build_config.h" |
| 13 #include "ppapi/c/pp_completion_callback.h" | 13 #include "ppapi/c/pp_completion_callback.h" |
| 14 #include "ppapi/c/pp_errors.h" | 14 #include "ppapi/c/pp_errors.h" |
| 15 #include "ppapi/c/pp_resource.h" | 15 #include "ppapi/c/pp_resource.h" |
| 16 #include "ppapi/c/ppb_url_loader.h" | 16 #include "ppapi/c/ppb_url_loader.h" |
| 17 #include "ppapi/c/private/ppb_proxy_private.h" | 17 #include "ppapi/c/private/ppb_proxy_private.h" |
| 18 #include "ppapi/c/trusted/ppb_url_loader_trusted.h" | 18 #include "ppapi/c/trusted/ppb_url_loader_trusted.h" |
| 19 #include "ppapi/proxy/host_dispatcher.h" | 19 #include "ppapi/proxy/host_dispatcher.h" |
| 20 #include "ppapi/proxy/plugin_dispatcher.h" | 20 #include "ppapi/proxy/plugin_dispatcher.h" |
| 21 #include "ppapi/proxy/plugin_resource.h" | 21 #include "ppapi/proxy/plugin_resource.h" |
| 22 #include "ppapi/proxy/plugin_resource_tracker.h" | 22 #include "ppapi/proxy/plugin_resource_tracker.h" |
| 23 #include "ppapi/proxy/ppapi_messages.h" | 23 #include "ppapi/proxy/ppapi_messages.h" |
| 24 #include "ppapi/proxy/ppb_url_response_info_proxy.h" | 24 #include "ppapi/proxy/ppb_url_response_info_proxy.h" |
| 25 #include "ppapi/thunk/common.h" | |
| 25 | 26 |
| 26 #if defined(OS_LINUX) | 27 #if defined(OS_LINUX) |
| 27 #include <sys/shm.h> | 28 #include <sys/shm.h> |
| 28 #endif | 29 #endif |
| 29 | 30 |
| 30 namespace pp { | 31 namespace pp { |
| 31 namespace proxy { | 32 namespace proxy { |
| 32 | 33 |
| 33 class URLLoader : public PluginResource { | 34 class URLLoader : public PluginResource { |
| 34 public: | 35 public: |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 171 URLLoader* object = PluginResource::GetAs<URLLoader>(resource); | 172 URLLoader* object = PluginResource::GetAs<URLLoader>(resource); |
| 172 return BoolToPPBool(!!object); | 173 return BoolToPPBool(!!object); |
| 173 } | 174 } |
| 174 | 175 |
| 175 int32_t Open(PP_Resource loader_id, | 176 int32_t Open(PP_Resource loader_id, |
| 176 PP_Resource request_id, | 177 PP_Resource request_id, |
| 177 PP_CompletionCallback callback) { | 178 PP_CompletionCallback callback) { |
| 178 URLLoader* loader_object; | 179 URLLoader* loader_object; |
| 179 PluginDispatcher* dispatcher; | 180 PluginDispatcher* dispatcher; |
| 180 if (!RoutingDataFromURLLoader(loader_id, &loader_object, &dispatcher)) | 181 if (!RoutingDataFromURLLoader(loader_id, &loader_object, &dispatcher)) |
| 181 return PP_ERROR_BADRESOURCE; | 182 return ppapi::thunk::MayForceCallback(callback, PP_ERROR_BADRESOURCE); |
| 182 PluginResource* request_object = | 183 PluginResource* request_object = |
| 183 PluginResourceTracker::GetInstance()->GetResourceObject(request_id); | 184 PluginResourceTracker::GetInstance()->GetResourceObject(request_id); |
| 184 if (!request_object) | 185 if (!request_object) |
| 185 return PP_ERROR_BADRESOURCE; | 186 return ppapi::thunk::MayForceCallback(callback, PP_ERROR_BADRESOURCE); |
| 186 | 187 |
| 187 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_Open( | 188 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_Open( |
| 188 INTERFACE_ID_PPB_URL_LOADER, loader_object->host_resource(), | 189 INTERFACE_ID_PPB_URL_LOADER, loader_object->host_resource(), |
| 189 request_object->host_resource(), | 190 request_object->host_resource(), |
| 190 dispatcher->callback_tracker().SendCallback(callback))); | 191 dispatcher->callback_tracker().SendCallback(callback))); |
| 191 return PP_OK_COMPLETIONPENDING; | 192 return PP_OK_COMPLETIONPENDING; |
| 192 } | 193 } |
| 193 | 194 |
| 194 int32_t FollowRedirect(PP_Resource loader_id, | 195 int32_t FollowRedirect(PP_Resource loader_id, |
| 195 PP_CompletionCallback callback) { | 196 PP_CompletionCallback callback) { |
| 196 URLLoader* loader_object; | 197 URLLoader* loader_object; |
| 197 PluginDispatcher* dispatcher; | 198 PluginDispatcher* dispatcher; |
| 198 if (!RoutingDataFromURLLoader(loader_id, &loader_object, &dispatcher)) | 199 if (!RoutingDataFromURLLoader(loader_id, &loader_object, &dispatcher)) |
| 199 return PP_ERROR_BADRESOURCE; | 200 return ppapi::thunk::MayForceCallback(callback, PP_ERROR_BADRESOURCE); |
| 200 | 201 |
| 201 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_FollowRedirect( | 202 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_FollowRedirect( |
| 202 INTERFACE_ID_PPB_URL_LOADER, loader_object->host_resource(), | 203 INTERFACE_ID_PPB_URL_LOADER, loader_object->host_resource(), |
| 203 dispatcher->callback_tracker().SendCallback(callback))); | 204 dispatcher->callback_tracker().SendCallback(callback))); |
| 204 return PP_OK_COMPLETIONPENDING; | 205 return PP_OK_COMPLETIONPENDING; |
| 205 } | 206 } |
| 206 | 207 |
| 207 PP_Bool GetUploadProgress(PP_Resource loader_id, | 208 PP_Bool GetUploadProgress(PP_Resource loader_id, |
| 208 int64_t* bytes_sent, | 209 int64_t* bytes_sent, |
| 209 int64_t* total_bytes_to_be_sent) { | 210 int64_t* total_bytes_to_be_sent) { |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 239 return object->GetResponseInfo(); | 240 return object->GetResponseInfo(); |
| 240 } | 241 } |
| 241 | 242 |
| 242 int32_t ReadResponseBody(PP_Resource loader_id, | 243 int32_t ReadResponseBody(PP_Resource loader_id, |
| 243 void* buffer, | 244 void* buffer, |
| 244 int32_t bytes_to_read, | 245 int32_t bytes_to_read, |
| 245 PP_CompletionCallback callback) { | 246 PP_CompletionCallback callback) { |
| 246 URLLoader* object; | 247 URLLoader* object; |
| 247 PluginDispatcher* dispatcher; | 248 PluginDispatcher* dispatcher; |
| 248 if (!RoutingDataFromURLLoader(loader_id, &object, &dispatcher)) | 249 if (!RoutingDataFromURLLoader(loader_id, &object, &dispatcher)) |
| 249 return PP_ERROR_BADRESOURCE; | 250 return ppapi::thunk::MayForceCallback(callback, PP_ERROR_BADRESOURCE); |
| 250 | 251 |
| 251 if (!buffer || bytes_to_read <= 0) | 252 if (!buffer || bytes_to_read <= 0) |
|
piman
2011/06/07 17:32:14
add braces around the next 2 lines
polina
2011/06/09 23:53:51
Done.
| |
| 252 return PP_ERROR_BADARGUMENT; // Must specify an output buffer. | 253 // Must specify an output buffer. |
| 254 return ppapi::thunk::MayForceCallback(callback, PP_ERROR_BADARGUMENT); | |
| 253 if (object->current_read_callback_.func) | 255 if (object->current_read_callback_.func) |
|
piman
2011/06/07 17:32:14
add braces around the next 2 lines
polina
2011/06/09 23:53:51
Done.
| |
| 254 return PP_ERROR_INPROGRESS; // Can only have one request pending. | 256 // Can only have one request pending. |
| 257 return ppapi::thunk::MayForceCallback(callback, PP_ERROR_INPROGRESS); | |
| 255 | 258 |
| 256 // Currently we don't support sync calls to read. We'll need to revisit | 259 // Currently we don't support sync calls to read. We'll need to revisit |
| 257 // how this works when we allow blocking calls (from background threads). | 260 // how this works when we allow blocking calls (from background threads). |
| 258 if (!callback.func) | 261 if (!callback.func) |
| 259 return PP_ERROR_BADARGUMENT; | 262 return ppapi::thunk::MayForceCallback(callback, PP_ERROR_BADARGUMENT); |
| 260 | 263 |
| 261 if (static_cast<size_t>(bytes_to_read) <= object->buffer_.size()) { | 264 if (static_cast<size_t>(bytes_to_read) <= object->buffer_.size()) { |
| 262 // Special case: we've buffered enough data to be able to synchronously | 265 // Special case: we've buffered enough data to be able to synchronously |
| 263 // return data to the caller. Do so without making IPCs. | 266 // return data to the caller. Do so without making IPCs. |
| 264 object->PopBuffer(buffer, bytes_to_read); | 267 object->PopBuffer(buffer, bytes_to_read); |
| 265 return bytes_to_read; | 268 return ppapi::thunk::MayForceCallback(callback, bytes_to_read); |
| 266 } | 269 } |
| 267 | 270 |
| 268 object->current_read_callback_ = callback; | 271 object->current_read_callback_ = callback; |
| 269 object->current_read_buffer_ = buffer; | 272 object->current_read_buffer_ = buffer; |
| 270 object->current_read_buffer_size_ = bytes_to_read; | 273 object->current_read_buffer_size_ = bytes_to_read; |
| 271 | 274 |
| 272 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_ReadResponseBody( | 275 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_ReadResponseBody( |
| 273 INTERFACE_ID_PPB_URL_LOADER, | 276 INTERFACE_ID_PPB_URL_LOADER, |
| 274 object->host_resource(), bytes_to_read)); | 277 object->host_resource(), bytes_to_read)); |
| 275 return PP_OK_COMPLETIONPENDING; | 278 return PP_OK_COMPLETIONPENDING; |
| 276 } | 279 } |
| 277 | 280 |
| 278 int32_t FinishStreamingToFile(PP_Resource loader_id, | 281 int32_t FinishStreamingToFile(PP_Resource loader_id, |
| 279 PP_CompletionCallback callback) { | 282 PP_CompletionCallback callback) { |
| 280 URLLoader* loader_object; | 283 URLLoader* loader_object; |
| 281 PluginDispatcher* dispatcher; | 284 PluginDispatcher* dispatcher; |
| 282 if (!RoutingDataFromURLLoader(loader_id, &loader_object, &dispatcher)) | 285 if (!RoutingDataFromURLLoader(loader_id, &loader_object, &dispatcher)) |
| 283 return PP_ERROR_BADRESOURCE; | 286 return ppapi::thunk::MayForceCallback(callback, PP_ERROR_BADRESOURCE); |
| 284 | 287 |
| 285 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_FinishStreamingToFile( | 288 dispatcher->Send(new PpapiHostMsg_PPBURLLoader_FinishStreamingToFile( |
| 286 INTERFACE_ID_PPB_URL_LOADER, loader_object->host_resource(), | 289 INTERFACE_ID_PPB_URL_LOADER, loader_object->host_resource(), |
| 287 dispatcher->callback_tracker().SendCallback(callback))); | 290 dispatcher->callback_tracker().SendCallback(callback))); |
| 288 return PP_OK_COMPLETIONPENDING; | 291 return PP_OK_COMPLETIONPENDING; |
| 289 } | 292 } |
| 290 | 293 |
| 291 void Close(PP_Resource loader_id) { | 294 void Close(PP_Resource loader_id) { |
| 292 URLLoader* loader_object; | 295 URLLoader* loader_object; |
| 293 PluginDispatcher* dispatcher; | 296 PluginDispatcher* dispatcher; |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 648 return handled; | 651 return handled; |
| 649 } | 652 } |
| 650 | 653 |
| 651 void PPB_URLLoaderTrusted_Proxy::OnMsgGrantUniversalAccess( | 654 void PPB_URLLoaderTrusted_Proxy::OnMsgGrantUniversalAccess( |
| 652 const HostResource& loader) { | 655 const HostResource& loader) { |
| 653 ppb_url_loader_trusted_target()->GrantUniversalAccess(loader.host_resource()); | 656 ppb_url_loader_trusted_target()->GrantUniversalAccess(loader.host_resource()); |
| 654 } | 657 } |
| 655 | 658 |
| 656 } // namespace proxy | 659 } // namespace proxy |
| 657 } // namespace pp | 660 } // namespace pp |
| OLD | NEW |