| // Copyright 2018 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef BLUETOOTH_DISPATCHER_SERVICE_WATCHER_H_ |
| #define BLUETOOTH_DISPATCHER_SERVICE_WATCHER_H_ |
| |
| #include <string> |
| |
| #include <base/memory/weak_ptr.h> |
| #include <dbus/object_proxy.h> |
| |
| namespace bluetooth { |
| |
| // This is a helper class to watch the availability of another D-Bus service. |
| class ServiceWatcher { |
| public: |
| using ServiceAvailabilityChangedCallback = |
| base::Callback<void(bool is_available)>; |
| |
| // |object_proxy| is the service and object to watch for. |
| explicit ServiceWatcher(dbus::ObjectProxy* object_proxy); |
| ~ServiceWatcher() = default; |
| |
| // Clients can register a watcher by calling ServiceWatcher::RegisterWatcher |
| // and availability events will be delivered without needing to care where |
| // those events come from. |
| void RegisterWatcher(ServiceAvailabilityChangedCallback callback); |
| |
| private: |
| // Called when ownership of the service's D-Bus service name changes. |
| // Invokes HandleServiceAvailableOrRestarted if the service is running. |
| void ServiceNameOwnerChangedReceived(const std::string& old_owner, |
| const std::string& new_owner); |
| |
| // Called when the service is initially available or restarted. |
| void HandleServiceAvailableOrRestarted(bool is_available); |
| |
| // The callback to be called when service availability changes. |
| ServiceAvailabilityChangedCallback service_availability_changed_callback_; |
| |
| // The ObjectProxy to watch for. |
| dbus::ObjectProxy* object_proxy_; |
| |
| // Keeps the availability state of the last change. Needed to filter out |
| // duplicate available events. |
| bool last_is_available_ = false; |
| |
| // Must come last so that weak pointers will be invalidated before other |
| // members are destroyed. |
| base::WeakPtrFactory<ServiceWatcher> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ServiceWatcher); |
| }; |
| |
| } // namespace bluetooth |
| |
| #endif // BLUETOOTH_DISPATCHER_SERVICE_WATCHER_H_ |