1fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// 2fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// Copyright (C) 2015 Google, Inc. 3fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// 4fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// Licensed under the Apache License, Version 2.0 (the "License"); 5fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// you may not use this file except in compliance with the License. 6fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// You may obtain a copy of the License at: 7fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// 8fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// http://www.apache.org/licenses/LICENSE-2.0 9fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// 10fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// Unless required by applicable law or agreed to in writing, software 11fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// distributed under the License is distributed on an "AS IS" BASIS, 12fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// See the License for the specific language governing permissions and 14fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// limitations under the License. 15fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// 16fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 17fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray#pragma once 18fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 19fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray#include <memory> 20fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 21fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray#include <base/macros.h> 22fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray#include <base/memory/ref_counted.h> 23fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 24fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguraynamespace bluetooth { 25d6a4b0c950f44d3eab34825880d26c19e362d22bArman Ugurayclass Adapter; 26fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray} // namespace bluetooth 27fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 28fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguraynamespace ipc { 29fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 30fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Ugurayclass IPCHandler; 31fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 32fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// IPCManager is a class for initializing and running supported IPC mechanisms. 33fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray// It manages the life-time of different IPC flavors that are available on the 34e415c050edbb2710e8807dd2602c851412953268Scott James Remnant// system. There are two flavors: a Linux sequential packet domain socket based 35e415c050edbb2710e8807dd2602c851412953268Scott James Remnant// system and one based on the Binder-based android.bluetooth framework. 36fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Ugurayclass IPCManager { 37fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray public: 38fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray // Possible IPC types. 39fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray enum Type { 4079c2ff968f1bdbd158c08943728c1a7316c21a80Jakub Pawlowski TYPE_LINUX, // IPC based on a Linux sequential packet domain socket 4179c2ff968f1bdbd158c08943728c1a7316c21a80Jakub Pawlowski TYPE_BINDER, // IPC based on the Binder 4279c2ff968f1bdbd158c08943728c1a7316c21a80Jakub Pawlowski TYPE_DBUS // IPC based on the DBus 43fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray }; 44fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 45e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray // Interface for observing events from an IPC mechanism. These methods will be 46e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray // called on the thread that started the particular IPC type. 47e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray class Delegate { 48e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray public: 49e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray Delegate() = default; 50e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray virtual ~Delegate() = default; 51e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray 52e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray // Called when an IPC mechanism has successfully started and is ready for 53e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray // client connections. 54e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray virtual void OnIPCHandlerStarted(Type type) = 0; 55e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray 56e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray // Called when an IPC mechanism has stopped. This may happen due to an error 57e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray // in initialization or due to a regular shut down routine. 58e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray virtual void OnIPCHandlerStopped(Type type) = 0; 59e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray 60e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray private: 61e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray DISALLOW_COPY_AND_ASSIGN(Delegate); 62e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray }; 63e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray 64d6a4b0c950f44d3eab34825880d26c19e362d22bArman Uguray explicit IPCManager(bluetooth::Adapter* adapter); 65fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray ~IPCManager(); 66fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 67fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray // Initialize the underlying IPC handler based on |type|, if that type has not 68fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray // yet been initialized and returns true on success. Returns false if that 69fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray // type has already been initialized or an error occurs. 70fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray // 71e415c050edbb2710e8807dd2602c851412953268Scott James Remnant // If TYPE_LINUX is given, the file path to use for the domain socket will be 72fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray // obtained from the global Settings object. Hence, the Settings object must 73fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray // have been initialized before calling this method. 74e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray // 75e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray // |delegate| must out-live the IPCManager and the underlying handler. Users 76e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray // can guarantee proper clean up by deallocating |delegate| when or after 77e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray // Delegate::OnIPCHandlerStopped is called. It is safe to destroy |delegate| 78e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray // after destroying the IPCManager instance, as the destructor will join and 79e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray // clean up all underlying threads. 80e0d08c9fecdf92c386b52375501a306c8f67d63eArman Uguray bool Start(Type type, Delegate* delegate); 81fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 82fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray // Returns true if an IPC type has been initialized. 83fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray bool BinderStarted() const; 84e415c050edbb2710e8807dd2602c851412953268Scott James Remnant bool LinuxStarted() const; 8579c2ff968f1bdbd158c08943728c1a7316c21a80Jakub Pawlowski bool DBusStarted() const; 86fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 87fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray private: 88fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray IPCManager() = default; 89fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 90fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray // Pointers to the different IPC handler classes. These are initialized and 91fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray // owned by us. 92fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray scoped_refptr<IPCHandler> binder_handler_; 93e415c050edbb2710e8807dd2602c851412953268Scott James Remnant scoped_refptr<IPCHandler> linux_handler_; 9479c2ff968f1bdbd158c08943728c1a7316c21a80Jakub Pawlowski scoped_refptr<IPCHandler> dbus_handler_; 95fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 96d6a4b0c950f44d3eab34825880d26c19e362d22bArman Uguray // The Bluetooth adapter instance. This is owned by Daemon so we keep a raw 97d6a4b0c950f44d3eab34825880d26c19e362d22bArman Uguray // pointer to it. 98d6a4b0c950f44d3eab34825880d26c19e362d22bArman Uguray bluetooth::Adapter* adapter_; 99fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 100fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray DISALLOW_COPY_AND_ASSIGN(IPCManager); 101fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray}; 102fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray 103fe65fb7978bc9257a36d1e5eae59c5f412dbdb49Arman Uguray} // namespace ipc 104