summaryrefslogtreecommitdiffstats
path: root/extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.h
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.h')
-rw-r--r--extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.h93
1 files changed, 93 insertions, 0 deletions
diff --git a/extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.h b/extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.h
new file mode 100644
index 0000000..e42ecb4
--- /dev/null
+++ b/extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.h
@@ -0,0 +1,93 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef EXTENSIONS_BROWSER_API_SOCKETS_UDP_UDP_SOCKET_EVENT_DISPATCHER_H_
+#define EXTENSIONS_BROWSER_API_SOCKETS_UDP_UDP_SOCKET_EVENT_DISPATCHER_H_
+
+#include "extensions/browser/api/api_resource_manager.h"
+#include "extensions/browser/api/sockets_udp/sockets_udp_api.h"
+
+namespace content {
+class BrowserContext;
+}
+
+namespace extensions {
+struct Event;
+class ResumableUDPSocket;
+}
+
+namespace extensions {
+namespace core_api {
+
+// Dispatch events related to "sockets.udp" sockets from callback on native
+// socket instances. There is one instance per profile.
+class UDPSocketEventDispatcher
+ : public BrowserContextKeyedAPI,
+ public base::SupportsWeakPtr<UDPSocketEventDispatcher> {
+ public:
+ explicit UDPSocketEventDispatcher(content::BrowserContext* context);
+ virtual ~UDPSocketEventDispatcher();
+
+ // Socket is active, start receving from it.
+ void OnSocketBind(const std::string& extension_id, int socket_id);
+
+ // Socket is active again, start receiving data from it.
+ void OnSocketResume(const std::string& extension_id, int socket_id);
+
+ // BrowserContextKeyedAPI implementation.
+ static BrowserContextKeyedAPIFactory<UDPSocketEventDispatcher>*
+ GetFactoryInstance();
+
+ // Convenience method to get the SocketEventDispatcher for a profile.
+ static UDPSocketEventDispatcher* Get(content::BrowserContext* context);
+
+ private:
+ typedef ApiResourceManager<ResumableUDPSocket>::ApiResourceData SocketData;
+ friend class BrowserContextKeyedAPIFactory<UDPSocketEventDispatcher>;
+ // BrowserContextKeyedAPI implementation.
+ static const char* service_name() { return "UDPSocketEventDispatcher"; }
+ static const bool kServiceHasOwnInstanceInIncognito = true;
+ static const bool kServiceIsNULLWhileTesting = true;
+
+ // base::Bind supports methods with up to 6 parameters. ReceiveParams is used
+ // as a workaround that limitation for invoking StartReceive.
+ struct ReceiveParams {
+ ReceiveParams();
+ ~ReceiveParams();
+
+ content::BrowserThread::ID thread_id;
+ void* browser_context_id;
+ std::string extension_id;
+ scoped_refptr<SocketData> sockets;
+ int socket_id;
+ };
+
+ // Start a receive and register a callback.
+ static void StartReceive(const ReceiveParams& params);
+
+ // Called when socket receive data.
+ static void ReceiveCallback(const ReceiveParams& params,
+ int bytes_read,
+ scoped_refptr<net::IOBuffer> io_buffer,
+ const std::string& address,
+ int port);
+
+ // Post an extension event from IO to UI thread
+ static void PostEvent(const ReceiveParams& params, scoped_ptr<Event> event);
+
+ // Dispatch an extension event on to EventRouter instance on UI thread.
+ static void DispatchEvent(void* browser_context_id,
+ const std::string& extension_id,
+ scoped_ptr<Event> event);
+
+ // Usually IO thread (except for unit testing).
+ content::BrowserThread::ID thread_id_;
+ content::BrowserContext* const browser_context_;
+ scoped_refptr<SocketData> sockets_;
+};
+
+} // namespace core_api
+} // namespace extensions
+
+#endif // EXTENSIONS_BROWSER_API_SOCKETS_UDP_UDP_SOCKET_EVENT_DISPATCHER_H_