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
22namespace ipc {
23class IPCManager;
24}  // namespace ipc
25
26namespace bluetooth {
27
28class CoreStack;
29class 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.
34class 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