1 // Copyright (c) 2013 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 #ifndef PPAPI_PROXY_URL_LOADER_RESOURCE_H_ 6 #define PPAPI_PROXY_URL_LOADER_RESOURCE_H_ 7 8 #include <deque> 9 10 #include "base/basictypes.h" 11 #include "base/compiler_specific.h" 12 #include "ppapi/c/trusted/ppb_url_loader_trusted.h" 13 #include "ppapi/proxy/plugin_resource.h" 14 #include "ppapi/proxy/ppapi_proxy_export.h" 15 #include "ppapi/shared_impl/url_request_info_data.h" 16 #include "ppapi/thunk/ppb_url_loader_api.h" 17 18 namespace ppapi { 19 namespace proxy { 20 21 class URLResponseInfoResource; 22 23 class PPAPI_PROXY_EXPORT URLLoaderResource 24 : public PluginResource, 25 public NON_EXPORTED_BASE(thunk::PPB_URLLoader_API) { 26 public: 27 // Constructor for plugin-initiated loads. 28 URLLoaderResource(Connection connection, 29 PP_Instance instance); 30 31 // Constructor for renderer-initiated (document) loads. The loader ID is the 32 // pending host ID for the already-created host in the renderer, and the 33 // response data is the response for the already-opened connection. 34 URLLoaderResource(Connection connection, 35 PP_Instance instance, 36 int pending_main_document_loader_id, 37 const URLResponseInfoData& data); 38 39 virtual ~URLLoaderResource(); 40 41 // Resource override. 42 thunk::PPB_URLLoader_API* AsPPB_URLLoader_API() OVERRIDE; 43 44 // PPB_URLLoader_API implementation. 45 virtual int32_t Open(PP_Resource request_id, 46 scoped_refptr<TrackedCallback> callback) OVERRIDE; 47 virtual int32_t Open(const URLRequestInfoData& data, 48 int requestor_pid, 49 scoped_refptr<TrackedCallback> callback) OVERRIDE; 50 virtual int32_t FollowRedirect( 51 scoped_refptr<TrackedCallback> callback) OVERRIDE; 52 virtual PP_Bool GetUploadProgress(int64_t* bytes_sent, 53 int64_t* total_bytes_to_be_sent) OVERRIDE; 54 virtual PP_Bool GetDownloadProgress( 55 int64_t* bytes_received, 56 int64_t* total_bytes_to_be_received) OVERRIDE; 57 virtual PP_Resource GetResponseInfo() OVERRIDE; 58 virtual int32_t ReadResponseBody( 59 void* buffer, 60 int32_t bytes_to_read, 61 scoped_refptr<TrackedCallback> callback) OVERRIDE; 62 virtual int32_t FinishStreamingToFile( 63 scoped_refptr<TrackedCallback> callback) OVERRIDE; 64 virtual void Close() OVERRIDE; 65 virtual void GrantUniversalAccess() OVERRIDE; 66 virtual void RegisterStatusCallback( 67 PP_URLLoaderTrusted_StatusCallback callback) OVERRIDE; 68 69 // PluginResource implementation. 70 virtual void OnReplyReceived(const ResourceMessageReplyParams& params, 71 const IPC::Message& msg) OVERRIDE; 72 73 private: 74 enum Mode { 75 // The plugin has not called Open() yet. 76 MODE_WAITING_TO_OPEN, 77 78 // The plugin is waiting for the Open() or FollowRedirect callback. 79 MODE_OPENING, 80 81 // We've started to receive data and may receive more. 82 MODE_STREAMING_DATA, 83 84 // All data has been streamed or there was an error. 85 MODE_LOAD_COMPLETE 86 }; 87 88 // IPC message handlers. 89 void OnPluginMsgReceivedResponse(const ResourceMessageReplyParams& params, 90 const URLResponseInfoData& data); 91 void OnPluginMsgSendData(const ResourceMessageReplyParams& params, 92 const IPC::Message& message); 93 void OnPluginMsgFinishedLoading(const ResourceMessageReplyParams& params, 94 int32_t result); 95 void OnPluginMsgUpdateProgress(const ResourceMessageReplyParams& params, 96 int64_t bytes_sent, 97 int64_t total_bytes_to_be_sent, 98 int64_t bytes_received, 99 int64_t total_bytes_to_be_received); 100 101 // Sends the defers loading message to the renderer to block or unblock the 102 // load. 103 void SetDefersLoading(bool defers_loading); 104 105 int32_t ValidateCallback(scoped_refptr<TrackedCallback> callback); 106 107 // Sets up |callback| as the pending callback. This should only be called once 108 // it is certain that |PP_OK_COMPLETIONPENDING| will be returned. 109 void RegisterCallback(scoped_refptr<TrackedCallback> callback); 110 111 void RunCallback(int32_t result); 112 113 // Saves the given response info to response_info_, handling file refs if 114 // necessary. This does not issue any callbacks. 115 void SaveResponseInfo(const URLResponseInfoData& data); 116 117 size_t FillUserBuffer(); 118 119 Mode mode_; 120 URLRequestInfoData request_data_; 121 122 scoped_refptr<TrackedCallback> pending_callback_; 123 124 PP_URLLoaderTrusted_StatusCallback status_callback_; 125 126 std::deque<char> buffer_; 127 int64_t bytes_sent_; 128 int64_t total_bytes_to_be_sent_; 129 int64_t bytes_received_; 130 int64_t total_bytes_to_be_received_; 131 char* user_buffer_; 132 size_t user_buffer_size_; 133 int32_t done_status_; 134 bool is_streaming_to_file_; 135 bool is_asynchronous_load_suspended_; 136 137 // The response info if we've received it. 138 scoped_refptr<URLResponseInfoResource> response_info_; 139 140 DISALLOW_COPY_AND_ASSIGN(URLLoaderResource); 141 }; 142 143 } // namespace proxy 144 } // namespace ppapi 145 146 #endif // PPAPI_PROXY_URL_LOADER_RESOURCE_H_