15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved. 25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be 35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file. 45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef EXTENSIONS_BROWSER_API_BLUETOOTH_SOCKET_BLUETOOTH_SOCKET_EVENT_DISPATCHER_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define EXTENSIONS_BROWSER_API_BLUETOOTH_SOCKET_BLUETOOTH_SOCKET_EVENT_DISPATCHER_H_ 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/browser/api/api_resource_manager.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/bluetooth_socket/bluetooth_api_socket.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/browser/browser_context_keyed_api_factory.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace content { 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass BrowserContext; 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace device { 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class BluetoothDevice; 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class BluetoothSocket; 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace extensions { 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustruct Event; 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass BluetoothApiSocket; 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace extensions { 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace core_api { 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Dispatch events related to "bluetooth" sockets from callback on native socket 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// instances. There is one instance per browser context. 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass BluetoothSocketEventDispatcher 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : public BrowserContextKeyedAPI, 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public base::SupportsWeakPtr<BluetoothSocketEventDispatcher> { 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu explicit BluetoothSocketEventDispatcher(content::BrowserContext* context); 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual ~BluetoothSocketEventDispatcher(); 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Socket is active, start receiving data from it. 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void OnSocketConnect(const std::string& extension_id, int socket_id); 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Socket is active again, start accepting connections from it. 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnSocketListen(const std::string& extension_id, int socket_id); 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Socket is active again, start receiving data from it. 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnSocketResume(const std::string& extension_id, int socket_id); 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // BrowserContextKeyedAPI implementation. 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static BrowserContextKeyedAPIFactory<BluetoothSocketEventDispatcher>* 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetFactoryInstance(); 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Convenience method to get the SocketEventDispatcher for a profile. 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static BluetoothSocketEventDispatcher* Get(content::BrowserContext* context); 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu typedef ApiResourceManager<BluetoothApiSocket>::ApiResourceData SocketData; 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu friend class BrowserContextKeyedAPIFactory<BluetoothSocketEventDispatcher>; 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // BrowserContextKeyedAPI implementation. 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static const char* service_name() { return "BluetoothSocketEventDispatcher"; } 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static const bool kServiceHasOwnInstanceInIncognito = true; 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static const bool kServiceIsNULLWhileTesting = true; 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // base::Bind supports methods with up to 6 parameters. SocketParams is used 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // as a workaround that limitation for invoking StartReceive() and 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // StartAccept(). 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) struct SocketParams { 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SocketParams(); 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ~SocketParams(); 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::BrowserThread::ID thread_id; 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void* browser_context_id; 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::string extension_id; 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_refptr<SocketData> sockets; 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int socket_id; 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu }; 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Start a receive and register a callback. 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void StartReceive(const SocketParams& params); 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Called when socket receive data. 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void ReceiveCallback(const SocketParams& params, 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int bytes_read, 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_refptr<net::IOBuffer> io_buffer); 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Called when socket receive data. 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void ReceiveErrorCallback(const SocketParams& params, 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu BluetoothApiSocket::ErrorReason error_reason, 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& error); 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Start an accept and register a callback. 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void StartAccept(const SocketParams& params); 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called when socket accepts a client connection. 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void AcceptCallback(const SocketParams& params, 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const device::BluetoothDevice* device, 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<device::BluetoothSocket> socket); 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called when socket encounters an error while accepting a client connection. 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void AcceptErrorCallback(const SocketParams& params, 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BluetoothApiSocket::ErrorReason error_reason, 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& error); 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Post an extension event from IO to UI thread 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void PostEvent(const SocketParams& params, scoped_ptr<Event> event); 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Dispatch an extension event on to EventRouter instance on UI thread. 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu static void DispatchEvent(void* browser_context_id, 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& extension_id, 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<Event> event); 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Usually FILE thread (except for unit testing). 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::BrowserThread::ID thread_id_; 1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::BrowserContext* const browser_context_; 1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_refptr<SocketData> sockets_; 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace core_api 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace extensions 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // EXTENSIONS_BROWSER_API_BLUETOOTH_SOCKET_BLUETOOTH_SOCKET_EVENT_DISPATCHER_H_ 120