OLD | NEW |
(Empty) | |
| 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_ |
OLD | NEW |