2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <JavaScriptCore/JavaScript.h>
18 #include <dpl/log/log.h>
19 #include <dpl/shared_ptr.h>
20 #include <CommonsJavaScript/PrivateObject.h>
21 #include <CommonsJavaScript/JSCallbackManager.h>
22 #include <CommonsJavaScript/Converter.h>
23 #include <Commons/IEvent.h>
24 #include <CommonsJavaScript/Utils.h>
25 #include "BluetoothAdapterListener.h"
26 #include "JSBluetoothDevice.h"
27 #include <API/Bluetooth/BluetoothFactory.h>
28 #include <CommonsJavaScript/JSUtils.h>
29 #include "BluetoothMultiCallback.h"
30 #include "JSBluetoothSocket.h"
31 #include "JSBluetoothServiceHandler.h"
32 #include "BluetoothConverter.h"
33 #include <Tizen/Common/JSTizenExceptionFactory.h>
34 #include <Tizen/Common/JSTizenException.h>
36 using namespace TizenApis::Commons;
42 BluetoothAdapterListener::~BluetoothAdapterListener()
47 BluetoothAdapterListener::BluetoothAdapterListener() :
48 EventBTCreateDestroyBondingAnswerReceiver(ThreadEnum::NULL_THREAD),
49 EventBTGetKnownDevicesAnswerReceiver(ThreadEnum::NULL_THREAD),
50 EventBTGetDeviceAnswerReceiver(ThreadEnum::NULL_THREAD),
51 EventBTSetPoweredAnswerReceiver(ThreadEnum::NULL_THREAD),
52 EventBTSetVisibleAnswerReceiver(ThreadEnum::NULL_THREAD),
53 EventBTOnDiscoveryDevicesListener(ThreadEnum::NULL_THREAD),
54 EventBTRegisterRFCOMMAnswerReceiver(ThreadEnum::NULL_THREAD),
55 EventBTUnregisterRFCOMMServiceAnswerReceiver(ThreadEnum::NULL_THREAD),
56 EventBTStopDiscoveryAnswerReceiver(ThreadEnum::NULL_THREAD),
57 EventBTSetNameAnswerReceiver(ThreadEnum::NULL_THREAD),
58 EventBTServiceOnConnectListener(ThreadEnum::NULL_THREAD)
64 BluetoothAdapterListener& BluetoothAdapterListener::getInstance()
66 static BluetoothAdapterListener instance;
71 void BluetoothAdapterListener::MakeErrorJSCallBack(JSCallbackManagerPtr cbm, JSContextRef globalContext, unsigned short error)
78 case ExceptionCodes::SecurityException:
79 err = JSTizenExceptionFactory::makeErrorObject(globalContext,
80 JSTizenException::PERMISSION_DENIED_ERROR, "permission denied error");
83 case ExceptionCodes::UnsupportedException:
84 err = JSTizenExceptionFactory::makeErrorObject(globalContext,
85 JSTizenException::NOT_SUPPORTED_ERROR, "unsupport error");
87 case ExceptionCodes::UnknownException:
89 err = JSTizenExceptionFactory::makeErrorObject(globalContext,
90 JSTizenException::UNKNOWN_ERROR, "unknown error");
93 cbm->callOnError(err);
96 void BluetoothAdapterListener::OnAnswerReceived(const EventBTCreateDestroyBondingPtr& event)
98 LogDebug("Enter - EventBTCreateDestroyBondingPtr");
99 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
100 JSContextRef l_globalContext = callbackManager->getContext();
102 if (event->getExceptionCode() == ExceptionCodes::None)
104 BluetoothDeviceData device = event->getDevice();
105 JSObjectRef deviceObject = JSBluetoothDevice::createJSObject(l_globalContext, device);
106 callbackManager->callOnSuccess(deviceObject);
110 MakeErrorJSCallBack(callbackManager, l_globalContext, event->getExceptionCode());
114 void BluetoothAdapterListener::OnAnswerReceived(const EventBTGetKnownDevicesPtr& event)
116 LogDebug("Enter - EventBTGetKnownDevicesPtr");
117 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
118 JSContextRef l_globalContext = callbackManager->getContext();
120 if (event->getExceptionCode() == ExceptionCodes::None)
122 std::vector<BluetoothDeviceData> devices = event->getDevices();
123 BluetoothConverter converter(l_globalContext);
124 JSObjectRef result = converter.toBluetoothDevices(devices);
125 callbackManager->callOnSuccess(result);
129 MakeErrorJSCallBack(callbackManager, l_globalContext, event->getExceptionCode());
136 void BluetoothAdapterListener::OnAnswerReceived(const EventBTSetPoweredPtr& event)
138 LogDebug("Enter - EventBTSetPoweredPtr");
139 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
140 JSContextRef l_globalContext = callbackManager->getContext();
143 if (event->getExceptionCode() == ExceptionCodes::None)
145 callbackManager->callOnSuccess();
149 MakeErrorJSCallBack(callbackManager, l_globalContext, event->getExceptionCode());
153 void BluetoothAdapterListener::OnAnswerReceived(const EventBTGetDevicePtr& event)
155 LogDebug("Enter - EventBTGetDevicePtr");
156 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
157 JSContextRef l_globalContext = callbackManager->getContext();
159 if (event->getExceptionCode() == ExceptionCodes::None)
161 BluetoothDeviceData device = event->getDevice();
162 LogDebug("Enter" << device.name << " " << device.address << "major: " << device.btClass.major << "minor: " << device.btClass.minor);
163 JSObjectRef adapterObject = JSBluetoothDevice::createJSObject(callbackManager->getContext(), device);
164 callbackManager->callOnSuccess(adapterObject);
168 MakeErrorJSCallBack(callbackManager, l_globalContext, event->getExceptionCode());
174 void BluetoothAdapterListener::OnAnswerReceived(const EventBTSetVisiblePtr& event)
176 LogDebug("Enter - EventBTSetVisiblePtr");
177 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
178 JSContextRef l_globalContext = callbackManager->getContext();
180 if (event->getExceptionCode() == ExceptionCodes::None)
182 callbackManager->callOnSuccess();
186 MakeErrorJSCallBack(callbackManager, l_globalContext, event->getExceptionCode());
190 void BluetoothAdapterListener::OnAnswerReceived(const EventBTUnregisterRFCOMMServicePtr& event)
192 LogDebug("Enter - EventBTUnregisterRFCOMMServicePtr");
193 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
194 JSContextRef l_globalContext = callbackManager->getContext();
196 if (event->getExceptionCode() == ExceptionCodes::None)
198 callbackManager->callOnSuccess();
202 MakeErrorJSCallBack(callbackManager, l_globalContext, event->getExceptionCode());
207 void BluetoothAdapterListener::onAnswerReceived(const EventBTOnDiscoveryDevicesPtr& event)
211 EventBTOnDiscoveryDevicesPrivateDataPtr multiCallbacks =
212 DPL::DynamicPointerCast<EventBTOnDiscoveryDevicesPrivateData>(event->getPrivateData());
213 JSCallbackManagerPtr defaultCbm = multiCallbacks->getOnSuccess();
214 std::vector<BluetoothDeviceData> devices;
216 assert(multiCallbacks != NULL);
217 assert(defaultCbm != NULL);
218 assert(multiCallbacks->getOnFound() != NULL);
219 assert(multiCallbacks->getOnFinished() != NULL);
221 if (event->getExceptionCode() == ExceptionCodes::None)
223 switch(event->getDiscoveryState())
225 case EventBTOnDiscoveryDevices::STARTED:
226 multiCallbacks->getOnSuccess()->callOnSuccess();
228 case EventBTOnDiscoveryDevices::DISCOVERYING:
230 JSObjectRef adapterObject;
231 devices = event->getDevices();
232 defaultCbm = multiCallbacks->getOnFound();
233 adapterObject = JSBluetoothDevice::createJSObject(defaultCbm->getContext(), devices[0]);
234 defaultCbm->callOnSuccess(adapterObject);
238 case EventBTOnDiscoveryDevices::FINISHED:
240 devices = event->getDevices();
241 defaultCbm = multiCallbacks->getOnFinished();
243 BluetoothConverter converter(defaultCbm->getContext());
244 JSObjectRef result = converter.toBluetoothDevices(devices);
245 defaultCbm->callOnSuccess(result);
249 MakeErrorJSCallBack(defaultCbm, defaultCbm->getContext(), event->getExceptionCode());
256 MakeErrorJSCallBack(defaultCbm, defaultCbm->getContext(), event->getExceptionCode());
260 void BluetoothAdapterListener::OnAnswerReceived(const EventBTRegisterRFCOMMPtr& event)
263 LogDebug("Enter - EventBTRegisterRFCOMMPtr");
265 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
266 JSContextRef l_globalContext = callbackManager->getContext();
268 if (event->getExceptionCode() == ExceptionCodes::None)
270 JSObjectRef adapterObject;
271 int socketFd = event->getSocketFd();
272 std::string uuid = event->getUuid();
273 std::string name = event->getName();
274 adapterObject = JSBluetoothServiceHandler::createJSObject(l_globalContext, name, uuid, socketFd);
275 callbackManager->callOnSuccess(adapterObject);
279 MakeErrorJSCallBack(callbackManager, l_globalContext, event->getExceptionCode());
285 void BluetoothAdapterListener::OnAnswerReceived(const EventBTStopDiscoveryPtr& event)
287 LogDebug("Enter - EventBTStopDiscoveryPtr");
288 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
289 JSContextRef l_globalContext = callbackManager->getContext();
291 if (event->getExceptionCode() == ExceptionCodes::None)
293 callbackManager->callOnSuccess();
297 MakeErrorJSCallBack(callbackManager, l_globalContext, event->getExceptionCode());
301 void BluetoothAdapterListener::OnAnswerReceived(const EventBTSetNamePtr& event)
303 LogDebug("Enter - EventBTStopDiscoveryPtr");
304 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
305 JSContextRef l_globalContext = callbackManager->getContext();
307 if (event->getExceptionCode() == ExceptionCodes::None)
309 callbackManager->callOnSuccess();
313 MakeErrorJSCallBack(callbackManager, l_globalContext, event->getExceptionCode());
317 void BluetoothAdapterListener::onAnswerReceived(const EventBTServiceOnConnectPtr& event)
319 LogDebug("Enter - EventBTServiceOnConnectPtr");
321 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
322 JSContextRef l_globalContext = callbackManager->getContext();
324 BluetoothSocketData socketData;
325 JSObjectRef adapterObject;
327 if (event->getExceptionCode() == ExceptionCodes::None)
329 socketData = event->getSocketData();
330 adapterObject = JSBluetoothSocket::createJSObject(l_globalContext, socketData);
331 callbackManager->callOnSuccess(adapterObject);
335 MakeErrorJSCallBack(callbackManager, l_globalContext, event->getExceptionCode());