// Copyright (c) 2013 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. #ifndef PPAPI_PROXY_URL_LOADER_RESOURCE_H_ #define PPAPI_PROXY_URL_LOADER_RESOURCE_H_ #include <deque> #include "base/basictypes.h" #include "base/compiler_specific.h" #include "ppapi/c/trusted/ppb_url_loader_trusted.h" #include "ppapi/proxy/plugin_resource.h" #include "ppapi/proxy/ppapi_proxy_export.h" #include "ppapi/shared_impl/url_request_info_data.h" #include "ppapi/thunk/ppb_url_loader_api.h" namespace ppapi { namespace proxy { class URLResponseInfoResource; class PPAPI_PROXY_EXPORT URLLoaderResource : public PluginResource, public NON_EXPORTED_BASE(thunk::PPB_URLLoader_API) { public: // Constructor for plugin-initiated loads. URLLoaderResource(Connection connection, PP_Instance instance); // Constructor for renderer-initiated (document) loads. The loader ID is the // pending host ID for the already-created host in the renderer, and the // response data is the response for the already-opened connection. URLLoaderResource(Connection connection, PP_Instance instance, int pending_main_document_loader_id, const URLResponseInfoData& data); virtual ~URLLoaderResource(); // Resource override. thunk::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 callback) OVERRIDE; // PluginResource implementation. virtual void OnReplyReceived(const ResourceMessageReplyParams& params, const IPC::Message& msg) OVERRIDE; private: enum Mode { // The plugin has not called Open() yet. MODE_WAITING_TO_OPEN, // The plugin is waiting for the Open() or FollowRedirect callback. MODE_OPENING, // We've started to receive data and may receive more. MODE_STREAMING_DATA, // All data has been streamed or there was an error. MODE_LOAD_COMPLETE }; // IPC message handlers. void OnPluginMsgReceivedResponse(const ResourceMessageReplyParams& params, const URLResponseInfoData& data); void OnPluginMsgSendData(const ResourceMessageReplyParams& params, const IPC::Message& message); void OnPluginMsgFinishedLoading(const ResourceMessageReplyParams& params, int32_t result); void OnPluginMsgUpdateProgress(const ResourceMessageReplyParams& params, int64_t bytes_sent, int64_t total_bytes_to_be_sent, int64_t bytes_received, int64_t total_bytes_to_be_received); // Sends the defers loading message to the renderer to block or unblock the // load. void SetDefersLoading(bool defers_loading); int32_t ValidateCallback(scoped_refptr<TrackedCallback> callback); // Sets up |callback| as the pending callback. This should only be called once // it is certain that |PP_OK_COMPLETIONPENDING| will be returned. void RegisterCallback(scoped_refptr<TrackedCallback> callback); void RunCallback(int32_t result); // Saves the given response info to response_info_, handling file refs if // necessary. This does not issue any callbacks. void SaveResponseInfo(const URLResponseInfoData& data); size_t FillUserBuffer(); Mode mode_; URLRequestInfoData request_data_; scoped_refptr<TrackedCallback> pending_callback_; PP_URLLoaderTrusted_StatusCallback status_callback_; std::deque<char> buffer_; int64_t bytes_sent_; int64_t total_bytes_to_be_sent_; int64_t bytes_received_; int64_t total_bytes_to_be_received_; char* user_buffer_; size_t user_buffer_size_; int32_t done_status_; bool is_streaming_to_file_; bool is_asynchronous_load_suspended_; // The response info if we've received it. scoped_refptr<URLResponseInfoResource> response_info_; DISALLOW_COPY_AND_ASSIGN(URLLoaderResource); }; } // namespace proxy } // namespace ppapi #endif // PPAPI_PROXY_URL_LOADER_RESOURCE_H_