Home | History | Annotate | Download | only in cpp
      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/websocket.h"
      6 
      7 #include "ppapi/c/pp_errors.h"
      8 #include "ppapi/c/pp_macros.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 #include "ppapi/cpp/var.h"
     14 
     15 namespace pp {
     16 
     17 namespace {
     18 
     19 template <> const char* interface_name<PPB_WebSocket_1_0>() {
     20   return PPB_WEBSOCKET_INTERFACE_1_0;
     21 }
     22 
     23 }  // namespace
     24 
     25 WebSocket::WebSocket(const InstanceHandle& instance) {
     26   if (!has_interface<PPB_WebSocket_1_0>())
     27     return;
     28   PassRefFromConstructor(get_interface<PPB_WebSocket_1_0>()->Create(
     29     instance.pp_instance()));
     30 }
     31 
     32 WebSocket::~WebSocket() {
     33 }
     34 
     35 int32_t WebSocket::Connect(const Var& url, const Var protocols[],
     36     uint32_t protocol_count, const CompletionCallback& callback) {
     37   if (!has_interface<PPB_WebSocket_1_0>())
     38     return PP_ERROR_BADRESOURCE;
     39 
     40   // Convert protocols to C interface.
     41   PP_Var *c_protocols = NULL;
     42   if (protocol_count) {
     43     c_protocols = new PP_Var[protocol_count];
     44     if (!c_protocols)
     45       return PP_ERROR_NOMEMORY;
     46   }
     47   for (uint32_t i = 0; i < protocol_count; ++i)
     48     c_protocols[i] = protocols[i].pp_var();
     49 
     50   int32_t result = get_interface<PPB_WebSocket_1_0>()->Connect(
     51       pp_resource(), url.pp_var(), c_protocols, protocol_count,
     52       callback.pp_completion_callback());
     53   if (c_protocols)
     54     delete[] c_protocols;
     55   return result;
     56 }
     57 
     58 int32_t WebSocket::Close(uint16_t code, const Var& reason,
     59     const CompletionCallback& callback) {
     60   if (!has_interface<PPB_WebSocket_1_0>())
     61     return PP_ERROR_BADRESOURCE;
     62 
     63   return get_interface<PPB_WebSocket_1_0>()->Close(
     64       pp_resource(), code, reason.pp_var(),
     65       callback.pp_completion_callback());
     66 }
     67 
     68 int32_t WebSocket::ReceiveMessage(Var* message,
     69     const CompletionCallback& callback) {
     70   if (!has_interface<PPB_WebSocket_1_0>())
     71     return PP_ERROR_BADRESOURCE;
     72 
     73   // Initialize |message| to release old internal PP_Var of reused |message|.
     74   if (message)
     75     *message = Var();
     76 
     77   return get_interface<PPB_WebSocket_1_0>()->ReceiveMessage(
     78       pp_resource(), const_cast<PP_Var*>(&message->pp_var()),
     79       callback.pp_completion_callback());
     80 }
     81 
     82 int32_t WebSocket::SendMessage(const Var& message) {
     83   if (!has_interface<PPB_WebSocket_1_0>())
     84     return PP_ERROR_BADRESOURCE;
     85 
     86   return get_interface<PPB_WebSocket_1_0>()->SendMessage(
     87       pp_resource(), message.pp_var());
     88 }
     89 
     90 uint64_t WebSocket::GetBufferedAmount() {
     91   if (!has_interface<PPB_WebSocket_1_0>())
     92     return 0;
     93 
     94   return get_interface<PPB_WebSocket_1_0>()->GetBufferedAmount(pp_resource());
     95 }
     96 
     97 uint16_t WebSocket::GetCloseCode() {
     98   if (!has_interface<PPB_WebSocket_1_0>())
     99     return 0;
    100 
    101   return get_interface<PPB_WebSocket_1_0>()->GetCloseCode(pp_resource());
    102 }
    103 
    104 Var WebSocket::GetCloseReason() {
    105   if (!has_interface<PPB_WebSocket_1_0>())
    106     return 0;
    107 
    108   return Var(PASS_REF,
    109       get_interface<PPB_WebSocket_1_0>()->GetCloseReason(pp_resource()));
    110 }
    111 
    112 bool WebSocket::GetCloseWasClean() {
    113   if (!has_interface<PPB_WebSocket_1_0>())
    114     return false;
    115 
    116   PP_Bool result =
    117       get_interface<PPB_WebSocket_1_0>()->GetCloseWasClean(pp_resource());
    118   return PP_ToBool(result);
    119 }
    120 
    121 Var WebSocket::GetExtensions() {
    122   if (!has_interface<PPB_WebSocket_1_0>())
    123     return Var();
    124 
    125   return Var(PASS_REF,
    126              get_interface<PPB_WebSocket_1_0>()->GetExtensions(pp_resource()));
    127 }
    128 
    129 Var WebSocket::GetProtocol() {
    130   if (!has_interface<PPB_WebSocket_1_0>())
    131     return Var();
    132 
    133   return Var(PASS_REF,
    134              get_interface<PPB_WebSocket_1_0>()->GetProtocol(pp_resource()));
    135 }
    136 
    137 PP_WebSocketReadyState WebSocket::GetReadyState() {
    138   if (!has_interface<PPB_WebSocket_1_0>())
    139     return PP_WEBSOCKETREADYSTATE_INVALID;
    140 
    141   return get_interface<PPB_WebSocket_1_0>()->GetReadyState(pp_resource());
    142 }
    143 
    144 Var WebSocket::GetURL() {
    145   if (!has_interface<PPB_WebSocket_1_0>())
    146     return Var();
    147 
    148   return Var(PASS_REF,
    149              get_interface<PPB_WebSocket_1_0>()->GetURL(pp_resource()));
    150 }
    151 
    152 }  // namespace pp
    153