• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
service_name()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