/extensions/browser/api/sockets_tcp_server/tcp_server_socket_event_dispatcher.h

https://gitlab.com/jonnialva90/iridium-browser · C Header · 100 lines · 61 code · 21 blank · 18 comment · 0 complexity · 6cc99c074c84590ef5093e4c9566b278 MD5 · raw file

  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. #ifndef EXTENSIONS_BROWSER_API_SOCKETS_TCP_SERVER_TCP_SERVER_SOCKET_EVENT_DISPATCHER_H_
  5. #define EXTENSIONS_BROWSER_API_SOCKETS_TCP_SERVER_TCP_SERVER_SOCKET_EVENT_DISPATCHER_H_
  6. #include "extensions/browser/api/api_resource_manager.h"
  7. #include "extensions/browser/api/sockets_tcp/sockets_tcp_api.h"
  8. #include "extensions/browser/api/sockets_tcp_server/sockets_tcp_server_api.h"
  9. namespace content {
  10. class BrowserContext;
  11. }
  12. namespace extensions {
  13. struct Event;
  14. class ResumableTCPSocket;
  15. }
  16. namespace extensions {
  17. namespace api {
  18. // Dispatch events related to "sockets.tcp" sockets from callback on native
  19. // socket instances. There is one instance per profile.
  20. class TCPServerSocketEventDispatcher
  21. : public BrowserContextKeyedAPI,
  22. public base::SupportsWeakPtr<TCPServerSocketEventDispatcher> {
  23. public:
  24. explicit TCPServerSocketEventDispatcher(content::BrowserContext* context);
  25. ~TCPServerSocketEventDispatcher() override;
  26. // Server socket is active, start accepting connections from it.
  27. void OnServerSocketListen(const std::string& extension_id, int socket_id);
  28. // Server socket is active again, start accepting connections from it.
  29. void OnServerSocketResume(const std::string& extension_id, int socket_id);
  30. // BrowserContextKeyedAPI implementation.
  31. static BrowserContextKeyedAPIFactory<TCPServerSocketEventDispatcher>*
  32. GetFactoryInstance();
  33. // Convenience method to get the SocketEventDispatcher for a profile.
  34. static TCPServerSocketEventDispatcher* Get(content::BrowserContext* context);
  35. private:
  36. typedef ApiResourceManager<ResumableTCPServerSocket>::ApiResourceData
  37. ServerSocketData;
  38. typedef ApiResourceManager<ResumableTCPSocket>::ApiResourceData
  39. ClientSocketData;
  40. friend class BrowserContextKeyedAPIFactory<TCPServerSocketEventDispatcher>;
  41. // BrowserContextKeyedAPI implementation.
  42. static const char* service_name() { return "TCPServerSocketEventDispatcher"; }
  43. static const bool kServiceHasOwnInstanceInIncognito = true;
  44. static const bool kServiceIsNULLWhileTesting = true;
  45. // base::Bind supports methods with up to 6 parameters. AcceptParams is used
  46. // as a workaround that limitation for invoking StartAccept.
  47. struct AcceptParams {
  48. AcceptParams();
  49. ~AcceptParams();
  50. content::BrowserThread::ID thread_id;
  51. void* browser_context_id;
  52. std::string extension_id;
  53. scoped_refptr<ServerSocketData> server_sockets;
  54. scoped_refptr<ClientSocketData> client_sockets;
  55. int socket_id;
  56. };
  57. // Start an accept and register a callback.
  58. void StartSocketAccept(const std::string& extension_id, int socket_id);
  59. // Start an accept and register a callback.
  60. static void StartAccept(const AcceptParams& params);
  61. // Called when socket accepts a new connection.
  62. static void AcceptCallback(const AcceptParams& params,
  63. int result_code,
  64. net::TCPClientSocket* socket);
  65. // Post an extension event from |thread_id| to UI thread
  66. static void PostEvent(const AcceptParams& params, scoped_ptr<Event> event);
  67. // Dispatch an extension event on to EventRouter instance on UI thread.
  68. static void DispatchEvent(void* browser_context_id,
  69. const std::string& extension_id,
  70. scoped_ptr<Event> event);
  71. // Usually IO thread (except for unit testing).
  72. content::BrowserThread::ID thread_id_;
  73. content::BrowserContext* const browser_context_;
  74. scoped_refptr<ServerSocketData> server_sockets_;
  75. scoped_refptr<ClientSocketData> client_sockets_;
  76. };
  77. } // namespace api
  78. } // namespace extensions
  79. #endif // EXTENSIONS_BROWSER_API_SOCKETS_TCP_SERVER_TCP_SERVER_SOCKET_EVENT_DISPATCHER_H_