You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.4 KiB
104 lines
3.4 KiB
//
|
|
// Copyright 2015 Google, Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at:
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
|
|
#pragma once
|
|
|
|
#include <memory>
|
|
|
|
#include <base/macros.h>
|
|
#include <base/memory/ref_counted.h>
|
|
|
|
namespace bluetooth {
|
|
class Adapter;
|
|
} // namespace bluetooth
|
|
|
|
namespace ipc {
|
|
|
|
class IPCHandler;
|
|
|
|
// IPCManager is a class for initializing and running supported IPC mechanisms.
|
|
// It manages the life-time of different IPC flavors that are available on the
|
|
// system. There are two flavors: a Linux sequential packet domain socket based
|
|
// system and one based on the Binder-based android.bluetooth framework.
|
|
class IPCManager {
|
|
public:
|
|
// Possible IPC types.
|
|
enum Type {
|
|
TYPE_LINUX, // IPC based on a Linux sequential packet domain socket
|
|
TYPE_BINDER, // IPC based on the Binder
|
|
TYPE_DBUS // IPC based on the DBus
|
|
};
|
|
|
|
// Interface for observing events from an IPC mechanism. These methods will be
|
|
// called on the thread that started the particular IPC type.
|
|
class Delegate {
|
|
public:
|
|
Delegate() = default;
|
|
virtual ~Delegate() = default;
|
|
|
|
// Called when an IPC mechanism has successfully started and is ready for
|
|
// client connections.
|
|
virtual void OnIPCHandlerStarted(Type type) = 0;
|
|
|
|
// Called when an IPC mechanism has stopped. This may happen due to an error
|
|
// in initialization or due to a regular shut down routine.
|
|
virtual void OnIPCHandlerStopped(Type type) = 0;
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(Delegate);
|
|
};
|
|
|
|
explicit IPCManager(bluetooth::Adapter* adapter);
|
|
~IPCManager();
|
|
|
|
// Initialize the underlying IPC handler based on |type|, if that type has not
|
|
// yet been initialized and returns true on success. Returns false if that
|
|
// type has already been initialized or an error occurs.
|
|
//
|
|
// If TYPE_LINUX is given, the file path to use for the domain socket will be
|
|
// obtained from the global Settings object. Hence, the Settings object must
|
|
// have been initialized before calling this method.
|
|
//
|
|
// |delegate| must out-live the IPCManager and the underlying handler. Users
|
|
// can guarantee proper clean up by deallocating |delegate| when or after
|
|
// Delegate::OnIPCHandlerStopped is called. It is safe to destroy |delegate|
|
|
// after destroying the IPCManager instance, as the destructor will join and
|
|
// clean up all underlying threads.
|
|
bool Start(Type type, Delegate* delegate);
|
|
|
|
// Returns true if an IPC type has been initialized.
|
|
bool BinderStarted() const;
|
|
bool LinuxStarted() const;
|
|
bool DBusStarted() const;
|
|
|
|
private:
|
|
IPCManager() = default;
|
|
|
|
// Pointers to the different IPC handler classes. These are initialized and
|
|
// owned by us.
|
|
scoped_refptr<IPCHandler> binder_handler_;
|
|
scoped_refptr<IPCHandler> linux_handler_;
|
|
scoped_refptr<IPCHandler> dbus_handler_;
|
|
|
|
// The Bluetooth adapter instance. This is owned by Daemon so we keep a raw
|
|
// pointer to it.
|
|
bluetooth::Adapter* adapter_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(IPCManager);
|
|
};
|
|
|
|
} // namespace ipc
|