Home | History | Annotate | Download | only in sockets_tcp
      1 // Copyright 2014 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 EXTENSIONS_BROWSER_API_SOCKETS_TCP_TCP_SOCKET_EVENT_DISPATCHER_H_
      6 #define EXTENSIONS_BROWSER_API_SOCKETS_TCP_TCP_SOCKET_EVENT_DISPATCHER_H_
      7 
      8 #include "extensions/browser/api/api_resource_manager.h"
      9 #include "extensions/browser/api/sockets_tcp/sockets_tcp_api.h"
     10 
     11 namespace content {
     12 class BrowserContext;
     13 }
     14 
     15 namespace extensions {
     16 struct Event;
     17 class ResumableTCPSocket;
     18 }
     19 
     20 namespace extensions {
     21 namespace core_api {
     22 
     23 // Dispatch events related to "sockets.tcp" sockets from callback on native
     24 // socket instances. There is one instance per profile.
     25 class TCPSocketEventDispatcher
     26     : public BrowserContextKeyedAPI,
     27       public base::SupportsWeakPtr<TCPSocketEventDispatcher> {
     28  public:
     29   explicit TCPSocketEventDispatcher(content::BrowserContext* context);
     30   virtual ~TCPSocketEventDispatcher();
     31 
     32   // Socket is active, start receving from it.
     33   void OnSocketConnect(const std::string& extension_id, int socket_id);
     34 
     35   // Socket is active again, start receiving data from it.
     36   void OnSocketResume(const std::string& extension_id, int socket_id);
     37 
     38   // BrowserContextKeyedAPI implementation.
     39   static BrowserContextKeyedAPIFactory<TCPSocketEventDispatcher>*
     40       GetFactoryInstance();
     41 
     42   // Convenience method to get the SocketEventDispatcher for a profile.
     43   static TCPSocketEventDispatcher* Get(content::BrowserContext* context);
     44 
     45  private:
     46   typedef ApiResourceManager<ResumableTCPSocket>::ApiResourceData SocketData;
     47   friend class BrowserContextKeyedAPIFactory<TCPSocketEventDispatcher>;
     48   // BrowserContextKeyedAPI implementation.
     49   static const char* service_name() { return "TCPSocketEventDispatcher"; }
     50   static const bool kServiceHasOwnInstanceInIncognito = true;
     51   static const bool kServiceIsNULLWhileTesting = true;
     52 
     53   // base::Bind supports methods with up to 6 parameters. ReadParams is used
     54   // as a workaround that limitation for invoking StartReceive.
     55   struct ReadParams {
     56     ReadParams();
     57     ~ReadParams();
     58 
     59     content::BrowserThread::ID thread_id;
     60     void* browser_context_id;
     61     std::string extension_id;
     62     scoped_refptr<SocketData> sockets;
     63     int socket_id;
     64   };
     65 
     66   // Start a receive and register a callback.
     67   void StartSocketRead(const std::string& extension_id, int socket_id);
     68 
     69   // Start a receive and register a callback.
     70   static void StartRead(const ReadParams& params);
     71 
     72   // Called when socket receive data.
     73   static void ReadCallback(const ReadParams& params,
     74                            int bytes_read,
     75                            scoped_refptr<net::IOBuffer> io_buffer);
     76 
     77   // Post an extension event from IO to UI thread
     78   static void PostEvent(const ReadParams& params, scoped_ptr<Event> event);
     79 
     80   // Dispatch an extension event on to EventRouter instance on UI thread.
     81   static void DispatchEvent(void* browser_context_id,
     82                             const std::string& extension_id,
     83                             scoped_ptr<Event> event);
     84 
     85   // Usually IO thread (except for unit testing).
     86   content::BrowserThread::ID thread_id_;
     87   content::BrowserContext* const browser_context_;
     88   scoped_refptr<SocketData> sockets_;
     89 };
     90 
     91 }  // namespace core_api
     92 }  // namespace extensions
     93 
     94 #endif  // EXTENSIONS_BROWSER_API_SOCKETS_TCP_TCP_SOCKET_EVENT_DISPATCHER_H_
     95