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