15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_completion_callback.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_tcp_socket_private.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/tracked_callback.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/thunk.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_tcp_socket_private_api.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/resource_creation_api.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace thunk { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef EnterResource<PPB_TCPSocket_Private_API> EnterTCP; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource Create(PP_Instance instance) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResourceCreation enter(instance); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.functions()->CreateTCPSocketPrivate(instance); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool IsTCPSocket(PP_Resource resource) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterTCP enter(resource, false); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FromBool(enter.succeeded()); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t Connect(PP_Resource tcp_socket, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* host, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t port, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_CompletionCallback callback) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterTCP enter(tcp_socket, callback, true); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.retval(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.SetResult(enter.object()->Connect(host, port, enter.callback())); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t ConnectWithNetAddress(PP_Resource tcp_socket, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_NetAddress_Private* addr, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_CompletionCallback callback) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterTCP enter(tcp_socket, callback, true); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.retval(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.SetResult( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enter.object()->ConnectWithNetAddress(addr, enter.callback())); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool GetLocalAddress(PP_Resource tcp_socket, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private* local_addr) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterTCP enter(tcp_socket, true); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.object()->GetLocalAddress(local_addr); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool GetRemoteAddress(PP_Resource tcp_socket, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private* remote_addr) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterTCP enter(tcp_socket, true); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.object()->GetRemoteAddress(remote_addr); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t SSLHandshake(PP_Resource tcp_socket, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* server_name, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t server_port, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_CompletionCallback callback) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterTCP enter(tcp_socket, callback, true); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.retval(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.SetResult(enter.object()->SSLHandshake(server_name, server_port, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enter.callback())); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource GetServerCertificate(PP_Resource tcp_socket) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterTCP enter(tcp_socket, true); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.object()->GetServerCertificate(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool AddChainBuildingCertificate(PP_Resource tcp_socket, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource certificate, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Bool trusted) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterTCP enter(tcp_socket, true); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.object()->AddChainBuildingCertificate(certificate, trusted); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t Read(PP_Resource tcp_socket, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* buffer, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t bytes_to_read, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_CompletionCallback callback) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterTCP enter(tcp_socket, callback, true); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.retval(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.SetResult(enter.object()->Read(buffer, bytes_to_read, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enter.callback())); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t Write(PP_Resource tcp_socket, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* buffer, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t bytes_to_write, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_CompletionCallback callback) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterTCP enter(tcp_socket, callback, true); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.retval(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.SetResult(enter.object()->Write(buffer, bytes_to_write, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enter.callback())); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Disconnect(PP_Resource tcp_socket) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterTCP enter(tcp_socket, true); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.succeeded()) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enter.object()->Disconnect(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t SetOption(PP_Resource tcp_socket, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_TCPSocketOption_Private name, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Var value, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_CompletionCallback callback) { 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterTCP enter(tcp_socket, callback, true); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.failed()) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return enter.retval(); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return enter.SetResult( 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enter.object()->SetOption(name, value, enter.callback())); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_TCPSocket_Private_0_3 g_ppb_tcp_socket_thunk_0_3 = { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Create, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &IsTCPSocket, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Connect, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ConnectWithNetAddress, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetLocalAddress, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetRemoteAddress, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SSLHandshake, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Read, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Write, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Disconnect 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const PPB_TCPSocket_Private_0_4 g_ppb_tcp_socket_thunk_0_4 = { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Create, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &IsTCPSocket, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Connect, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ConnectWithNetAddress, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetLocalAddress, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetRemoteAddress, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SSLHandshake, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetServerCertificate, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &AddChainBuildingCertificate, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Read, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Write, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Disconnect 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const PPB_TCPSocket_Private_0_5 g_ppb_tcp_socket_thunk_0_5 = { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Create, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &IsTCPSocket, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Connect, 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &ConnectWithNetAddress, 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &GetLocalAddress, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &GetRemoteAddress, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &SSLHandshake, 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &GetServerCertificate, 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &AddChainBuildingCertificate, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Read, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Write, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Disconnect, 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &SetOption 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_TCPSocket_Private_0_3* GetPPB_TCPSocket_Private_0_3_Thunk() { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &g_ppb_tcp_socket_thunk_0_3; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_TCPSocket_Private_0_4* GetPPB_TCPSocket_Private_0_4_Thunk() { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &g_ppb_tcp_socket_thunk_0_4; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const PPB_TCPSocket_Private_0_5* GetPPB_TCPSocket_Private_0_5_Thunk() { 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &g_ppb_tcp_socket_thunk_0_5; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace thunk 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 195