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.
5 #include "chromeos/dbus/nfc_manager_client.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/memory/weak_ptr.h"
9 #include "base/observer_list.h"
11 #include "third_party/cros_system_api/dbus/service_constants.h"
15 NfcManagerClient::Properties::Properties(
16 dbus::ObjectProxy
* object_proxy
,
17 const PropertyChangedCallback
& callback
)
18 : NfcPropertySet(object_proxy
,
19 nfc_manager::kNfcManagerInterface
,
21 RegisterProperty(nfc_manager::kAdaptersProperty
, &adapters
);
24 NfcManagerClient::Properties::~Properties() {
28 // The NfcManagerClient implementation used in production.
29 class NfcManagerClientImpl
: public NfcManagerClient
{
31 NfcManagerClientImpl()
32 : object_proxy_(NULL
),
33 weak_ptr_factory_(this) {
36 ~NfcManagerClientImpl() override
{}
38 // NfcManagerClient override.
39 void AddObserver(Observer
* observer
) override
{
41 observers_
.AddObserver(observer
);
44 // NfcManagerClient override.
45 void RemoveObserver(Observer
* observer
) override
{
47 observers_
.RemoveObserver(observer
);
50 // NfcManagerClient override.
51 Properties
* GetProperties() override
{ return properties_
.get(); }
54 // DBusClient override.
55 void Init(dbus::Bus
* bus
) override
{
56 VLOG(1) << "Creating NfcManagerClientImpl";
58 // Create the object proxy.
59 object_proxy_
= bus
->GetObjectProxy(
60 nfc_manager::kNfcManagerServiceName
,
61 dbus::ObjectPath(nfc_manager::kNfcManagerServicePath
));
63 // Set up the signal handlers.
64 object_proxy_
->ConnectToSignal(
65 nfc_manager::kNfcManagerInterface
,
66 nfc_manager::kAdapterAddedSignal
,
67 base::Bind(&NfcManagerClientImpl::AdapterAddedReceived
,
68 weak_ptr_factory_
.GetWeakPtr()),
69 base::Bind(&NfcManagerClientImpl::AdapterAddedConnected
,
70 weak_ptr_factory_
.GetWeakPtr()));
72 object_proxy_
->ConnectToSignal(
73 nfc_manager::kNfcManagerInterface
,
74 nfc_manager::kAdapterRemovedSignal
,
75 base::Bind(&NfcManagerClientImpl::AdapterRemovedReceived
,
76 weak_ptr_factory_
.GetWeakPtr()),
77 base::Bind(&NfcManagerClientImpl::AdapterRemovedConnected
,
78 weak_ptr_factory_
.GetWeakPtr()));
80 // Create the properties structure.
81 properties_
.reset(new Properties(
83 base::Bind(&NfcManagerClientImpl::OnPropertyChanged
,
84 weak_ptr_factory_
.GetWeakPtr())));
86 properties_
->ConnectSignals();
87 properties_
->GetAll();
91 // NFC manager signal handlers.
92 void OnPropertyChanged(const std::string
& property_name
) {
93 VLOG(1) << "NFC Manager property changed: " << property_name
;
94 FOR_EACH_OBSERVER(Observer
, observers_
,
95 ManagerPropertyChanged(property_name
));
98 // Called by dbus:: when an "AdapterAdded" signal is received..
99 void AdapterAddedReceived(dbus::Signal
* signal
) {
101 dbus::MessageReader
reader(signal
);
102 dbus::ObjectPath object_path
;
103 if (!reader
.PopObjectPath(&object_path
)) {
104 LOG(WARNING
) << "AdapterAdded signal has incorrect parameters: "
105 << signal
->ToString();
108 VLOG(1) << "Adapter added: " << object_path
.value();
109 FOR_EACH_OBSERVER(Observer
, observers_
, AdapterAdded(object_path
));
112 // Called by dbus:: when the "AdapterAdded" signal is initially connected.
113 void AdapterAddedConnected(const std::string
& interface_name
,
114 const std::string
& signal_name
,
116 LOG_IF(WARNING
, !success
) << "Failed to connect to AdapterAdded signal.";
119 // Called by dbus:: when an "AdapterRemoved" signal is received..
120 void AdapterRemovedReceived(dbus::Signal
* signal
) {
122 dbus::MessageReader
reader(signal
);
123 dbus::ObjectPath object_path
;
124 if (!reader
.PopObjectPath(&object_path
)) {
125 LOG(WARNING
) << "AdapterRemoved signal has incorrect parameters: "
126 << signal
->ToString();
129 VLOG(1) << "Adapter removed: " << object_path
.value();
130 FOR_EACH_OBSERVER(Observer
, observers_
, AdapterRemoved(object_path
));
133 // Called by dbus:: when the "AdapterAdded" signal is initially connected.
134 void AdapterRemovedConnected(const std::string
& interface_name
,
135 const std::string
& signal_name
,
137 LOG_IF(WARNING
, !success
) << "Failed to connect to AdapterRemoved signal.";
140 // D-Bus proxy for neard Manager interface.
141 dbus::ObjectProxy
* object_proxy_
;
143 // Properties for neard Manager interface.
144 scoped_ptr
<Properties
> properties_
;
146 // List of observers interested in event notifications.
147 base::ObserverList
<NfcManagerClient::Observer
> observers_
;
149 // Weak pointer factory for generating 'this' pointers that might live longer
151 // Note: This should remain the last member so it'll be destroyed and
152 // invalidate its weak pointers before any other members are destroyed.
153 base::WeakPtrFactory
<NfcManagerClientImpl
> weak_ptr_factory_
;
155 DISALLOW_COPY_AND_ASSIGN(NfcManagerClientImpl
);
158 NfcManagerClient::NfcManagerClient() {
161 NfcManagerClient::~NfcManagerClient() {
165 NfcManagerClient
* NfcManagerClient::Create() {
166 return new NfcManagerClientImpl();
169 } // namespace chromeos