| Index: chromeos/dbus/peer_daemon_manager_client.cc
|
| diff --git a/chromeos/dbus/peer_daemon_manager_client.cc b/chromeos/dbus/peer_daemon_manager_client.cc
|
| index b2ba214a23630632f274b48bac508c7769677022..9fdea05a794545bb47fd4b8e32b0173eacf3cda8 100644
|
| --- a/chromeos/dbus/peer_daemon_manager_client.cc
|
| +++ b/chromeos/dbus/peer_daemon_manager_client.cc
|
| @@ -8,8 +8,11 @@
|
| #include "base/callback.h"
|
| #include "base/logging.h"
|
| #include "base/memory/weak_ptr.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/observer_list.h"
|
| #include "dbus/bus.h"
|
| #include "dbus/message.h"
|
| +#include "dbus/object_manager.h"
|
| #include "dbus/object_proxy.h"
|
| #include "dbus/values_util.h"
|
|
|
| @@ -19,8 +22,11 @@ namespace {
|
| // TODO(benchan): Move these constants to system_api.
|
| namespace peerd {
|
| const char kPeerdServiceName[] = "org.chromium.peerd";
|
| +const char kPeerdObjectManagerServicePath[] = "/org/chromium/peerd";
|
| const char kPeerdManagerPath[] = "/org/chromium/peerd/Manager";
|
| const char kManagerInterface[] = "org.chromium.peerd.Manager";
|
| +const char kServiceInterface[] = "org.chromium.peerd.Service";
|
| +const char kPeerInterface[] = "org.chromium.peerd.Peer";
|
| const char kStartMonitoringMethod[] = "StartMonitoring";
|
| const char kStopMonitoringMethod[] = "StopMonitoring";
|
| const char kExposeServiceMethod[] = "ExposeService";
|
| @@ -29,15 +35,24 @@ const char kPingMethod[] = "Ping";
|
| } // namespace peerd
|
|
|
| // The PeerDaemonManagerClient implementation used in production.
|
| -class PeerDaemonManagerClientImpl : public PeerDaemonManagerClient {
|
| +class PeerDaemonManagerClientImpl : public PeerDaemonManagerClient,
|
| + public dbus::ObjectManager::Interface {
|
| public:
|
| PeerDaemonManagerClientImpl();
|
| ~PeerDaemonManagerClientImpl() override;
|
|
|
| - // DBusClient overrides:
|
| + // DBusClient overrides.
|
| void Init(dbus::Bus* bus) override;
|
|
|
| - // PeerDaemonManagerClient overrides:
|
| + // PeerDaemonManagerClient overrides.
|
| + void AddObserver(Observer* observer) override;
|
| + void RemoveObserver(Observer* observer) override;
|
| + std::vector<dbus::ObjectPath> GetServices() override;
|
| + std::vector<dbus::ObjectPath> GetPeers() override;
|
| + ServiceProperties* GetServiceProperties(
|
| + const dbus::ObjectPath& object_path) override;
|
| + PeerProperties* GetPeerProperties(
|
| + const dbus::ObjectPath& object_path) override;
|
| void StartMonitoring(
|
| const std::vector<std::string>& requested_technologies,
|
| const base::DictionaryValue& options,
|
| @@ -53,55 +68,126 @@ class PeerDaemonManagerClientImpl : public PeerDaemonManagerClient {
|
| const VoidDBusMethodCallback& callback) override;
|
| void Ping(const StringDBusMethodCallback& callback) override;
|
|
|
| + // dbus::ObjectManager::Interface overrides.
|
| + dbus::PropertySet* CreateProperties(
|
| + dbus::ObjectProxy* object_proxy,
|
| + const dbus::ObjectPath& object_path,
|
| + const std::string& interface_name) override;
|
| + void ObjectAdded(const dbus::ObjectPath& object_path,
|
| + const std::string& interface_name) override;
|
| + void ObjectRemoved(const dbus::ObjectPath& object_path,
|
| + const std::string& interface_name) override;
|
| +
|
| private:
|
| void OnStringDBusMethod(const StringDBusMethodCallback& callback,
|
| dbus::Response* response);
|
| void OnVoidDBusMethod(const VoidDBusMethodCallback& callback,
|
| dbus::Response* response);
|
| + void OnManagerPropertyChanged(const std::string& property_name);
|
| + void OnServicePropertyChanged(const dbus::ObjectPath& object_path,
|
| + const std::string& property_name);
|
| + void OnPeerPropertyChanged(const dbus::ObjectPath& object_path,
|
| + const std::string& property_name);
|
| +
|
| + // List of observers interested in event notifications from us.
|
| + ObserverList<Observer> observers_;
|
| + dbus::ObjectManager* object_manager_;
|
|
|
| - dbus::ObjectProxy* peer_daemon_proxy_;
|
| base::WeakPtrFactory<PeerDaemonManagerClientImpl> weak_ptr_factory_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(PeerDaemonManagerClientImpl);
|
| };
|
|
|
| PeerDaemonManagerClientImpl::PeerDaemonManagerClientImpl()
|
| - : peer_daemon_proxy_(nullptr), weak_ptr_factory_(this) {
|
| + : object_manager_(nullptr), weak_ptr_factory_(this) {
|
| }
|
|
|
| PeerDaemonManagerClientImpl::~PeerDaemonManagerClientImpl() {
|
| + if (object_manager_) {
|
| + object_manager_->UnregisterInterface(peerd::kManagerInterface);
|
| + object_manager_->UnregisterInterface(peerd::kServiceInterface);
|
| + object_manager_->UnregisterInterface(peerd::kPeerInterface);
|
| + }
|
| +}
|
| +
|
| +void PeerDaemonManagerClientImpl::AddObserver(Observer* observer) {
|
| + DCHECK(observer);
|
| + observers_.AddObserver(observer);
|
| +}
|
| +
|
| +void PeerDaemonManagerClientImpl::RemoveObserver(Observer* observer) {
|
| + DCHECK(observer);
|
| + observers_.RemoveObserver(observer);
|
| +}
|
| +
|
| +std::vector<dbus::ObjectPath> PeerDaemonManagerClientImpl::GetServices() {
|
| + return object_manager_->GetObjectsWithInterface(peerd::kServiceInterface);
|
| +}
|
| +
|
| +std::vector<dbus::ObjectPath> PeerDaemonManagerClientImpl::GetPeers() {
|
| + return object_manager_->GetObjectsWithInterface(peerd::kPeerInterface);
|
| +}
|
| +
|
| +PeerDaemonManagerClient::ServiceProperties*
|
| +PeerDaemonManagerClientImpl::GetServiceProperties(
|
| + const dbus::ObjectPath& object_path) {
|
| + return static_cast<ServiceProperties*>(
|
| + object_manager_->GetProperties(object_path, peerd::kServiceInterface));
|
| +}
|
| +
|
| +PeerDaemonManagerClient::PeerProperties*
|
| +PeerDaemonManagerClientImpl::GetPeerProperties(
|
| + const dbus::ObjectPath& object_path) {
|
| + return static_cast<PeerProperties*>(
|
| + object_manager_->GetProperties(object_path, peerd::kPeerInterface));
|
| }
|
|
|
| void PeerDaemonManagerClientImpl::StartMonitoring(
|
| const std::vector<std::string>& requested_technologies,
|
| const base::DictionaryValue& options,
|
| const StringDBusMethodCallback& callback) {
|
| + dbus::ObjectProxy* object_proxy = object_manager_->GetObjectProxy(
|
| + dbus::ObjectPath(peerd::kPeerdManagerPath));
|
| + if (!object_proxy) {
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&PeerDaemonManagerClientImpl::OnStringDBusMethod,
|
| + weak_ptr_factory_.GetWeakPtr(), callback, nullptr));
|
| + return;
|
| + }
|
| +
|
| dbus::MethodCall method_call(peerd::kManagerInterface,
|
| peerd::kStartMonitoringMethod);
|
| dbus::MessageWriter writer(&method_call);
|
| writer.AppendArrayOfStrings(requested_technologies);
|
| dbus::AppendValueData(&writer, options);
|
| - peer_daemon_proxy_->CallMethod(
|
| - &method_call,
|
| - dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| + object_proxy->CallMethod(
|
| + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| base::Bind(&PeerDaemonManagerClientImpl::OnStringDBusMethod,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - callback));
|
| + weak_ptr_factory_.GetWeakPtr(), callback));
|
| }
|
|
|
| void PeerDaemonManagerClientImpl::StopMonitoring(
|
| const std::string& monitoring_token,
|
| const VoidDBusMethodCallback& callback) {
|
| + dbus::ObjectProxy* object_proxy = object_manager_->GetObjectProxy(
|
| + dbus::ObjectPath(peerd::kPeerdManagerPath));
|
| + if (!object_proxy) {
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&PeerDaemonManagerClientImpl::OnVoidDBusMethod,
|
| + weak_ptr_factory_.GetWeakPtr(), callback, nullptr));
|
| + return;
|
| + }
|
| +
|
| dbus::MethodCall method_call(peerd::kManagerInterface,
|
| peerd::kStopMonitoringMethod);
|
| dbus::MessageWriter writer(&method_call);
|
| writer.AppendString(monitoring_token);
|
| - peer_daemon_proxy_->CallMethod(
|
| - &method_call,
|
| - dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| + object_proxy->CallMethod(
|
| + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| base::Bind(&PeerDaemonManagerClientImpl::OnVoidDBusMethod,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - callback));
|
| + weak_ptr_factory_.GetWeakPtr(), callback));
|
| }
|
|
|
| void PeerDaemonManagerClientImpl::ExposeService(
|
| @@ -109,6 +195,16 @@ void PeerDaemonManagerClientImpl::ExposeService(
|
| const std::map<std::string, std::string>& service_info,
|
| const base::DictionaryValue& options,
|
| const StringDBusMethodCallback& callback) {
|
| + dbus::ObjectProxy* object_proxy = object_manager_->GetObjectProxy(
|
| + dbus::ObjectPath(peerd::kPeerdManagerPath));
|
| + if (!object_proxy) {
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&PeerDaemonManagerClientImpl::OnStringDBusMethod,
|
| + weak_ptr_factory_.GetWeakPtr(), callback, nullptr));
|
| + return;
|
| + }
|
| +
|
| dbus::MethodCall method_call(peerd::kManagerInterface,
|
| peerd::kExposeServiceMethod);
|
| dbus::MessageWriter writer(&method_call);
|
| @@ -126,12 +222,10 @@ void PeerDaemonManagerClientImpl::ExposeService(
|
| writer.CloseContainer(&array_writer);
|
|
|
| dbus::AppendValueData(&writer, options);
|
| - peer_daemon_proxy_->CallMethod(
|
| - &method_call,
|
| - dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| + object_proxy->CallMethod(
|
| + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| base::Bind(&PeerDaemonManagerClientImpl::OnStringDBusMethod,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - callback));
|
| + weak_ptr_factory_.GetWeakPtr(), callback));
|
| }
|
|
|
| void PeerDaemonManagerClientImpl::RemoveExposedService(
|
| @@ -139,27 +233,95 @@ void PeerDaemonManagerClientImpl::RemoveExposedService(
|
| const VoidDBusMethodCallback& callback) {
|
| dbus::MethodCall method_call(peerd::kManagerInterface,
|
| peerd::kRemoveExposedServiceMethod);
|
| + dbus::ObjectProxy* object_proxy = object_manager_->GetObjectProxy(
|
| + dbus::ObjectPath(peerd::kPeerdManagerPath));
|
| + if (!object_proxy) {
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&PeerDaemonManagerClientImpl::OnVoidDBusMethod,
|
| + weak_ptr_factory_.GetWeakPtr(), callback, nullptr));
|
| + return;
|
| + }
|
| dbus::MessageWriter writer(&method_call);
|
| writer.AppendString(service_token);
|
| - peer_daemon_proxy_->CallMethod(
|
| - &method_call,
|
| - dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| + object_proxy->CallMethod(
|
| + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| base::Bind(&PeerDaemonManagerClientImpl::OnVoidDBusMethod,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - callback));
|
| + weak_ptr_factory_.GetWeakPtr(), callback));
|
| }
|
|
|
| void PeerDaemonManagerClientImpl::Ping(
|
| const StringDBusMethodCallback& callback) {
|
| dbus::MethodCall method_call(peerd::kManagerInterface,
|
| peerd::kPingMethod);
|
| + dbus::ObjectProxy* object_proxy = object_manager_->GetObjectProxy(
|
| + dbus::ObjectPath(peerd::kPeerdManagerPath));
|
| + if (!object_proxy) {
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&PeerDaemonManagerClientImpl::OnStringDBusMethod,
|
| + weak_ptr_factory_.GetWeakPtr(), callback, nullptr));
|
| + return;
|
| + }
|
| dbus::MessageWriter writer(&method_call);
|
| - peer_daemon_proxy_->CallMethod(
|
| - &method_call,
|
| - dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| + object_proxy->CallMethod(
|
| + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| base::Bind(&PeerDaemonManagerClientImpl::OnStringDBusMethod,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - callback));
|
| + weak_ptr_factory_.GetWeakPtr(), callback));
|
| +}
|
| +
|
| +dbus::PropertySet* PeerDaemonManagerClientImpl::CreateProperties(
|
| + dbus::ObjectProxy* object_proxy,
|
| + const dbus::ObjectPath& object_path,
|
| + const std::string& interface_name) {
|
| + dbus::PropertySet* properties = nullptr;
|
| + if (interface_name == peerd::kManagerInterface) {
|
| + properties = new ManagerProperties(
|
| + object_proxy,
|
| + base::Bind(&PeerDaemonManagerClientImpl::OnManagerPropertyChanged,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| + } else if (interface_name == peerd::kServiceInterface) {
|
| + properties = new ServiceProperties(
|
| + object_proxy,
|
| + base::Bind(&PeerDaemonManagerClientImpl::OnServicePropertyChanged,
|
| + weak_ptr_factory_.GetWeakPtr(), object_path));
|
| + } else if (interface_name == peerd::kPeerInterface) {
|
| + properties = new PeerProperties(
|
| + object_proxy,
|
| + base::Bind(&PeerDaemonManagerClientImpl::OnPeerPropertyChanged,
|
| + weak_ptr_factory_.GetWeakPtr(), object_path));
|
| + } else {
|
| + NOTREACHED() << "Unhandled interface name " << interface_name;
|
| + }
|
| + return properties;
|
| +}
|
| +
|
| +void PeerDaemonManagerClientImpl::ObjectAdded(
|
| + const dbus::ObjectPath& object_path,
|
| + const std::string& interface_name) {
|
| + if (interface_name == peerd::kManagerInterface) {
|
| + FOR_EACH_OBSERVER(Observer, observers_, ManagerAdded());
|
| + } else if (interface_name == peerd::kServiceInterface) {
|
| + FOR_EACH_OBSERVER(Observer, observers_, ServiceAdded(object_path));
|
| + } else if (interface_name == peerd::kPeerInterface) {
|
| + FOR_EACH_OBSERVER(Observer, observers_, PeerAdded(object_path));
|
| + } else {
|
| + NOTREACHED() << "Unhandled interface name " << interface_name;
|
| + }
|
| +}
|
| +
|
| +void PeerDaemonManagerClientImpl::ObjectRemoved(
|
| + const dbus::ObjectPath& object_path,
|
| + const std::string& interface_name) {
|
| + if (interface_name == peerd::kManagerInterface) {
|
| + FOR_EACH_OBSERVER(Observer, observers_, ManagerRemoved());
|
| + } else if (interface_name == peerd::kServiceInterface) {
|
| + FOR_EACH_OBSERVER(Observer, observers_, ServiceRemoved(object_path));
|
| + } else if (interface_name == peerd::kPeerInterface) {
|
| + FOR_EACH_OBSERVER(Observer, observers_, PeerRemoved(object_path));
|
| + } else {
|
| + NOTREACHED() << "Unhandled interface name " << interface_name;
|
| + }
|
| }
|
|
|
| void PeerDaemonManagerClientImpl::OnStringDBusMethod(
|
| @@ -187,13 +349,68 @@ void PeerDaemonManagerClientImpl::OnVoidDBusMethod(
|
| }
|
|
|
| void PeerDaemonManagerClientImpl::Init(dbus::Bus* bus) {
|
| - peer_daemon_proxy_ =
|
| - bus->GetObjectProxy(peerd::kPeerdServiceName,
|
| - dbus::ObjectPath(peerd::kPeerdManagerPath));
|
| + object_manager_ = bus->GetObjectManager(
|
| + peerd::kPeerdServiceName,
|
| + dbus::ObjectPath(peerd::kPeerdObjectManagerServicePath));
|
| + object_manager_->RegisterInterface(peerd::kManagerInterface, this);
|
| + object_manager_->RegisterInterface(peerd::kServiceInterface, this);
|
| + object_manager_->RegisterInterface(peerd::kPeerInterface, this);
|
| +}
|
| +
|
| +void PeerDaemonManagerClientImpl::OnManagerPropertyChanged(
|
| + const std::string& property_name) {
|
| + FOR_EACH_OBSERVER(Observer, observers_,
|
| + ManagerPropertyChanged(property_name));
|
| +}
|
| +
|
| +void PeerDaemonManagerClientImpl::OnServicePropertyChanged(
|
| + const dbus::ObjectPath& object_path,
|
| + const std::string& property_name) {
|
| + FOR_EACH_OBSERVER(Observer, observers_,
|
| + ServicePropertyChanged(object_path, property_name));
|
| +}
|
| +
|
| +void PeerDaemonManagerClientImpl::OnPeerPropertyChanged(
|
| + const dbus::ObjectPath& object_path,
|
| + const std::string& property_name) {
|
| + FOR_EACH_OBSERVER(Observer, observers_,
|
| + PeerPropertyChanged(object_path, property_name));
|
| }
|
|
|
| } // namespace
|
|
|
| +PeerDaemonManagerClient::ManagerProperties::ManagerProperties(
|
| + dbus::ObjectProxy* object_proxy,
|
| + const PropertyChangedCallback& callback)
|
| + : dbus::PropertySet{object_proxy, peerd::kManagerInterface, callback} {
|
| + RegisterProperty("MonitoredTechnologies", &monitored_technologies_);
|
| +}
|
| +
|
| +PeerDaemonManagerClient::ManagerProperties::~ManagerProperties() {
|
| +}
|
| +
|
| +PeerDaemonManagerClient::ServiceProperties::ServiceProperties(
|
| + dbus::ObjectProxy* object_proxy,
|
| + const PropertyChangedCallback& callback)
|
| + : dbus::PropertySet{object_proxy, peerd::kServiceInterface, callback} {
|
| + RegisterProperty("ServiceId", &service_id_);
|
| + RegisterProperty("ServiceInfo", &service_info_);
|
| + RegisterProperty("IpInfos", &ip_infos_);
|
| +}
|
| +
|
| +PeerDaemonManagerClient::ServiceProperties::~ServiceProperties() {
|
| +}
|
| +
|
| +PeerDaemonManagerClient::PeerProperties::PeerProperties(
|
| + dbus::ObjectProxy* object_proxy,
|
| + const PropertyChangedCallback& callback)
|
| + : dbus::PropertySet{object_proxy, peerd::kPeerInterface, callback} {
|
| + RegisterProperty("UUID", &uuid_);
|
| + RegisterProperty("LastSeen", &last_seen_);
|
| +}
|
| +
|
| +PeerDaemonManagerClient::PeerProperties::~PeerProperties() {
|
| +}
|
|
|
| PeerDaemonManagerClient::PeerDaemonManagerClient() {
|
| }
|
|
|