| Index: ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_websocket_rpc_server.cc | 
| diff --git a/ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_websocket_rpc_server.cc b/ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_websocket_rpc_server.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..01749fcf46fba679e516f02691de07abf626e6f9 | 
| --- /dev/null | 
| +++ b/ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_websocket_rpc_server.cc | 
| @@ -0,0 +1,360 @@ | 
| +// Copyright (c) 2012 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. | 
| +// | 
| +// SRPC-abstraction wrappers around PPB_WebSocket functions. | 
| + | 
| +#include "native_client/src/include/nacl_scoped_ptr.h" | 
| +#include "native_client/src/shared/ppapi_proxy/browser_callback.h" | 
| +#include "native_client/src/shared/ppapi_proxy/browser_globals.h" | 
| +#include "native_client/src/shared/ppapi_proxy/object_serialize.h" | 
| +#include "native_client/src/shared/ppapi_proxy/utility.h" | 
| +#include "ppapi/c/pp_completion_callback.h" | 
| +#include "ppapi/c/pp_errors.h" | 
| +#include "ppapi/c/dev/ppb_websocket_dev.h" | 
| +#include "srpcgen/ppb_rpc.h" | 
| + | 
| +using ppapi_proxy::DebugPrintf; | 
| +using ppapi_proxy::DeleteRemoteCallbackInfo; | 
| +using ppapi_proxy::DeserializeTo; | 
| +using ppapi_proxy::MakeRemoteCompletionCallback; | 
| +using ppapi_proxy::PPBWebSocketInterface; | 
| +using ppapi_proxy::SerializeTo; | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_Create( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Instance instance, | 
| +    // outputs | 
| +    PP_Resource* resource) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  *resource = PPBWebSocketInterface()->Create(instance); | 
| +  DebugPrintf("PPB_WebSocket::Create: resource=%"NACL_PRId32"\n", *resource); | 
| + | 
| +  rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_IsWebSocket( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource resource, | 
| +    // outputs | 
| +    int32_t* success) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  PP_Bool pp_success = PPBWebSocketInterface()->IsWebSocket(resource); | 
| +  *success = PP_ToBool(pp_success); | 
| +  DebugPrintf("PPB_WebSocket::IsWebSocket: success=%d\n", *success); | 
| +  rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_Connect( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    nacl_abi_size_t url_size, | 
| +    char* url_bytes, | 
| +    nacl_abi_size_t protocols_size, | 
| +    char* protocols_bytes, | 
| +    int32_t protocol_count, | 
| +    int32_t callback_id, | 
| +    // outputs | 
| +    int32_t* pp_error) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  PP_CompletionCallback remote_callback = | 
| +      MakeRemoteCompletionCallback(rpc->channel, callback_id); | 
| +  if (NULL == remote_callback.func) | 
| +    return; | 
| + | 
| +  PP_Var url; | 
| +  if (!DeserializeTo(url_bytes, url_size, 1, &url)) | 
| +    return; | 
| + | 
| +  nacl::scoped_array<PP_Var> protocols(new PP_Var[protocol_count]); | 
| +  if (!DeserializeTo( | 
| +      protocols_bytes, protocols_size, protocol_count, protocols.get())) | 
| +    return; | 
| + | 
| +  *pp_error = PPBWebSocketInterface()->Connect( | 
| +      ws, | 
| +      url, | 
| +      protocols.get(), | 
| +      static_cast<uint32_t>(protocol_count), | 
| +      remote_callback); | 
| +  DebugPrintf("PPB_WebSocket::Connect: pp_error=%"NACL_PRId32"\n", *pp_error); | 
| + | 
| +  if (*pp_error != PP_OK_COMPLETIONPENDING) | 
| +    DeleteRemoteCallbackInfo(remote_callback); | 
| +  rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_Close( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    int32_t code, | 
| +    nacl_abi_size_t reason_size, | 
| +    char* reason_bytes, | 
| +    int32_t callback_id, | 
| +    // outputs | 
| +    int32_t* pp_error) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  PP_CompletionCallback remote_callback = | 
| +      MakeRemoteCompletionCallback(rpc->channel, callback_id); | 
| +  if (NULL == remote_callback.func) | 
| +    return; | 
| + | 
| +  PP_Var reason; | 
| +  if (!DeserializeTo(reason_bytes, reason_size, 1, &reason)) | 
| +    return; | 
| + | 
| +  *pp_error = PPBWebSocketInterface()->Close( | 
| +      ws, code, reason, remote_callback); | 
| +  DebugPrintf("PPB_WebSocket::Close: pp_error=%"NACL_PRId32"\n", *pp_error); | 
| + | 
| +  if (*pp_error != PP_OK_COMPLETIONPENDING) | 
| +    DeleteRemoteCallbackInfo(remote_callback); | 
| +  rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_ReceiveMessage( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    int32_t callback_id, | 
| +    // outputs | 
| +    int32_t* pp_error) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  PP_Var* callback_var = NULL; | 
| +  PP_CompletionCallback remote_callback = | 
| +      MakeRemoteCompletionCallback(rpc->channel, callback_id, &callback_var); | 
| +  if (NULL == remote_callback.func) | 
| +    return; | 
| + | 
| +  // The callback is always invoked asynchronously for now, so it doesn't care | 
| +  // about re-entrancy. | 
| +  *pp_error = PPBWebSocketInterface()->ReceiveMessage( | 
| +      ws, callback_var, remote_callback); | 
| +  DebugPrintf("PPB_WebSocket::ReceiveMessage: pp_error=%"NACL_PRId32"\n", | 
| +      *pp_error); | 
| + | 
| +  if (*pp_error != PP_OK_COMPLETIONPENDING) | 
| +    DeleteRemoteCallbackInfo(remote_callback); | 
| +  rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_SendMessage( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    nacl_abi_size_t message_size, | 
| +    char* message_bytes, | 
| +    // outputs | 
| +    int32_t* pp_error) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  PP_Var message; | 
| +  if (!DeserializeTo(message_bytes, message_size, 1, &message)) | 
| +    return; | 
| + | 
| +  *pp_error = PPBWebSocketInterface()->SendMessage(ws, message); | 
| +  DebugPrintf("PPB_WebSocket::SendMessage: pp_error=%"NACL_PRId32"\n", | 
| +      *pp_error); | 
| + | 
| +  rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_GetBufferedAmount( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    // outputs | 
| +    int64_t* buffered_amount) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  *buffered_amount = static_cast<int64_t>( | 
| +      PPBWebSocketInterface()->GetBufferedAmount(ws)); | 
| +  DebugPrintf("PPB_WebSocket::GetBufferedAmount: buffered_amount=%lu\n", | 
| +      *buffered_amount); | 
| + | 
| +  rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_GetCloseCode( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    // outputs | 
| +    int32_t* close_code) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  *close_code = static_cast<int32_t>( | 
| +      PPBWebSocketInterface()->GetCloseCode(ws)); | 
| +  DebugPrintf("PPB_WebSocket::GetCloseCode: close_code=%d\n", *close_code); | 
| + | 
| +  rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_GetCloseReason( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    // outputs | 
| +    nacl_abi_size_t* reason_size, | 
| +    char* reason_bytes) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  PP_Var reason = PPBWebSocketInterface()->GetCloseReason(ws); | 
| +  DebugPrintf("PPB_WebSocket::GetCloseReason:: reason.type=%d\n", reason.type); | 
| + | 
| +  if (SerializeTo(&reason, reason_bytes, reason_size)) | 
| +    rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_GetCloseWasClean( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    // outputs | 
| +    int32_t* was_clean) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  PP_Bool pp_was_clean = PPBWebSocketInterface()->GetCloseWasClean(ws); | 
| +  *was_clean = PP_ToBool(pp_was_clean); | 
| +  DebugPrintf("PPB_WebSocket::GetCloseWasClean: was_clean=%d\n", *was_clean); | 
| +  rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_GetExtensions( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    // outputs | 
| +    nacl_abi_size_t* extensions_size, | 
| +    char* extensions_bytes) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  PP_Var extensions = PPBWebSocketInterface()->GetExtensions(ws); | 
| +  DebugPrintf("PPB_WebSocket::GetExtensions:: extensions.type=%d\n", | 
| +      extensions.type); | 
| + | 
| +  if (SerializeTo(&extensions, extensions_bytes, extensions_size)) | 
| +    rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_GetProtocol( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    // outputs | 
| +    nacl_abi_size_t* protocol_size, | 
| +    char* protocol_bytes) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  PP_Var protocol = PPBWebSocketInterface()->GetProtocol(ws); | 
| +  DebugPrintf("PPB_WebSocket::GetProtocol:: protocol.type=%d\n", | 
| +      protocol.type); | 
| + | 
| +  if (SerializeTo(&protocol, protocol_bytes, protocol_size)) | 
| +    rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_GetReadyState( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    // outputs | 
| +    int32_t* ready_state) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  *ready_state = static_cast<int32_t>( | 
| +      PPBWebSocketInterface()->GetReadyState(ws)); | 
| +  DebugPrintf("PPB_WebSocket::GetReadyState:: ready_state=%d\n", ready_state); | 
| + | 
| +  rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_GetURL( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    // outputs | 
| +    nacl_abi_size_t* url_size, | 
| +    char* url_bytes) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  PP_Var url = PPBWebSocketInterface()->GetURL(ws); | 
| +  DebugPrintf("PPB_WebSocket::GetURL:: url.type=%d\n", url.type); | 
| + | 
| +  if (SerializeTo(&url, url_bytes, url_size)) | 
| +    rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_SetBinaryType( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    int32_t binary_type, | 
| +    // outputs | 
| +    int32_t* success) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  PP_Bool pp_success = PPBWebSocketInterface()->SetBinaryType( | 
| +      ws, static_cast<PP_WebSocketBinaryType_Dev>(binary_type)); | 
| +  *success = PP_ToBool(pp_success); | 
| +  DebugPrintf("PPB_WebSocket::SetBinaryType:: success=%d\n", *success); | 
| + | 
| +  rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
| + | 
| +void PpbWebSocketRpcServer::PPB_WebSocket_GetBinaryType( | 
| +    NaClSrpcRpc* rpc, | 
| +    NaClSrpcClosure* done, | 
| +    // inputs | 
| +    PP_Resource ws, | 
| +    // outputs | 
| +    int32_t* binary_type) { | 
| +  NaClSrpcClosureRunner runner(done); | 
| +  rpc->result = NACL_SRPC_RESULT_APP_ERROR; | 
| + | 
| +  *binary_type = static_cast<int32_t>( | 
| +      PPBWebSocketInterface()->GetBinaryType(ws)); | 
| +  DebugPrintf( | 
| +      "PPB_WebSocket::GetBinaryType:: binary_type=%d\n", *binary_type); | 
| + | 
| +  rpc->result = NACL_SRPC_RESULT_OK; | 
| +} | 
|  |