| Index: ppapi/proxy/ppb_url_loader_proxy.cc
|
| diff --git a/ppapi/proxy/ppb_url_loader_proxy.cc b/ppapi/proxy/ppb_url_loader_proxy.cc
|
| deleted file mode 100644
|
| index 425b61ff295f69234359027ea4aed8a078d5c0da..0000000000000000000000000000000000000000
|
| --- a/ppapi/proxy/ppb_url_loader_proxy.cc
|
| +++ /dev/null
|
| @@ -1,652 +0,0 @@
|
| -// Copyright (c) 2012 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 "ppapi/proxy/ppb_url_loader_proxy.h"
|
| -
|
| -#include <algorithm>
|
| -#include <deque>
|
| -#include <vector>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/logging.h"
|
| -#include "build/build_config.h"
|
| -#include "ppapi/c/pp_completion_callback.h"
|
| -#include "ppapi/c/pp_errors.h"
|
| -#include "ppapi/c/pp_resource.h"
|
| -#include "ppapi/c/ppb_url_loader.h"
|
| -#include "ppapi/c/private/ppb_proxy_private.h"
|
| -#include "ppapi/c/trusted/ppb_url_loader_trusted.h"
|
| -#include "ppapi/proxy/enter_proxy.h"
|
| -#include "ppapi/proxy/host_dispatcher.h"
|
| -#include "ppapi/proxy/plugin_dispatcher.h"
|
| -#include "ppapi/proxy/plugin_resource_tracker.h"
|
| -#include "ppapi/proxy/ppapi_messages.h"
|
| -#include "ppapi/proxy/ppb_file_ref_proxy.h"
|
| -#include "ppapi/shared_impl/scoped_pp_resource.h"
|
| -#include "ppapi/shared_impl/tracked_callback.h"
|
| -#include "ppapi/thunk/enter.h"
|
| -#include "ppapi/thunk/ppb_url_loader_api.h"
|
| -#include "ppapi/thunk/ppb_url_request_info_api.h"
|
| -#include "ppapi/thunk/resource_creation_api.h"
|
| -#include "ppapi/thunk/thunk.h"
|
| -
|
| -#if defined(OS_LINUX)
|
| -#include <sys/shm.h>
|
| -#endif
|
| -
|
| -using ppapi::thunk::EnterResourceNoLock;
|
| -using ppapi::thunk::PPB_URLLoader_API;
|
| -using ppapi::thunk::ResourceCreationAPI;
|
| -
|
| -namespace ppapi {
|
| -namespace proxy {
|
| -
|
| -namespace {
|
| -
|
| -// The maximum size we'll read into the plugin without being explicitly
|
| -// asked for a larger buffer.
|
| -const int32_t kMaxReadBufferSize = 16777216; // 16MB
|
| -
|
| -#if !defined(OS_NACL)
|
| -// Called in the renderer when the byte counts have changed. We send a message
|
| -// to the plugin to synchronize its counts so it can respond to status polls
|
| -// from the plugin.
|
| -void UpdateResourceLoadStatus(PP_Instance pp_instance,
|
| - PP_Resource pp_resource,
|
| - int64 bytes_sent,
|
| - int64 total_bytes_to_be_sent,
|
| - int64 bytes_received,
|
| - int64 total_bytes_to_be_received) {
|
| - Dispatcher* dispatcher = HostDispatcher::GetForInstance(pp_instance);
|
| - if (!dispatcher)
|
| - return;
|
| -
|
| - PPBURLLoader_UpdateProgress_Params params;
|
| - params.instance = pp_instance;
|
| - params.resource.SetHostResource(pp_instance, pp_resource);
|
| - params.bytes_sent = bytes_sent;
|
| - params.total_bytes_to_be_sent = total_bytes_to_be_sent;
|
| - params.bytes_received = bytes_received;
|
| - params.total_bytes_to_be_received = total_bytes_to_be_received;
|
| - dispatcher->Send(new PpapiMsg_PPBURLLoader_UpdateProgress(
|
| - API_ID_PPB_URL_LOADER, params));
|
| -}
|
| -#endif // !defined(OS_NACL)
|
| -
|
| -InterfaceProxy* CreateURLLoaderProxy(Dispatcher* dispatcher) {
|
| - return new PPB_URLLoader_Proxy(dispatcher);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// URLLoader -------------------------------------------------------------------
|
| -
|
| -class URLLoader : public Resource, public PPB_URLLoader_API {
|
| - public:
|
| - URLLoader(const HostResource& resource);
|
| - virtual ~URLLoader();
|
| -
|
| - // Resource overrides.
|
| - virtual PPB_URLLoader_API* AsPPB_URLLoader_API() OVERRIDE;
|
| -
|
| - // PPB_URLLoader_API implementation.
|
| - virtual int32_t Open(PP_Resource request_id,
|
| - scoped_refptr<TrackedCallback> callback) OVERRIDE;
|
| - virtual int32_t Open(const URLRequestInfoData& data,
|
| - int requestor_pid,
|
| - scoped_refptr<TrackedCallback> callback) OVERRIDE;
|
| - virtual int32_t FollowRedirect(
|
| - scoped_refptr<TrackedCallback> callback) OVERRIDE;
|
| - virtual PP_Bool GetUploadProgress(int64_t* bytes_sent,
|
| - int64_t* total_bytes_to_be_sent) OVERRIDE;
|
| - virtual PP_Bool GetDownloadProgress(
|
| - int64_t* bytes_received,
|
| - int64_t* total_bytes_to_be_received) OVERRIDE;
|
| - virtual PP_Resource GetResponseInfo() OVERRIDE;
|
| - virtual int32_t ReadResponseBody(
|
| - void* buffer,
|
| - int32_t bytes_to_read,
|
| - scoped_refptr<TrackedCallback> callback) OVERRIDE;
|
| - virtual int32_t FinishStreamingToFile(
|
| - scoped_refptr<TrackedCallback> callback) OVERRIDE;
|
| - virtual void Close() OVERRIDE;
|
| - virtual void GrantUniversalAccess() OVERRIDE;
|
| - virtual void RegisterStatusCallback(
|
| - PP_URLLoaderTrusted_StatusCallback cb) OVERRIDE;
|
| - virtual bool GetResponseInfoData(URLResponseInfoData* data) OVERRIDE;
|
| -
|
| - // Called when the browser has new up/download progress to report.
|
| - void UpdateProgress(const PPBURLLoader_UpdateProgress_Params& params);
|
| -
|
| - // Called when the browser responds to our ReadResponseBody request.
|
| - void ReadResponseBodyAck(int32_t result, const char* data);
|
| -
|
| - // Called when any callback other than the read callback has been executed.
|
| - void CallbackComplete(int32_t result);
|
| -
|
| - private:
|
| - // Reads the give bytes out of the buffer_, placing them in the given output
|
| - // buffer, and removes the bytes from the buffer.
|
| - //
|
| - // The size must be not more than the current size of the buffer.
|
| - void PopBuffer(void* output_buffer, int32_t output_size);
|
| -
|
| - PluginDispatcher* GetDispatcher() const {
|
| - return PluginDispatcher::GetForResource(this);
|
| - }
|
| -
|
| - // Initialized to -1. Will be set to nonnegative values by the UpdateProgress
|
| - // message when the values are known.
|
| - int64_t bytes_sent_;
|
| - int64_t total_bytes_to_be_sent_;
|
| - int64_t bytes_received_;
|
| - int64_t total_bytes_to_be_received_;
|
| -
|
| - // Current completion callback for the current phase of loading. We have only
|
| - // one thing (open, follow redirect, read, etc.) outstanding at once.
|
| - scoped_refptr<TrackedCallback> current_callback_;
|
| -
|
| - // When an asynchronous read is pending, this will contain the buffer to put
|
| - // the data. The current_callback_ will identify the read callback.
|
| - void* current_read_buffer_;
|
| - int32_t current_read_buffer_size_;
|
| -
|
| - // A buffer of all the data that's been sent to us from the host that we
|
| - // have yet to send out to the plugin.
|
| - std::deque<char> buffer_;
|
| -
|
| - // Cached copy of the response info. When nonzero, we're holding a reference
|
| - // to this resource.
|
| - PP_Resource response_info_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(URLLoader);
|
| -};
|
| -
|
| -URLLoader::URLLoader(const HostResource& resource)
|
| - : Resource(OBJECT_IS_PROXY, resource),
|
| - bytes_sent_(-1),
|
| - total_bytes_to_be_sent_(-1),
|
| - bytes_received_(-1),
|
| - total_bytes_to_be_received_(-1),
|
| - current_read_buffer_(NULL),
|
| - current_read_buffer_size_(0),
|
| - response_info_(0) {
|
| -}
|
| -
|
| -URLLoader::~URLLoader() {
|
| - if (response_info_)
|
| - PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(response_info_);
|
| -}
|
| -
|
| -PPB_URLLoader_API* URLLoader::AsPPB_URLLoader_API() {
|
| - return this;
|
| -}
|
| -
|
| -int32_t URLLoader::Open(PP_Resource request_id,
|
| - scoped_refptr<TrackedCallback> callback) {
|
| - EnterResourceNoLock<thunk::PPB_URLRequestInfo_API> enter(request_id, true);
|
| - if (enter.failed()) {
|
| - Log(PP_LOGLEVEL_ERROR, "PPB_URLLoader.Open: The URL you're requesting is "
|
| - " on a different security origin than your plugin. To request "
|
| - " cross-origin resources, see "
|
| - " PP_URLREQUESTPROPERTY_ALLOWCROSSORIGINREQUESTS.");
|
| - return PP_ERROR_BADRESOURCE;
|
| - }
|
| - return Open(enter.object()->GetData(), 0, callback);
|
| -}
|
| -
|
| -int32_t URLLoader::Open(const URLRequestInfoData& data,
|
| - int requestor_pid,
|
| - scoped_refptr<TrackedCallback> callback) {
|
| - DCHECK_EQ(0, requestor_pid); // Used in-process only.
|
| -
|
| - if (TrackedCallback::IsPending(current_callback_))
|
| - return PP_ERROR_INPROGRESS;
|
| -
|
| - current_callback_ = callback;
|
| -
|
| - GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_Open(
|
| - API_ID_PPB_URL_LOADER, host_resource(), data));
|
| - return PP_OK_COMPLETIONPENDING;
|
| -}
|
| -
|
| -int32_t URLLoader::FollowRedirect(scoped_refptr<TrackedCallback> callback) {
|
| - if (TrackedCallback::IsPending(current_callback_))
|
| - return PP_ERROR_INPROGRESS;
|
| -
|
| - current_callback_ = callback;
|
| -
|
| - GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_FollowRedirect(
|
| - API_ID_PPB_URL_LOADER, host_resource()));
|
| - return PP_OK_COMPLETIONPENDING;
|
| -}
|
| -
|
| -PP_Bool URLLoader::GetUploadProgress(int64_t* bytes_sent,
|
| - int64_t* total_bytes_to_be_sent) {
|
| - if (bytes_sent_ == -1) {
|
| - *bytes_sent = 0;
|
| - *total_bytes_to_be_sent = 0;
|
| - return PP_FALSE;
|
| - }
|
| - *bytes_sent = bytes_sent_;
|
| - *total_bytes_to_be_sent = total_bytes_to_be_sent_;
|
| - return PP_TRUE;
|
| -}
|
| -
|
| -PP_Bool URLLoader::GetDownloadProgress(
|
| - int64_t* bytes_received,
|
| - int64_t* total_bytes_to_be_received) {
|
| - if (bytes_received_ == -1) {
|
| - *bytes_received = 0;
|
| - *total_bytes_to_be_received = 0;
|
| - return PP_FALSE;
|
| - }
|
| - *bytes_received = bytes_received_;
|
| - *total_bytes_to_be_received = total_bytes_to_be_received_;
|
| - return PP_TRUE;
|
| -}
|
| -
|
| -PP_Resource URLLoader::GetResponseInfo() {
|
| - if (!response_info_) {
|
| - bool success = false;
|
| - URLResponseInfoData data;
|
| - GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_GetResponseInfo(
|
| - API_ID_PPB_URL_LOADER, host_resource(), &success, &data));
|
| - if (!success)
|
| - return 0;
|
| -
|
| - // Create a proxy resource for the the file ref host resource if needed.
|
| - PP_Resource body_as_file_ref = 0;
|
| - if (!data.body_as_file_ref.resource.is_null()) {
|
| - body_as_file_ref =
|
| - PPB_FileRef_Proxy::DeserializeFileRef(data.body_as_file_ref);
|
| - }
|
| -
|
| - // Assumes ownership of body_as_file_ref.
|
| - thunk::EnterResourceCreationNoLock enter(pp_instance());
|
| - response_info_ = enter.functions()->CreateURLResponseInfo(
|
| - pp_instance(), data, body_as_file_ref);
|
| - }
|
| -
|
| - // The caller expects to get a ref, and we want to keep holding ours.
|
| - PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(response_info_);
|
| - return response_info_;
|
| -}
|
| -
|
| -int32_t URLLoader::ReadResponseBody(void* buffer,
|
| - int32_t bytes_to_read,
|
| - scoped_refptr<TrackedCallback> callback) {
|
| - if (!buffer || bytes_to_read <= 0)
|
| - return PP_ERROR_BADARGUMENT; // Must specify an output buffer.
|
| - if (TrackedCallback::IsPending(current_callback_))
|
| - return PP_ERROR_INPROGRESS; // Can only have one request pending.
|
| -
|
| - if (buffer_.size()) {
|
| - // Special case: we've already buffered some data that we can synchronously
|
| - // return to the caller. Do so without making IPCs.
|
| - int32_t bytes_to_return =
|
| - std::min(bytes_to_read, static_cast<int32_t>(buffer_.size()));
|
| - PopBuffer(buffer, bytes_to_return);
|
| - return bytes_to_return;
|
| - }
|
| -
|
| - current_callback_ = callback;
|
| - current_read_buffer_ = buffer;
|
| - current_read_buffer_size_ = bytes_to_read;
|
| -
|
| - GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_ReadResponseBody(
|
| - API_ID_PPB_URL_LOADER, host_resource(), bytes_to_read));
|
| - return PP_OK_COMPLETIONPENDING;
|
| -}
|
| -
|
| -int32_t URLLoader::FinishStreamingToFile(
|
| - scoped_refptr<TrackedCallback> callback) {
|
| - if (TrackedCallback::IsPending(current_callback_))
|
| - return PP_ERROR_INPROGRESS;
|
| -
|
| - current_callback_ = callback;
|
| -
|
| - GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_FinishStreamingToFile(
|
| - API_ID_PPB_URL_LOADER, host_resource()));
|
| - return PP_OK_COMPLETIONPENDING;
|
| -}
|
| -
|
| -void URLLoader::Close() {
|
| - GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_Close(
|
| - API_ID_PPB_URL_LOADER, host_resource()));
|
| -}
|
| -
|
| -void URLLoader::GrantUniversalAccess() {
|
| - GetDispatcher()->Send(
|
| - new PpapiHostMsg_PPBURLLoader_GrantUniversalAccess(
|
| - API_ID_PPB_URL_LOADER, host_resource()));
|
| -}
|
| -
|
| -void URLLoader::RegisterStatusCallback(
|
| - PP_URLLoaderTrusted_StatusCallback cb) {
|
| - // Not implemented in the proxied version, this is for implementing the
|
| - // proxy itself in the host.
|
| -}
|
| -
|
| -bool URLLoader::GetResponseInfoData(URLResponseInfoData* data) {
|
| - // Not implemented in the proxied version, this is for implementing the
|
| - // proxy itself in the host.
|
| - return false;
|
| -}
|
| -
|
| -void URLLoader::UpdateProgress(
|
| - const PPBURLLoader_UpdateProgress_Params& params) {
|
| - bytes_sent_ = params.bytes_sent;
|
| - total_bytes_to_be_sent_ = params.total_bytes_to_be_sent;
|
| - bytes_received_ = params.bytes_received;
|
| - total_bytes_to_be_received_ = params.total_bytes_to_be_received;
|
| -}
|
| -
|
| -void URLLoader::ReadResponseBodyAck(int32 result, const char* data) {
|
| - if (!TrackedCallback::IsPending(current_callback_) || !current_read_buffer_) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -
|
| - if (result >= 0) {
|
| - DCHECK_EQ(0U, buffer_.size());
|
| -
|
| - int32_t bytes_to_return = std::min(current_read_buffer_size_, result);
|
| - std::copy(data,
|
| - data + bytes_to_return,
|
| - static_cast<char*>(current_read_buffer_));
|
| -
|
| - if (result > bytes_to_return) {
|
| - // Save what remains to be copied when ReadResponseBody is called again.
|
| - buffer_.insert(buffer_.end(),
|
| - data + bytes_to_return,
|
| - data + result);
|
| - }
|
| -
|
| - result = bytes_to_return;
|
| - }
|
| -
|
| - current_callback_->Run(result);
|
| -}
|
| -
|
| -void URLLoader::CallbackComplete(int32_t result) {
|
| - current_callback_->Run(result);
|
| -}
|
| -
|
| -void URLLoader::PopBuffer(void* output_buffer, int32_t output_size) {
|
| - CHECK(output_size <= static_cast<int32_t>(buffer_.size()));
|
| - std::copy(buffer_.begin(),
|
| - buffer_.begin() + output_size,
|
| - static_cast<char*>(output_buffer));
|
| - buffer_.erase(buffer_.begin(),
|
| - buffer_.begin() + output_size);
|
| -}
|
| -
|
| -// PPB_URLLoader_Proxy ---------------------------------------------------------
|
| -
|
| -PPB_URLLoader_Proxy::PPB_URLLoader_Proxy(Dispatcher* dispatcher)
|
| - : InterfaceProxy(dispatcher),
|
| - callback_factory_(this) {
|
| -}
|
| -
|
| -PPB_URLLoader_Proxy::~PPB_URLLoader_Proxy() {
|
| -}
|
| -
|
| -// static
|
| -PP_Resource PPB_URLLoader_Proxy::TrackPluginResource(
|
| - const HostResource& url_loader_resource) {
|
| - return (new URLLoader(url_loader_resource))->GetReference();
|
| -}
|
| -
|
| -// static
|
| -const InterfaceProxy::Info* PPB_URLLoader_Proxy::GetTrustedInfo() {
|
| - static const Info info = {
|
| - thunk::GetPPB_URLLoaderTrusted_0_3_Thunk(),
|
| - PPB_URLLOADERTRUSTED_INTERFACE_0_3,
|
| - API_ID_NONE, // URL_LOADER is the canonical one.
|
| - false,
|
| - &CreateURLLoaderProxy
|
| - };
|
| - return &info;
|
| -}
|
| -
|
| -// static
|
| -PP_Resource PPB_URLLoader_Proxy::CreateProxyResource(PP_Instance pp_instance) {
|
| - PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(pp_instance);
|
| - if (!dispatcher)
|
| - return 0;
|
| -
|
| - HostResource result;
|
| - dispatcher->Send(new PpapiHostMsg_PPBURLLoader_Create(
|
| - API_ID_PPB_URL_LOADER, pp_instance, &result));
|
| - if (result.is_null())
|
| - return 0;
|
| - return PPB_URLLoader_Proxy::TrackPluginResource(result);
|
| -}
|
| -
|
| -bool PPB_URLLoader_Proxy::OnMessageReceived(const IPC::Message& msg) {
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(PPB_URLLoader_Proxy, msg)
|
| -#if !defined(OS_NACL)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBURLLoader_Create,
|
| - OnMsgCreate)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBURLLoader_Open,
|
| - OnMsgOpen)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBURLLoader_FollowRedirect,
|
| - OnMsgFollowRedirect)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBURLLoader_GetResponseInfo,
|
| - OnMsgGetResponseInfo)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBURLLoader_ReadResponseBody,
|
| - OnMsgReadResponseBody)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBURLLoader_FinishStreamingToFile,
|
| - OnMsgFinishStreamingToFile)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBURLLoader_Close,
|
| - OnMsgClose)
|
| - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBURLLoader_GrantUniversalAccess,
|
| - OnMsgGrantUniversalAccess)
|
| -#endif // !defined(OS_NACL)
|
| -
|
| - IPC_MESSAGE_HANDLER(PpapiMsg_PPBURLLoader_UpdateProgress,
|
| - OnMsgUpdateProgress)
|
| - IPC_MESSAGE_HANDLER(PpapiMsg_PPBURLLoader_ReadResponseBody_Ack,
|
| - OnMsgReadResponseBodyAck)
|
| - IPC_MESSAGE_HANDLER(PpapiMsg_PPBURLLoader_CallbackComplete,
|
| - OnMsgCallbackComplete)
|
| - IPC_MESSAGE_UNHANDLED(handled = false)
|
| - IPC_END_MESSAGE_MAP()
|
| - // TODO(brettw) handle bad messages!
|
| - return handled;
|
| -}
|
| -
|
| -#if !defined(OS_NACL)
|
| -void PPB_URLLoader_Proxy::PrepareURLLoaderForSendingToPlugin(
|
| - PP_Resource resource) {
|
| - // So the plugin can query load status, we need to register our status
|
| - // callback before sending any URLLoader to the plugin.
|
| - EnterResourceNoLock<PPB_URLLoader_API> enter(resource, false);
|
| - if (enter.succeeded())
|
| - enter.object()->RegisterStatusCallback(&UpdateResourceLoadStatus);
|
| - else
|
| - NOTREACHED(); // Only called internally, resource should be valid.
|
| -}
|
| -
|
| -void PPB_URLLoader_Proxy::OnMsgCreate(PP_Instance instance,
|
| - HostResource* result) {
|
| - thunk::EnterResourceCreation enter(instance);
|
| - if (enter.succeeded()) {
|
| - result->SetHostResource(instance,
|
| - enter.functions()->CreateURLLoader(instance));
|
| - PrepareURLLoaderForSendingToPlugin(result->host_resource());
|
| - }
|
| -}
|
| -
|
| -void PPB_URLLoader_Proxy::OnMsgOpen(const HostResource& loader,
|
| - const URLRequestInfoData& data) {
|
| - int peer_pid = dispatcher()->channel()->peer_pid();
|
| -
|
| - EnterHostFromHostResourceForceCallback<PPB_URLLoader_API> enter(
|
| - loader, callback_factory_, &PPB_URLLoader_Proxy::OnCallback, loader);
|
| - enter.SetResult(enter.object()->Open(data, peer_pid, enter.callback()));
|
| - // TODO(brettw) bug 73236 register for the status callbacks.
|
| -}
|
| -
|
| -void PPB_URLLoader_Proxy::OnMsgFollowRedirect(
|
| - const HostResource& loader) {
|
| - EnterHostFromHostResourceForceCallback<PPB_URLLoader_API> enter(
|
| - loader, callback_factory_, &PPB_URLLoader_Proxy::OnCallback, loader);
|
| - if (enter.succeeded())
|
| - enter.SetResult(enter.object()->FollowRedirect(enter.callback()));
|
| -}
|
| -
|
| -void PPB_URLLoader_Proxy::OnMsgGetResponseInfo(const HostResource& loader,
|
| - bool* success,
|
| - URLResponseInfoData* result) {
|
| - EnterHostFromHostResource<PPB_URLLoader_API> enter(loader);
|
| - if (enter.succeeded())
|
| - *success = enter.object()->GetResponseInfoData(result);
|
| - else
|
| - *success = false;
|
| -}
|
| -
|
| -void PPB_URLLoader_Proxy::OnMsgReadResponseBody(
|
| - const HostResource& loader,
|
| - int32_t bytes_to_read) {
|
| - // The plugin could be sending us malicious messages, don't accept negative
|
| - // sizes.
|
| - if (bytes_to_read < 0) {
|
| - // TODO(brettw) kill plugin.
|
| - bytes_to_read = 0;
|
| - }
|
| -
|
| - // Read more than requested if there are bytes available for synchronous
|
| - // reading. This prevents us from getting too far behind due to IPC message
|
| - // latency. Any extra data will get buffered in the plugin.
|
| - int32_t synchronously_available_bytes =
|
| - static_cast<HostDispatcher*>(dispatcher())->ppb_proxy()->
|
| - GetURLLoaderBufferedBytes(loader.host_resource());
|
| - if (bytes_to_read < kMaxReadBufferSize) {
|
| - // Grow the amount to read so we read ahead synchronously, if possible.
|
| - bytes_to_read =
|
| - std::max(bytes_to_read,
|
| - std::min(synchronously_available_bytes, kMaxReadBufferSize));
|
| - }
|
| -
|
| - // This heap object will get deleted by the callback handler.
|
| - // TODO(brettw) this will be leaked if the plugin closes the resource!
|
| - // (Also including the plugin unloading and having the resource implicitly
|
| - // destroyed. Depending on the cleanup ordering, we may not need the weak
|
| - // pointer here.)
|
| - IPC::Message* message =
|
| - new PpapiMsg_PPBURLLoader_ReadResponseBody_Ack(API_ID_PPB_URL_LOADER);
|
| - IPC::ParamTraits<HostResource>::Write(message, loader);
|
| -
|
| - char* ptr = message->BeginWriteData(bytes_to_read);
|
| - if (!ptr) {
|
| - // TODO(brettw) have a way to check for out-of-memory.
|
| - }
|
| -
|
| - EnterHostFromHostResourceForceCallback<PPB_URLLoader_API> enter(
|
| - loader, callback_factory_, &PPB_URLLoader_Proxy::OnReadCallback, message);
|
| - if (enter.succeeded()) {
|
| - enter.SetResult(enter.object()->ReadResponseBody(ptr, bytes_to_read,
|
| - enter.callback()));
|
| - }
|
| -}
|
| -
|
| -void PPB_URLLoader_Proxy::OnMsgFinishStreamingToFile(
|
| - const HostResource& loader) {
|
| - EnterHostFromHostResourceForceCallback<PPB_URLLoader_API> enter(
|
| - loader, callback_factory_, &PPB_URLLoader_Proxy::OnCallback, loader);
|
| - if (enter.succeeded())
|
| - enter.SetResult(enter.object()->FinishStreamingToFile(enter.callback()));;
|
| -}
|
| -
|
| -void PPB_URLLoader_Proxy::OnMsgClose(const HostResource& loader) {
|
| - EnterHostFromHostResource<PPB_URLLoader_API> enter(loader);
|
| - if (enter.succeeded())
|
| - enter.object()->Close();
|
| -}
|
| -
|
| -void PPB_URLLoader_Proxy::OnMsgGrantUniversalAccess(
|
| - const HostResource& loader) {
|
| - EnterHostFromHostResource<PPB_URLLoader_API> enter(loader);
|
| - if (enter.succeeded())
|
| - enter.object()->GrantUniversalAccess();
|
| -}
|
| -#endif // !defined(OS_NACL)
|
| -
|
| -// Called in the Plugin.
|
| -void PPB_URLLoader_Proxy::OnMsgUpdateProgress(
|
| - const PPBURLLoader_UpdateProgress_Params& params) {
|
| - EnterPluginFromHostResource<PPB_URLLoader_API> enter(params.resource);
|
| - if (enter.succeeded())
|
| - static_cast<URLLoader*>(enter.object())->UpdateProgress(params);
|
| -}
|
| -
|
| -// Called in the Plugin.
|
| -void PPB_URLLoader_Proxy::OnMsgReadResponseBodyAck(
|
| - const IPC::Message& message) {
|
| - PickleIterator iter(message);
|
| -
|
| - HostResource host_resource;
|
| - if (!IPC::ParamTraits<HostResource>::Read(&message, &iter, &host_resource)) {
|
| - NOTREACHED() << "Expecting HostResource";
|
| - return;
|
| - }
|
| -
|
| - const char* data;
|
| - int data_len;
|
| - if (!iter.ReadData(&data, &data_len)) {
|
| - NOTREACHED() << "Expecting data";
|
| - return;
|
| - }
|
| -
|
| - int result;
|
| - if (!iter.ReadInt(&result)) {
|
| - NOTREACHED() << "Expecting result";
|
| - return;
|
| - }
|
| -
|
| - if (result >= 0 && result != data_len) {
|
| - NOTREACHED() << "Data size mismatch";
|
| - return;
|
| - }
|
| -
|
| - EnterPluginFromHostResource<PPB_URLLoader_API> enter(host_resource);
|
| - if (enter.succeeded())
|
| - static_cast<URLLoader*>(enter.object())->ReadResponseBodyAck(result, data);
|
| -}
|
| -
|
| -// Called in the plugin.
|
| -void PPB_URLLoader_Proxy::OnMsgCallbackComplete(
|
| - const HostResource& host_resource,
|
| - int32_t result) {
|
| - EnterPluginFromHostResource<PPB_URLLoader_API> enter(host_resource);
|
| - if (enter.succeeded())
|
| - static_cast<URLLoader*>(enter.object())->CallbackComplete(result);
|
| -}
|
| -
|
| -#if !defined(OS_NACL)
|
| -void PPB_URLLoader_Proxy::OnReadCallback(int32_t result,
|
| - IPC::Message* message) {
|
| - int32_t bytes_read = 0;
|
| - if (result > 0)
|
| - bytes_read = result; // Positive results indicate bytes read.
|
| -
|
| - message->TrimWriteData(bytes_read);
|
| - message->WriteInt(result);
|
| -
|
| - dispatcher()->Send(message);
|
| -}
|
| -
|
| -void PPB_URLLoader_Proxy::OnCallback(int32_t result,
|
| - const HostResource& resource) {
|
| - dispatcher()->Send(new PpapiMsg_PPBURLLoader_CallbackComplete(
|
| - API_ID_PPB_URL_LOADER, resource, result));
|
| -}
|
| -#endif // !defined(OS_NACL)
|
| -
|
| -} // namespace proxy
|
| -} // namespace ppapi
|
|
|