OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/pairing/bluetooth_host_pairing_controller.h" | 5 #include "components/pairing/bluetooth_host_pairing_controller.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/hash.h" | 8 #include "base/hash.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
11 #include "components/pairing/bluetooth_pairing_constants.h" | 11 #include "components/pairing/bluetooth_pairing_constants.h" |
12 #include "components/pairing/pairing_api.pb.h" | 12 #include "components/pairing/pairing_api.pb.h" |
13 #include "components/pairing/proto_decoder.h" | 13 #include "components/pairing/proto_decoder.h" |
14 #include "device/bluetooth/bluetooth_adapter_factory.h" | 14 #include "device/bluetooth/bluetooth_adapter_factory.h" |
15 #include "net/base/io_buffer.h" | 15 #include "net/base/io_buffer.h" |
16 | 16 |
| 17 namespace pairing_chromeos { |
| 18 |
17 namespace { | 19 namespace { |
18 const int kReceiveSize = 16384; | 20 const int kReceiveSize = 16384; |
| 21 |
| 22 pairing_api::HostStatusParameters::UpdateStatus PairingApiUpdateStatus( |
| 23 HostPairingController::UpdateStatus update_status) { |
| 24 switch(update_status) { |
| 25 case HostPairingController::UPDATE_STATUS_UNKNOWN: |
| 26 return pairing_api::HostStatusParameters::UPDATE_STATUS_UNKNOWN; |
| 27 case HostPairingController::UPDATE_STATUS_UPDATING: |
| 28 return pairing_api::HostStatusParameters::UPDATE_STATUS_UPDATING; |
| 29 case HostPairingController::UPDATE_STATUS_REBOOTING: |
| 30 return pairing_api::HostStatusParameters::UPDATE_STATUS_REBOOTING; |
| 31 case HostPairingController::UPDATE_STATUS_UPDATED: |
| 32 return pairing_api::HostStatusParameters::UPDATE_STATUS_UPDATED; |
| 33 default: |
| 34 NOTREACHED(); |
| 35 return pairing_api::HostStatusParameters::UPDATE_STATUS_UNKNOWN; |
| 36 } |
19 } | 37 } |
20 | 38 |
21 namespace pairing_chromeos { | 39 pairing_api::HostStatusParameters::EnrollmentStatus PairingApiEnrollmentStatus( |
| 40 HostPairingController::EnrollmentStatus enrollment_status) { |
| 41 switch(enrollment_status) { |
| 42 case HostPairingController::ENROLLMENT_STATUS_UNKNOWN: |
| 43 return pairing_api::HostStatusParameters::ENROLLMENT_STATUS_UNKNOWN; |
| 44 case HostPairingController::ENROLLMENT_STATUS_ENROLLING: |
| 45 return pairing_api::HostStatusParameters::ENROLLMENT_STATUS_ENROLLING; |
| 46 case HostPairingController::ENROLLMENT_STATUS_FAILURE: |
| 47 return pairing_api::HostStatusParameters::ENROLLMENT_STATUS_FAILURE; |
| 48 case HostPairingController::ENROLLMENT_STATUS_SUCCESS: |
| 49 return pairing_api::HostStatusParameters::ENROLLMENT_STATUS_SUCCESS; |
| 50 default: |
| 51 NOTREACHED(); |
| 52 return pairing_api::HostStatusParameters::ENROLLMENT_STATUS_UNKNOWN; |
| 53 } |
| 54 } |
| 55 |
| 56 } // namespace |
22 | 57 |
23 BluetoothHostPairingController::BluetoothHostPairingController() | 58 BluetoothHostPairingController::BluetoothHostPairingController() |
24 : current_stage_(STAGE_NONE), | 59 : current_stage_(STAGE_NONE), |
| 60 update_status_(UPDATE_STATUS_UNKNOWN), |
| 61 enrollment_status_(ENROLLMENT_STATUS_UNKNOWN), |
25 device_(NULL), | 62 device_(NULL), |
26 proto_decoder_(new ProtoDecoder(this)), | 63 proto_decoder_(new ProtoDecoder(this)), |
27 ptr_factory_(this) { | 64 ptr_factory_(this) { |
28 } | 65 } |
29 | 66 |
30 BluetoothHostPairingController::~BluetoothHostPairingController() { | 67 BluetoothHostPairingController::~BluetoothHostPairingController() { |
31 if (adapter_.get()) | 68 if (adapter_.get()) |
32 adapter_->RemoveObserver(this); | 69 adapter_->RemoveObserver(this); |
33 } | 70 } |
34 | 71 |
35 void BluetoothHostPairingController::ChangeStage(Stage new_stage) { | 72 void BluetoothHostPairingController::ChangeStage(Stage new_stage) { |
36 if (current_stage_ == new_stage) | 73 if (current_stage_ == new_stage) |
37 return; | 74 return; |
38 VLOG(1) << "ChangeStage " << new_stage; | 75 VLOG(1) << "ChangeStage " << new_stage; |
39 current_stage_ = new_stage; | 76 current_stage_ = new_stage; |
40 FOR_EACH_OBSERVER(Observer, observers_, PairingStageChanged(new_stage)); | 77 FOR_EACH_OBSERVER(Observer, observers_, PairingStageChanged(new_stage)); |
41 } | 78 } |
42 | 79 |
43 void BluetoothHostPairingController::SendHostStatus() { | 80 void BluetoothHostPairingController::SendHostStatus() { |
44 pairing_api::HostStatus host_status; | 81 pairing_api::HostStatus host_status; |
45 | 82 |
46 host_status.set_api_version(kPairingAPIVersion); | 83 host_status.set_api_version(kPairingAPIVersion); |
47 if (!enrollment_domain_.empty()) | 84 if (!enrollment_domain_.empty()) |
48 host_status.mutable_parameters()->set_domain(enrollment_domain_); | 85 host_status.mutable_parameters()->set_domain(enrollment_domain_); |
49 | 86 |
50 // TODO(zork): Get these values from the UI. (http://crbug.com/405744) | 87 // TODO(zork): Get these values from the UI. (http://crbug.com/405744) |
51 host_status.mutable_parameters()->set_connectivity( | 88 host_status.mutable_parameters()->set_connectivity( |
52 pairing_api::HostStatusParameters::CONNECTIVITY_CONNECTED); | 89 pairing_api::HostStatusParameters::CONNECTIVITY_CONNECTED); |
53 host_status.mutable_parameters()->set_update_status( | 90 host_status.mutable_parameters()->set_update_status( |
54 pairing_api::HostStatusParameters::UPDATE_STATUS_UPDATED); | 91 PairingApiUpdateStatus(update_status_)); |
| 92 host_status.mutable_parameters()->set_enrollment_status( |
| 93 PairingApiEnrollmentStatus(enrollment_status_)); |
55 | 94 |
56 // TODO(zork): Get a list of other paired controllers. | 95 // TODO(zork): Get a list of other paired controllers. |
57 // (http://crbug.com/405757) | 96 // (http://crbug.com/405757) |
58 | 97 |
59 int size = 0; | 98 int size = 0; |
60 scoped_refptr<net::IOBuffer> io_buffer( | 99 scoped_refptr<net::IOBuffer> io_buffer( |
61 ProtoDecoder::SendHostStatus(host_status, &size)); | 100 ProtoDecoder::SendHostStatus(host_status, &size)); |
62 | 101 |
63 controller_socket_->Send( | 102 controller_socket_->Send( |
64 io_buffer, size, | 103 io_buffer, size, |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 // TODO: Update Host. (http://crbug.com/405754) | 238 // TODO: Update Host. (http://crbug.com/405754) |
200 SendHostStatus(); | 239 SendHostStatus(); |
201 | 240 |
202 controller_socket_->Receive( | 241 controller_socket_->Receive( |
203 kReceiveSize, | 242 kReceiveSize, |
204 base::Bind(&BluetoothHostPairingController::OnReceiveComplete, | 243 base::Bind(&BluetoothHostPairingController::OnReceiveComplete, |
205 ptr_factory_.GetWeakPtr()), | 244 ptr_factory_.GetWeakPtr()), |
206 base::Bind(&BluetoothHostPairingController::OnReceiveError, | 245 base::Bind(&BluetoothHostPairingController::OnReceiveError, |
207 ptr_factory_.GetWeakPtr())); | 246 ptr_factory_.GetWeakPtr())); |
208 | 247 |
209 ChangeStage(STAGE_WAITING_FOR_CREDENTIALS); | 248 ChangeStage(STAGE_UPDATING); |
210 } | 249 } |
211 | 250 |
212 void BluetoothHostPairingController::OnSetDiscoverable(bool change_stage) { | 251 void BluetoothHostPairingController::OnSetDiscoverable(bool change_stage) { |
213 DCHECK(thread_checker_.CalledOnValidThread()); | 252 DCHECK(thread_checker_.CalledOnValidThread()); |
214 if (change_stage) { | 253 if (change_stage) { |
215 DCHECK_EQ(current_stage_, STAGE_NONE); | 254 DCHECK_EQ(current_stage_, STAGE_NONE); |
216 ChangeStage(STAGE_WAITING_FOR_CONTROLLER); | 255 ChangeStage(STAGE_WAITING_FOR_CONTROLLER); |
217 } | 256 } |
218 } | 257 } |
219 | 258 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 ConfigureHost(message.parameters().accepted_eula(), | 311 ConfigureHost(message.parameters().accepted_eula(), |
273 message.parameters().lang(), | 312 message.parameters().lang(), |
274 message.parameters().timezone(), | 313 message.parameters().timezone(), |
275 message.parameters().send_reports(), | 314 message.parameters().send_reports(), |
276 message.parameters().keyboard_layout())); | 315 message.parameters().keyboard_layout())); |
277 } | 316 } |
278 | 317 |
279 void BluetoothHostPairingController::OnPairDevicesMessage( | 318 void BluetoothHostPairingController::OnPairDevicesMessage( |
280 const pairing_api::PairDevices& message) { | 319 const pairing_api::PairDevices& message) { |
281 DCHECK(thread_checker_.CalledOnValidThread()); | 320 DCHECK(thread_checker_.CalledOnValidThread()); |
282 if (current_stage_ != STAGE_WAITING_FOR_CREDENTIALS) { | |
283 AbortWithError(PAIRING_ERROR_PAIRING_OR_ENROLLMENT, kErrorInvalidProtocol); | |
284 return; | |
285 } | |
286 | |
287 ChangeStage(STAGE_ENROLLING); | 321 ChangeStage(STAGE_ENROLLING); |
288 FOR_EACH_OBSERVER(Observer, observers_, | 322 FOR_EACH_OBSERVER(Observer, observers_, |
289 EnrollHost(message.parameters().admin_access_token())); | 323 EnrollHost(message.parameters().admin_access_token())); |
290 } | 324 } |
291 | 325 |
292 void BluetoothHostPairingController::SetEnrollmentComplete(bool success) { | |
293 DCHECK_EQ(current_stage_, STAGE_ENROLLING); | |
294 DCHECK(thread_checker_.CalledOnValidThread()); | |
295 if (success) { | |
296 ChangeStage(STAGE_PAIRING_DONE); | |
297 SendHostStatus(); | |
298 } else { | |
299 AbortWithError(PAIRING_ERROR_PAIRING_OR_ENROLLMENT, kErrorEnrollmentFailed); | |
300 } | |
301 } | |
302 | |
303 void BluetoothHostPairingController::OnCompleteSetupMessage( | 326 void BluetoothHostPairingController::OnCompleteSetupMessage( |
304 const pairing_api::CompleteSetup& message) { | 327 const pairing_api::CompleteSetup& message) { |
305 DCHECK(thread_checker_.CalledOnValidThread()); | 328 DCHECK(thread_checker_.CalledOnValidThread()); |
306 if (current_stage_ != STAGE_PAIRING_DONE) { | 329 if (current_stage_ != STAGE_PAIRING_DONE) { |
307 AbortWithError(PAIRING_ERROR_PAIRING_OR_ENROLLMENT, kErrorInvalidProtocol); | 330 AbortWithError(PAIRING_ERROR_PAIRING_OR_ENROLLMENT, kErrorInvalidProtocol); |
308 return; | 331 return; |
309 } | 332 } |
310 | 333 |
311 // TODO(zork): Handle adding another controller. (http://crbug.com/405757) | 334 // TODO(zork): Handle adding another controller. (http://crbug.com/405757) |
312 ChangeStage(STAGE_FINISHED); | 335 ChangeStage(STAGE_FINISHED); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 DCHECK_EQ(current_stage_, STAGE_WAITING_FOR_CODE_CONFIRMATION); | 384 DCHECK_EQ(current_stage_, STAGE_WAITING_FOR_CODE_CONFIRMATION); |
362 return confirmation_code_; | 385 return confirmation_code_; |
363 } | 386 } |
364 | 387 |
365 std::string BluetoothHostPairingController::GetEnrollmentDomain() { | 388 std::string BluetoothHostPairingController::GetEnrollmentDomain() { |
366 return enrollment_domain_; | 389 return enrollment_domain_; |
367 } | 390 } |
368 | 391 |
369 void BluetoothHostPairingController::OnUpdateStatusChanged( | 392 void BluetoothHostPairingController::OnUpdateStatusChanged( |
370 UpdateStatus update_status) { | 393 UpdateStatus update_status) { |
371 // TODO(zork): Handling updating stages (http://crbug.com/405754). | 394 update_status_ = update_status; |
| 395 if (update_status == UPDATE_STATUS_UPDATED) |
| 396 ChangeStage(STAGE_WAITING_FOR_CREDENTIALS); |
| 397 SendHostStatus(); |
| 398 } |
| 399 |
| 400 void BluetoothHostPairingController::OnEnrollmentStatusChanged( |
| 401 EnrollmentStatus enrollment_status) { |
| 402 DCHECK_EQ(current_stage_, STAGE_ENROLLING); |
| 403 DCHECK(thread_checker_.CalledOnValidThread()); |
| 404 |
| 405 enrollment_status_ = enrollment_status; |
| 406 if (enrollment_status == ENROLLMENT_STATUS_SUCCESS) { |
| 407 ChangeStage(STAGE_PAIRING_DONE); |
| 408 } else if (enrollment_status == ENROLLMENT_STATUS_FAILURE) { |
| 409 AbortWithError(PAIRING_ERROR_PAIRING_OR_ENROLLMENT, |
| 410 kErrorEnrollmentFailed); |
| 411 } |
| 412 SendHostStatus(); |
372 } | 413 } |
373 | 414 |
374 void BluetoothHostPairingController::RequestPinCode( | 415 void BluetoothHostPairingController::RequestPinCode( |
375 device::BluetoothDevice* device) { | 416 device::BluetoothDevice* device) { |
376 // Disallow unknown device. | 417 // Disallow unknown device. |
377 device->RejectPairing(); | 418 device->RejectPairing(); |
378 } | 419 } |
379 | 420 |
380 void BluetoothHostPairingController::RequestPasskey( | 421 void BluetoothHostPairingController::RequestPasskey( |
381 device::BluetoothDevice* device) { | 422 device::BluetoothDevice* device) { |
(...skipping 30 matching lines...) Expand all Loading... |
412 ChangeStage(STAGE_WAITING_FOR_CODE_CONFIRMATION); | 453 ChangeStage(STAGE_WAITING_FOR_CODE_CONFIRMATION); |
413 } | 454 } |
414 | 455 |
415 void BluetoothHostPairingController::AuthorizePairing( | 456 void BluetoothHostPairingController::AuthorizePairing( |
416 device::BluetoothDevice* device) { | 457 device::BluetoothDevice* device) { |
417 // Disallow unknown device. | 458 // Disallow unknown device. |
418 device->RejectPairing(); | 459 device->RejectPairing(); |
419 } | 460 } |
420 | 461 |
421 } // namespace pairing_chromeos | 462 } // namespace pairing_chromeos |
OLD | NEW |