nfc_manager_client.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chromeos/dbus/nfc_manager_client.h"
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/memory/weak_ptr.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/observer_list.h"
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chromeos/dbus/fake_nfc_manager_client.h"
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "dbus/bus.h"
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace chromeos {
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)NfcManagerClient::Properties::Properties(
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    dbus::ObjectProxy* object_proxy,
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const PropertyChangedCallback& callback)
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : NfcPropertySet(object_proxy,
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                     nfc_manager::kNfcManagerInterface,
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                     callback) {
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RegisterProperty(nfc_manager::kAdaptersProperty, &adapters);
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)NfcManagerClient::Properties::~Properties() {
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// The NfcManagerClient implementation used in production.
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class NfcManagerClientImpl : public NfcManagerClient {
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  NfcManagerClientImpl()
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : object_proxy_(NULL),
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        weak_ptr_factory_(this) {
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~NfcManagerClientImpl() {
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // NfcManagerClient override.
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void AddObserver(Observer* observer) OVERRIDE {
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(observer);
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    observers_.AddObserver(observer);
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // NfcManagerClient override.
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void RemoveObserver(Observer* observer) OVERRIDE {
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(observer);
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    observers_.RemoveObserver(observer);
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // NfcManagerClient override.
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual Properties* GetProperties() OVERRIDE {
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return properties_.get();
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) protected:
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // DBusClient override.
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void Init(dbus::Bus* bus) OVERRIDE {
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    VLOG(1) << "Creating NfcManagerClientImpl";
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Create the object proxy.
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    object_proxy_ = bus->GetObjectProxy(
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        nfc_manager::kNfcManagerServiceName,
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        dbus::ObjectPath(nfc_manager::kNfcManagerServicePath));
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Set up the signal handlers.
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    object_proxy_->ConnectToSignal(
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        nfc_manager::kNfcManagerInterface,
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        nfc_manager::kAdapterAddedSignal,
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        base::Bind(&NfcManagerClientImpl::AdapterAddedReceived,
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr()),
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        base::Bind(&NfcManagerClientImpl::AdapterAddedConnected,
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr()));
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    object_proxy_->ConnectToSignal(
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        nfc_manager::kNfcManagerInterface,
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        nfc_manager::kAdapterRemovedSignal,
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        base::Bind(&NfcManagerClientImpl::AdapterRemovedReceived,
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr()),
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        base::Bind(&NfcManagerClientImpl::AdapterRemovedConnected,
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr()));
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Create the properties structure.
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    properties_.reset(new Properties(
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        object_proxy_,
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        base::Bind(&NfcManagerClientImpl::OnPropertyChanged,
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr())));
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    properties_->ConnectSignals();
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    properties_->GetAll();
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // NFC manager signal handlers.
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void OnPropertyChanged(const std::string& property_name) {
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    VLOG(1) << "NFC Manager property changed: " << property_name;
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    FOR_EACH_OBSERVER(Observer, observers_,
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                      ManagerPropertyChanged(property_name));
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Called by dbus:: when an "AdapterAdded" signal is received..
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void AdapterAddedReceived(dbus::Signal* signal) {
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(signal);
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    dbus::MessageReader reader(signal);
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    dbus::ObjectPath object_path;
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!reader.PopObjectPath(&object_path)) {
1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      LOG(WARNING) << "AdapterAdded signal has incorrect parameters: "
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   << signal->ToString();
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return;
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    VLOG(1) << "Adapter added: " << object_path.value();
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    FOR_EACH_OBSERVER(Observer, observers_, AdapterAdded(object_path));
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Called by dbus:: when the "AdapterAdded" signal is initially connected.
1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void AdapterAddedConnected(const std::string& interface_name,
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                             const std::string& signal_name,
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                             bool success) {
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    LOG_IF(WARNING, !success) << "Failed to connect to AdapterAdded signal.";
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Called by dbus:: when an "AdapterRemoved" signal is received..
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void AdapterRemovedReceived(dbus::Signal* signal) {
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DCHECK(signal);
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    dbus::MessageReader reader(signal);
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    dbus::ObjectPath object_path;
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!reader.PopObjectPath(&object_path)) {
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      LOG(WARNING) << "AdapterRemoved signal has incorrect parameters: "
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   << signal->ToString();
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return;
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    VLOG(1) << "Adapter removed: " << object_path.value();
1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    FOR_EACH_OBSERVER(Observer, observers_, AdapterRemoved(object_path));
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Called by dbus:: when the "AdapterAdded" signal is initially connected.
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void AdapterRemovedConnected(const std::string& interface_name,
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               const std::string& signal_name,
1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               bool success) {
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    LOG_IF(WARNING, !success) << "Failed to connect to AdapterRemoved signal.";
1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // D-Bus proxy for neard Manager interface.
1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  dbus::ObjectProxy* object_proxy_;
1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Properties for neard Manager interface.
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<Properties> properties_;
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // List of observers interested in event notifications.
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ObserverList<NfcManagerClient::Observer> observers_;
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Weak pointer factory for generating 'this' pointers that might live longer
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // than we do.
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Note: This should remain the last member so it'll be destroyed and
1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // invalidate its weak pointers before any other members are destroyed.
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::WeakPtrFactory<NfcManagerClientImpl> weak_ptr_factory_;
1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NfcManagerClientImpl);
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)NfcManagerClient::NfcManagerClient() {
1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)NfcManagerClient::~NfcManagerClient() {
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// static
1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)NfcManagerClient* NfcManagerClient::Create(DBusClientImplementationType type) {
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (type == REAL_DBUS_CLIENT_IMPLEMENTATION)
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return new NfcManagerClientImpl();
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return new FakeNfcManagerClient();
1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace chromeos
177