1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/api/sockets_udp/sockets_udp_api.h" 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/public/common/socket_permission_request.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/api/socket/udp_socket.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.h" 104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "extensions/common/api/sockets/sockets_manifest_data.h" 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/base/net_errors.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace extensions { 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace core_api { 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using content::SocketPermissionRequest; 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kSocketNotFoundError[] = "Socket not found"; 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kPermissionError[] = "App does not have permission"; 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kWildcardAddress[] = "*"; 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int kWildcardPort = 0; 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)UDPSocketAsyncApiFunction::~UDPSocketAsyncApiFunction() {} 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_ptr<SocketResourceManagerInterface> 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)UDPSocketAsyncApiFunction::CreateSocketResourceManager() { 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return scoped_ptr<SocketResourceManagerInterface>( 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new SocketResourceManager<ResumableUDPSocket>()).Pass(); 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)ResumableUDPSocket* UDPSocketAsyncApiFunction::GetUdpSocket(int socket_id) { 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return static_cast<ResumableUDPSocket*>(GetSocket(socket_id)); 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)UDPSocketExtensionWithDnsLookupFunction:: 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ~UDPSocketExtensionWithDnsLookupFunction() {} 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_ptr<SocketResourceManagerInterface> 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)UDPSocketExtensionWithDnsLookupFunction::CreateSocketResourceManager() { 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return scoped_ptr<SocketResourceManagerInterface>( 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new SocketResourceManager<ResumableUDPSocket>()).Pass(); 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)ResumableUDPSocket* UDPSocketExtensionWithDnsLookupFunction::GetUdpSocket( 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int socket_id) { 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return static_cast<ResumableUDPSocket*>(GetSocket(socket_id)); 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)linked_ptr<sockets_udp::SocketInfo> CreateSocketInfo( 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int socket_id, 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket) { 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) linked_ptr<sockets_udp::SocketInfo> socket_info( 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new sockets_udp::SocketInfo()); 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // This represents what we know about the socket, and does not call through 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // to the system. 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) socket_info->socket_id = socket_id; 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!socket->name().empty()) { 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) socket_info->name.reset(new std::string(socket->name())); 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) socket_info->persistent = socket->persistent(); 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (socket->buffer_size() > 0) { 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) socket_info->buffer_size.reset(new int(socket->buffer_size())); 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) socket_info->paused = socket->paused(); 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Grab the local address as known by the OS. 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) net::IPEndPoint localAddress; 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (socket->GetLocalAddress(&localAddress)) { 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) socket_info->local_address.reset( 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new std::string(localAddress.ToStringWithoutPort())); 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) socket_info->local_port.reset(new int(localAddress.port())); 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return socket_info; 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SetSocketProperties(ResumableUDPSocket* socket, 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) sockets_udp::SocketProperties* properties) { 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (properties->name.get()) { 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) socket->set_name(*properties->name.get()); 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (properties->persistent.get()) { 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) socket->set_persistent(*properties->persistent.get()); 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (properties->buffer_size.get()) { 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) socket->set_buffer_size(*properties->buffer_size.get()); 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpCreateFunction::SocketsUdpCreateFunction() {} 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpCreateFunction::~SocketsUdpCreateFunction() {} 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool SocketsUdpCreateFunction::Prepare() { 953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params_ = sockets_udp::Create::Params::Create(*args_); 963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params_.get()); 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpCreateFunction::Work() { 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket = new ResumableUDPSocket(extension_->id()); 1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) sockets_udp::SocketProperties* properties = params_.get()->properties.get(); 1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (properties) { 1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetSocketProperties(socket, properties); 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) sockets_udp::CreateInfo create_info; 1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) create_info.socket_id = AddSocket(socket); 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results_ = sockets_udp::Create::Results::Create(create_info); 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpUpdateFunction::SocketsUdpUpdateFunction() {} 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpUpdateFunction::~SocketsUdpUpdateFunction() {} 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool SocketsUdpUpdateFunction::Prepare() { 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params_ = sockets_udp::Update::Params::Create(*args_); 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params_.get()); 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpUpdateFunction::Work() { 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket = GetUdpSocket(params_->socket_id); 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!socket) { 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kSocketNotFoundError; 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetSocketProperties(socket, ¶ms_.get()->properties); 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results_ = sockets_udp::Update::Results::Create(); 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)SocketsUdpSetPausedFunction::SocketsUdpSetPausedFunction() 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : socket_event_dispatcher_(NULL) {} 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)SocketsUdpSetPausedFunction::~SocketsUdpSetPausedFunction() {} 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool SocketsUdpSetPausedFunction::Prepare() { 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params_ = core_api::sockets_udp::SetPaused::Params::Create(*args_); 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params_.get()); 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_event_dispatcher_ = UDPSocketEventDispatcher::Get(browser_context()); 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(socket_event_dispatcher_) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) << "There is no socket event dispatcher. " 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "If this assertion is failing during a test, then it is likely that " 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "TestExtensionSystem is failing to provide an instance of " 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "UDPSocketEventDispatcher."; 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return socket_event_dispatcher_ != NULL; 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SocketsUdpSetPausedFunction::Work() { 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResumableUDPSocket* socket = GetUdpSocket(params_->socket_id); 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!socket) { 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) error_ = kSocketNotFoundError; 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (socket->paused() != params_->paused) { 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) socket->set_paused(params_->paused); 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (socket->IsBound() && !params_->paused) { 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) socket_event_dispatcher_->OnSocketResume(extension_->id(), 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params_->socket_id); 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) results_ = sockets_udp::SetPaused::Results::Create(); 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)SocketsUdpBindFunction::SocketsUdpBindFunction() 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : socket_event_dispatcher_(NULL) {} 1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpBindFunction::~SocketsUdpBindFunction() {} 1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool SocketsUdpBindFunction::Prepare() { 1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params_ = sockets_udp::Bind::Params::Create(*args_); 1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params_.get()); 17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_event_dispatcher_ = UDPSocketEventDispatcher::Get(browser_context()); 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(socket_event_dispatcher_) 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) << "There is no socket event dispatcher. " 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "If this assertion is failing during a test, then it is likely that " 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "TestExtensionSystem is failing to provide an instance of " 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "UDPSocketEventDispatcher."; 18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return socket_event_dispatcher_ != NULL; 1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpBindFunction::Work() { 1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket = GetUdpSocket(params_->socket_id); 1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!socket) { 1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kSocketNotFoundError; 1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SocketPermissionRequest param( 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SocketPermissionRequest::UDP_BIND, params_->address, params_->port); 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!SocketsManifestData::CheckRequest(extension(), param)) { 1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kPermissionError; 1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int net_result = socket->Bind(params_->address, params_->port); 2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (net_result == net::OK) { 20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) socket_event_dispatcher_->OnSocketBind(extension_->id(), 20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) params_->socket_id); 2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (net_result != net::OK) 2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = net::ErrorToString(net_result); 2103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results_ = sockets_udp::Bind::Results::Create(net_result); 2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SocketsUdpSendFunction::SocketsUdpSendFunction() : io_buffer_size_(0) {} 2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpSendFunction::~SocketsUdpSendFunction() {} 2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool SocketsUdpSendFunction::Prepare() { 2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params_ = sockets_udp::Send::Params::Create(*args_); 2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params_.get()); 2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) io_buffer_size_ = params_->data.size(); 2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) io_buffer_ = new net::WrappedIOBuffer(params_->data.data()); 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpSendFunction::AsyncWorkStart() { 2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket = GetUdpSocket(params_->socket_id); 2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!socket) { 2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kSocketNotFoundError; 2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AsyncWorkCompleted(); 2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SocketPermissionRequest param( 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SocketPermissionRequest::UDP_SEND_TO, params_->address, params_->port); 2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!SocketsManifestData::CheckRequest(extension(), param)) { 2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kPermissionError; 2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AsyncWorkCompleted(); 2393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 2403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) StartDnsLookup(params_->address); 2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpSendFunction::AfterDnsLookup(int lookup_result) { 2463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (lookup_result == net::OK) { 2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) StartSendTo(); 2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetSendResult(lookup_result, -1); 2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpSendFunction::StartSendTo() { 2543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket = GetUdpSocket(params_->socket_id); 2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!socket) { 2563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kSocketNotFoundError; 2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AsyncWorkCompleted(); 2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket->SendTo(io_buffer_, 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) io_buffer_size_, 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) resolved_address_, 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params_->port, 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&SocketsUdpSendFunction::OnCompleted, this)); 2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpSendFunction::OnCompleted(int net_result) { 2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (net_result >= net::OK) { 2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetSendResult(net::OK, net_result); 2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 2723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetSendResult(net_result, -1); 2733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SocketsUdpSendFunction::SetSendResult(int net_result, int bytes_sent) { 2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CHECK(net_result <= net::OK) << "Network status code must be < 0"; 2783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) sockets_udp::SendInfo send_info; 2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) send_info.result_code = net_result; 2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (net_result == net::OK) { 2821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) send_info.bytes_sent.reset(new int(bytes_sent)); 2833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (net_result != net::OK) 2863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = net::ErrorToString(net_result); 2873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results_ = sockets_udp::Send::Results::Create(send_info); 2883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AsyncWorkCompleted(); 2893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpCloseFunction::SocketsUdpCloseFunction() {} 2923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpCloseFunction::~SocketsUdpCloseFunction() {} 2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool SocketsUdpCloseFunction::Prepare() { 2963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params_ = sockets_udp::Close::Params::Create(*args_); 2973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params_.get()); 2983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 2993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpCloseFunction::Work() { 3023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket = GetUdpSocket(params_->socket_id); 3033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!socket) { 3043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kSocketNotFoundError; 3053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 3063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 3073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) socket->Disconnect(); 3093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) RemoveSocket(params_->socket_id); 3103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results_ = sockets_udp::Close::Results::Create(); 3113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpGetInfoFunction::SocketsUdpGetInfoFunction() {} 3143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpGetInfoFunction::~SocketsUdpGetInfoFunction() {} 3163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool SocketsUdpGetInfoFunction::Prepare() { 3183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params_ = sockets_udp::GetInfo::Params::Create(*args_); 3193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params_.get()); 3203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 3213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpGetInfoFunction::Work() { 3243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket = GetUdpSocket(params_->socket_id); 3253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!socket) { 3263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kSocketNotFoundError; 3273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 3283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 3293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) linked_ptr<sockets_udp::SocketInfo> socket_info = 3313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CreateSocketInfo(params_->socket_id, socket); 3323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results_ = sockets_udp::GetInfo::Results::Create(*socket_info); 3333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpGetSocketsFunction::SocketsUdpGetSocketsFunction() {} 3363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpGetSocketsFunction::~SocketsUdpGetSocketsFunction() {} 3383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool SocketsUdpGetSocketsFunction::Prepare() { return true; } 3403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpGetSocketsFunction::Work() { 3423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::vector<linked_ptr<sockets_udp::SocketInfo> > socket_infos; 3433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::hash_set<int>* resource_ids = GetSocketIds(); 3443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (resource_ids != NULL) { 3453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (base::hash_set<int>::iterator it = resource_ids->begin(); 346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) it != resource_ids->end(); 347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ++it) { 3483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int socket_id = *it; 3493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket = GetUdpSocket(socket_id); 3503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (socket) { 3513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) socket_infos.push_back(CreateSocketInfo(socket_id, socket)); 3523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 3533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 3543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 3553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results_ = sockets_udp::GetSockets::Results::Create(socket_infos); 3563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpJoinGroupFunction::SocketsUdpJoinGroupFunction() {} 3593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpJoinGroupFunction::~SocketsUdpJoinGroupFunction() {} 3613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool SocketsUdpJoinGroupFunction::Prepare() { 3633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params_ = sockets_udp::JoinGroup::Params::Create(*args_); 3643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params_.get()); 3653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 3663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpJoinGroupFunction::Work() { 3693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket = GetUdpSocket(params_->socket_id); 3703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!socket) { 3713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kSocketNotFoundError; 3723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 3733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 3743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 37568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SocketPermissionRequest param( 3763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP, 3773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) kWildcardAddress, 3783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) kWildcardPort); 3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!SocketsManifestData::CheckRequest(extension(), param)) { 3803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kPermissionError; 3813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 3823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 3833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int net_result = socket->JoinGroup(params_->address); 3853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (net_result != net::OK) 3863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = net::ErrorToString(net_result); 3873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results_ = sockets_udp::JoinGroup::Results::Create(net_result); 3883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpLeaveGroupFunction::SocketsUdpLeaveGroupFunction() {} 3913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpLeaveGroupFunction::~SocketsUdpLeaveGroupFunction() {} 3933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool SocketsUdpLeaveGroupFunction::Prepare() { 395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params_ = core_api::sockets_udp::LeaveGroup::Params::Create(*args_); 3963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params_.get()); 3973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 3983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 3993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpLeaveGroupFunction::Work() { 4013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket = GetUdpSocket(params_->socket_id); 4023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!socket) { 4033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kSocketNotFoundError; 4043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 4053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 4063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 40768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SocketPermissionRequest param( 4083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP, 4093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) kWildcardAddress, 4103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) kWildcardPort); 4115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!SocketsManifestData::CheckRequest(extension(), param)) { 4123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kPermissionError; 4133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 4143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 4153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int net_result = socket->LeaveGroup(params_->address); 4173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (net_result != net::OK) 4183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = net::ErrorToString(net_result); 4193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results_ = sockets_udp::LeaveGroup::Results::Create(net_result); 4203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpSetMulticastTimeToLiveFunction:: 4233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SocketsUdpSetMulticastTimeToLiveFunction() {} 4243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpSetMulticastTimeToLiveFunction:: 4263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ~SocketsUdpSetMulticastTimeToLiveFunction() {} 4273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool SocketsUdpSetMulticastTimeToLiveFunction::Prepare() { 429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params_ = 430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) core_api::sockets_udp::SetMulticastTimeToLive::Params::Create(*args_); 4313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params_.get()); 4323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 4333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpSetMulticastTimeToLiveFunction::Work() { 4363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket = GetUdpSocket(params_->socket_id); 4373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!socket) { 4383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kSocketNotFoundError; 4393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 4403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 4413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int net_result = socket->SetMulticastTimeToLive(params_->ttl); 4433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (net_result != net::OK) 4443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = net::ErrorToString(net_result); 4453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results_ = sockets_udp::SetMulticastTimeToLive::Results::Create(net_result); 4463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpSetMulticastLoopbackModeFunction:: 4493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SocketsUdpSetMulticastLoopbackModeFunction() {} 4503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpSetMulticastLoopbackModeFunction:: 452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~SocketsUdpSetMulticastLoopbackModeFunction() {} 4533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool SocketsUdpSetMulticastLoopbackModeFunction::Prepare() { 455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params_ = 456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) core_api::sockets_udp::SetMulticastLoopbackMode::Params::Create(*args_); 4573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params_.get()); 4583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 4593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpSetMulticastLoopbackModeFunction::Work() { 4623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket = GetUdpSocket(params_->socket_id); 4633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!socket) { 4643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kSocketNotFoundError; 4653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 4663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 4673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int net_result = socket->SetMulticastLoopbackMode(params_->enabled); 4693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (net_result != net::OK) 4703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = net::ErrorToString(net_result); 4713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results_ = sockets_udp::SetMulticastLoopbackMode::Results::Create(net_result); 4723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpGetJoinedGroupsFunction::SocketsUdpGetJoinedGroupsFunction() {} 4753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SocketsUdpGetJoinedGroupsFunction::~SocketsUdpGetJoinedGroupsFunction() {} 4773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool SocketsUdpGetJoinedGroupsFunction::Prepare() { 479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params_ = core_api::sockets_udp::GetJoinedGroups::Params::Create(*args_); 4803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params_.get()); 4813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 4823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void SocketsUdpGetJoinedGroupsFunction::Work() { 4853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResumableUDPSocket* socket = GetUdpSocket(params_->socket_id); 4863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!socket) { 4873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kSocketNotFoundError; 4883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 4893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 4903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 49168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SocketPermissionRequest param( 4923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP, 4933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) kWildcardAddress, 4943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) kWildcardPort); 4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!SocketsManifestData::CheckRequest(extension(), param)) { 4963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) error_ = kPermissionError; 4973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 4983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 4993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<std::string>& groups = socket->GetJoinedGroups(); 5013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) results_ = sockets_udp::GetJoinedGroups::Results::Create(groups); 5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 5033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace core_api 5053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace extensions 506