2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
21 #include <JSWebAPIErrorFactory.h>
23 #include <TimeTracer.h>
24 #include "plugin_config_impl.h"
25 #include "BluetoothAdapter.h"
26 #include "BluetoothCallbackUtil.h"
27 #include "JSBluetoothDevice.h"
28 #include "JSBluetoothServiceHandler.h"
29 #include "JSBluetoothSocket.h"
30 #include "GlobalContextManager.h"
32 using namespace DeviceAPI::Common;
37 void BluetoothAdapter::onStateChangedCB(int result, bt_adapter_state_e adapterState, void *userData)
39 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 1);
41 BluetoothAdapterPtr object = static_cast<BluetoothAdapterPtr>(userData);
43 LoggerW("userData is NULL");
47 bool previousState = object->mEnabled;
48 object->mEnabled = (adapterState == BT_ADAPTER_ENABLED) ? true : false;
49 if(object->mEnabled == true) {
50 object->mVisible = object->getVisible();
53 // call onstatechanged in ChangeListener
54 if(previousState != object->mEnabled && result == BT_ERROR_NONE && object->mChangeListener != NULL) {
55 LoggerD("call onstatechanged in ChangeListener");
56 object->mChangeListener->invokeCallback("onstatechanged", JSUtil::toJSValueRef(object->mChangeListener->getContext(), object->mEnabled));
59 // call a result callback of setPowered()
60 if(object->mUserDataList[SET_POWERED] != NULL) { // requested event
61 LoggerD("call a result callback of setPowered()");
62 if(object->mRequestedState != object->mEnabled) {
63 LoggerW("Requested state is not equal to current state");
67 MultiCallbackUserDataPtr callback = static_cast<MultiCallbackUserDataPtr>(object->mUserDataList[SET_POWERED]);
68 object->mUserDataList[SET_POWERED].reset();
70 if(result == BT_ERROR_NONE) {
72 callback->invokeCallback("success");
74 else if(result == BT_ERROR_RESOURCE_BUSY) {
76 JSContextRef context = callback->getContext();
77 ServiceNotAvailableException error("Bluetooth device is busy");
78 callback->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(context, error));
83 JSContextRef context = callback->getContext();
84 UnknownException error("Unknown error");
85 callback->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(context, error));
89 else { // unexpected event
90 LoggerW("Bluetooth state is changed unexpectedly");
93 TIME_TRACER_ITEM_END(__FUNCTION__, 1);
96 void BluetoothAdapter::onNameChangedCB(char *name, void *userData)
98 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 1);
100 BluetoothAdapterPtr object = static_cast<BluetoothAdapterPtr>(userData);
102 LoggerW("userData is NULL");
106 LoggerD("changed name: " << std::string(name));
107 // call onnamechanged in ChangeListener
108 if(object->mChangeListener != NULL) {
109 LoggerD("call onnamechanged in ChangeListener");
110 object->mChangeListener->invokeCallback("onnamechanged", JSUtil::toJSValueRef(object->mChangeListener->getContext(), std::string(name)));
113 // call a result callback of setName()
114 if(object->mUserDataList[SET_NAME] != NULL && !strcmp(object->mRequestedName.c_str(), name)) { // requested event
115 MultiCallbackUserDataPtr callback = static_cast<MultiCallbackUserDataPtr>(object->mUserDataList[SET_NAME]);
116 object->mUserDataList[SET_NAME].reset();
118 callback->invokeCallback("success");
120 //bt_adapter_unset_name_changed_cb();
122 else { // unexpected event
123 LoggerW("Bluetooth name is changed unexpectedly");
126 TIME_TRACER_ITEM_END(__FUNCTION__, 1);
129 void BluetoothAdapter::onVisibilityChangedCB(int result, bt_adapter_visibility_mode_e visibilityMode, void *userData)
131 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 1);
133 BluetoothAdapterPtr object = static_cast<BluetoothAdapterPtr>(userData);
135 LoggerW("userData is NULL");
139 bool previousVisible = object->mVisible;
140 object->mVisible = (visibilityMode != BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE) ? true : false;
142 // call onvisibilitychanged in ChangeListener
143 if(object->mChangeListener != NULL) {
144 if(previousVisible != object->mVisible) {
145 LoggerD("call onvisibilitychanged in ChangeListener");
146 object->mChangeListener->invokeCallback("onvisibilitychanged", JSUtil::toJSValueRef(object->mChangeListener->getContext(), object->mVisible));
150 // call a result callback of setVisible()
151 if(object->mUserDataList[SET_VISIBLE] != NULL) { // requested event
152 //bool visibility = (visibilityMode == BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE) ? false : true;
153 if(object->mRequestedVisibility != visibilityMode) {
154 LoggerW("Requested visibility is not same to current visibility");
158 MultiCallbackUserDataPtr callback = static_cast<MultiCallbackUserDataPtr>(object->mUserDataList[SET_VISIBLE]);
159 object->mUserDataList[SET_VISIBLE].reset();
161 if(result == BT_ERROR_NONE) {
163 callback->invokeCallback("success");
167 JSContextRef context = callback->getContext();
168 UnknownException error("Unknown error");
169 callback->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(context, error));
173 //bt_adapter_unset_visibility_mode_changed_cb();
175 else { // unexpected event
176 LoggerW("Bluetooth visibility is changed unexpectedly");
179 TIME_TRACER_ITEM_END(__FUNCTION__, 1);
182 void BluetoothAdapter::onDiscoveryStateChangedCB(int result, bt_adapter_device_discovery_state_e discoveryState,
183 bt_adapter_device_discovery_info_s *discoveryInfo, void *userData)
185 BluetoothAdapterPtr object = static_cast<BluetoothAdapterPtr>(userData);
187 LoggerW("userData is NULL");
191 switch(discoveryState) {
192 case BT_ADAPTER_DEVICE_DISCOVERY_STARTED:
194 LoggerD("Discovery started");
195 if(object->mUserDataList[DISCOVER_DEVICES] != NULL) { // requested event
196 MultiCallbackUserDataPtr callback =
197 static_cast<MultiCallbackUserDataPtr>(object->mUserDataList[DISCOVER_DEVICES]);
199 if(result == BT_ERROR_NONE) {
201 // store MAC address of previously found device into mDisappearedDevices
202 object->mDisappearedDevices.clear();
203 for(std::vector<BluetoothDeviceSharedPtr>::iterator iter = object->mFoundDevices.begin();
204 iter != object->mFoundDevices.end(); iter++) {
205 BluetoothDeviceSharedPtr foundDevice = *iter;
206 object->mDisappearedDevices.push_back(foundDevice->getAddress());
209 object->mFoundDevices.clear();
211 callback->invokeCallback("onstarted");
215 object->mUserDataList[DISCOVER_DEVICES].reset();
217 JSContextRef context = callback->getContext();
218 UnknownException error("Unknown error");
219 callback->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(context, error));
223 if(object->mUserDataList[STOP_DISCOVERY] == NULL) // because same core API callback is used
224 bt_adapter_unset_device_discovery_state_changed_cb();
228 else { // unexpected event
229 LoggerW("Unexpected discovery");
233 case BT_ADAPTER_DEVICE_DISCOVERY_FINISHED:
235 LoggerD("Discovery finished");
236 if(result == BT_ERROR_NONE || result == BT_ERROR_CANCELLED) {
237 // in case of discoverDevices()
238 if(object->mUserDataList[DISCOVER_DEVICES] != NULL) {
239 MultiCallbackUserDataPtr callback =
240 static_cast<MultiCallbackUserDataPtr>(object->mUserDataList[DISCOVER_DEVICES]);
243 if(object->mDisappearedDevices.size() > 0) {
244 LoggerD("There are disappeared devices");
245 for(std::vector<std::string>::iterator iter = object->mDisappearedDevices.begin();
246 iter != object->mDisappearedDevices.end(); iter++) {
248 callback->invokeCallback("ondevicedisappeared",
249 JSUtil::toJSValueRef(callback->getContext(), *iter));
253 if(object->mFoundDevices.size() > 0) { // There are found devices
254 LoggerD("There are found devices");
255 int num = object->mFoundDevices.size();
256 JSObjectRef devices[num];
257 for(int i = 0; i < num; i++) {
258 JSObjectRef deviceObj = JSBluetoothDevice::createJSObject(callback->getContext(), object->mFoundDevices[i]);
259 devices[i] = deviceObj;
262 object->mUserDataList[DISCOVER_DEVICES].reset();
264 callback->invokeCallback(
266 JSObjectMakeArray(callback->getContext(), num, devices, NULL) );
268 else { // There is no found device
269 LoggerD("There is no found device");
270 object->mUserDataList[DISCOVER_DEVICES].reset();
272 callback->invokeCallback(
274 JSObjectMakeArray(callback->getContext(), 0, NULL, NULL) );
279 // in case of stopDiscovery()
280 if(object->mUserDataList[STOP_DISCOVERY] != NULL) {
281 MultiCallbackUserDataPtr callback =
282 static_cast<MultiCallbackUserDataPtr>(object->mUserDataList[STOP_DISCOVERY]);
285 LoggerD("Call successCallback of stopDiscovery()");
286 object->mUserDataList[STOP_DISCOVERY].reset();
287 callback->invokeCallback("success");
291 //bt_adapter_unset_device_discovery_state_changed_cb();
294 LoggerW("Unexpected result of discovery finish");
298 case BT_ADAPTER_DEVICE_DISCOVERY_FOUND:
300 LoggerD("A device is found");
302 LoggerW("No information about found device");
306 if(object->mUserDataList[DISCOVER_DEVICES] != NULL) { // requested event
307 MultiCallbackUserDataPtr callback =
308 static_cast<MultiCallbackUserDataPtr>(object->mUserDataList[DISCOVER_DEVICES]);
310 if(result == BT_ERROR_NONE) {
311 // create BluetoothDevice
312 BluetoothDeviceSharedPtr device(new BluetoothDevice(discoveryInfo));
313 device->copyAceCheckAccessFunction(getInstance());
314 JSContextRef context = callback->getContext();
315 JSObjectRef deviceObj = JSBluetoothDevice::createJSObject(context, device);
316 object->mFoundDevices.push_back(device);
318 // remove MAC address of found device from mDisappearedDevices
319 for(std::vector<std::string>::iterator iter = object->mDisappearedDevices.begin();
320 iter != object->mDisappearedDevices.end(); iter++) {
321 if(!strcmp(discoveryInfo->remote_address, (*iter).c_str())) {
322 object->mDisappearedDevices.erase(iter);
328 callback->invokeCallback("ondevicefound", deviceObj);
331 LoggerW("Unexpected result of discovery");
334 else { // unexpected event
335 LoggerW("Unexpected discovery");
341 LoggerW("Unknown state");
346 bool BluetoothAdapter::foreachBondedDevicesCB(bt_device_info_s *deviceInfo, void *userData)
348 BluetoothAdapterPtr adapter = static_cast<BluetoothAdapterPtr>(userData);
350 LoggerW("userData is NULL");
354 if(deviceInfo == NULL) {
355 LoggerW("deviceInfo is NULL");
359 std::vector<BluetoothDeviceSharedPtr>::iterator iter;
360 for(iter = adapter->knownDevices.begin(); iter != adapter->knownDevices.end(); ++iter) {
361 BluetoothDeviceSharedPtr foundDevice = *iter;
363 if(!strcmp(foundDevice->getAddress().c_str(), deviceInfo->remote_address)) {
364 foundDevice->updateInfo(deviceInfo);
369 if(iter == adapter->knownDevices.end()) {
370 BluetoothDeviceSharedPtr device(new BluetoothDevice(deviceInfo));
371 device->copyAceCheckAccessFunction(getInstance());
372 adapter->knownDevices.push_back(device);
378 void BluetoothAdapter::onBondCreatedCB(int result, bt_device_info_s *deviceInfo, void *userData)
380 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 1);
382 BluetoothAdapterPtr object = static_cast<BluetoothAdapterPtr>(userData);
384 LoggerW("userData is NULL");
389 LoggerW("deviceInfo is NULL");
393 if(object->mUserDataList[CREATE_BONDING] != NULL &&
394 !strcmp(object->mCreateBondingAddress.c_str(), deviceInfo->remote_address)) { // requested event
396 MultiCallbackUserDataPtr callback = static_cast<MultiCallbackUserDataPtr>(object->mUserDataList[CREATE_BONDING]);
397 object->mUserDataList[CREATE_BONDING].reset();
399 if(result == BT_ERROR_NONE && deviceInfo != NULL) {
401 BluetoothDeviceSharedPtr device(new BluetoothDevice(deviceInfo));
402 device->copyAceCheckAccessFunction(getInstance());
403 JSContextRef context = callback->getContext();
404 JSObjectRef deviceObj = JSBluetoothDevice::createJSObject(context, device);
405 callback->invokeCallback("success", deviceObj);
408 else if(result == BT_ERROR_REMOTE_DEVICE_NOT_FOUND) {
410 LoggerE("Not found");
411 JSContextRef context = callback->getContext();
412 NotFoundException error("Not found");
413 callback->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(context, error));
418 JSContextRef context = callback->getContext();
419 UnknownException error("Unknown error");
420 callback->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(context, error));
424 bt_device_unset_bond_created_cb();
425 object->mCreateBondingAddress.clear();
427 else { // unexpected event
428 LoggerW("A bonding is created unexpectedly");
431 TIME_TRACER_ITEM_END(__FUNCTION__, 1);
434 void BluetoothAdapter::onBondDestroyedCB(int result, char *remoteAddress, void *userData)
436 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 1);
438 BluetoothAdapterPtr object = static_cast<BluetoothAdapterPtr>(userData);
440 LoggerW("userData is NULL");
444 if(object->mUserDataList[DESTROY_BONDING] != NULL &&
445 !strcmp(object->mDestroyBondingAddress.c_str(), remoteAddress)) { // requested event
447 MultiCallbackUserDataPtr callback = static_cast<MultiCallbackUserDataPtr>(object->mUserDataList[DESTROY_BONDING]);
448 object->mUserDataList[DESTROY_BONDING].reset();
450 if(result == BT_ERROR_NONE) {
452 callback->invokeCallback("success");
456 JSContextRef context = callback->getContext();
457 UnknownException error("Unknown error");
458 callback->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(context, error));
462 bt_device_unset_bond_destroyed_cb();
463 object->mDestroyBondingAddress.clear();
465 else { // unexpected event
466 LoggerW("A bonding is destroyed unexpectedly");
469 TIME_TRACER_ITEM_END(__FUNCTION__, 1);
472 void BluetoothAdapter::onSocketConnected(int result, bt_socket_connection_state_e state, bt_socket_connection_s *connection, void *userData)
474 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 1);
476 BluetoothAdapterPtr object = static_cast<BluetoothAdapterPtr>(userData);
478 LoggerW("userData is NULL");
483 LoggerW("connection is NULL");
487 if(connection->local_role == BT_SOCKET_SERVER) {
488 RegisteredUUIDMapT::iterator iter = object->mRegisteredUUID.find(connection->service_uuid);
489 if(iter == object->mRegisteredUUID.end()) {
490 LoggerW("Connection state is changed unexpectedly");
494 if(state == BT_SOCKET_CONNECTED) { // connected when Server
495 if(result == BT_ERROR_NONE) {
496 // Update BluetoothServiceHandler
497 BluetoothServiceHandlerPtr service = iter->second;
498 service->setConnectionState(true);
500 // Call BluetoothServiceHandler.onconnect
501 BluetoothSocketPtr socket = new BluetoothSocket(connection, getInstance());
502 MultiCallbackUserDataPtr callback = service->getOnConnect();
503 JSContextRef context = callback->getContext();
504 JSObjectRef socketObj = JSBluetoothSocket::createJSObject(context, socket);
506 callback->invokeCallback("onconnect", socketObj);
508 // Update mConnectedSocket
509 object->mConnectedSocket.insert(std::pair<int, BluetoothSocketPtr>(connection->socket_fd, socket));
510 bt_socket_set_data_received_cb(onSocketReceivedCB, userData);
513 LoggerW("Establishing a connection failed");
517 else { // disconnected when Server
518 if(result == BT_ERROR_NONE) {
519 // Update BluetoothServiceHandler
520 BluetoothServiceHandlerPtr service = iter->second;
521 service->setConnectionState(false);
523 // call BluetoothSocket.onclose;
524 ConnectedSocketMapT::iterator i = object->mConnectedSocket.find(connection->socket_fd);
525 if(i == object->mConnectedSocket.end()) {
526 LoggerW("Unknown connected socket");
529 //BluetoothSocketSharedPtr socket = i->second;
530 BluetoothSocketPtr socket = i->second;
531 socket->setConnectionState(false);
532 MultiCallbackUserDataPtr callback = socket->getOnClose();
534 callback->invokeCallback("onclose");
536 // Update mConnectedSocket
537 object->mConnectedSocket.erase(i);
540 LoggerW("Disconnecting a connection failed");
544 else if(connection->local_role == BT_SOCKET_CLIENT) {
546 if(state == BT_SOCKET_CONNECTED) { // connected when Client
547 std::string remoteAddress(connection->remote_address);
548 ConnReqMultiMapT::iterator iter;
550 iter = object->mConnReqMap.find(remoteAddress);
551 if(iter != object->mConnReqMap.end() && !strcmp(iter->second->mUUID.c_str(), connection->service_uuid)) {
554 } while(iter != object->mConnReqMap.end());
556 if(iter == object->mConnReqMap.end()) {
557 LoggerW("Connection state is changed unexpectedly");
561 MultiCallbackUserDataPtr callback = static_cast<MultiCallbackUserDataPtr>(iter->second->mUserData);
563 if(result == BT_ERROR_NONE) {
564 // Update mConnectedSocket
565 BluetoothSocketPtr socket = new BluetoothSocket(connection, getInstance());
567 object->mConnectedSocket.insert(std::pair<int, BluetoothSocketPtr>(connection->socket_fd, socket));
568 bt_socket_set_data_received_cb(onSocketReceivedCB, userData);
570 // Call successcallback of connectToServiceByUUID
571 JSContextRef context = callback->getContext();
572 JSObjectRef socketObj = JSBluetoothSocket::createJSObject(context, socket);
574 callback->invokeCallback("success", socketObj);
576 // Update mConnReqMap
577 object->mConnReqMap.erase(iter);
580 // Call errorcallback of connectToServiceByUUID
581 JSContextRef context = callback->getContext();
582 NotFoundException error("Not found");
584 callback->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(context, error));
586 // Update mConnReqMap
587 object->mConnReqMap.erase(iter);
591 else { // disconnected when Client
592 if(result == BT_ERROR_NONE) {
593 // call BluetoothSocket.onclose;
594 ConnectedSocketMapT::iterator i = object->mConnectedSocket.find(connection->socket_fd);
595 if(i == object->mConnectedSocket.end()) {
596 LoggerW("Unknown connected socket");
600 BluetoothSocketPtr socket = i->second;
601 socket->setConnectionState(false);
602 MultiCallbackUserDataPtr callback = socket->getOnClose();
604 callback->invokeCallback("onclose");
606 // Update mConnectedSocket
607 object->mConnectedSocket.erase(i);
610 LoggerW("Disconnecting a connection failed");
615 LoggerW("Unknown role");
619 if(object->mConnectedSocket.size() == 0) {
620 bt_socket_unset_data_received_cb();
623 if(object->mRegisteredUUID.size() == 0 && object->mConnReqMap.size() == 0 && object->mConnectedSocket.size() == 0) {
624 bt_socket_unset_connection_state_changed_cb();
627 TIME_TRACER_ITEM_END(__FUNCTION__, 1);
630 void BluetoothAdapter::onSocketReceivedCB(bt_socket_received_data_s *data, void *userData)
632 BluetoothAdapterPtr object = static_cast<BluetoothAdapterPtr>(userData);
634 LoggerW("userData is NULL");
639 LoggerW("data is NULL");
643 ConnectedSocketMapT::iterator i = object->mConnectedSocket.find(data->socket_fd);
644 if(i == object->mConnectedSocket.end()) {
645 LoggerW("Unknown connected socket");
649 // Store received data
650 BluetoothSocketPtr socket = i->second;
651 socket->storeRecivedData(data->data, static_cast<unsigned long>(data->data_size));
653 // Call BluetoothSocket.onmessage
654 MultiCallbackUserDataPtr callback = socket->getOnMessage();
656 callback->invokeCallback("onmessage");
659 BluetoothAdapter::BluetoothAdapter():
660 mEnabled(false), mVisible(false)
662 Common::SecurityAccessor();
664 bt_adapter_state_e state;
665 if (bt_adapter_get_state(&state) == BT_ERROR_NONE) {
666 if (state == BT_ADAPTER_ENABLED) {
671 bt_adapter_visibility_mode_e mode;
672 if (bt_adapter_get_visibility(&mode, NULL) == BT_ERROR_NONE) {
673 if (mode != BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE) {
678 if(bt_adapter_set_state_changed_cb(onStateChangedCB, this) != BT_ERROR_NONE) {
679 LoggerE("bt_adapter_set_state_changed_cb() failed");
682 if(bt_adapter_set_device_discovery_state_changed_cb(onDiscoveryStateChangedCB, this) != BT_ERROR_NONE) {
683 LoggerE("bt_adapter_set_device_discovery_state_changed_cb() failed");
686 if(bt_adapter_set_name_changed_cb(onNameChangedCB, this) != BT_ERROR_NONE) {
687 LoggerE("bt_adapter_set_name_changed_cb() failed");
690 if(bt_adapter_set_visibility_mode_changed_cb(onVisibilityChangedCB, this) != BT_ERROR_NONE) {
691 LoggerE("bt_adapter_set_visibility_mode_changed_cb() failed");
695 BluetoothAdapter::~BluetoothAdapter()
697 // unset platform callback
698 bt_adapter_unset_state_changed_cb();
699 bt_adapter_unset_name_changed_cb();
700 bt_adapter_unset_visibility_mode_changed_cb();
701 bt_adapter_unset_device_discovery_state_changed_cb();
702 bt_device_unset_bond_created_cb();
703 bt_device_unset_bond_destroyed_cb();
704 bt_socket_unset_connection_state_changed_cb();
705 bt_socket_unset_data_received_cb();
708 for(int i = 0; i <= DESTROY_BONDING; i++) {
709 mUserDataList[i].reset();
711 mRegisteredUUID.clear();
713 mFoundDevices.clear();
714 mConnectedSocket.clear();
719 void BluetoothAdapter::unloadFrame(JSContextRef context)
721 LoggerD("Clean mUserDataList");
722 for(int i = 0; i <= DESTROY_BONDING; i++) {
723 if(mUserDataList[i]) {
724 MultiCallbackUserDataPtr callback = mUserDataList[i];
725 if(!GlobalContextManager::getInstance()->isAliveGlobalContext(callback->getContext())) {
726 mUserDataList[i].reset();
731 LoggerD("Clean mConnReqMap");
732 for(ConnReqMultiMapT::iterator iter = mConnReqMap.begin(); iter != mConnReqMap.end(); ) {
733 ConnReqMultiMapT::iterator temp = iter++;
734 MultiCallbackUserDataPtr callback = temp->second->mUserData;
735 if(!callback && !GlobalContextManager::getInstance()->isAliveGlobalContext(callback->getContext())) {
736 mConnReqMap.erase(temp);
741 void BluetoothAdapter::unregisterUUID(std::string &uuid)
743 mRegisteredUUID.erase(mRegisteredUUID.find(uuid));
744 if(mRegisteredUUID.size() == 0 && mConnReqMap.size() == 0 && mConnectedSocket.size() == 0) {
745 bt_socket_unset_connection_state_changed_cb();
749 bool BluetoothAdapter::closeConnectedSocket(int socket)
751 if(mEnabled == true) {
752 ConnectedSocketMapT::iterator iter = mConnectedSocket.find(socket);
753 if(iter == mConnectedSocket.end()) {
754 LoggerW("Already disconnected");
758 mConnectedSocket.erase(iter);
759 if(mConnectedSocket.size() == 0) {
760 bt_socket_unset_data_received_cb();
763 if(mRegisteredUUID.size() == 0 && mConnReqMap.size() == 0 && mConnectedSocket.size() == 0) {
764 bt_socket_unset_connection_state_changed_cb();
770 LoggerE("Bluetooth is not powered");
775 void BluetoothAdapter::removeConnReq(std::string &remoteAddress)
777 mConnReqMap.erase(remoteAddress);
779 if(mRegisteredUUID.size() == 0 && mConnReqMap.size() == 0 && mConnectedSocket.size() == 0) {
780 if(bt_socket_unset_connection_state_changed_cb() != BT_ERROR_NONE) {
781 LoggerW("Unsetting connection event callback failed");
786 BluetoothAdapter* BluetoothAdapter::getInstance()
788 static BluetoothAdapter instance;
792 bool BluetoothAdapter::isValidAddress(std::string &address)
794 pcrecpp::RE re("(([0-9a-zA-Z]+):)+([0-9a-zA-Z]+)");
795 std::string compareAddress = "00:12:47:08:9A:A6";
797 if (!re.FullMatch(address)) {
798 LoggerE("Invalid address");
802 if (address.size() != compareAddress.size())
804 LoggerE("Invalid size");
811 bool BluetoothAdapter::isValidUUID(std::string &uuid)
813 pcrecpp::RE re("(([0-9a-zA-Z]+)-)+([0-9a-zA-Z]+)");
814 std::string compareUUID = "00001101-0000-1000-8000-00805F9B34FB";
816 if (!re.FullMatch(uuid))
818 LoggerE("Invalid UUID");
822 if (uuid.size() != compareUUID.size())
824 LoggerE("Invalid size");
831 std::string BluetoothAdapter::getName() const
834 std::string str = "";
836 TIME_TRACER_ITEM_BEGIN("getName::bt_adapter_get_name", 1);
837 if(bt_adapter_get_name(&name) == BT_ERROR_NONE) {
838 TIME_TRACER_ITEM_END("getName::bt_adapter_get_name", 1);
846 TIME_TRACER_ITEM_END("getName::bt_adapter_get_name", 1);
847 LoggerE("bt_adapter_get_name() failed");
853 void BluetoothAdapter::setName(std::string &name, MultiCallbackUserDataPtr userData)
855 if(mEnabled == true) {
856 std::string adapterName = getName();
857 if(adapterName == name) { // in case of same name
858 LoggerD("same name");
859 BluetoothCallbackUtil::syncToAsyncSuccessCallback(userData);
863 if(mUserDataList[SET_NAME] == NULL) {
864 mUserDataList[SET_NAME] = userData;
866 LoggerE("Already requested");
867 UnknownException *error = new UnknownException("Already requested");
868 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
872 TIME_TRACER_ITEM_BEGIN("setName::bt_adapter_set_name", 1);
873 int ret = bt_adapter_set_name(name.c_str());
874 TIME_TRACER_ITEM_END("setName::bt_adapter_set_name", 1);
879 LoggerD("bt_adapter_set_name() succeeded");
880 mRequestedName = name;
883 case BT_ERROR_INVALID_PARAMETER:
885 LoggerE("Invalid value");
886 InvalidValuesException *error = new InvalidValuesException("Invalid value");
887 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
892 LoggerE("Invalid value");
893 UnknownException *error = new UnknownException("Unknown exception");
894 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
898 //TIME_TRACER_ITEM_BEGIN("setName::bt_adapter_unset_name_changed_cb", 1);
899 //bt_adapter_unset_name_changed_cb();
900 //TIME_TRACER_ITEM_END("setName::bt_adapter_unset_name_changed_cb", 1);
901 mUserDataList[SET_NAME].reset();
902 } else { // Not enabled
903 LoggerE("Bluetooth device is turned off");
904 ServiceNotAvailableException *error = new ServiceNotAvailableException("Bluetooth device is turned off");
905 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
909 std::string BluetoothAdapter::getAddress() const
911 char* address = NULL;
912 std::string str = "";
914 if (bt_adapter_get_address(&address) == BT_ERROR_NONE) {
915 if (address != NULL) {
920 LoggerW("address is NULL");
924 LoggerE("bt_adapter_get_address() failed");
930 bool BluetoothAdapter::getPowered() const
935 void BluetoothAdapter::setPowered(bool powered, MultiCallbackUserDataPtr userData)
937 TIME_TRACER_ITEM_BEGIN("setPowered::check current state", 1);
939 if(powered == mEnabled) {
940 LoggerD("same state");
941 BluetoothCallbackUtil::syncToAsyncSuccessCallback(userData);
945 if(mUserDataList[SET_POWERED] == NULL) {
946 mUserDataList[SET_POWERED] = userData;
949 LoggerE("Already requested");
950 ServiceNotAvailableException *error = new ServiceNotAvailableException("Already requested");
951 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
955 TIME_TRACER_ITEM_END("setPowered::check current state", 1);
957 mRequestedState = powered;
958 if(powered == true) {
959 TIME_TRACER_ITEM_BEGIN("setPowered::bt_adapter_enable", 1);
960 int ret = bt_adapter_enable();
961 TIME_TRACER_ITEM_END("setPowered::bt_adapter_enable", 1);
966 LoggerD("bt_adapter_enable() succeeded");
969 case BT_ERROR_ALREADY_DONE:
971 // call successCallback
972 LoggerD("BT_ERROR_ALREADY_DONE");
973 BluetoothCallbackUtil::syncToAsyncSuccessCallback(userData);
976 case BT_ERROR_NOW_IN_PROGRESS:
978 LoggerD("BT_ERROR_NOW_IN_PROGRESS");
979 ServiceNotAvailableException *error = new ServiceNotAvailableException("Bluetooth device is busy");
980 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
985 LoggerD("Unknown error");
986 UnknownException *error = new UnknownException("Unknown error");
987 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
991 TIME_TRACER_ITEM_BEGIN("setPowered::bt_adapter_disable", 1);
992 int ret = bt_adapter_disable();
993 TIME_TRACER_ITEM_END("setPowered::bt_adapter_disable", 1);
998 LoggerD("bt_adapter_disable() succeeded");
1001 case BT_ERROR_NOT_ENABLED:
1003 // call successCallback
1004 LoggerD("Already disabled");
1005 BluetoothCallbackUtil::syncToAsyncSuccessCallback(userData);
1008 case BT_ERROR_NOW_IN_PROGRESS:
1010 LoggerD("BT_ERROR_NOW_IN_PROGRESS");
1011 ServiceNotAvailableException *error = new ServiceNotAvailableException("Bluetooth device is busy");
1012 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1017 LoggerD("Unknown error");
1018 UnknownException *error = new UnknownException("Unknown error");
1019 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1024 mUserDataList[SET_POWERED].reset();
1027 bool BluetoothAdapter::getVisible() const
1029 bt_adapter_visibility_mode_e mode;
1031 if (bt_adapter_get_visibility(&mode, NULL) == BT_ERROR_NONE) {
1032 if (mode != BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE) {
1040 void BluetoothAdapter::setVisible(bool visible, unsigned int timeout, MultiCallbackUserDataPtr userData)
1042 if(mEnabled == true) {
1043 bt_adapter_visibility_mode_e discoverable_mode = BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE;
1044 if(visible == true) {
1046 discoverable_mode = BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE;
1048 discoverable_mode = BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE;
1051 bt_adapter_visibility_mode_e current = BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE;
1054 TIME_TRACER_ITEM_BEGIN("setVisible::bt_adapter_get_visibility", 1);
1055 if(bt_adapter_get_visibility(¤t , &time) != BT_ERROR_NONE) {
1056 LoggerE("bt_adapter_get_visibility() failed");
1057 UnknownException *error = new UnknownException("Can't get current visibility");
1058 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1061 TIME_TRACER_ITEM_END("setVisible::bt_adapter_get_visibility", 1);
1063 if(discoverable_mode == current) {
1064 if(discoverable_mode != BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE) {
1065 LoggerD("same visibility");
1066 BluetoothCallbackUtil::syncToAsyncSuccessCallback(userData);
1069 else if((unsigned int)time == timeout) {
1070 LoggerD("same visibility");
1071 BluetoothCallbackUtil::syncToAsyncSuccessCallback(userData);
1076 if(mUserDataList[SET_VISIBLE] == NULL) {
1077 mUserDataList[SET_VISIBLE] = userData;
1079 UnknownException *error = new UnknownException("Already requested");
1080 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1084 mRequestedVisibility = discoverable_mode;
1085 TIME_TRACER_ITEM_BEGIN("setVisible::bt_adapter_set_visibility", 1);
1086 int ret = bt_adapter_set_visibility(discoverable_mode, timeout);
1087 TIME_TRACER_ITEM_END("setVisible::bt_adapter_set_visibility", 1);
1091 LoggerD("bt_adapter_set_visibility() succeeded");
1094 case BT_ERROR_INVALID_PARAMETER:
1096 InvalidValuesException *error = new InvalidValuesException("Invalid value");
1097 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1102 UnknownException *error = new UnknownException("Unknown error");
1103 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1108 TIME_TRACER_ITEM_BEGIN("setVisible::bt_adapter_unset_visibility_mode_changed_cb", 1);
1109 bt_adapter_unset_visibility_mode_changed_cb();
1110 TIME_TRACER_ITEM_END("setVisible::bt_adapter_unset_visibility_mode_changed_cb", 1);
1112 mUserDataList[SET_VISIBLE].reset();
1113 } else { // Not enabled
1114 ServiceNotAvailableException *error = new ServiceNotAvailableException("Bluetooth device is turned off");
1115 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1120 void BluetoothAdapter::discoverDevices(MultiCallbackUserDataPtr userData)
1122 TIME_TRACER_ITEM_BEGIN("discoverDevices::current state", 1);
1124 if(mUserDataList[DISCOVER_DEVICES] == NULL) {
1125 mUserDataList[DISCOVER_DEVICES] = userData;
1128 if(mUserDataList[STOP_DISCOVERY] == NULL)
1129 bt_adapter_set_device_discovery_state_changed_cb(onDiscoveryStateChangedCB, this);
1132 LoggerE("Already requested");
1133 UnknownException *error = new UnknownException("Already requested");
1134 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1138 TIME_TRACER_ITEM_END("discoverDevices::current state", 1);
1140 if(mEnabled == true) {
1141 TIME_TRACER_ITEM_BEGIN("discoverDevices::bt_adapter_start_device_discovery", 1);
1142 int ret = bt_adapter_start_device_discovery();
1143 TIME_TRACER_ITEM_END("discoverDevices::bt_adapter_start_device_discovery", 1);
1147 LoggerD("bt_adapter_start_device_discovery() succeeded");
1152 LoggerE("Unknown exception");
1153 UnknownException *error = new UnknownException("Unknown error");
1154 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1157 } else { // Not enabled
1158 LoggerE("Bluetooth device is turned off");
1159 ServiceNotAvailableException *error = new ServiceNotAvailableException("Bluetooth device is turned off");
1160 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1163 mUserDataList[DISCOVER_DEVICES].reset();
1165 if(mUserDataList[STOP_DISCOVERY] == NULL) {
1166 bt_adapter_unset_device_discovery_state_changed_cb();
1171 void BluetoothAdapter::stopDiscovery(MultiCallbackUserDataPtr userData)
1173 if(mEnabled == true) {
1175 bool isDiscovering = false;
1176 bt_adapter_is_discovering(&isDiscovering);
1177 if(!isDiscovering) {
1178 BluetoothCallbackUtil::syncToAsyncSuccessCallback(userData);
1182 if(mUserDataList[STOP_DISCOVERY] == NULL) {
1183 mUserDataList[STOP_DISCOVERY] = userData;
1186 if(mUserDataList[DISCOVER_DEVICES] == NULL)
1187 bt_adapter_set_device_discovery_state_changed_cb(onDiscoveryStateChangedCB, this);
1190 LoggerD("Already requested");
1191 UnknownException *error = new UnknownException("Already requested");
1192 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1196 TIME_TRACER_ITEM_BEGIN("stopDiscovery::bt_adapter_stop_device_discovery", 1);
1197 int ret = bt_adapter_stop_device_discovery();
1198 TIME_TRACER_ITEM_END("stopDiscovery::bt_adapter_stop_device_discovery", 1);
1202 LoggerD("bt_adapter_stop_device_discovery() succeeded");
1207 UnknownException *error = new UnknownException("Unknown error");
1208 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1212 mUserDataList[STOP_DISCOVERY].reset();
1214 if(mUserDataList[DISCOVER_DEVICES] == NULL) {
1215 bt_adapter_unset_device_discovery_state_changed_cb();
1218 } else { // Not enabled
1219 ServiceNotAvailableException *error = new ServiceNotAvailableException("Bluetooth device is turned off");
1220 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1224 void BluetoothAdapter::getKnownDevices(MultiCallbackUserDataPtr userData)
1226 BluetoothCallbackUtil::syncToAsyncDeviceArrayCallback(userData);
1229 void BluetoothAdapter::getDevice(std::string &address, MultiCallbackUserDataPtr userData)
1231 BluetoothCallbackUtil::syncToAsyncDeviceCallback(userData, address);
1234 void BluetoothAdapter::createBonding(std::string &address, MultiCallbackUserDataPtr userData)
1236 if(!isValidAddress(address)) {
1237 LoggerE("Wrong address");
1238 NotFoundException *error = new NotFoundException("Wrong address");
1239 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1243 if(mUserDataList[CREATE_BONDING] == NULL) {
1244 TIME_TRACER_ITEM_BEGIN("createBonding::bt_device_set_bond_created_cb", 1);
1245 if(bt_device_set_bond_created_cb(onBondCreatedCB, this) != BT_ERROR_NONE) {
1246 LoggerW("bt_device_set_bond_created_cb() failed");
1248 TIME_TRACER_ITEM_END("createBonding::bt_device_set_bond_created_cb", 1);
1249 mCreateBondingAddress = address;
1250 mUserDataList[CREATE_BONDING] = userData;
1252 LoggerE("Already requested");
1253 UnknownException *error = new UnknownException("Already requested");
1254 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1258 if(mEnabled == true) {
1259 TIME_TRACER_ITEM_BEGIN("createBonding::bt_device_create_bond", 1);
1260 int ret = bt_device_create_bond(address.c_str());
1261 TIME_TRACER_ITEM_END("createBonding::bt_device_create_bond", 1);
1266 LoggerD("bt_device_create_bond() succeeded");
1269 case BT_ERROR_INVALID_PARAMETER:
1271 LoggerE("Not found");
1272 NotFoundException *error = new NotFoundException("Not found");
1273 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1278 LoggerE("Unknown exception");
1279 UnknownException *error = new UnknownException("Unknown error");
1280 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1283 } else { // Not enabled
1284 LoggerE("Bluetooth device is turned off");
1285 ServiceNotAvailableException *error = new ServiceNotAvailableException("Bluetooth device is turned off");
1286 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1289 TIME_TRACER_ITEM_BEGIN("createBonding::bt_device_unset_bond_created_cb", 1);
1290 bt_device_unset_bond_created_cb();
1291 TIME_TRACER_ITEM_END("createBonding::bt_device_unset_bond_created_cb", 1);
1292 mCreateBondingAddress.clear();
1293 mUserDataList[CREATE_BONDING].reset();
1296 void BluetoothAdapter::destroyBonding(std::string &address, MultiCallbackUserDataPtr userData)
1298 if(!isValidAddress(address)) {
1299 LoggerE("Wrong address");
1300 NotFoundException *error = new NotFoundException("Wrong address");
1301 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1305 if(mUserDataList[DESTROY_BONDING] == NULL) {
1306 TIME_TRACER_ITEM_BEGIN("destroyBonding::bt_device_set_bond_destroyed_cb", 1);
1307 if(bt_device_set_bond_destroyed_cb(onBondDestroyedCB, this) != BT_ERROR_NONE) {
1308 LoggerW("bt_device_set_bond_destroyed_cb() failed");
1310 TIME_TRACER_ITEM_END("destroyBonding::bt_device_set_bond_destroyed_cb", 1);
1311 mDestroyBondingAddress = address;
1312 mUserDataList[DESTROY_BONDING] = userData;
1314 LoggerD("Already requested");
1315 UnknownException *error = new UnknownException("Already requested");
1316 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1320 if(mEnabled == true) {
1321 bt_device_info_s *deviceInfo = NULL;
1322 TIME_TRACER_ITEM_BEGIN("destroyBonding::bt_adapter_get_bonded_device_info", 1);
1323 if(bt_adapter_get_bonded_device_info(address.c_str(), &deviceInfo) != BT_ERROR_NONE || deviceInfo == NULL) {
1324 TIME_TRACER_ITEM_END("destroyBonding::bt_adapter_get_bonded_device_info", 1);
1325 LoggerD("There is no bonding");
1326 NotFoundException *error = new NotFoundException("Not found");
1327 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1330 TIME_TRACER_ITEM_END("destroyBonding::bt_adapter_get_bonded_device_info", 1);
1331 bt_adapter_free_device_info(deviceInfo);
1332 TIME_TRACER_ITEM_BEGIN("destroyBonding::bt_device_destroy_bond", 1);
1333 int ret = bt_device_destroy_bond(address.c_str());
1334 TIME_TRACER_ITEM_END("destroyBonding::bt_device_destroy_bond", 1);
1339 LoggerD("bt_device_destroy_bond() succeeded");
1342 case BT_ERROR_INVALID_PARAMETER:
1344 NotFoundException *error = new NotFoundException("Not found");
1345 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1350 UnknownException *error = new UnknownException("Unknown error");
1351 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1355 } else { // Not enabled
1356 ServiceNotAvailableException *error = new ServiceNotAvailableException("Bluetooth device is turned off");
1357 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1360 TIME_TRACER_ITEM_BEGIN("destroyBonding::bt_device_unset_bond_destroyed_cb", 1);
1361 bt_device_unset_bond_destroyed_cb();
1362 TIME_TRACER_ITEM_END("destroyBonding::bt_device_unset_bond_destroyed_cb", 1);
1364 mDestroyBondingAddress.clear();
1365 mUserDataList[DESTROY_BONDING].reset();
1368 void BluetoothAdapter::registerRFCOMMServiceByUUID(std::string &uuid, std::string &name, MultiCallbackUserDataPtr userData)
1370 BluetoothCallbackUtil::syncToAsyncServiceCallback(userData, uuid, name);
1373 void BluetoothAdapter::connectToServiceByUUID(std::string &remoteAddress, std::string &uuid, Common::MultiCallbackUserDataPtr userData)
1375 if(!isValidUUID(uuid)) {
1376 LoggerE("Wrong UUID");
1377 InvalidValuesException *error = new InvalidValuesException("Wrong UUID");
1378 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1383 if(mEnabled == true) {
1384 TIME_TRACER_ITEM_BEGIN("connectToServiceByUUID::bt_socket_connect_rfcomm", 1);
1385 int ret = bt_socket_connect_rfcomm(remoteAddress.c_str(), uuid.c_str());
1386 TIME_TRACER_ITEM_END("connectToServiceByUUID::bt_socket_connect_rfcomm", 1);
1391 LoggerD("bt_socket_connect_rfcomm() succeeded");
1392 TIME_TRACER_ITEM_BEGIN("connectToServiceByUUID::bt_socket_set_connection_state_changed_cb", 1);
1393 bt_socket_set_connection_state_changed_cb(onSocketConnected, this);
1394 TIME_TRACER_ITEM_END("connectToServiceByUUID::bt_socket_set_connection_state_changed_cb", 1);
1396 BluetoothConnReqPtr connReq = new BluetoothConnReq(uuid, userData);
1397 mConnReqMap.insert(std::pair<std::string, BluetoothConnReqPtr>(remoteAddress, connReq));
1400 case BT_ERROR_INVALID_PARAMETER:
1401 case BT_ERROR_REMOTE_DEVICE_NOT_BONDED:
1403 InvalidValuesException *error = new InvalidValuesException("Invalid value");
1404 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1409 UnknownException *error = new UnknownException("Unknown error");
1410 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1413 } else { // Not enabled
1414 ServiceNotAvailableException *error = new ServiceNotAvailableException("Bluetooth device is turned off");
1415 BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
1419 void BluetoothAdapter::returnKnownDevices(Common::MultiCallbackUserDataPtr userData)
1421 if(mEnabled == true) {
1422 knownDevices = mFoundDevices;
1423 if(bt_adapter_foreach_bonded_device(foreachBondedDevicesCB, this) == BT_ERROR_NONE) {
1424 if(knownDevices.size() > 0) { // There are found devices
1426 int num = knownDevices.size();
1427 LoggerD("There are found devices " << num);
1428 JSObjectRef devices[num];
1429 for(int i = 0; i < num; i++) {
1430 JSObjectRef deviceObj = JSBluetoothDevice::createJSObject(userData->getContext(), knownDevices[i]);
1431 devices[i] = deviceObj;
1434 userData->invokeCallback("success", JSObjectMakeArray(userData->getContext(), num, devices, NULL));
1436 else { // There is no found device
1437 userData->invokeCallback("success", JSObjectMakeArray(userData->getContext(), 0, NULL, NULL) );
1441 LoggerE("Unknown exception");
1442 userData->invokeCallback(
1444 JSWebAPIErrorFactory::makeErrorObject(userData->getContext(), UnknownException("Unknown exception"))
1447 } else { // Not enabled
1448 LoggerE("Bluetooth device is turned off");
1449 userData->invokeCallback(
1451 JSWebAPIErrorFactory::makeErrorObject(userData->getContext(), ServiceNotAvailableException("Bluetooth device is turned off"))
1456 void BluetoothAdapter::returnDevice(std::string &address, Common::MultiCallbackUserDataPtr userData)
1458 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 1);
1460 if(!isValidAddress(address)) {
1461 LoggerE("Wrong address");
1462 userData->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(userData->getContext(), NotFoundException("Wrong address")));
1466 if(mEnabled == true) {
1467 bt_device_info_s *deviceInfo = NULL;
1469 TIME_TRACER_ITEM_BEGIN("returnDevice::bt_adapter_get_bonded_device_info", 1);
1470 if(bt_adapter_get_bonded_device_info(address.c_str(), &deviceInfo) == BT_ERROR_NONE &&
1471 deviceInfo != NULL) {
1472 TIME_TRACER_ITEM_END("returnDevice::bt_adapter_get_bonded_device_info", 1);
1473 BluetoothDeviceSharedPtr device(new BluetoothDevice(deviceInfo));
1474 device->copyAceCheckAccessFunction(getInstance());
1475 bt_adapter_free_device_info(deviceInfo);
1477 LoggerD("invoke successCallback");
1478 userData->invokeCallback("success", JSBluetoothDevice::createJSObject(userData->getContext(), device));
1479 TIME_TRACER_ITEM_END("returnDevice::bt_adapter_get_bonded_device_info", 1);
1483 std::vector<BluetoothDeviceSharedPtr>::iterator iter;
1484 for(iter = mFoundDevices.begin(); iter != mFoundDevices.end(); ++iter) {
1485 BluetoothDeviceSharedPtr foundDevice = *iter;
1486 if(!strcmp(foundDevice->getAddress().c_str(), address.c_str())) {
1487 LoggerD("Found in mFoundDevices");
1488 userData->invokeCallback("success", JSBluetoothDevice::createJSObject(userData->getContext(), foundDevice));
1493 if(iter == mFoundDevices.end()) {
1494 LoggerE("Can't find this device");
1496 userData->invokeCallback(
1498 JSWebAPIErrorFactory::makeErrorObject(userData->getContext(), NotFoundException("There is no device with the given address"))
1502 } else { // Not enabled
1503 LoggerE("Bluetooth device is turned off");
1504 userData->invokeCallback(
1506 JSWebAPIErrorFactory::makeErrorObject(userData->getContext(), ServiceNotAvailableException("Bluetooth device is turned off"))
1510 TIME_TRACER_ITEM_END(__FUNCTION__, 1);
1513 void BluetoothAdapter::returnRegisteredService(std::string &uuid, std::string &name, Common::MultiCallbackUserDataPtr userData)
1515 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 1);
1517 if(!isValidUUID(uuid)) {
1518 LoggerE("Wrong UUID");
1519 userData->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(userData->getContext(), InvalidValuesException("Wrong UUID")));
1523 if(mEnabled == true) {
1526 TIME_TRACER_ITEM_BEGIN("returnRegisteredService::bt_adapter_is_service_used", 1);
1527 if(bt_adapter_is_service_used(uuid.c_str(), &isRegistered) == BT_ERROR_NONE && isRegistered == true) {
1528 TIME_TRACER_ITEM_END("returnRegisteredService::bt_adapter_is_service_used", 1);
1529 LoggerD("Already registered");
1530 userData->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(userData->getContext(), InvalidValuesException("Already registered")));
1533 TIME_TRACER_ITEM_END("returnRegisteredService::bt_adapter_is_service_used", 1);
1536 TIME_TRACER_ITEM_BEGIN("returnRegisteredService::bt_socket_create_rfcomm", 1);
1537 int ret = bt_socket_create_rfcomm(uuid.c_str(), &socket);
1538 TIME_TRACER_ITEM_END("returnRegisteredService::bt_socket_create_rfcomm", 1);
1543 LoggerD("bt_socket_create_rfcomm() succeeded");
1544 TIME_TRACER_ITEM_BEGIN("returnRegisteredService::bt_socket_listen_and_accept_rfcomm", 1);
1545 int ret = bt_socket_listen_and_accept_rfcomm(socket, 0);
1546 TIME_TRACER_ITEM_END("returnRegisteredService::bt_socket_listen_and_accept_rfcomm", 1);
1550 LoggerD("bt_socket_listen() succeeded");
1551 bt_socket_set_connection_state_changed_cb(onSocketConnected, this);
1553 BluetoothServiceHandlerPtr serviceHandler = new BluetoothServiceHandler(uuid, name, socket);
1554 serviceHandler->copyAceCheckAccessFunction(getInstance());
1555 mRegisteredUUID.insert(std::pair<std::string, BluetoothServiceHandlerPtr>(uuid, serviceHandler));
1557 JSObjectRef serviceObj = JSBluetoothServiceHandler::createJSObject(userData->getContext(), serviceHandler);
1558 userData->invokeCallback("success", serviceObj);
1561 case BT_ERROR_INVALID_PARAMETER:
1563 LoggerD("Invalid value");
1564 userData->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(userData->getContext(), InvalidValuesException("Invalid value")));
1569 LoggerD("Unknown exception");
1570 userData->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(userData->getContext(), UnknownException("Unknown exception")));
1576 case BT_ERROR_INVALID_PARAMETER:
1578 LoggerD("Invalid value");
1579 userData->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(userData->getContext(), InvalidValuesException("Invalid value")));
1584 LoggerD("Unknown exception");
1585 userData->invokeCallback("error", JSWebAPIErrorFactory::makeErrorObject(userData->getContext(), UnknownException("Unknown exception")));
1588 } else { // Not enabled
1589 LoggerE("Bluetooth device is turned off");
1590 userData->invokeCallback(
1592 JSWebAPIErrorFactory::makeErrorObject(userData->getContext(), ServiceNotAvailableException("Bluetooth device is turned off"))
1596 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 1);
1599 void BluetoothAdapter::setChangeListener(MultiCallbackUserDataPtr userData)
1601 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 1);
1604 mChangeListener = userData;
1606 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 1);
1609 void BluetoothAdapter::unsetChangeListener()
1611 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 1);
1614 mChangeListener.reset();
1616 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 1);