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, &params_.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