| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2011 The Native Client Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can |
| 3 // be found in the LICENSE file. |
| 4 // |
| 5 // SRPC-abstraction wrappers around PPB_URLLoader functions. |
| 6 |
| 7 #include <stdio.h> |
| 8 #include <string.h> |
| 9 |
| 10 #include "native_client/src/include/nacl_macros.h" |
| 11 #include "native_client/src/include/portability.h" |
| 12 #include "native_client/src/shared/ppapi_proxy/browser_callback.h" |
| 13 #include "native_client/src/shared/ppapi_proxy/browser_globals.h" |
| 14 #include "native_client/src/shared/ppapi_proxy/utility.h" |
| 15 #include "ppapi/c/pp_completion_callback.h" |
| 16 #include "ppapi/c/pp_errors.h" |
| 17 #include "ppapi/c/ppb_url_loader.h" |
| 18 #include "srpcgen/ppb_rpc.h" |
| 19 |
| 20 using ppapi_proxy::PPBURLLoaderInterface; |
| 21 using ppapi_proxy::DebugPrintf; |
| 22 using ppapi_proxy::MakeRemoteCompletionCallback; |
| 23 using ppapi_proxy::DeleteRemoteCallbackInfo; |
| 24 |
| 25 void PpbURLLoaderRpcServer::PPB_URLLoader_Create( |
| 26 NaClSrpcRpc* rpc, |
| 27 NaClSrpcClosure* done, |
| 28 // inputsles |
| 29 PP_Instance instance, |
| 30 // outputs |
| 31 PP_Resource* resource) { |
| 32 NaClSrpcClosureRunner runner(done); |
| 33 rpc->result = NACL_SRPC_RESULT_APP_ERROR; |
| 34 |
| 35 *resource = PPBURLLoaderInterface()->Create(instance); |
| 36 DebugPrintf("PPB_URLLoader::Create: resource=%"NACL_PRIx64"\n", *resource); |
| 37 |
| 38 rpc->result = NACL_SRPC_RESULT_OK; |
| 39 } |
| 40 |
| 41 void PpbURLLoaderRpcServer::PPB_URLLoader_IsURLLoader( |
| 42 NaClSrpcRpc* rpc, |
| 43 NaClSrpcClosure* done, |
| 44 // inputs |
| 45 PP_Resource resource, |
| 46 // outputs |
| 47 int32_t* success) { |
| 48 NaClSrpcClosureRunner runner(done); |
| 49 rpc->result = NACL_SRPC_RESULT_APP_ERROR; |
| 50 |
| 51 PP_Bool pp_success = PPBURLLoaderInterface()->IsURLLoader(resource); |
| 52 DebugPrintf("PPB_URLLoader::IsURLLoader: pp_success=%d\n", pp_success); |
| 53 |
| 54 *success = (pp_success == PP_TRUE); |
| 55 rpc->result = NACL_SRPC_RESULT_OK; |
| 56 } |
| 57 |
| 58 void PpbURLLoaderRpcServer::PPB_URLLoader_Open( |
| 59 NaClSrpcRpc* rpc, |
| 60 NaClSrpcClosure* done, |
| 61 // inputs |
| 62 PP_Resource loader, |
| 63 PP_Resource request, |
| 64 int32_t callback_id, |
| 65 // outputs |
| 66 int32_t* pp_error) { |
| 67 NaClSrpcClosureRunner runner(done); |
| 68 rpc->result = NACL_SRPC_RESULT_APP_ERROR; |
| 69 |
| 70 PP_CompletionCallback remote_callback = |
| 71 MakeRemoteCompletionCallback(rpc->channel, callback_id); |
| 72 if (remote_callback.func == NULL) |
| 73 return; |
| 74 |
| 75 *pp_error = PPBURLLoaderInterface()->Open(loader, request, remote_callback); |
| 76 DebugPrintf("PPB_URLLoader::Open: pp_error=%"NACL_PRId32"\n", *pp_error); |
| 77 |
| 78 if (*pp_error != PP_ERROR_WOULDBLOCK) // Async error. No callback scheduled. |
| 79 DeleteRemoteCallbackInfo(remote_callback); |
| 80 rpc->result = NACL_SRPC_RESULT_OK; |
| 81 } |
| 82 |
| 83 void PpbURLLoaderRpcServer::PPB_URLLoader_FollowRedirect( |
| 84 NaClSrpcRpc* rpc, |
| 85 NaClSrpcClosure* done, |
| 86 // inputs |
| 87 PP_Resource loader, |
| 88 int32_t callback_id, |
| 89 // outputs |
| 90 int32_t* pp_error) { |
| 91 NACL_UNTESTED(); |
| 92 NaClSrpcClosureRunner runner(done); |
| 93 rpc->result = NACL_SRPC_RESULT_APP_ERROR; |
| 94 |
| 95 PP_CompletionCallback remote_callback = |
| 96 MakeRemoteCompletionCallback(rpc->channel, callback_id); |
| 97 if (remote_callback.func == NULL) |
| 98 return; |
| 99 |
| 100 *pp_error = PPBURLLoaderInterface()->FollowRedirect(loader, remote_callback); |
| 101 DebugPrintf("PPB_URLLoader::FollowRedirect: pp_error=%"NACL_PRId32"\n", |
| 102 *pp_error); |
| 103 if (*pp_error != PP_ERROR_WOULDBLOCK) // Async error. No callback scheduled. |
| 104 DeleteRemoteCallbackInfo(remote_callback); |
| 105 |
| 106 rpc->result = NACL_SRPC_RESULT_OK; |
| 107 } |
| 108 |
| 109 void PpbURLLoaderRpcServer::PPB_URLLoader_GetUploadProgress( |
| 110 NaClSrpcRpc* rpc, |
| 111 NaClSrpcClosure* done, |
| 112 // inputs |
| 113 PP_Resource loader, |
| 114 // outputs |
| 115 int64_t* bytes_sent, |
| 116 int64_t* total_bytes_to_be_sent, |
| 117 int32_t* success) { |
| 118 NACL_UNTESTED(); |
| 119 NaClSrpcClosureRunner runner(done); |
| 120 rpc->result = NACL_SRPC_RESULT_APP_ERROR; |
| 121 |
| 122 PP_Bool pp_success = PPBURLLoaderInterface()->GetUploadProgress( |
| 123 loader, bytes_sent, total_bytes_to_be_sent); |
| 124 DebugPrintf("PPB_URLLoader::GetUploadProgress: pp_success=%d\n", pp_success); |
| 125 |
| 126 *success = (pp_success == PP_TRUE); |
| 127 rpc->result = NACL_SRPC_RESULT_OK; |
| 128 } |
| 129 |
| 130 void PpbURLLoaderRpcServer::PPB_URLLoader_GetDownloadProgress( |
| 131 NaClSrpcRpc* rpc, |
| 132 NaClSrpcClosure* done, |
| 133 // inputs |
| 134 PP_Resource loader, |
| 135 // outputs |
| 136 int64_t* bytes_received, |
| 137 int64_t* total_bytes_to_be_received, |
| 138 int32_t* success) { |
| 139 NACL_UNTESTED(); |
| 140 NaClSrpcClosureRunner runner(done); |
| 141 rpc->result = NACL_SRPC_RESULT_APP_ERROR; |
| 142 |
| 143 PP_Bool pp_success = PPBURLLoaderInterface()->GetDownloadProgress( |
| 144 loader, bytes_received, total_bytes_to_be_received); |
| 145 DebugPrintf("PPB_URLLoader::GetDownloadProgress: pp_success=%d\n", |
| 146 pp_success); |
| 147 |
| 148 *success = (pp_success == PP_TRUE); |
| 149 rpc->result = NACL_SRPC_RESULT_OK; |
| 150 } |
| 151 |
| 152 void PpbURLLoaderRpcServer::PPB_URLLoader_GetResponseInfo( |
| 153 NaClSrpcRpc* rpc, |
| 154 NaClSrpcClosure* done, |
| 155 // inputs |
| 156 PP_Resource loader, |
| 157 // outputs |
| 158 PP_Resource* response) { |
| 159 NaClSrpcClosureRunner runner(done); |
| 160 rpc->result = NACL_SRPC_RESULT_APP_ERROR; |
| 161 |
| 162 *response = PPBURLLoaderInterface()->GetResponseInfo(loader); |
| 163 DebugPrintf("PPB_URLLoader::GetResponseInfo: response=%"NACL_PRIx64"\n", |
| 164 *response); |
| 165 |
| 166 rpc->result = NACL_SRPC_RESULT_OK; |
| 167 } |
| 168 |
| 169 void PpbURLLoaderRpcServer::PPB_URLLoader_ReadResponseBody( |
| 170 NaClSrpcRpc* rpc, |
| 171 NaClSrpcClosure* done, |
| 172 // inputs |
| 173 PP_Resource loader, |
| 174 int32_t bytes_to_read, |
| 175 int32_t callback_id, |
| 176 // outputs |
| 177 nacl_abi_size_t* buffer_size, char* buffer, |
| 178 int32_t* pp_error_or_bytes) { |
| 179 NaClSrpcClosureRunner runner(done); |
| 180 rpc->result = NACL_SRPC_RESULT_APP_ERROR; |
| 181 |
| 182 // |buffer| is allocated by the rpc server and will be freed after this |
| 183 // function returns. Hence we must provide our own byte storage for |
| 184 // a non-blocking call and tie it to the callback. |
| 185 char* callback_buffer = NULL; |
| 186 PP_CompletionCallback remote_callback = MakeRemoteCompletionCallback( |
| 187 rpc->channel, callback_id, bytes_to_read, &callback_buffer); |
| 188 if (remote_callback.func == NULL) |
| 189 return; |
| 190 |
| 191 *pp_error_or_bytes = PPBURLLoaderInterface()->ReadResponseBody( |
| 192 loader, callback_buffer, bytes_to_read, remote_callback); |
| 193 DebugPrintf("PPB_URLLoader::ReadResponseBody: pp_error_or_bytes=%" |
| 194 NACL_PRId32"\n", *pp_error_or_bytes); |
| 195 |
| 196 if (*pp_error_or_bytes > 0) { // Bytes read into |callback_buffer|. |
| 197 // No callback scheduled. |
| 198 *buffer_size = static_cast<nacl_abi_size_t>(*pp_error_or_bytes); |
| 199 memcpy(buffer, callback_buffer, *buffer_size); |
| 200 DeleteRemoteCallbackInfo(remote_callback); |
| 201 } else if (*pp_error_or_bytes != PP_ERROR_WOULDBLOCK) { // Async error. |
| 202 // No callback scheduled. |
| 203 *buffer_size = 0; |
| 204 DeleteRemoteCallbackInfo(remote_callback); |
| 205 } else { |
| 206 // Callback scheduled. |
| 207 *buffer_size = 0; |
| 208 } |
| 209 |
| 210 rpc->result = NACL_SRPC_RESULT_OK; |
| 211 } |
| 212 |
| 213 void PpbURLLoaderRpcServer::PPB_URLLoader_FinishStreamingToFile( |
| 214 NaClSrpcRpc* rpc, |
| 215 NaClSrpcClosure* done, |
| 216 // inputs |
| 217 PP_Resource loader, |
| 218 int32_t callback_id, |
| 219 // outputs |
| 220 int32_t* pp_error) { |
| 221 NaClSrpcClosureRunner runner(done); |
| 222 rpc->result = NACL_SRPC_RESULT_APP_ERROR; |
| 223 |
| 224 PP_CompletionCallback remote_callback = |
| 225 MakeRemoteCompletionCallback(rpc->channel, callback_id); |
| 226 if (remote_callback.func == NULL) |
| 227 return; |
| 228 |
| 229 *pp_error = |
| 230 PPBURLLoaderInterface()->FinishStreamingToFile(loader, remote_callback); |
| 231 DebugPrintf("PPB_URLLoader::FinishStreamingToFile: pp_error=%"NACL_PRId32"\n", |
| 232 *pp_error); |
| 233 if (*pp_error != PP_ERROR_WOULDBLOCK) // Async error. No callback scheduled. |
| 234 DeleteRemoteCallbackInfo(remote_callback); |
| 235 rpc->result = NACL_SRPC_RESULT_OK; |
| 236 } |
| 237 |
| 238 void PpbURLLoaderRpcServer::PPB_URLLoader_Close( |
| 239 NaClSrpcRpc* rpc, |
| 240 NaClSrpcClosure* done, |
| 241 // inputs |
| 242 PP_Resource loader) { |
| 243 NACL_UNTESTED(); |
| 244 NaClSrpcClosureRunner runner(done); |
| 245 rpc->result = NACL_SRPC_RESULT_APP_ERROR; |
| 246 PPBURLLoaderInterface()->Close(loader); |
| 247 rpc->result = NACL_SRPC_RESULT_OK; |
| 248 } |
| OLD | NEW |