| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 // Copyright 2010 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 | 
|---|