1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chromeos/dbus/nfc_manager_client.h" 6 7 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/weak_ptr.h" 9 #include "base/observer_list.h" 10 #include "dbus/bus.h" 11 #include "third_party/cros_system_api/dbus/service_constants.h" 12 13 namespace chromeos { 14 15 NfcManagerClient::Properties::Properties( 16 dbus::ObjectProxy* object_proxy, 17 const PropertyChangedCallback& callback) 18 : NfcPropertySet(object_proxy, 19 nfc_manager::kNfcManagerInterface, 20 callback) { 21 RegisterProperty(nfc_manager::kAdaptersProperty, &adapters); 22 } 23 24 NfcManagerClient::Properties::~Properties() { 25 } 26 27 28 // The NfcManagerClient implementation used in production. 29 class NfcManagerClientImpl : public NfcManagerClient { 30 public: 31 NfcManagerClientImpl() 32 : object_proxy_(NULL), 33 weak_ptr_factory_(this) { 34 } 35 36 virtual ~NfcManagerClientImpl() { 37 } 38 39 // NfcManagerClient override. 40 virtual void AddObserver(Observer* observer) OVERRIDE { 41 DCHECK(observer); 42 observers_.AddObserver(observer); 43 } 44 45 // NfcManagerClient override. 46 virtual void RemoveObserver(Observer* observer) OVERRIDE { 47 DCHECK(observer); 48 observers_.RemoveObserver(observer); 49 } 50 51 // NfcManagerClient override. 52 virtual Properties* GetProperties() OVERRIDE { 53 return properties_.get(); 54 } 55 56 protected: 57 // DBusClient override. 58 virtual void Init(dbus::Bus* bus) OVERRIDE { 59 VLOG(1) << "Creating NfcManagerClientImpl"; 60 61 // Create the object proxy. 62 object_proxy_ = bus->GetObjectProxy( 63 nfc_manager::kNfcManagerServiceName, 64 dbus::ObjectPath(nfc_manager::kNfcManagerServicePath)); 65 66 // Set up the signal handlers. 67 object_proxy_->ConnectToSignal( 68 nfc_manager::kNfcManagerInterface, 69 nfc_manager::kAdapterAddedSignal, 70 base::Bind(&NfcManagerClientImpl::AdapterAddedReceived, 71 weak_ptr_factory_.GetWeakPtr()), 72 base::Bind(&NfcManagerClientImpl::AdapterAddedConnected, 73 weak_ptr_factory_.GetWeakPtr())); 74 75 object_proxy_->ConnectToSignal( 76 nfc_manager::kNfcManagerInterface, 77 nfc_manager::kAdapterRemovedSignal, 78 base::Bind(&NfcManagerClientImpl::AdapterRemovedReceived, 79 weak_ptr_factory_.GetWeakPtr()), 80 base::Bind(&NfcManagerClientImpl::AdapterRemovedConnected, 81 weak_ptr_factory_.GetWeakPtr())); 82 83 // Create the properties structure. 84 properties_.reset(new Properties( 85 object_proxy_, 86 base::Bind(&NfcManagerClientImpl::OnPropertyChanged, 87 weak_ptr_factory_.GetWeakPtr()))); 88 89 properties_->ConnectSignals(); 90 properties_->GetAll(); 91 } 92 93 private: 94 // NFC manager signal handlers. 95 void OnPropertyChanged(const std::string& property_name) { 96 VLOG(1) << "NFC Manager property changed: " << property_name; 97 FOR_EACH_OBSERVER(Observer, observers_, 98 ManagerPropertyChanged(property_name)); 99 } 100 101 // Called by dbus:: when an "AdapterAdded" signal is received.. 102 void AdapterAddedReceived(dbus::Signal* signal) { 103 DCHECK(signal); 104 dbus::MessageReader reader(signal); 105 dbus::ObjectPath object_path; 106 if (!reader.PopObjectPath(&object_path)) { 107 LOG(WARNING) << "AdapterAdded signal has incorrect parameters: " 108 << signal->ToString(); 109 return; 110 } 111 VLOG(1) << "Adapter added: " << object_path.value(); 112 FOR_EACH_OBSERVER(Observer, observers_, AdapterAdded(object_path)); 113 } 114 115 // Called by dbus:: when the "AdapterAdded" signal is initially connected. 116 void AdapterAddedConnected(const std::string& interface_name, 117 const std::string& signal_name, 118 bool success) { 119 LOG_IF(WARNING, !success) << "Failed to connect to AdapterAdded signal."; 120 } 121 122 // Called by dbus:: when an "AdapterRemoved" signal is received.. 123 void AdapterRemovedReceived(dbus::Signal* signal) { 124 DCHECK(signal); 125 dbus::MessageReader reader(signal); 126 dbus::ObjectPath object_path; 127 if (!reader.PopObjectPath(&object_path)) { 128 LOG(WARNING) << "AdapterRemoved signal has incorrect parameters: " 129 << signal->ToString(); 130 return; 131 } 132 VLOG(1) << "Adapter removed: " << object_path.value(); 133 FOR_EACH_OBSERVER(Observer, observers_, AdapterRemoved(object_path)); 134 } 135 136 // Called by dbus:: when the "AdapterAdded" signal is initially connected. 137 void AdapterRemovedConnected(const std::string& interface_name, 138 const std::string& signal_name, 139 bool success) { 140 LOG_IF(WARNING, !success) << "Failed to connect to AdapterRemoved signal."; 141 } 142 143 // D-Bus proxy for neard Manager interface. 144 dbus::ObjectProxy* object_proxy_; 145 146 // Properties for neard Manager interface. 147 scoped_ptr<Properties> properties_; 148 149 // List of observers interested in event notifications. 150 ObserverList<NfcManagerClient::Observer> observers_; 151 152 // Weak pointer factory for generating 'this' pointers that might live longer 153 // than we do. 154 // Note: This should remain the last member so it'll be destroyed and 155 // invalidate its weak pointers before any other members are destroyed. 156 base::WeakPtrFactory<NfcManagerClientImpl> weak_ptr_factory_; 157 158 DISALLOW_COPY_AND_ASSIGN(NfcManagerClientImpl); 159 }; 160 161 NfcManagerClient::NfcManagerClient() { 162 } 163 164 NfcManagerClient::~NfcManagerClient() { 165 } 166 167 // static 168 NfcManagerClient* NfcManagerClient::Create() { 169 return new NfcManagerClientImpl(); 170 } 171 172 } // namespace chromeos 173