Roll src/third_party/WebKit a3b4a2e:7441784 (svn 202551:202552)
[chromium-blink-merge.git] / extensions / browser / api / bluetooth_socket / bluetooth_socket_event_dispatcher.h
blobe64336b3b5820fd40ca353996a298389befab9d1
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.
5 #ifndef EXTENSIONS_BROWSER_API_BLUETOOTH_SOCKET_BLUETOOTH_SOCKET_EVENT_DISPATCHER_H_
6 #define EXTENSIONS_BROWSER_API_BLUETOOTH_SOCKET_BLUETOOTH_SOCKET_EVENT_DISPATCHER_H_
8 #include "extensions/browser/api/api_resource_manager.h"
9 #include "extensions/browser/api/bluetooth_socket/bluetooth_api_socket.h"
10 #include "extensions/browser/browser_context_keyed_api_factory.h"
12 namespace content {
13 class BrowserContext;
16 namespace device {
17 class BluetoothDevice;
18 class BluetoothSocket;
21 namespace extensions {
22 struct Event;
23 class BluetoothApiSocket;
26 namespace extensions {
27 namespace api {
29 // Dispatch events related to "bluetooth" sockets from callback on native socket
30 // instances. There is one instance per browser context.
31 class BluetoothSocketEventDispatcher
32 : public BrowserContextKeyedAPI,
33 public base::SupportsWeakPtr<BluetoothSocketEventDispatcher> {
34 public:
35 explicit BluetoothSocketEventDispatcher(content::BrowserContext* context);
36 ~BluetoothSocketEventDispatcher() override;
38 // Socket is active, start receiving data from it.
39 void OnSocketConnect(const std::string& extension_id, int socket_id);
41 // Socket is active again, start accepting connections from it.
42 void OnSocketListen(const std::string& extension_id, int socket_id);
44 // Socket is active again, start receiving data from it.
45 void OnSocketResume(const std::string& extension_id, int socket_id);
47 // BrowserContextKeyedAPI implementation.
48 static BrowserContextKeyedAPIFactory<BluetoothSocketEventDispatcher>*
49 GetFactoryInstance();
51 // Convenience method to get the SocketEventDispatcher for a profile.
52 static BluetoothSocketEventDispatcher* Get(content::BrowserContext* context);
54 private:
55 typedef ApiResourceManager<BluetoothApiSocket>::ApiResourceData SocketData;
56 friend class BrowserContextKeyedAPIFactory<BluetoothSocketEventDispatcher>;
57 // BrowserContextKeyedAPI implementation.
58 static const char* service_name() { return "BluetoothSocketEventDispatcher"; }
59 static const bool kServiceHasOwnInstanceInIncognito = true;
60 static const bool kServiceIsNULLWhileTesting = true;
62 // base::Bind supports methods with up to 6 parameters. SocketParams is used
63 // as a workaround that limitation for invoking StartReceive() and
64 // StartAccept().
65 struct SocketParams {
66 SocketParams();
67 ~SocketParams();
69 content::BrowserThread::ID thread_id;
70 void* browser_context_id;
71 std::string extension_id;
72 scoped_refptr<SocketData> sockets;
73 int socket_id;
76 // Start a receive and register a callback.
77 static void StartReceive(const SocketParams& params);
79 // Called when socket receive data.
80 static void ReceiveCallback(const SocketParams& params,
81 int bytes_read,
82 scoped_refptr<net::IOBuffer> io_buffer);
84 // Called when socket receive data.
85 static void ReceiveErrorCallback(const SocketParams& params,
86 BluetoothApiSocket::ErrorReason error_reason,
87 const std::string& error);
89 // Start an accept and register a callback.
90 static void StartAccept(const SocketParams& params);
92 // Called when socket accepts a client connection.
93 static void AcceptCallback(const SocketParams& params,
94 const device::BluetoothDevice* device,
95 scoped_refptr<device::BluetoothSocket> socket);
97 // Called when socket encounters an error while accepting a client connection.
98 static void AcceptErrorCallback(const SocketParams& params,
99 BluetoothApiSocket::ErrorReason error_reason,
100 const std::string& error);
102 // Post an extension event from IO to UI thread
103 static void PostEvent(const SocketParams& params, scoped_ptr<Event> event);
105 // Dispatch an extension event on to EventRouter instance on UI thread.
106 static void DispatchEvent(void* browser_context_id,
107 const std::string& extension_id,
108 scoped_ptr<Event> event);
110 // Usually FILE thread (except for unit testing).
111 content::BrowserThread::ID thread_id_;
112 content::BrowserContext* const browser_context_;
113 scoped_refptr<SocketData> sockets_;
116 } // namespace api
117 } // namespace extensions
119 #endif // EXTENSIONS_BROWSER_API_BLUETOOTH_SOCKET_BLUETOOTH_SOCKET_EVENT_DISPATCHER_H_