Home | History | Annotate | Download | only in socket
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_EXTENSIONS_API_SOCKET_SOCKET_API_H_
      6 #define CHROME_BROWSER_EXTENSIONS_API_SOCKET_SOCKET_API_H_
      7 
      8 #include "base/gtest_prod_util.h"
      9 #include "base/memory/ref_counted.h"
     10 #include "chrome/browser/extensions/api/api_function.h"
     11 #include "chrome/browser/extensions/api/api_resource_manager.h"
     12 #include "chrome/common/extensions/api/socket.h"
     13 #include "extensions/browser/extension_function.h"
     14 #include "net/base/address_list.h"
     15 #include "net/dns/host_resolver.h"
     16 #include "net/socket/tcp_client_socket.h"
     17 
     18 #include <string>
     19 
     20 class IOThread;
     21 
     22 namespace net {
     23 class IOBuffer;
     24 }
     25 
     26 namespace extensions {
     27 
     28 class Socket;
     29 
     30 // A simple interface to ApiResourceManager<Socket> or derived class. The goal
     31 // of this interface is to allow Socket API functions to use distinct instances
     32 // of ApiResourceManager<> depending on the type of socket (old version in
     33 // "socket" namespace vs new version in "socket.xxx" namespaces).
     34 class SocketResourceManagerInterface {
     35  public:
     36   virtual ~SocketResourceManagerInterface() {}
     37 
     38   virtual bool SetProfile(Profile* profile) = 0;
     39   virtual int Add(Socket *socket) = 0;
     40   virtual Socket* Get(const std::string& extension_id,
     41                       int api_resource_id) = 0;
     42   virtual void Remove(const std::string& extension_id,
     43                       int api_resource_id) = 0;
     44   virtual base::hash_set<int>* GetResourceIds(
     45       const std::string& extension_id) = 0;
     46 };
     47 
     48 // Implementation of SocketResourceManagerInterface using an
     49 // ApiResourceManager<T> instance (where T derives from Socket).
     50 template<typename T>
     51 class SocketResourceManager : public SocketResourceManagerInterface {
     52  public:
     53   SocketResourceManager()
     54       : manager_(NULL) {
     55   }
     56 
     57   virtual bool SetProfile(Profile* profile) OVERRIDE {
     58     manager_ = ApiResourceManager<T>::Get(profile);
     59     DCHECK(manager_) << "There is no socket manager. "
     60       "If this assertion is failing during a test, then it is likely that "
     61       "TestExtensionSystem is failing to provide an instance of "
     62       "ApiResourceManager<Socket>.";
     63     return manager_ != NULL;
     64   }
     65 
     66   virtual int Add(Socket *socket) OVERRIDE {
     67     // Note: Cast needed here, because "T" may be a subclass of "Socket".
     68     return manager_->Add(static_cast<T*>(socket));
     69   }
     70 
     71   virtual Socket* Get(const std::string& extension_id,
     72                       int api_resource_id) OVERRIDE {
     73     return manager_->Get(extension_id, api_resource_id);
     74   }
     75 
     76   virtual void Remove(const std::string& extension_id,
     77                       int api_resource_id) OVERRIDE {
     78     manager_->Remove(extension_id, api_resource_id);
     79   }
     80 
     81   virtual base::hash_set<int>* GetResourceIds(
     82       const std::string& extension_id) OVERRIDE {
     83     return manager_->GetResourceIds(extension_id);
     84   }
     85 
     86  private:
     87   ApiResourceManager<T>* manager_;
     88 };
     89 
     90 class SocketAsyncApiFunction : public AsyncApiFunction {
     91  public:
     92   SocketAsyncApiFunction();
     93 
     94  protected:
     95   virtual ~SocketAsyncApiFunction();
     96 
     97   // AsyncApiFunction:
     98   virtual bool PrePrepare() OVERRIDE;
     99   virtual bool Respond() OVERRIDE;
    100 
    101   virtual scoped_ptr<SocketResourceManagerInterface>
    102       CreateSocketResourceManager();
    103 
    104   int AddSocket(Socket* socket);
    105   Socket* GetSocket(int api_resource_id);
    106   void RemoveSocket(int api_resource_id);
    107   base::hash_set<int>* GetSocketIds();
    108 
    109  private:
    110   scoped_ptr<SocketResourceManagerInterface> manager_;
    111 };
    112 
    113 class SocketExtensionWithDnsLookupFunction : public SocketAsyncApiFunction {
    114  protected:
    115   SocketExtensionWithDnsLookupFunction();
    116   virtual ~SocketExtensionWithDnsLookupFunction();
    117 
    118   void StartDnsLookup(const std::string& hostname);
    119   virtual void AfterDnsLookup(int lookup_result) = 0;
    120 
    121   std::string resolved_address_;
    122 
    123  private:
    124   void OnDnsLookup(int resolve_result);
    125 
    126   // This instance is widely available through BrowserProcess, but we need to
    127   // acquire it on the UI thread and then use it on the IO thread, so we keep a
    128   // plain pointer to it here as we move from thread to thread.
    129   IOThread* io_thread_;
    130 
    131   scoped_ptr<net::HostResolver::RequestHandle> request_handle_;
    132   scoped_ptr<net::AddressList> addresses_;
    133 };
    134 
    135 class SocketCreateFunction : public SocketAsyncApiFunction {
    136  public:
    137   DECLARE_EXTENSION_FUNCTION("socket.create", SOCKET_CREATE)
    138 
    139   SocketCreateFunction();
    140 
    141  protected:
    142   virtual ~SocketCreateFunction();
    143 
    144   // AsyncApiFunction:
    145   virtual bool Prepare() OVERRIDE;
    146   virtual void Work() OVERRIDE;
    147 
    148  private:
    149   FRIEND_TEST_ALL_PREFIXES(SocketUnitTest, Create);
    150   enum SocketType {
    151     kSocketTypeInvalid = -1,
    152     kSocketTypeTCP,
    153     kSocketTypeUDP
    154   };
    155 
    156   scoped_ptr<api::socket::Create::Params> params_;
    157   SocketType socket_type_;
    158 };
    159 
    160 class SocketDestroyFunction : public SocketAsyncApiFunction {
    161  public:
    162   DECLARE_EXTENSION_FUNCTION("socket.destroy", SOCKET_DESTROY)
    163 
    164  protected:
    165   virtual ~SocketDestroyFunction() {}
    166 
    167   // AsyncApiFunction:
    168   virtual bool Prepare() OVERRIDE;
    169   virtual void Work() OVERRIDE;
    170 
    171  private:
    172   int socket_id_;
    173 };
    174 
    175 class SocketConnectFunction : public SocketExtensionWithDnsLookupFunction {
    176  public:
    177   DECLARE_EXTENSION_FUNCTION("socket.connect", SOCKET_CONNECT)
    178 
    179   SocketConnectFunction();
    180 
    181  protected:
    182   virtual ~SocketConnectFunction();
    183 
    184   // AsyncApiFunction:
    185   virtual bool Prepare() OVERRIDE;
    186   virtual void AsyncWorkStart() OVERRIDE;
    187 
    188   // SocketExtensionWithDnsLookupFunction:
    189   virtual void AfterDnsLookup(int lookup_result) OVERRIDE;
    190 
    191  private:
    192   void StartConnect();
    193   void OnConnect(int result);
    194 
    195   int socket_id_;
    196   std::string hostname_;
    197   int port_;
    198   Socket* socket_;
    199 };
    200 
    201 class SocketDisconnectFunction : public SocketAsyncApiFunction {
    202  public:
    203   DECLARE_EXTENSION_FUNCTION("socket.disconnect", SOCKET_DISCONNECT)
    204 
    205  protected:
    206   virtual ~SocketDisconnectFunction() {}
    207 
    208   // AsyncApiFunction:
    209   virtual bool Prepare() OVERRIDE;
    210   virtual void Work() OVERRIDE;
    211 
    212  private:
    213   int socket_id_;
    214 };
    215 
    216 class SocketBindFunction : public SocketAsyncApiFunction {
    217  public:
    218   DECLARE_EXTENSION_FUNCTION("socket.bind", SOCKET_BIND)
    219 
    220  protected:
    221   virtual ~SocketBindFunction() {}
    222 
    223   // AsyncApiFunction:
    224   virtual bool Prepare() OVERRIDE;
    225   virtual void Work() OVERRIDE;
    226 
    227  private:
    228   int socket_id_;
    229   std::string address_;
    230   int port_;
    231 };
    232 
    233 class SocketListenFunction : public SocketAsyncApiFunction {
    234  public:
    235   DECLARE_EXTENSION_FUNCTION("socket.listen", SOCKET_LISTEN)
    236 
    237   SocketListenFunction();
    238 
    239  protected:
    240   virtual ~SocketListenFunction();
    241 
    242   // AsyncApiFunction:
    243   virtual bool Prepare() OVERRIDE;
    244   virtual void Work() OVERRIDE;
    245 
    246  private:
    247   scoped_ptr<api::socket::Listen::Params> params_;
    248 };
    249 
    250 class SocketAcceptFunction : public SocketAsyncApiFunction {
    251  public:
    252   DECLARE_EXTENSION_FUNCTION("socket.accept", SOCKET_ACCEPT)
    253 
    254   SocketAcceptFunction();
    255 
    256  protected:
    257   virtual ~SocketAcceptFunction();
    258 
    259   // AsyncApiFunction:
    260   virtual bool Prepare() OVERRIDE;
    261   virtual void AsyncWorkStart() OVERRIDE;
    262 
    263  private:
    264   void OnAccept(int result_code, net::TCPClientSocket *socket);
    265   scoped_ptr<api::socket::Accept::Params> params_;
    266 };
    267 
    268 class SocketReadFunction : public SocketAsyncApiFunction {
    269  public:
    270   DECLARE_EXTENSION_FUNCTION("socket.read", SOCKET_READ)
    271 
    272   SocketReadFunction();
    273 
    274  protected:
    275   virtual ~SocketReadFunction();
    276 
    277   // AsyncApiFunction:
    278   virtual bool Prepare() OVERRIDE;
    279   virtual void AsyncWorkStart() OVERRIDE;
    280   void OnCompleted(int result, scoped_refptr<net::IOBuffer> io_buffer);
    281 
    282  private:
    283   scoped_ptr<api::socket::Read::Params> params_;
    284 };
    285 
    286 class SocketWriteFunction : public SocketAsyncApiFunction {
    287  public:
    288   DECLARE_EXTENSION_FUNCTION("socket.write", SOCKET_WRITE)
    289 
    290   SocketWriteFunction();
    291 
    292  protected:
    293   virtual ~SocketWriteFunction();
    294 
    295   // AsyncApiFunction:
    296   virtual bool Prepare() OVERRIDE;
    297   virtual void AsyncWorkStart() OVERRIDE;
    298   void OnCompleted(int result);
    299 
    300  private:
    301   int socket_id_;
    302   scoped_refptr<net::IOBuffer> io_buffer_;
    303   size_t io_buffer_size_;
    304 };
    305 
    306 class SocketRecvFromFunction : public SocketAsyncApiFunction {
    307  public:
    308   DECLARE_EXTENSION_FUNCTION("socket.recvFrom", SOCKET_RECVFROM)
    309 
    310   SocketRecvFromFunction();
    311 
    312  protected:
    313   virtual ~SocketRecvFromFunction();
    314 
    315   // AsyncApiFunction
    316   virtual bool Prepare() OVERRIDE;
    317   virtual void AsyncWorkStart() OVERRIDE;
    318   void OnCompleted(int result,
    319                    scoped_refptr<net::IOBuffer> io_buffer,
    320                    const std::string& address,
    321                    int port);
    322 
    323  private:
    324   scoped_ptr<api::socket::RecvFrom::Params> params_;
    325 };
    326 
    327 class SocketSendToFunction : public SocketExtensionWithDnsLookupFunction {
    328  public:
    329   DECLARE_EXTENSION_FUNCTION("socket.sendTo", SOCKET_SENDTO)
    330 
    331   SocketSendToFunction();
    332 
    333  protected:
    334   virtual ~SocketSendToFunction();
    335 
    336   // AsyncApiFunction:
    337   virtual bool Prepare() OVERRIDE;
    338   virtual void AsyncWorkStart() OVERRIDE;
    339   void OnCompleted(int result);
    340 
    341   // SocketExtensionWithDnsLookupFunction:
    342   virtual void AfterDnsLookup(int lookup_result) OVERRIDE;
    343 
    344  private:
    345   void StartSendTo();
    346 
    347   int socket_id_;
    348   scoped_refptr<net::IOBuffer> io_buffer_;
    349   size_t io_buffer_size_;
    350   std::string hostname_;
    351   int port_;
    352   Socket* socket_;
    353 };
    354 
    355 class SocketSetKeepAliveFunction : public SocketAsyncApiFunction {
    356  public:
    357   DECLARE_EXTENSION_FUNCTION("socket.setKeepAlive", SOCKET_SETKEEPALIVE)
    358 
    359   SocketSetKeepAliveFunction();
    360 
    361  protected:
    362   virtual ~SocketSetKeepAliveFunction();
    363 
    364   // AsyncApiFunction:
    365   virtual bool Prepare() OVERRIDE;
    366   virtual void Work() OVERRIDE;
    367 
    368  private:
    369   scoped_ptr<api::socket::SetKeepAlive::Params> params_;
    370 };
    371 
    372 class SocketSetNoDelayFunction : public SocketAsyncApiFunction {
    373  public:
    374   DECLARE_EXTENSION_FUNCTION("socket.setNoDelay", SOCKET_SETNODELAY)
    375 
    376   SocketSetNoDelayFunction();
    377 
    378  protected:
    379   virtual ~SocketSetNoDelayFunction();
    380 
    381   // AsyncApiFunction:
    382   virtual bool Prepare() OVERRIDE;
    383   virtual void Work() OVERRIDE;
    384 
    385  private:
    386   scoped_ptr<api::socket::SetNoDelay::Params> params_;
    387 };
    388 
    389 class SocketGetInfoFunction : public SocketAsyncApiFunction {
    390  public:
    391   DECLARE_EXTENSION_FUNCTION("socket.getInfo", SOCKET_GETINFO)
    392 
    393   SocketGetInfoFunction();
    394 
    395  protected:
    396   virtual ~SocketGetInfoFunction();
    397 
    398   // AsyncApiFunction:
    399   virtual bool Prepare() OVERRIDE;
    400   virtual void Work() OVERRIDE;
    401 
    402  private:
    403   scoped_ptr<api::socket::GetInfo::Params> params_;
    404 };
    405 
    406 class SocketGetNetworkListFunction : public AsyncExtensionFunction {
    407  public:
    408   DECLARE_EXTENSION_FUNCTION("socket.getNetworkList", SOCKET_GETNETWORKLIST)
    409 
    410  protected:
    411   virtual ~SocketGetNetworkListFunction() {}
    412   virtual bool RunImpl() OVERRIDE;
    413 
    414  private:
    415   void GetNetworkListOnFileThread();
    416   void HandleGetNetworkListError();
    417   void SendResponseOnUIThread(const net::NetworkInterfaceList& interface_list);
    418 };
    419 
    420 class SocketJoinGroupFunction : public SocketAsyncApiFunction {
    421  public:
    422   DECLARE_EXTENSION_FUNCTION("socket.joinGroup", SOCKET_MULTICAST_JOIN_GROUP)
    423 
    424   SocketJoinGroupFunction();
    425 
    426  protected:
    427   virtual ~SocketJoinGroupFunction();
    428 
    429   // AsyncApiFunction
    430   virtual bool Prepare() OVERRIDE;
    431   virtual void Work() OVERRIDE;
    432 
    433  private:
    434   scoped_ptr<api::socket::JoinGroup::Params> params_;
    435 };
    436 
    437 class SocketLeaveGroupFunction : public SocketAsyncApiFunction {
    438  public:
    439   DECLARE_EXTENSION_FUNCTION("socket.leaveGroup", SOCKET_MULTICAST_LEAVE_GROUP)
    440 
    441   SocketLeaveGroupFunction();
    442 
    443  protected:
    444   virtual ~SocketLeaveGroupFunction();
    445 
    446   // AsyncApiFunction
    447   virtual bool Prepare() OVERRIDE;
    448   virtual void Work() OVERRIDE;
    449 
    450  private:
    451   scoped_ptr<api::socket::LeaveGroup::Params> params_;
    452 };
    453 
    454 class SocketSetMulticastTimeToLiveFunction : public SocketAsyncApiFunction {
    455  public:
    456   DECLARE_EXTENSION_FUNCTION("socket.setMulticastTimeToLive",
    457                              SOCKET_MULTICAST_SET_TIME_TO_LIVE)
    458 
    459   SocketSetMulticastTimeToLiveFunction();
    460 
    461  protected:
    462   virtual ~SocketSetMulticastTimeToLiveFunction();
    463 
    464   // AsyncApiFunction
    465   virtual bool Prepare() OVERRIDE;
    466   virtual void Work() OVERRIDE;
    467 
    468  private:
    469   scoped_ptr<api::socket::SetMulticastTimeToLive::Params> params_;
    470 };
    471 
    472 class SocketSetMulticastLoopbackModeFunction : public SocketAsyncApiFunction {
    473  public:
    474   DECLARE_EXTENSION_FUNCTION("socket.setMulticastLoopbackMode",
    475                              SOCKET_MULTICAST_SET_LOOPBACK_MODE)
    476 
    477   SocketSetMulticastLoopbackModeFunction();
    478 
    479  protected:
    480   virtual ~SocketSetMulticastLoopbackModeFunction();
    481 
    482   // AsyncApiFunction
    483   virtual bool Prepare() OVERRIDE;
    484   virtual void Work() OVERRIDE;
    485 
    486  private:
    487   scoped_ptr<api::socket::SetMulticastLoopbackMode::Params> params_;
    488 };
    489 
    490 class SocketGetJoinedGroupsFunction : public SocketAsyncApiFunction {
    491  public:
    492   DECLARE_EXTENSION_FUNCTION("socket.getJoinedGroups",
    493                              SOCKET_MULTICAST_GET_JOINED_GROUPS)
    494 
    495   SocketGetJoinedGroupsFunction();
    496 
    497  protected:
    498   virtual ~SocketGetJoinedGroupsFunction();
    499 
    500   // AsyncApiFunction
    501   virtual bool Prepare() OVERRIDE;
    502   virtual void Work() OVERRIDE;
    503 
    504  private:
    505   scoped_ptr<api::socket::GetJoinedGroups::Params> params_;
    506 };
    507 }  // namespace extensions
    508 
    509 #endif  // CHROME_BROWSER_EXTENSIONS_API_SOCKET_SOCKET_API_H_
    510