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