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