Home | History | Annotate | Download | only in private
      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 
     14 namespace pp {
     15 
     16 namespace {
     17 
     18 template <> const char* interface_name<PPB_TCPSocket_Private_0_5>() {
     19   return PPB_TCPSOCKET_PRIVATE_INTERFACE_0_5;
     20 }
     21 
     22 template <> const char* interface_name<PPB_TCPSocket_Private_0_4>() {
     23   return PPB_TCPSOCKET_PRIVATE_INTERFACE_0_4;
     24 }
     25 
     26 template <> const char* interface_name<PPB_TCPSocket_Private_0_3>() {
     27   return PPB_TCPSOCKET_PRIVATE_INTERFACE_0_3;
     28 }
     29 
     30 }  // namespace
     31 
     32 TCPSocketPrivate::TCPSocketPrivate(const InstanceHandle& instance) {
     33   if (has_interface<PPB_TCPSocket_Private_0_5>()) {
     34     PassRefFromConstructor(get_interface<PPB_TCPSocket_Private_0_5>()->Create(
     35         instance.pp_instance()));
     36   } else if (has_interface<PPB_TCPSocket_Private_0_4>()) {
     37     PassRefFromConstructor(get_interface<PPB_TCPSocket_Private_0_4>()->Create(
     38         instance.pp_instance()));
     39   } else if (has_interface<PPB_TCPSocket_Private_0_3>()) {
     40     PassRefFromConstructor(get_interface<PPB_TCPSocket_Private_0_3>()->Create(
     41         instance.pp_instance()));
     42   }
     43 }
     44 
     45 TCPSocketPrivate::TCPSocketPrivate(PassRef, PP_Resource resource)
     46     : Resource(PASS_REF, resource) {
     47 }
     48 
     49 // static
     50 bool TCPSocketPrivate::IsAvailable() {
     51   return has_interface<PPB_TCPSocket_Private_0_5>() ||
     52       has_interface<PPB_TCPSocket_Private_0_4>() ||
     53       has_interface<PPB_TCPSocket_Private_0_3>();
     54 }
     55 
     56 int32_t TCPSocketPrivate::Connect(const char* host,
     57                                   uint16_t port,
     58                                   const CompletionCallback& callback) {
     59   if (has_interface<PPB_TCPSocket_Private_0_5>()) {
     60     return get_interface<PPB_TCPSocket_Private_0_5>()->Connect(
     61         pp_resource(), host, port, callback.pp_completion_callback());
     62   }
     63   if (has_interface<PPB_TCPSocket_Private_0_4>()) {
     64     return get_interface<PPB_TCPSocket_Private_0_4>()->Connect(
     65         pp_resource(), host, port, callback.pp_completion_callback());
     66   }
     67   if (has_interface<PPB_TCPSocket_Private_0_3>()) {
     68     return get_interface<PPB_TCPSocket_Private_0_3>()->Connect(
     69         pp_resource(), host, port, callback.pp_completion_callback());
     70   }
     71   return callback.MayForce(PP_ERROR_NOINTERFACE);
     72 }
     73 
     74 int32_t TCPSocketPrivate::ConnectWithNetAddress(
     75     const PP_NetAddress_Private* addr,
     76     const CompletionCallback& callback) {
     77   if (has_interface<PPB_TCPSocket_Private_0_5>()) {
     78     return get_interface<PPB_TCPSocket_Private_0_5>()->ConnectWithNetAddress(
     79         pp_resource(), addr, callback.pp_completion_callback());
     80   }
     81   if (has_interface<PPB_TCPSocket_Private_0_4>()) {
     82     return get_interface<PPB_TCPSocket_Private_0_4>()->ConnectWithNetAddress(
     83         pp_resource(), addr, callback.pp_completion_callback());
     84   }
     85   if (has_interface<PPB_TCPSocket_Private_0_3>()) {
     86     return get_interface<PPB_TCPSocket_Private_0_3>()->ConnectWithNetAddress(
     87         pp_resource(), addr, callback.pp_completion_callback());
     88   }
     89   return callback.MayForce(PP_ERROR_NOINTERFACE);
     90 }
     91 
     92 bool TCPSocketPrivate::GetLocalAddress(PP_NetAddress_Private* local_addr) {
     93   if (has_interface<PPB_TCPSocket_Private_0_5>()) {
     94     PP_Bool result = get_interface<PPB_TCPSocket_Private_0_5>()->
     95         GetLocalAddress(pp_resource(), local_addr);
     96     return PP_ToBool(result);
     97   }
     98   if (has_interface<PPB_TCPSocket_Private_0_4>()) {
     99     PP_Bool result = get_interface<PPB_TCPSocket_Private_0_4>()->
    100         GetLocalAddress(pp_resource(), local_addr);
    101     return PP_ToBool(result);
    102   }
    103   if (has_interface<PPB_TCPSocket_Private_0_3>()) {
    104     PP_Bool result = get_interface<PPB_TCPSocket_Private_0_3>()->
    105         GetLocalAddress(pp_resource(), local_addr);
    106     return PP_ToBool(result);
    107   }
    108   return false;
    109 }
    110 
    111 bool TCPSocketPrivate::GetRemoteAddress(PP_NetAddress_Private* remote_addr) {
    112   if (has_interface<PPB_TCPSocket_Private_0_5>()) {
    113     PP_Bool result = get_interface<PPB_TCPSocket_Private_0_5>()->
    114         GetRemoteAddress(pp_resource(), remote_addr);
    115     return PP_ToBool(result);
    116   }
    117   if (has_interface<PPB_TCPSocket_Private_0_4>()) {
    118     PP_Bool result = get_interface<PPB_TCPSocket_Private_0_4>()->
    119         GetRemoteAddress(pp_resource(), remote_addr);
    120     return PP_ToBool(result);
    121   }
    122   if (has_interface<PPB_TCPSocket_Private_0_3>()) {
    123     PP_Bool result = get_interface<PPB_TCPSocket_Private_0_3>()->
    124         GetRemoteAddress(pp_resource(), remote_addr);
    125     return PP_ToBool(result);
    126   }
    127   return false;
    128 }
    129 
    130 int32_t TCPSocketPrivate::SSLHandshake(const char* server_name,
    131                                        uint16_t server_port,
    132                                        const CompletionCallback& callback) {
    133   if (has_interface<PPB_TCPSocket_Private_0_5>()) {
    134     return get_interface<PPB_TCPSocket_Private_0_5>()->SSLHandshake(
    135         pp_resource(), server_name, server_port,
    136         callback.pp_completion_callback());
    137   }
    138   if (has_interface<PPB_TCPSocket_Private_0_4>()) {
    139     return get_interface<PPB_TCPSocket_Private_0_4>()->SSLHandshake(
    140         pp_resource(), server_name, server_port,
    141         callback.pp_completion_callback());
    142   }
    143   if (has_interface<PPB_TCPSocket_Private_0_3>()) {
    144     return get_interface<PPB_TCPSocket_Private_0_3>()->SSLHandshake(
    145         pp_resource(), server_name, server_port,
    146         callback.pp_completion_callback());
    147   }
    148   return callback.MayForce(PP_ERROR_NOINTERFACE);
    149 }
    150 
    151 X509CertificatePrivate TCPSocketPrivate::GetServerCertificate() {
    152   if (has_interface<PPB_TCPSocket_Private_0_5>()) {
    153     return X509CertificatePrivate(PASS_REF,
    154         get_interface<PPB_TCPSocket_Private_0_5>()->GetServerCertificate(
    155             pp_resource()));
    156   }
    157   if (has_interface<PPB_TCPSocket_Private_0_4>()) {
    158     return X509CertificatePrivate(PASS_REF,
    159         get_interface<PPB_TCPSocket_Private_0_4>()->GetServerCertificate(
    160             pp_resource()));
    161   }
    162   return X509CertificatePrivate();
    163 }
    164 
    165 bool TCPSocketPrivate::AddChainBuildingCertificate(
    166     const X509CertificatePrivate& cert,
    167     bool trusted) {
    168   if (has_interface<PPB_TCPSocket_Private_0_5>()) {
    169     return PP_ToBool(get_interface<PPB_TCPSocket_Private_0_5>()->
    170         AddChainBuildingCertificate(pp_resource(), cert.pp_resource(),
    171                                     PP_FromBool(trusted)));
    172   }
    173   if (has_interface<PPB_TCPSocket_Private_0_4>()) {
    174     return PP_ToBool(get_interface<PPB_TCPSocket_Private_0_4>()->
    175         AddChainBuildingCertificate(pp_resource(), cert.pp_resource(),
    176                                     PP_FromBool(trusted)));
    177   }
    178   return false;
    179 }
    180 
    181 int32_t TCPSocketPrivate::Read(char* buffer,
    182                                int32_t bytes_to_read,
    183                                const CompletionCallback& callback) {
    184   if (has_interface<PPB_TCPSocket_Private_0_5>()) {
    185     return get_interface<PPB_TCPSocket_Private_0_5>()->Read(
    186         pp_resource(), buffer, bytes_to_read,
    187         callback.pp_completion_callback());
    188   }
    189   if (has_interface<PPB_TCPSocket_Private_0_4>()) {
    190     return get_interface<PPB_TCPSocket_Private_0_4>()->Read(
    191         pp_resource(), buffer, bytes_to_read,
    192         callback.pp_completion_callback());
    193   }
    194   if (has_interface<PPB_TCPSocket_Private_0_3>()) {
    195     return get_interface<PPB_TCPSocket_Private_0_3>()->Read(
    196         pp_resource(), buffer, bytes_to_read,
    197         callback.pp_completion_callback());
    198   }
    199   return callback.MayForce(PP_ERROR_NOINTERFACE);
    200 }
    201 
    202 int32_t TCPSocketPrivate::Write(const char* buffer,
    203                                 int32_t bytes_to_write,
    204                                 const CompletionCallback& callback) {
    205   if (has_interface<PPB_TCPSocket_Private_0_5>()) {
    206     return get_interface<PPB_TCPSocket_Private_0_5>()->Write(
    207         pp_resource(), buffer, bytes_to_write,
    208         callback.pp_completion_callback());
    209   }
    210   if (has_interface<PPB_TCPSocket_Private_0_4>()) {
    211     return get_interface<PPB_TCPSocket_Private_0_4>()->Write(
    212         pp_resource(), buffer, bytes_to_write,
    213         callback.pp_completion_callback());
    214   }
    215   if (has_interface<PPB_TCPSocket_Private_0_3>()) {
    216     return get_interface<PPB_TCPSocket_Private_0_3>()->Write(
    217         pp_resource(), buffer, bytes_to_write,
    218         callback.pp_completion_callback());
    219   }
    220   return callback.MayForce(PP_ERROR_NOINTERFACE);
    221 }
    222 
    223 void TCPSocketPrivate::Disconnect() {
    224   if (has_interface<PPB_TCPSocket_Private_0_5>()) {
    225     return get_interface<PPB_TCPSocket_Private_0_5>()->Disconnect(
    226         pp_resource());
    227   }
    228   if (has_interface<PPB_TCPSocket_Private_0_4>()) {
    229     return get_interface<PPB_TCPSocket_Private_0_4>()->Disconnect(
    230         pp_resource());
    231   }
    232   if (has_interface<PPB_TCPSocket_Private_0_3>()) {
    233     return get_interface<PPB_TCPSocket_Private_0_3>()->Disconnect(
    234         pp_resource());
    235   }
    236 }
    237 
    238 int32_t TCPSocketPrivate::SetOption(PP_TCPSocketOption_Private name,
    239                                     const Var& value,
    240                                     const CompletionCallback& callback) {
    241   if (has_interface<PPB_TCPSocket_Private_0_5>()) {
    242     return get_interface<PPB_TCPSocket_Private_0_5>()->SetOption(
    243         pp_resource(), name, value.pp_var(), callback.pp_completion_callback());
    244   }
    245   return callback.MayForce(PP_ERROR_NOINTERFACE);
    246 }
    247 
    248 }  // namespace pp
    249