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