socket_api.h revision 010d83a9304c5a91596085d917d248abff47903a
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef EXTENSIONS_BROWSER_API_SOCKET_SOCKET_API_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define EXTENSIONS_BROWSER_API_SOCKET_SOCKET_API_H_
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/gtest_prod_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/api/api_resource_manager.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/api/async_api_function.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/extension_function.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/common/api/socket.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/address_list.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/host_resolver.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/tcp_client_socket.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content {
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BrowserContext;
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ResourceContext;
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IOBuffer;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Socket;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// A simple interface to ApiResourceManager<Socket> or derived class. The goal
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// of this interface is to allow Socket API functions to use distinct instances
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// of ApiResourceManager<> depending on the type of socket (old version in
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// "socket" namespace vs new version in "socket.xxx" namespaces).
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class SocketResourceManagerInterface {
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~SocketResourceManagerInterface() {}
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool SetBrowserContext(content::BrowserContext* context) = 0;
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual int Add(Socket* socket) = 0;
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual Socket* Get(const std::string& extension_id, int api_resource_id) = 0;
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void Remove(const std::string& extension_id, int api_resource_id) = 0;
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual base::hash_set<int>* GetResourceIds(
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const std::string& extension_id) = 0;
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Implementation of SocketResourceManagerInterface using an
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// ApiResourceManager<T> instance (where T derives from Socket).
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename T>
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class SocketResourceManager : public SocketResourceManagerInterface {
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SocketResourceManager() : manager_(NULL) {}
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool SetBrowserContext(content::BrowserContext* context) OVERRIDE {
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    manager_ = ApiResourceManager<T>::Get(context);
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(manager_)
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        << "There is no socket manager. "
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           "If this assertion is failing during a test, then it is likely that "
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           "TestExtensionSystem is failing to provide an instance of "
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           "ApiResourceManager<Socket>.";
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return manager_ != NULL;
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual int Add(Socket* socket) OVERRIDE {
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Note: Cast needed here, because "T" may be a subclass of "Socket".
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return manager_->Add(static_cast<T*>(socket));
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual Socket* Get(const std::string& extension_id,
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                      int api_resource_id) OVERRIDE {
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return manager_->Get(extension_id, api_resource_id);
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void Remove(const std::string& extension_id,
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                      int api_resource_id) OVERRIDE {
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    manager_->Remove(extension_id, api_resource_id);
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual base::hash_set<int>* GetResourceIds(const std::string& extension_id)
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      OVERRIDE {
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return manager_->GetResourceIds(extension_id);
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ApiResourceManager<T>* manager_;
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketAsyncApiFunction : public AsyncApiFunction {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketAsyncApiFunction();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketAsyncApiFunction();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool PrePrepare() OVERRIDE;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Respond() OVERRIDE;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual scoped_ptr<SocketResourceManagerInterface>
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      CreateSocketResourceManager();
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int AddSocket(Socket* socket);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Socket* GetSocket(int api_resource_id);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveSocket(int api_resource_id);
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::hash_set<int>* GetSocketIds();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<SocketResourceManagerInterface> manager_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketExtensionWithDnsLookupFunction : public SocketAsyncApiFunction {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketExtensionWithDnsLookupFunction();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketExtensionWithDnsLookupFunction();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // AsyncApiFunction:
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool PrePrepare() OVERRIDE;
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartDnsLookup(const std::string& hostname);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AfterDnsLookup(int lookup_result) = 0;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string resolved_address_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDnsLookup(int resolve_result);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Weak pointer to the resource context.
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  content::ResourceContext* resource_context_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::HostResolver::RequestHandle> request_handle_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::AddressList> addresses_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketCreateFunction : public SocketAsyncApiFunction {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.create", SOCKET_CREATE)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketCreateFunction();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketCreateFunction();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SocketUnitTest, Create);
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  enum SocketType { kSocketTypeInvalid = -1, kSocketTypeTCP, kSocketTypeUDP };
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::Create::Params> params_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketType socket_type_;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketDestroyFunction : public SocketAsyncApiFunction {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.destroy", SOCKET_DESTROY)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketDestroyFunction() {}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int socket_id_;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketConnectFunction : public SocketExtensionWithDnsLookupFunction {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.connect", SOCKET_CONNECT)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketConnectFunction();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketConnectFunction();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AsyncWorkStart() OVERRIDE;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SocketExtensionWithDnsLookupFunction:
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AfterDnsLookup(int lookup_result) OVERRIDE;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartConnect();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnConnect(int result);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int socket_id_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string hostname_;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int port_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Socket* socket_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketDisconnectFunction : public SocketAsyncApiFunction {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.disconnect", SOCKET_DISCONNECT)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketDisconnectFunction() {}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int socket_id_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketBindFunction : public SocketAsyncApiFunction {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.bind", SOCKET_BIND)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketBindFunction() {}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int socket_id_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string address_;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int port_;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketListenFunction : public SocketAsyncApiFunction {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.listen", SOCKET_LISTEN)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketListenFunction();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketListenFunction();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::Listen::Params> params_;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketAcceptFunction : public SocketAsyncApiFunction {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.accept", SOCKET_ACCEPT)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketAcceptFunction();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketAcceptFunction();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AsyncWorkStart() OVERRIDE;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnAccept(int result_code, net::TCPClientSocket* socket);
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::Accept::Params> params_;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketReadFunction : public SocketAsyncApiFunction {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.read", SOCKET_READ)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketReadFunction();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketReadFunction();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AsyncWorkStart() OVERRIDE;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCompleted(int result, scoped_refptr<net::IOBuffer> io_buffer);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::Read::Params> params_;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketWriteFunction : public SocketAsyncApiFunction {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.write", SOCKET_WRITE)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketWriteFunction();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketWriteFunction();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AsyncWorkStart() OVERRIDE;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCompleted(int result);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int socket_id_;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> io_buffer_;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t io_buffer_size_;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketRecvFromFunction : public SocketAsyncApiFunction {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.recvFrom", SOCKET_RECVFROM)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketRecvFromFunction();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketRecvFromFunction();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AsyncWorkStart() OVERRIDE;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCompleted(int result,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   scoped_refptr<net::IOBuffer> io_buffer,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& address,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int port);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::RecvFrom::Params> params_;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketSendToFunction : public SocketExtensionWithDnsLookupFunction {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.sendTo", SOCKET_SENDTO)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketSendToFunction();
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketSendToFunction();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AsyncWorkStart() OVERRIDE;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCompleted(int result);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SocketExtensionWithDnsLookupFunction:
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AfterDnsLookup(int lookup_result) OVERRIDE;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartSendTo();
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int socket_id_;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> io_buffer_;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t io_buffer_size_;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string hostname_;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int port_;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Socket* socket_;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketSetKeepAliveFunction : public SocketAsyncApiFunction {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.setKeepAlive", SOCKET_SETKEEPALIVE)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketSetKeepAliveFunction();
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketSetKeepAliveFunction();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::SetKeepAlive::Params> params_;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketSetNoDelayFunction : public SocketAsyncApiFunction {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.setNoDelay", SOCKET_SETNODELAY)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketSetNoDelayFunction();
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketSetNoDelayFunction();
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::SetNoDelay::Params> params_;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketGetInfoFunction : public SocketAsyncApiFunction {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.getInfo", SOCKET_GETINFO)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketGetInfoFunction();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketGetInfoFunction();
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::GetInfo::Params> params_;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketGetNetworkListFunction : public AsyncExtensionFunction {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.getNetworkList", SOCKET_GETNETWORKLIST)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketGetNetworkListFunction() {}
410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool RunAsync() OVERRIDE;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetNetworkListOnFileThread();
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleGetNetworkListError();
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendResponseOnUIThread(const net::NetworkInterfaceList& interface_list);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SocketJoinGroupFunction : public SocketAsyncApiFunction {
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.joinGroup", SOCKET_MULTICAST_JOIN_GROUP)
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SocketJoinGroupFunction();
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~SocketJoinGroupFunction();
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // AsyncApiFunction
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Prepare() OVERRIDE;
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Work() OVERRIDE;
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::JoinGroup::Params> params_;
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SocketLeaveGroupFunction : public SocketAsyncApiFunction {
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.leaveGroup", SOCKET_MULTICAST_LEAVE_GROUP)
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SocketLeaveGroupFunction();
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~SocketLeaveGroupFunction();
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // AsyncApiFunction
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Prepare() OVERRIDE;
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Work() OVERRIDE;
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::LeaveGroup::Params> params_;
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SocketSetMulticastTimeToLiveFunction : public SocketAsyncApiFunction {
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.setMulticastTimeToLive",
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             SOCKET_MULTICAST_SET_TIME_TO_LIVE)
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SocketSetMulticastTimeToLiveFunction();
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~SocketSetMulticastTimeToLiveFunction();
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // AsyncApiFunction
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Prepare() OVERRIDE;
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Work() OVERRIDE;
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::SetMulticastTimeToLive::Params> params_;
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SocketSetMulticastLoopbackModeFunction : public SocketAsyncApiFunction {
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.setMulticastLoopbackMode",
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             SOCKET_MULTICAST_SET_LOOPBACK_MODE)
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SocketSetMulticastLoopbackModeFunction();
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~SocketSetMulticastLoopbackModeFunction();
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // AsyncApiFunction
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Prepare() OVERRIDE;
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Work() OVERRIDE;
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::SetMulticastLoopbackMode::Params> params_;
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SocketGetJoinedGroupsFunction : public SocketAsyncApiFunction {
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.getJoinedGroups",
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             SOCKET_MULTICAST_GET_JOINED_GROUPS)
492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SocketGetJoinedGroupsFunction();
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~SocketGetJoinedGroupsFunction();
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // AsyncApiFunction
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Prepare() OVERRIDE;
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Work() OVERRIDE;
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::GetJoinedGroups::Params> params_;
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // EXTENSIONS_BROWSER_API_SOCKET_SOCKET_API_H_
508