tcp_socket_private.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "ppapi/cpp/private/tcp_socket_private.h" 6 7#include "ppapi/c/pp_bool.h" 8#include "ppapi/c/pp_errors.h" 9#include "ppapi/cpp/completion_callback.h" 10#include "ppapi/cpp/instance_handle.h" 11#include "ppapi/cpp/module.h" 12#include "ppapi/cpp/module_impl.h" 13 14namespace pp { 15 16namespace { 17 18template <> const char* interface_name<PPB_TCPSocket_Private_0_4>() { 19 return PPB_TCPSOCKET_PRIVATE_INTERFACE_0_4; 20} 21 22template <> const char* interface_name<PPB_TCPSocket_Private_0_3>() { 23 return PPB_TCPSOCKET_PRIVATE_INTERFACE_0_3; 24} 25 26} // namespace 27 28TCPSocketPrivate::TCPSocketPrivate(const InstanceHandle& instance) { 29 if (has_interface<PPB_TCPSocket_Private_0_4>()) { 30 PassRefFromConstructor(get_interface<PPB_TCPSocket_Private_0_4>()->Create( 31 instance.pp_instance())); 32 } else if (has_interface<PPB_TCPSocket_Private_0_3>()) { 33 PassRefFromConstructor(get_interface<PPB_TCPSocket_Private_0_3>()->Create( 34 instance.pp_instance())); 35 } 36} 37 38TCPSocketPrivate::TCPSocketPrivate(PassRef, PP_Resource resource) 39 : Resource(PASS_REF, resource) { 40} 41 42// static 43bool TCPSocketPrivate::IsAvailable() { 44 return has_interface<PPB_TCPSocket_Private_0_4>() || 45 has_interface<PPB_TCPSocket_Private_0_3>(); 46} 47 48int32_t TCPSocketPrivate::Connect(const char* host, 49 uint16_t port, 50 const CompletionCallback& callback) { 51 if (has_interface<PPB_TCPSocket_Private_0_4>()) { 52 return get_interface<PPB_TCPSocket_Private_0_4>()->Connect( 53 pp_resource(), host, port, callback.pp_completion_callback()); 54 } 55 if (has_interface<PPB_TCPSocket_Private_0_3>()) { 56 return get_interface<PPB_TCPSocket_Private_0_3>()->Connect( 57 pp_resource(), host, port, callback.pp_completion_callback()); 58 } 59 return callback.MayForce(PP_ERROR_NOINTERFACE); 60} 61 62int32_t TCPSocketPrivate::ConnectWithNetAddress( 63 const PP_NetAddress_Private* addr, 64 const CompletionCallback& callback) { 65 if (has_interface<PPB_TCPSocket_Private_0_4>()) { 66 return get_interface<PPB_TCPSocket_Private_0_4>()->ConnectWithNetAddress( 67 pp_resource(), addr, callback.pp_completion_callback()); 68 } 69 if (has_interface<PPB_TCPSocket_Private_0_3>()) { 70 return get_interface<PPB_TCPSocket_Private_0_3>()->ConnectWithNetAddress( 71 pp_resource(), addr, callback.pp_completion_callback()); 72 } 73 return callback.MayForce(PP_ERROR_NOINTERFACE); 74} 75 76bool TCPSocketPrivate::GetLocalAddress(PP_NetAddress_Private* local_addr) { 77 if (has_interface<PPB_TCPSocket_Private_0_4>()) { 78 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_4>()-> 79 GetLocalAddress(pp_resource(), local_addr); 80 return PP_ToBool(result); 81 } 82 if (has_interface<PPB_TCPSocket_Private_0_3>()) { 83 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_3>()-> 84 GetLocalAddress(pp_resource(), local_addr); 85 return PP_ToBool(result); 86 } 87 return false; 88} 89 90bool TCPSocketPrivate::GetRemoteAddress(PP_NetAddress_Private* remote_addr) { 91 if (has_interface<PPB_TCPSocket_Private_0_4>()) { 92 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_4>()-> 93 GetRemoteAddress(pp_resource(), remote_addr); 94 return PP_ToBool(result); 95 } 96 if (has_interface<PPB_TCPSocket_Private_0_3>()) { 97 PP_Bool result = get_interface<PPB_TCPSocket_Private_0_3>()-> 98 GetRemoteAddress(pp_resource(), remote_addr); 99 return PP_ToBool(result); 100 } 101 return false; 102} 103 104int32_t TCPSocketPrivate::SSLHandshake(const char* server_name, 105 uint16_t server_port, 106 const CompletionCallback& callback) { 107 if (has_interface<PPB_TCPSocket_Private_0_4>()) { 108 return get_interface<PPB_TCPSocket_Private_0_4>()->SSLHandshake( 109 pp_resource(), server_name, server_port, 110 callback.pp_completion_callback()); 111 } 112 if (has_interface<PPB_TCPSocket_Private_0_3>()) { 113 return get_interface<PPB_TCPSocket_Private_0_3>()->SSLHandshake( 114 pp_resource(), server_name, server_port, 115 callback.pp_completion_callback()); 116 } 117 return callback.MayForce(PP_ERROR_NOINTERFACE); 118} 119 120X509CertificatePrivate TCPSocketPrivate::GetServerCertificate() { 121 if (has_interface<PPB_TCPSocket_Private_0_4>()) { 122 return X509CertificatePrivate(PASS_REF, 123 get_interface<PPB_TCPSocket_Private_0_4>()->GetServerCertificate( 124 pp_resource())); 125 } 126 return X509CertificatePrivate(); 127} 128 129bool TCPSocketPrivate::AddChainBuildingCertificate( 130 const X509CertificatePrivate& cert, 131 bool trusted) { 132 if (has_interface<PPB_TCPSocket_Private_0_4>()) { 133 return PP_ToBool(get_interface<PPB_TCPSocket_Private_0_4>()-> 134 AddChainBuildingCertificate(pp_resource(), cert.pp_resource(), 135 PP_FromBool(trusted))); 136 } 137 return false; 138} 139 140int32_t TCPSocketPrivate::Read(char* buffer, 141 int32_t bytes_to_read, 142 const CompletionCallback& callback) { 143 if (has_interface<PPB_TCPSocket_Private_0_4>()) { 144 return get_interface<PPB_TCPSocket_Private_0_4>()->Read( 145 pp_resource(), buffer, bytes_to_read, 146 callback.pp_completion_callback()); 147 } 148 if (has_interface<PPB_TCPSocket_Private_0_3>()) { 149 return get_interface<PPB_TCPSocket_Private_0_3>()->Read( 150 pp_resource(), buffer, bytes_to_read, 151 callback.pp_completion_callback()); 152 } 153 return callback.MayForce(PP_ERROR_NOINTERFACE); 154} 155 156int32_t TCPSocketPrivate::Write(const char* buffer, 157 int32_t bytes_to_write, 158 const CompletionCallback& callback) { 159 if (has_interface<PPB_TCPSocket_Private_0_4>()) { 160 return get_interface<PPB_TCPSocket_Private_0_4>()->Write( 161 pp_resource(), buffer, bytes_to_write, 162 callback.pp_completion_callback()); 163 } 164 if (has_interface<PPB_TCPSocket_Private_0_3>()) { 165 return get_interface<PPB_TCPSocket_Private_0_3>()->Write( 166 pp_resource(), buffer, bytes_to_write, 167 callback.pp_completion_callback()); 168 } 169 return callback.MayForce(PP_ERROR_NOINTERFACE); 170} 171 172void TCPSocketPrivate::Disconnect() { 173 if (has_interface<PPB_TCPSocket_Private_0_4>()) { 174 return get_interface<PPB_TCPSocket_Private_0_4>()->Disconnect( 175 pp_resource()); 176 } 177 if (has_interface<PPB_TCPSocket_Private_0_3>()) { 178 return get_interface<PPB_TCPSocket_Private_0_3>()->Disconnect( 179 pp_resource()); 180 } 181} 182 183} // namespace pp 184