1 //
2 //  Copyright (C) 2015 Google, Inc.
3 //
4 //  Licensed under the Apache License, Version 2.0 (the "License");
5 //  you may not use this file except in compliance with the License.
6 //  You may obtain a copy of the License at:
7 //
8 //  http://www.apache.org/licenses/LICENSE-2.0
9 //
10 //  Unless required by applicable law or agreed to in writing, software
11 //  distributed under the License is distributed on an "AS IS" BASIS,
12 //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 //  See the License for the specific language governing permissions and
14 //  limitations under the License.
15 //
16 
17 #pragma once
18 
19 #include <base/macros.h>
20 #include <base/message_loop/message_loop.h>
21 
22 namespace ipc {
23 class IPCManager;
24 }  // namespace ipc
25 
26 namespace bluetooth {
27 
28 class CoreStack;
29 class Settings;
30 
31 // The Daemon class is a singleton that represents the root of the ownership
32 // hierarchy. The single instance sets up and owns the main event loop, the IPC
33 // handlers, global Settings, and the core Bluetooth stack.
34 class Daemon {
35  public:
36   // Initializes the daemon. This must be called to at the start of the
37   // application to set up the global daemon instance and everything it manages.
38   // Returns false in case of a failure.
39   static bool Initialize();
40 
41   // Cleans up all the resources associated with the global Daemon object.
42   static void ShutDown();
43 
44   // Assigns the global Daemon instance for testing. Should only be called from
45   // test code.
46   static void InitializeForTesting(Daemon* test_daemon);
47 
48   // Returns the singleton Daemon instance. All classes can interact with the
49   // Daemon, obtain its resources etc using this getter.
50   static Daemon* Get();
51 
52   // The global Settings object. All classes have direct access to this through
53   // the Daemon object.
54   virtual Settings* GetSettings() const = 0;
55 
56   // The main event loop. This should be used for any events and delayed tasks
57   // that should be executed on the daemon's main thread.
58   virtual base::MessageLoop* GetMessageLoop() const = 0;
59 
60   // Starts the daemon's main loop.
61   virtual void StartMainLoop() = 0;
62 
63  protected:
64   Daemon() = default;
65   virtual ~Daemon() = default;
66 
67  private:
68   // Internal instance helper called by Initialize().
69   virtual bool Init() = 0;
70 
71   DISALLOW_COPY_AND_ASSIGN(Daemon);
72 };
73 
74 }  // namespace bluetooth
75