| 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 "chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energ
y_api.h" | 5 #include "chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energ
y_api.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "chrome/browser/extensions/api/bluetooth_low_energy/utils.h" | 10 #include "chrome/browser/extensions/api/bluetooth_low_energy/utils.h" |
| 11 #include "chrome/common/extensions/api/bluetooth/bluetooth_manifest_data.h" | 11 #include "chrome/common/extensions/api/bluetooth/bluetooth_manifest_data.h" |
| 12 #include "chrome/common/extensions/api/bluetooth_low_energy.h" | 12 #include "chrome/common/extensions/api/bluetooth_low_energy.h" |
| 13 #include "content/public/browser/browser_thread.h" | 13 #include "content/public/browser/browser_thread.h" |
| 14 #include "extensions/browser/event_router.h" | 14 #include "extensions/browser/event_router.h" |
| 15 #include "extensions/common/permissions/permissions_data.h" | 15 #include "extensions/common/permissions/permissions_data.h" |
| 16 | 16 |
| 17 using content::BrowserContext; | 17 using content::BrowserContext; |
| 18 using content::BrowserThread; | 18 using content::BrowserThread; |
| 19 | 19 |
| 20 namespace apibtle = extensions::api::bluetooth_low_energy; | 20 namespace apibtle = extensions::api::bluetooth_low_energy; |
| 21 | 21 |
| 22 namespace extensions { | 22 namespace extensions { |
| 23 | 23 |
| 24 namespace { | 24 namespace { |
| 25 | 25 |
| 26 const char kErrorAdapterNotInitialized[] = | 26 const char kErrorAdapterNotInitialized[] = |
| 27 "Could not initialize Bluetooth adapter"; | 27 "Could not initialize Bluetooth adapter"; |
| 28 const char kErrorAlreadyConnected[] = "Already connected"; |
| 29 const char kErrorNotConnected[] = "Not connected"; |
| 28 const char kErrorNotFound[] = "Instance not found"; | 30 const char kErrorNotFound[] = "Instance not found"; |
| 29 const char kErrorOperationFailed[] = "Operation failed"; | 31 const char kErrorOperationFailed[] = "Operation failed"; |
| 30 const char kErrorPermissionDenied[] = "Permission denied"; | 32 const char kErrorPermissionDenied[] = "Permission denied"; |
| 31 const char kErrorPlatformNotSupported[] = | 33 const char kErrorPlatformNotSupported[] = |
| 32 "This operation is not supported on the current platform"; | 34 "This operation is not supported on the current platform"; |
| 33 | 35 |
| 34 // Returns the correct error string based on error status |status|. This is used | 36 // Returns the correct error string based on error status |status|. This is used |
| 35 // to set the value of |chrome.runtime.lastError.message| and should not be | 37 // to set the value of |chrome.runtime.lastError.message| and should not be |
| 36 // passed |BluetoothLowEnergyEventRouter::kStatusSuccess|. | 38 // passed |BluetoothLowEnergyEventRouter::kStatusSuccess|. |
| 37 std::string StatusToString(BluetoothLowEnergyEventRouter::Status status) { | 39 std::string StatusToString(BluetoothLowEnergyEventRouter::Status status) { |
| 38 switch (status) { | 40 switch (status) { |
| 39 case BluetoothLowEnergyEventRouter::kStatusErrorPermissionDenied: | 41 case BluetoothLowEnergyEventRouter::kStatusErrorPermissionDenied: |
| 40 return kErrorPermissionDenied; | 42 return kErrorPermissionDenied; |
| 41 case BluetoothLowEnergyEventRouter::kStatusErrorNotFound: | 43 case BluetoothLowEnergyEventRouter::kStatusErrorNotFound: |
| 42 return kErrorNotFound; | 44 return kErrorNotFound; |
| 45 case BluetoothLowEnergyEventRouter::kStatusErrorAlreadyConnected: |
| 46 return kErrorAlreadyConnected; |
| 47 case BluetoothLowEnergyEventRouter::kStatusErrorNotConnected: |
| 48 return kErrorNotConnected; |
| 43 case BluetoothLowEnergyEventRouter::kStatusSuccess: | 49 case BluetoothLowEnergyEventRouter::kStatusSuccess: |
| 44 NOTREACHED(); | 50 NOTREACHED(); |
| 45 break; | 51 break; |
| 46 default: | 52 default: |
| 47 return kErrorOperationFailed; | 53 return kErrorOperationFailed; |
| 48 } | 54 } |
| 49 return ""; | 55 return ""; |
| 50 } | 56 } |
| 51 | 57 |
| 52 extensions::BluetoothLowEnergyEventRouter* GetEventRouter( | 58 extensions::BluetoothLowEnergyEventRouter* GetEventRouter( |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 if (!event_router->InitializeAdapterAndInvokeCallback(base::Bind( | 124 if (!event_router->InitializeAdapterAndInvokeCallback(base::Bind( |
| 119 &DoWorkCallback, | 125 &DoWorkCallback, |
| 120 base::Bind(&BluetoothLowEnergyExtensionFunction::DoWork, this)))) { | 126 base::Bind(&BluetoothLowEnergyExtensionFunction::DoWork, this)))) { |
| 121 SetError(kErrorAdapterNotInitialized); | 127 SetError(kErrorAdapterNotInitialized); |
| 122 return false; | 128 return false; |
| 123 } | 129 } |
| 124 | 130 |
| 125 return true; | 131 return true; |
| 126 } | 132 } |
| 127 | 133 |
| 134 bool BluetoothLowEnergyConnectFunction::DoWork() { |
| 135 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 136 |
| 137 BluetoothLowEnergyEventRouter* event_router = |
| 138 GetEventRouter(browser_context()); |
| 139 |
| 140 // The adapter must be initialized at this point, but return an error instead |
| 141 // of asserting. |
| 142 if (!event_router->HasAdapter()) { |
| 143 SetError(kErrorAdapterNotInitialized); |
| 144 SendResponse(false); |
| 145 return false; |
| 146 } |
| 147 |
| 148 scoped_ptr<apibtle::Connect::Params> params( |
| 149 apibtle::Connect::Params::Create(*args_)); |
| 150 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); |
| 151 |
| 152 bool persistent = false; // Not persistent by default. |
| 153 apibtle::ConnectProperties* properties = params.get()->properties.get(); |
| 154 if (properties) |
| 155 persistent = properties->persistent; |
| 156 |
| 157 event_router->Connect( |
| 158 persistent, |
| 159 GetExtension(), |
| 160 params->device_address, |
| 161 base::Bind(&BluetoothLowEnergyConnectFunction::SuccessCallback, this), |
| 162 base::Bind(&BluetoothLowEnergyConnectFunction::ErrorCallback, this)); |
| 163 |
| 164 return true; |
| 165 } |
| 166 |
| 167 void BluetoothLowEnergyConnectFunction::SuccessCallback() { |
| 168 SendResponse(true); |
| 169 } |
| 170 |
| 171 void BluetoothLowEnergyConnectFunction::ErrorCallback( |
| 172 BluetoothLowEnergyEventRouter::Status status) { |
| 173 SetError(StatusToString(status)); |
| 174 SendResponse(false); |
| 175 } |
| 176 |
| 177 bool BluetoothLowEnergyDisconnectFunction::DoWork() { |
| 178 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 179 |
| 180 BluetoothLowEnergyEventRouter* event_router = |
| 181 GetEventRouter(browser_context()); |
| 182 |
| 183 // The adapter must be initialized at this point, but return an error instead |
| 184 // of asserting. |
| 185 if (!event_router->HasAdapter()) { |
| 186 SetError(kErrorAdapterNotInitialized); |
| 187 SendResponse(false); |
| 188 return false; |
| 189 } |
| 190 |
| 191 scoped_ptr<apibtle::Disconnect::Params> params( |
| 192 apibtle::Disconnect::Params::Create(*args_)); |
| 193 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); |
| 194 |
| 195 event_router->Disconnect( |
| 196 GetExtension(), |
| 197 params->device_address, |
| 198 base::Bind(&BluetoothLowEnergyDisconnectFunction::SuccessCallback, this), |
| 199 base::Bind(&BluetoothLowEnergyDisconnectFunction::ErrorCallback, this)); |
| 200 |
| 201 return true; |
| 202 } |
| 203 |
| 204 void BluetoothLowEnergyDisconnectFunction::SuccessCallback() { |
| 205 SendResponse(true); |
| 206 } |
| 207 |
| 208 void BluetoothLowEnergyDisconnectFunction::ErrorCallback( |
| 209 BluetoothLowEnergyEventRouter::Status status) { |
| 210 SetError(StatusToString(status)); |
| 211 SendResponse(false); |
| 212 } |
| 213 |
| 128 bool BluetoothLowEnergyGetServiceFunction::DoWork() { | 214 bool BluetoothLowEnergyGetServiceFunction::DoWork() { |
| 129 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 215 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 130 | 216 |
| 131 BluetoothLowEnergyEventRouter* event_router = | 217 BluetoothLowEnergyEventRouter* event_router = |
| 132 GetEventRouter(browser_context()); | 218 GetEventRouter(browser_context()); |
| 133 | 219 |
| 134 // The adapter must be initialized at this point, but return an error instead | 220 // The adapter must be initialized at this point, but return an error instead |
| 135 // of asserting. | 221 // of asserting. |
| 136 if (!event_router->HasAdapter()) { | 222 if (!event_router->HasAdapter()) { |
| 137 SetError(kErrorAdapterNotInitialized); | 223 SetError(kErrorAdapterNotInitialized); |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 SetError(kErrorAdapterNotInitialized); | 480 SetError(kErrorAdapterNotInitialized); |
| 395 SendResponse(false); | 481 SendResponse(false); |
| 396 return false; | 482 return false; |
| 397 } | 483 } |
| 398 | 484 |
| 399 scoped_ptr<apibtle::ReadCharacteristicValue::Params> params( | 485 scoped_ptr<apibtle::ReadCharacteristicValue::Params> params( |
| 400 apibtle::ReadCharacteristicValue::Params::Create(*args_)); | 486 apibtle::ReadCharacteristicValue::Params::Create(*args_)); |
| 401 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); | 487 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); |
| 402 | 488 |
| 403 instance_id_ = params->characteristic_id; | 489 instance_id_ = params->characteristic_id; |
| 404 BluetoothLowEnergyEventRouter::Status status = | 490 event_router->ReadCharacteristicValue( |
| 405 event_router->ReadCharacteristicValue( | 491 GetExtension(), |
| 406 GetExtension(), | 492 instance_id_, |
| 407 instance_id_, | 493 base::Bind( |
| 408 base::Bind(&BluetoothLowEnergyReadCharacteristicValueFunction:: | 494 &BluetoothLowEnergyReadCharacteristicValueFunction::SuccessCallback, |
| 409 SuccessCallback, | 495 this), |
| 410 this), | 496 base::Bind( |
| 411 base::Bind( | 497 &BluetoothLowEnergyReadCharacteristicValueFunction::ErrorCallback, |
| 412 &BluetoothLowEnergyReadCharacteristicValueFunction::ErrorCallback, | 498 this)); |
| 413 this)); | |
| 414 if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) { | |
| 415 SetError(StatusToString(status)); | |
| 416 SendResponse(false); | |
| 417 return false; | |
| 418 } | |
| 419 | 499 |
| 420 return true; | 500 return true; |
| 421 } | 501 } |
| 422 | 502 |
| 423 void BluetoothLowEnergyReadCharacteristicValueFunction::SuccessCallback() { | 503 void BluetoothLowEnergyReadCharacteristicValueFunction::SuccessCallback() { |
| 424 // Obtain info on the characteristic and see whether or not the characteristic | 504 // Obtain info on the characteristic and see whether or not the characteristic |
| 425 // is still around. | 505 // is still around. |
| 426 apibtle::Characteristic characteristic; | 506 apibtle::Characteristic characteristic; |
| 427 BluetoothLowEnergyEventRouter::Status status = | 507 BluetoothLowEnergyEventRouter::Status status = |
| 428 GetEventRouter(browser_context()) | 508 GetEventRouter(browser_context()) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 458 SetError(kErrorAdapterNotInitialized); | 538 SetError(kErrorAdapterNotInitialized); |
| 459 SendResponse(false); | 539 SendResponse(false); |
| 460 return false; | 540 return false; |
| 461 } | 541 } |
| 462 | 542 |
| 463 scoped_ptr<apibtle::WriteCharacteristicValue::Params> params( | 543 scoped_ptr<apibtle::WriteCharacteristicValue::Params> params( |
| 464 apibtle::WriteCharacteristicValue::Params::Create(*args_)); | 544 apibtle::WriteCharacteristicValue::Params::Create(*args_)); |
| 465 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); | 545 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); |
| 466 | 546 |
| 467 std::vector<uint8> value(params->value.begin(), params->value.end()); | 547 std::vector<uint8> value(params->value.begin(), params->value.end()); |
| 468 | 548 event_router->WriteCharacteristicValue( |
| 469 BluetoothLowEnergyEventRouter::Status status = | 549 GetExtension(), |
| 470 event_router->WriteCharacteristicValue( | 550 params->characteristic_id, |
| 471 GetExtension(), | 551 value, |
| 472 params->characteristic_id, | 552 base::Bind( |
| 473 value, | 553 &BluetoothLowEnergyWriteCharacteristicValueFunction::SuccessCallback, |
| 474 base::Bind(&BluetoothLowEnergyWriteCharacteristicValueFunction:: | 554 this), |
| 475 SuccessCallback, | 555 base::Bind( |
| 476 this), | 556 &BluetoothLowEnergyWriteCharacteristicValueFunction::ErrorCallback, |
| 477 base::Bind(&BluetoothLowEnergyWriteCharacteristicValueFunction:: | 557 this)); |
| 478 ErrorCallback, | |
| 479 this)); | |
| 480 if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) { | |
| 481 SetError(StatusToString(status)); | |
| 482 SendResponse(false); | |
| 483 return false; | |
| 484 } | |
| 485 | 558 |
| 486 return true; | 559 return true; |
| 487 } | 560 } |
| 488 | 561 |
| 489 void BluetoothLowEnergyWriteCharacteristicValueFunction::SuccessCallback() { | 562 void BluetoothLowEnergyWriteCharacteristicValueFunction::SuccessCallback() { |
| 490 results_ = apibtle::WriteCharacteristicValue::Results::Create(); | 563 results_ = apibtle::WriteCharacteristicValue::Results::Create(); |
| 491 SendResponse(true); | 564 SendResponse(true); |
| 492 } | 565 } |
| 493 | 566 |
| 494 void BluetoothLowEnergyWriteCharacteristicValueFunction::ErrorCallback( | 567 void BluetoothLowEnergyWriteCharacteristicValueFunction::ErrorCallback( |
| (...skipping 14 matching lines...) Expand all Loading... |
| 509 SetError(kErrorAdapterNotInitialized); | 582 SetError(kErrorAdapterNotInitialized); |
| 510 SendResponse(false); | 583 SendResponse(false); |
| 511 return false; | 584 return false; |
| 512 } | 585 } |
| 513 | 586 |
| 514 scoped_ptr<apibtle::ReadDescriptorValue::Params> params( | 587 scoped_ptr<apibtle::ReadDescriptorValue::Params> params( |
| 515 apibtle::ReadDescriptorValue::Params::Create(*args_)); | 588 apibtle::ReadDescriptorValue::Params::Create(*args_)); |
| 516 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); | 589 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); |
| 517 | 590 |
| 518 instance_id_ = params->descriptor_id; | 591 instance_id_ = params->descriptor_id; |
| 519 BluetoothLowEnergyEventRouter::Status status = | 592 event_router->ReadDescriptorValue( |
| 520 event_router->ReadDescriptorValue( | 593 GetExtension(), |
| 521 GetExtension(), | 594 instance_id_, |
| 522 instance_id_, | 595 base::Bind( |
| 523 base::Bind( | 596 &BluetoothLowEnergyReadDescriptorValueFunction::SuccessCallback, |
| 524 &BluetoothLowEnergyReadDescriptorValueFunction::SuccessCallback, | 597 this), |
| 525 this), | 598 base::Bind(&BluetoothLowEnergyReadDescriptorValueFunction::ErrorCallback, |
| 526 base::Bind( | 599 this)); |
| 527 &BluetoothLowEnergyReadDescriptorValueFunction::ErrorCallback, | |
| 528 this)); | |
| 529 if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) { | |
| 530 SetError(StatusToString(status)); | |
| 531 SendResponse(false); | |
| 532 return false; | |
| 533 } | |
| 534 | 600 |
| 535 return true; | 601 return true; |
| 536 } | 602 } |
| 537 | 603 |
| 538 void BluetoothLowEnergyReadDescriptorValueFunction::SuccessCallback() { | 604 void BluetoothLowEnergyReadDescriptorValueFunction::SuccessCallback() { |
| 539 // Obtain info on the descriptor and see whether or not the descriptor is | 605 // Obtain info on the descriptor and see whether or not the descriptor is |
| 540 // still around. | 606 // still around. |
| 541 apibtle::Descriptor descriptor; | 607 apibtle::Descriptor descriptor; |
| 542 BluetoothLowEnergyEventRouter::Status status = | 608 BluetoothLowEnergyEventRouter::Status status = |
| 543 GetEventRouter(browser_context()) | 609 GetEventRouter(browser_context()) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 573 SetError(kErrorAdapterNotInitialized); | 639 SetError(kErrorAdapterNotInitialized); |
| 574 SendResponse(false); | 640 SendResponse(false); |
| 575 return false; | 641 return false; |
| 576 } | 642 } |
| 577 | 643 |
| 578 scoped_ptr<apibtle::WriteDescriptorValue::Params> params( | 644 scoped_ptr<apibtle::WriteDescriptorValue::Params> params( |
| 579 apibtle::WriteDescriptorValue::Params::Create(*args_)); | 645 apibtle::WriteDescriptorValue::Params::Create(*args_)); |
| 580 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); | 646 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); |
| 581 | 647 |
| 582 std::vector<uint8> value(params->value.begin(), params->value.end()); | 648 std::vector<uint8> value(params->value.begin(), params->value.end()); |
| 583 | 649 event_router->WriteDescriptorValue( |
| 584 BluetoothLowEnergyEventRouter::Status status = | 650 GetExtension(), |
| 585 event_router->WriteDescriptorValue( | 651 params->descriptor_id, |
| 586 GetExtension(), | 652 value, |
| 587 params->descriptor_id, | 653 base::Bind( |
| 588 value, | 654 &BluetoothLowEnergyWriteDescriptorValueFunction::SuccessCallback, |
| 589 base::Bind( | 655 this), |
| 590 &BluetoothLowEnergyWriteDescriptorValueFunction::SuccessCallback, | 656 base::Bind(&BluetoothLowEnergyWriteDescriptorValueFunction::ErrorCallback, |
| 591 this), | 657 this)); |
| 592 base::Bind( | |
| 593 &BluetoothLowEnergyWriteDescriptorValueFunction::ErrorCallback, | |
| 594 this)); | |
| 595 if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) { | |
| 596 SetError(StatusToString(status)); | |
| 597 SendResponse(false); | |
| 598 return false; | |
| 599 } | |
| 600 | 658 |
| 601 return true; | 659 return true; |
| 602 } | 660 } |
| 603 | 661 |
| 604 void BluetoothLowEnergyWriteDescriptorValueFunction::SuccessCallback() { | 662 void BluetoothLowEnergyWriteDescriptorValueFunction::SuccessCallback() { |
| 605 results_ = apibtle::WriteDescriptorValue::Results::Create(); | 663 results_ = apibtle::WriteDescriptorValue::Results::Create(); |
| 606 SendResponse(true); | 664 SendResponse(true); |
| 607 } | 665 } |
| 608 | 666 |
| 609 void BluetoothLowEnergyWriteDescriptorValueFunction::ErrorCallback( | 667 void BluetoothLowEnergyWriteDescriptorValueFunction::ErrorCallback( |
| 610 BluetoothLowEnergyEventRouter::Status status) { | 668 BluetoothLowEnergyEventRouter::Status status) { |
| 611 SetError(StatusToString(status)); | 669 SetError(StatusToString(status)); |
| 612 SendResponse(false); | 670 SendResponse(false); |
| 613 } | 671 } |
| 614 | 672 |
| 615 } // namespace api | 673 } // namespace api |
| 616 } // namespace extensions | 674 } // namespace extensions |
| OLD | NEW |