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;
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class URLRequestContextGetter;
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class SSLClientSocket;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TLSSocket;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Socket;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// A simple interface to ApiResourceManager<Socket> or derived class. The goal
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// of this interface is to allow Socket API functions to use distinct instances
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// of ApiResourceManager<> depending on the type of socket (old version in
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// "socket" namespace vs new version in "socket.xxx" namespaces).
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class SocketResourceManagerInterface {
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~SocketResourceManagerInterface() {}
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool SetBrowserContext(content::BrowserContext* context) = 0;
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual int Add(Socket* socket) = 0;
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual Socket* Get(const std::string& extension_id, int api_resource_id) = 0;
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void Remove(const std::string& extension_id, int api_resource_id) = 0;
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void Replace(const std::string& extension_id,
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       int api_resource_id,
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       Socket* socket) = 0;
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual base::hash_set<int>* GetResourceIds(
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const std::string& extension_id) = 0;
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Implementation of SocketResourceManagerInterface using an
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// ApiResourceManager<T> instance (where T derives from Socket).
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename T>
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class SocketResourceManager : public SocketResourceManagerInterface {
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SocketResourceManager() : manager_(NULL) {}
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool SetBrowserContext(content::BrowserContext* context) OVERRIDE {
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    manager_ = ApiResourceManager<T>::Get(context);
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(manager_)
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        << "There is no socket manager. "
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           "If this assertion is failing during a test, then it is likely that "
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           "TestExtensionSystem is failing to provide an instance of "
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)           "ApiResourceManager<Socket>.";
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return manager_ != NULL;
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual int Add(Socket* socket) OVERRIDE {
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Note: Cast needed here, because "T" may be a subclass of "Socket".
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return manager_->Add(static_cast<T*>(socket));
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual Socket* Get(const std::string& extension_id,
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                      int api_resource_id) OVERRIDE {
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return manager_->Get(extension_id, api_resource_id);
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void Replace(const std::string& extension_id,
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       int api_resource_id,
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       Socket* socket) OVERRIDE {
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    manager_->Replace(extension_id, api_resource_id, static_cast<T*>(socket));
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void Remove(const std::string& extension_id,
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                      int api_resource_id) OVERRIDE {
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    manager_->Remove(extension_id, api_resource_id);
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual base::hash_set<int>* GetResourceIds(const std::string& extension_id)
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      OVERRIDE {
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return manager_->GetResourceIds(extension_id);
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ApiResourceManager<T>* manager_;
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketAsyncApiFunction : public AsyncApiFunction {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketAsyncApiFunction();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketAsyncApiFunction();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool PrePrepare() OVERRIDE;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Respond() OVERRIDE;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual scoped_ptr<SocketResourceManagerInterface>
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      CreateSocketResourceManager();
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int AddSocket(Socket* socket);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Socket* GetSocket(int api_resource_id);
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void ReplaceSocket(int api_resource_id, Socket* socket);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveSocket(int api_resource_id);
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::hash_set<int>* GetSocketIds();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<SocketResourceManagerInterface> manager_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketExtensionWithDnsLookupFunction : public SocketAsyncApiFunction {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketExtensionWithDnsLookupFunction();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketExtensionWithDnsLookupFunction();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // AsyncApiFunction:
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool PrePrepare() OVERRIDE;
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartDnsLookup(const std::string& hostname);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AfterDnsLookup(int lookup_result) = 0;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string resolved_address_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDnsLookup(int resolve_result);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Weak pointer to the resource context.
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  content::ResourceContext* resource_context_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::HostResolver::RequestHandle> request_handle_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::AddressList> addresses_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketCreateFunction : public SocketAsyncApiFunction {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.create", SOCKET_CREATE)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketCreateFunction();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketCreateFunction();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SocketUnitTest, Create);
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  enum SocketType { kSocketTypeInvalid = -1, kSocketTypeTCP, kSocketTypeUDP };
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::Create::Params> params_;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketType socket_type_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketDestroyFunction : public SocketAsyncApiFunction {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.destroy", SOCKET_DESTROY)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketDestroyFunction() {}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int socket_id_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketConnectFunction : public SocketExtensionWithDnsLookupFunction {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.connect", SOCKET_CONNECT)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketConnectFunction();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketConnectFunction();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AsyncWorkStart() OVERRIDE;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SocketExtensionWithDnsLookupFunction:
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AfterDnsLookup(int lookup_result) OVERRIDE;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartConnect();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnConnect(int result);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int socket_id_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string hostname_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int port_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Socket* socket_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketDisconnectFunction : public SocketAsyncApiFunction {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.disconnect", SOCKET_DISCONNECT)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketDisconnectFunction() {}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int socket_id_;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketBindFunction : public SocketAsyncApiFunction {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.bind", SOCKET_BIND)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketBindFunction() {}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int socket_id_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string address_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int port_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketListenFunction : public SocketAsyncApiFunction {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.listen", SOCKET_LISTEN)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketListenFunction();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketListenFunction();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::Listen::Params> params_;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketAcceptFunction : public SocketAsyncApiFunction {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.accept", SOCKET_ACCEPT)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketAcceptFunction();
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketAcceptFunction();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AsyncWorkStart() OVERRIDE;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnAccept(int result_code, net::TCPClientSocket* socket);
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::Accept::Params> params_;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketReadFunction : public SocketAsyncApiFunction {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.read", SOCKET_READ)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketReadFunction();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketReadFunction();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AsyncWorkStart() OVERRIDE;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCompleted(int result, scoped_refptr<net::IOBuffer> io_buffer);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::Read::Params> params_;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketWriteFunction : public SocketAsyncApiFunction {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.write", SOCKET_WRITE)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketWriteFunction();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketWriteFunction();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AsyncWorkStart() OVERRIDE;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCompleted(int result);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int socket_id_;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> io_buffer_;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t io_buffer_size_;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketRecvFromFunction : public SocketAsyncApiFunction {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.recvFrom", SOCKET_RECVFROM)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketRecvFromFunction();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketRecvFromFunction();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AsyncWorkStart() OVERRIDE;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCompleted(int result,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   scoped_refptr<net::IOBuffer> io_buffer,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& address,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int port);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::RecvFrom::Params> params_;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketSendToFunction : public SocketExtensionWithDnsLookupFunction {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.sendTo", SOCKET_SENDTO)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketSendToFunction();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketSendToFunction();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AsyncWorkStart() OVERRIDE;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCompleted(int result);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SocketExtensionWithDnsLookupFunction:
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AfterDnsLookup(int lookup_result) OVERRIDE;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartSendTo();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int socket_id_;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> io_buffer_;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t io_buffer_size_;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string hostname_;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int port_;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Socket* socket_;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketSetKeepAliveFunction : public SocketAsyncApiFunction {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.setKeepAlive", SOCKET_SETKEEPALIVE)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketSetKeepAliveFunction();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketSetKeepAliveFunction();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::SetKeepAlive::Params> params_;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketSetNoDelayFunction : public SocketAsyncApiFunction {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.setNoDelay", SOCKET_SETNODELAY)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketSetNoDelayFunction();
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketSetNoDelayFunction();
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::SetNoDelay::Params> params_;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketGetInfoFunction : public SocketAsyncApiFunction {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.getInfo", SOCKET_GETINFO)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketGetInfoFunction();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketGetInfoFunction();
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AsyncApiFunction:
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() OVERRIDE;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work() OVERRIDE;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::GetInfo::Params> params_;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SocketGetNetworkListFunction : public AsyncExtensionFunction {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.getNetworkList", SOCKET_GETNETWORKLIST)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SocketGetNetworkListFunction() {}
422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool RunAsync() OVERRIDE;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetNetworkListOnFileThread();
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleGetNetworkListError();
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendResponseOnUIThread(const net::NetworkInterfaceList& interface_list);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SocketJoinGroupFunction : public SocketAsyncApiFunction {
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.joinGroup", SOCKET_MULTICAST_JOIN_GROUP)
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SocketJoinGroupFunction();
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~SocketJoinGroupFunction();
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // AsyncApiFunction
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Prepare() OVERRIDE;
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Work() OVERRIDE;
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::JoinGroup::Params> params_;
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SocketLeaveGroupFunction : public SocketAsyncApiFunction {
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.leaveGroup", SOCKET_MULTICAST_LEAVE_GROUP)
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SocketLeaveGroupFunction();
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~SocketLeaveGroupFunction();
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // AsyncApiFunction
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Prepare() OVERRIDE;
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Work() OVERRIDE;
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::LeaveGroup::Params> params_;
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SocketSetMulticastTimeToLiveFunction : public SocketAsyncApiFunction {
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.setMulticastTimeToLive",
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             SOCKET_MULTICAST_SET_TIME_TO_LIVE)
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SocketSetMulticastTimeToLiveFunction();
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~SocketSetMulticastTimeToLiveFunction();
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // AsyncApiFunction
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Prepare() OVERRIDE;
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Work() OVERRIDE;
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::SetMulticastTimeToLive::Params> params_;
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SocketSetMulticastLoopbackModeFunction : public SocketAsyncApiFunction {
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.setMulticastLoopbackMode",
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             SOCKET_MULTICAST_SET_LOOPBACK_MODE)
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SocketSetMulticastLoopbackModeFunction();
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~SocketSetMulticastLoopbackModeFunction();
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // AsyncApiFunction
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Prepare() OVERRIDE;
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Work() OVERRIDE;
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::SetMulticastLoopbackMode::Params> params_;
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SocketGetJoinedGroupsFunction : public SocketAsyncApiFunction {
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.getJoinedGroups",
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             SOCKET_MULTICAST_GET_JOINED_GROUPS)
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SocketGetJoinedGroupsFunction();
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~SocketGetJoinedGroupsFunction();
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // AsyncApiFunction
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Prepare() OVERRIDE;
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Work() OVERRIDE;
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<core_api::socket::GetJoinedGroups::Params> params_;
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class SocketSecureFunction : public SocketAsyncApiFunction {
5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
5205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("socket.secure", SOCKET_SECURE);
5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  SocketSecureFunction();
5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected:
5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~SocketSecureFunction();
5255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // AsyncApiFunction
5275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual bool Prepare() OVERRIDE;
5285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void AsyncWorkStart() OVERRIDE;
5295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
5315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Callback from TLSSocket::UpgradeSocketToTLS().
5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void TlsConnectDone(scoped_ptr<TLSSocket> socket, int result);
5335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<core_api::socket::Secure::Params> params_;
5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter> url_request_getter_;
5365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SocketSecureFunction);
5385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
5395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // EXTENSIONS_BROWSER_API_SOCKET_SOCKET_API_H_
543