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