Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: chromeos/dbus/biod_biometrics_manager_client.cc

Issue 2567813002: cros: DBUS client to interact with fingerprint DBUS API. (Closed)
Patch Set: ScanFailed -> SessionFailed. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 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/biod_biometrics_manager_client.h"
6
7 #include <stdint.h>
8
9 #include "base/bind.h"
10 #include "base/macros.h"
11 #include "dbus/bus.h"
12 #include "dbus/message.h"
13 #include "dbus/object_path.h"
14 #include "dbus/object_proxy.h"
15 #include "third_party/cros_system_api/dbus/service_constants.h"
16
17 namespace chromeos {
18
19 // The BiodBiometricsManagerClient implementation used in production.
20 class BiodBiometricsManagerClientImpl : public BiodBiometricsManagerClient {
21 public:
22 BiodBiometricsManagerClientImpl()
23 : biometrics_manager_proxy_(nullptr), weak_ptr_factory_(this) {}
24
25 ~BiodBiometricsManagerClientImpl() override {}
26
27 // BiodBiometricsManagerClient overrides:
28 void AddObserver(Observer* observer) override {
29 observers_.AddObserver(observer);
30 }
31
32 void RemoveObserver(Observer* observer) override {
33 observers_.RemoveObserver(observer);
34 }
35
36 bool HasObserver(const Observer* observer) const override {
37 return observers_.HasObserver(observer);
38 }
39
40 void StartEnrollSession(const std::string& user_id,
41 const std::string& label,
42 const ObjectPathCallback& callback) override {
43 dbus::MethodCall method_call(
44 biod::kBiometricsManagerInterface,
45 biod::kBiometricsManagerStartEnrollSessionMethod);
46 dbus::MessageWriter writer(&method_call);
47 writer.AppendString(user_id);
48 writer.AppendString(label);
49
50 biometrics_manager_proxy_->CallMethod(
51 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
52 base::Bind(&BiodBiometricsManagerClientImpl::OnStartEnrollSession,
53 weak_ptr_factory_.GetWeakPtr(), callback));
54 }
55
56 void GetRecordsForUser(const std::string& user_id,
57 const UserRecordsCallback& callback) override {
58 dbus::MethodCall method_call(
59 biod::kBiometricsManagerInterface,
60 biod::kBiometricsManagerGetRecordsForUserMethod);
61 dbus::MessageWriter writer(&method_call);
62 writer.AppendString(user_id);
63
64 biometrics_manager_proxy_->CallMethod(
65 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
66 base::Bind(&BiodBiometricsManagerClientImpl::OnGetRecordsForUser,
67 weak_ptr_factory_.GetWeakPtr(), callback));
68 }
69
70 void DestroyAllRecords() override {
71 dbus::MethodCall method_call(
72 biod::kBiometricsManagerInterface,
73 biod::kBiometricsManagerDestroyAllRecordsMethod);
74
75 biometrics_manager_proxy_->CallMethod(
76 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
77 dbus::ObjectProxy::EmptyResponseCallback());
78 }
79
80 void StartAuthSession(const ObjectPathCallback& callback) override {
81 dbus::MethodCall method_call(
82 biod::kBiometricsManagerInterface,
83 biod::kBiometricsManagerStartAuthSessionMethod);
84
85 biometrics_manager_proxy_->CallMethod(
86 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
87 base::Bind(&BiodBiometricsManagerClientImpl::OnStartAuthSession,
88 weak_ptr_factory_.GetWeakPtr(), callback));
89 }
90
91 void RequestType(const BiometricTypeCallback& callback) override {
92 dbus::MethodCall method_call(dbus::kDBusPropertiesInterface,
93 dbus::kDBusPropertiesGet);
94 dbus::MessageWriter writer(&method_call);
95 writer.AppendString(biod::kBiometricsManagerInterface);
96 writer.AppendString(biod::kBiometricsManagerBiometricTypeProperty);
97
98 biometrics_manager_proxy_->CallMethod(
99 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
100 base::Bind(&BiodBiometricsManagerClientImpl::OnRequestType,
101 weak_ptr_factory_.GetWeakPtr(), callback));
102 }
103
104 protected:
105 void Init(dbus::Bus* bus) override {
106 biometrics_manager_proxy_ = bus->GetObjectProxy(
107 biod::kBiodServiceName, dbus::ObjectPath(biod::kBiodServicePath));
108
109 // Monitor the NameOwnerChanged signal.
Daniel Erat 2017/03/27 18:18:25 these comments don't add much; i'd remove them
sammiequon 2017/03/27 23:21:48 Done.
110 biometrics_manager_proxy_->SetNameOwnerChangedCallback(
111 base::Bind(&BiodBiometricsManagerClientImpl::NameOwnerChangedReceived,
112 weak_ptr_factory_.GetWeakPtr()));
113
114 // Monitor the D-Bus signal for enroll scans.
115 biometrics_manager_proxy_->ConnectToSignal(
116 biod::kBiometricsManagerInterface,
117 biod::kBiometricsManagerEnrollScanDoneSignal,
118 base::Bind(&BiodBiometricsManagerClientImpl::EnrollScanDoneReceived,
119 weak_ptr_factory_.GetWeakPtr()),
120 base::Bind(&BiodBiometricsManagerClientImpl::OnSignalConnected,
121 weak_ptr_factory_.GetWeakPtr()));
122
123 // Monitor the D-Bus signal for auth scans.
124 biometrics_manager_proxy_->ConnectToSignal(
125 biod::kBiometricsManagerInterface,
126 biod::kBiometricsManagerAuthScanDoneSignal,
127 base::Bind(&BiodBiometricsManagerClientImpl::AuthScanDoneReceived,
128 weak_ptr_factory_.GetWeakPtr()),
129 base::Bind(&BiodBiometricsManagerClientImpl::OnSignalConnected,
130 weak_ptr_factory_.GetWeakPtr()));
131
132 // Monitor the D-Bus signal for session failures.
133 biometrics_manager_proxy_->ConnectToSignal(
134 biod::kBiometricsManagerInterface,
135 biod::kBiometricsManagerSessionFailedSignal,
136 base::Bind(&BiodBiometricsManagerClientImpl::SessionFailedReceived,
137 weak_ptr_factory_.GetWeakPtr()),
138 base::Bind(&BiodBiometricsManagerClientImpl::OnSignalConnected,
139 weak_ptr_factory_.GetWeakPtr()));
140 }
141
142 private:
143 void OnStartEnrollSession(const ObjectPathCallback& callback,
144 dbus::Response* response) {
145 dbus::MessageReader reader(response);
Daniel Erat 2017/03/27 18:18:25 i think that all of these methods will segfault if
sammiequon 2017/03/27 23:21:48 Done.
146 dbus::ObjectPath result;
147 if (reader.PopObjectPath(&result))
148 callback.Run(result);
Daniel Erat 2017/03/27 18:18:25 please make all of these methods log errors if inc
sammiequon 2017/03/27 23:21:48 Done.
149 }
150
151 void OnGetRecordsForUser(const UserRecordsCallback& callback,
152 dbus::Response* response) {
153 dbus::MessageReader reader(response);
154 std::vector<dbus::ObjectPath> result;
155 if (reader.PopArrayOfObjectPaths(&result))
156 callback.Run(result);
157 }
158
159 void OnStartAuthSession(const ObjectPathCallback& callback,
160 dbus::Response* response) {
161 dbus::MessageReader reader(response);
162 dbus::ObjectPath result;
163 if (reader.PopObjectPath(&result))
164 callback.Run(result);
165 }
166
167 void OnRequestType(const BiometricTypeCallback& callback,
168 dbus::Response* response) {
169 dbus::MessageReader reader(response);
170 uint32_t result;
171 if (reader.PopVariantOfUint32(&result))
172 callback.Run(static_cast<biod::BiometricType>(result));
173 }
174
175 // Called when the biometrics signal is initially connected.
176 void OnSignalConnected(const std::string& interface_name,
177 const std::string& signal_name,
178 bool success) {
179 LOG_IF(ERROR, !success)
180 << "Failed to connect to biometrics signal:" << signal_name;
181 }
182
183 void NameOwnerChangedReceived(const std::string& old_owner,
rkc 2017/03/25 00:28:20 nit: /* old_owner */ /* new_owner */
sammiequon 2017/03/27 23:21:48 Done.
184 const std::string& new_owner) {
185 for (auto& observer : observers_)
186 observer.ClientRestarted();
Daniel Erat 2017/03/27 18:18:26 this seems incorrect. i think you'll see this meth
sammiequon 2017/03/27 23:21:48 Done.
187 }
188
189 void EnrollScanDoneReceived(dbus::Signal* signal) {
190 dbus::MessageReader reader(signal);
191 uint32_t scan_result;
192 bool is_complete;
193 if (!reader.PopUint32(&scan_result) || !reader.PopBool(&is_complete)) {
194 LOG(ERROR) << "Error reading signal from biometrics:"
195 << signal->ToString();
196 return;
197 }
198
199 for (auto& observer : observers_)
200 observer.EnrollScanDoneReceived(scan_result, is_complete);
201 }
202
203 void AuthScanDoneReceived(dbus::Signal* signal) {
204 dbus::MessageReader signal_reader(signal);
205 dbus::MessageReader array_reader(NULL);
Daniel Erat 2017/03/27 18:18:25 use nullptr instead of NULL in c++ code (also belo
sammiequon 2017/03/27 23:21:48 Done.
206 uint32_t scan_result;
207 AuthScanMatches matches;
208 if (!signal_reader.PopUint32(&scan_result) ||
209 !signal_reader.PopArray(&array_reader)) {
210 LOG(ERROR) << "Error reading signal from biometrics:"
211 << signal->ToString();
212 return;
213 }
214
215 while (array_reader.HasMoreData()) {
216 dbus::MessageReader entry_reader(NULL);
217 std::string user_id;
218 std::vector<std::string> labels;
219 if (!array_reader.PopDictEntry(&entry_reader) ||
220 !entry_reader.PopString(&user_id) ||
221 !entry_reader.PopArrayOfStrings(&labels)) {
222 LOG(ERROR) << "Error reading signal from biometrics:"
223 << signal->ToString();
224 return;
225 }
226
227 matches[user_id] = std::move(labels);
228 }
229
230 for (auto& observer : observers_)
231 observer.AuthScanDoneReceived(scan_result, matches);
232 }
233
234 void SessionFailedReceived(dbus::Signal* signal) {
235 for (auto& observer : observers_)
236 observer.SessionFailedReceived();
237 }
238
239 dbus::ObjectProxy* biometrics_manager_proxy_;
240 base::ObserverList<Observer> observers_;
241
242 // Note: This should remain the last member so it'll be destroyed and
243 // invalidate its weak pointers before any other members are destroyed.
244 base::WeakPtrFactory<BiodBiometricsManagerClientImpl> weak_ptr_factory_;
245
246 DISALLOW_COPY_AND_ASSIGN(BiodBiometricsManagerClientImpl);
247 };
248
249 BiodBiometricsManagerClient::BiodBiometricsManagerClient() {}
250
251 BiodBiometricsManagerClient::~BiodBiometricsManagerClient() {}
252
253 // static
254 BiodBiometricsManagerClient* BiodBiometricsManagerClient::Create(
255 DBusClientImplementationType /* type */) {
256 return new BiodBiometricsManagerClientImpl();
257 }
258
259 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698