1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/udp_socket.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/pp_errors.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/completion_callback.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/instance_handle.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/module_impl.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/var.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace pp { 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <> const char* interface_name<PPB_UDPSocket_1_0>() { 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PPB_UDPSOCKET_INTERFACE_1_0; 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUDPSocket::UDPSocket() { 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUDPSocket::UDPSocket(const InstanceHandle& instance) { 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_UDPSocket_1_0>()) { 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PassRefFromConstructor(get_interface<PPB_UDPSocket_1_0>()->Create( 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch instance.pp_instance())); 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUDPSocket::UDPSocket(PassRef, PP_Resource resource) 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : Resource(PASS_REF, resource) { 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUDPSocket::UDPSocket(const UDPSocket& other) : Resource(other) { 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUDPSocket::~UDPSocket() { 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochUDPSocket& UDPSocket::operator=(const UDPSocket& other) { 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Resource::operator=(other); 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return *this; 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool UDPSocket::IsAvailable() { 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return has_interface<PPB_UDPSocket_1_0>(); 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t UDPSocket::Bind(const NetAddress& addr, 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const CompletionCallback& callback) { 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_UDPSocket_1_0>()) { 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return get_interface<PPB_UDPSocket_1_0>()->Bind( 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp_resource(), addr.pp_resource(), callback.pp_completion_callback()); 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return callback.MayForce(PP_ERROR_NOINTERFACE); 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochNetAddress UDPSocket::GetBoundAddress() { 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_UDPSocket_1_0>()) { 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return NetAddress( 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PASS_REF, 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch get_interface<PPB_UDPSocket_1_0>()->GetBoundAddress(pp_resource())); 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return NetAddress(); 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t UDPSocket::RecvFrom( 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch char* buffer, 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int32_t num_bytes, 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const CompletionCallbackWithOutput<NetAddress>& callback) { 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_UDPSocket_1_0>()) { 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return get_interface<PPB_UDPSocket_1_0>()->RecvFrom( 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp_resource(), buffer, num_bytes, callback.output(), 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback.pp_completion_callback()); 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return callback.MayForce(PP_ERROR_NOINTERFACE); 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t UDPSocket::SendTo(const char* buffer, 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int32_t num_bytes, 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const NetAddress& addr, 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const CompletionCallback& callback) { 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_UDPSocket_1_0>()) { 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return get_interface<PPB_UDPSocket_1_0>()->SendTo( 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp_resource(), buffer, num_bytes, addr.pp_resource(), 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback.pp_completion_callback()); 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return callback.MayForce(PP_ERROR_NOINTERFACE); 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid UDPSocket::Close() { 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_UDPSocket_1_0>()) 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return get_interface<PPB_UDPSocket_1_0>()->Close(pp_resource()); 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t UDPSocket::SetOption(PP_UDPSocket_Option name, 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const Var& value, 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const CompletionCallback& callback) { 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (has_interface<PPB_UDPSocket_1_0>()) { 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return get_interface<PPB_UDPSocket_1_0>()->SetOption( 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp_resource(), name, value.pp_var(), callback.pp_completion_callback()); 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return callback.MayForce(PP_ERROR_NOINTERFACE); 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace pp 111