33 #include <dbus/dbus.h>
36 #include "btrCore_bt_ifce.h"
37 #include "btrCore_logger.h"
38 #ifdef LIBSYSWRAPPER_BUILD
39 #include "secure_wrapper.h"
42 #define BD_NAME_LEN 248
44 #define BT_MEDIA_A2DP_SINK_ENDPOINT "/MediaEndpoint/A2DPSink"
45 #define BT_MEDIA_A2DP_SOURCE_ENDPOINT "/MediaEndpoint/A2DPSource"
48 static int btrCore_BTHandleDusError (DBusError* aDBusErr,
int aErrline,
const char* aErrfunc);
50 static DBusHandlerResult btrCore_BTDBusConnectionFilter_cb (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
51 static DBusHandlerResult btrCore_BTMediaEndpointHandler_cb (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
52 static DBusHandlerResult btrCore_BTAgentMessageHandler_cb (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
54 static char* btrCore_BTGetDefaultAdapterPath (
void);
55 static int btrCore_BTReleaseDefaultAdapterPath (
void);
57 static DBusHandlerResult btrCore_BTAgentRelease (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
58 static DBusHandlerResult btrCore_BTAgentRequestPincode (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
59 static DBusHandlerResult btrCore_BTAgentRequestPasskey (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
60 static DBusHandlerResult btrCore_BTAgentRequestConfirmation(DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
61 static DBusHandlerResult btrCore_BTAgentAuthorize (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
62 static DBusHandlerResult btrCore_BTAgentCancelMessage (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
64 static DBusMessage* btrCore_BTSendMethodCall (
const char* objectpath,
const char* interfacename,
const char* methodname);
65 static int btrCore_BTParseDevice (DBusMessage* apDBusMsg,
stBTDeviceInfo* apstBTDeviceInfo);
66 static int btrCore_BTParsePropertyChange (DBusMessage* apDBusMsg,
stBTDeviceInfo* apstBTDeviceInfo);
67 static DBusMessage* btrCore_BTMediaEndpointSelectConfiguration (DBusMessage* apDBusMsg);
68 static DBusMessage* btrCore_BTMediaEndpointSetConfiguration (DBusMessage* apDBusMsg);
69 static DBusMessage* btrCore_BTMediaEndpointClearConfiguration (DBusMessage* apDBusMsg);
74 static char *gpcBTOutPassCode = NULL;
75 static int do_reject = 0;
77 static DBusConnection* gpDBusConn = NULL;
78 static char* gpcBTAgentPath = NULL;
79 static char* gpcBTDAdapterPath = NULL;
80 static char* gpcBTAdapterPath = NULL;
81 static char* gpcDevTransportPath = NULL;
82 static void* gpcBDevStatusUserData = NULL;
83 static void* gpcBNegMediaUserData = NULL;
84 static void* gpcBTransPathMediaUserData = NULL;
85 static void* gpcBConnIntimUserData = NULL;
86 static void* gpcBConnAuthUserData = NULL;
88 static unsigned int gpcBConnAuthPassKey = 0;
89 static unsigned int gpDevLost = 0;
91 static const DBusObjectPathVTable gDBusMediaEndpointVTable = {
92 .message_function = btrCore_BTMediaEndpointHandler_cb,
95 static const DBusObjectPathVTable gDBusAgentVTable = {
96 .message_function = btrCore_BTAgentMessageHandler_cb,
101 static fPtr_BtrCore_BTDevStatusUpdate_cB gfpcBDevStatusUpdate = NULL;
102 static fPtr_BtrCore_BTNegotiateMedia_cB gfpcBNegotiateMedia = NULL;
103 static fPtr_BtrCore_BTTransportPathMedia_cB gfpcBTransportPathMedia = NULL;
104 static fPtr_BtrCore_BTConnIntim_cB gfpcBConnectionIntimation = NULL;
105 static fPtr_BtrCore_BTConnAuth_cB gfpcBConnectionAuthentication = NULL;
110 btrCore_BTHandleDusError (
111 DBusError* apDBusErr,
113 const char* apErrfunc
115 if (dbus_error_is_set(apDBusErr)) {
116 BTRCORELOG_ERROR (
"%d\t:%s - DBus Error is %s\n", aErrline, apErrfunc, apDBusErr->message);
117 dbus_error_free(apDBusErr);
124 static DBusHandlerResult
125 btrCore_BTDBusConnectionFilter_cb (
126 DBusConnection* apDBusConn,
127 DBusMessage* apDBusMsg,
134 lstBTDeviceInfo.i32RSSI = INT_MIN;
137 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.Adapter",
"DeviceCreated")) {
138 BTRCORELOG_INFO (
"Device Created!\n");
139 if (gfpcBDevStatusUpdate) {
140 if(gfpcBDevStatusUpdate(enBTDevUnknown, enBTDevStPaired, NULL, NULL)) {
145 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.Adapter",
"DeviceFound")) {
146 BTRCORELOG_INFO (
"Device Found!\n");
148 i32OpRet = btrCore_BTParseDevice(apDBusMsg, &lstBTDeviceInfo);
149 if (gfpcBDevStatusUpdate && !i32OpRet) {
150 if(gfpcBDevStatusUpdate(enBTDevUnknown, enBTDevStFound, &lstBTDeviceInfo, gpcBDevStatusUserData)) {
155 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.Adapter",
"DeviceDisappeared")) {
156 BTRCORELOG_INFO (
"Device DeviceDisappeared!\n");
157 if (gfpcBDevStatusUpdate) {
158 if(gfpcBDevStatusUpdate(enBTDevUnknown, enBTDevStLost, NULL, NULL)) {
163 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.Adapter",
"DeviceRemoved")) {
164 BTRCORELOG_ERROR (
"Device Removed!\n");
165 if (gfpcBDevStatusUpdate) {
166 if(gfpcBDevStatusUpdate(enBTDevUnknown, enBTDevStUnPaired, NULL, NULL)) {
171 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.AudioSink",
"Connected")) {
172 BTRCORELOG_INFO (
"Device Connected - AudioSink!\n");
173 if (gfpcBDevStatusUpdate) {
174 if(gfpcBDevStatusUpdate(enBTDevAudioSink, enBTDevStConnected, NULL, NULL)) {
179 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.AudioSink",
"Disconnected")) {
180 BTRCORELOG_INFO (
"Device Disconnected - AudioSink!\n");
181 if (gfpcBDevStatusUpdate) {
183 if(gfpcBDevStatusUpdate(enBTDevAudioSink, enBTDevStDisconnected, NULL, NULL)) {
188 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.AudioSink",
"PropertyChanged")) {
190 BTRCORELOG_INFO (
"Device PropertyChanged!\n");
191 btrCore_BTParsePropertyChange(apDBusMsg, &lstBTDeviceInfo);
192 if (gfpcBDevStatusUpdate) {
194 lenBtDevState = enBTDevStPropChanged;
197 lenBtDevState = enBTDevStLost;
200 if(gfpcBDevStatusUpdate(enBTDevAudioSink, lenBtDevState, &lstBTDeviceInfo, gpcBDevStatusUserData)) {
205 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.AudioSource",
"Connected")) {
206 BTRCORELOG_ERROR (
"Device Connected - AudioSource!\n");
207 if (gfpcBDevStatusUpdate) {
208 if(gfpcBDevStatusUpdate(enBTDevAudioSource, enBTDevStConnected, NULL, NULL)) {
213 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.AudioSource",
"Disconnected")) {
214 BTRCORELOG_INFO (
"Device Disconnected - AudioSource!\n");
215 if (gfpcBDevStatusUpdate) {
216 if(gfpcBDevStatusUpdate(enBTDevAudioSource, enBTDevStDisconnected, NULL, NULL)) {
221 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.AudioSource",
"PropertyChanged")) {
222 BTRCORELOG_INFO (
"Device PropertyChanged!\n");
223 btrCore_BTParsePropertyChange(apDBusMsg, &lstBTDeviceInfo);
224 if (gfpcBDevStatusUpdate) {
225 if(gfpcBDevStatusUpdate(enBTDevAudioSource, enBTDevStPropChanged, &lstBTDeviceInfo, gpcBDevStatusUserData)) {
230 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.Headset",
"Connected")) {
231 BTRCORELOG_INFO (
"Device Connected - Headset!\n");
232 if (gfpcBDevStatusUpdate) {
233 if(gfpcBDevStatusUpdate(enBTDevHFPHeadset,enBTDevStConnected, NULL, NULL)) {
238 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.Headset",
"Disconnected")) {
239 BTRCORELOG_INFO (
"Device Disconnected - Headset!\n");
240 if (gfpcBDevStatusUpdate) {
241 if(gfpcBDevStatusUpdate(enBTDevHFPHeadset, enBTDevStDisconnected, NULL, NULL)) {
246 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.Headset",
"PropertyChanged")) {
247 BTRCORELOG_INFO (
"Device PropertyChanged!\n");
248 btrCore_BTParsePropertyChange(apDBusMsg, &lstBTDeviceInfo);
249 if (gfpcBDevStatusUpdate) {
250 if(gfpcBDevStatusUpdate(enBTDevHFPHeadset, enBTDevStPropChanged, &lstBTDeviceInfo, gpcBDevStatusUserData)) {
256 if (dbus_message_is_signal(apDBusMsg,
"org.bluez.MediaTransport",
"PropertyChanged")) {
257 BTRCORELOG_INFO (
"MediaTransport PropertyChanged!\n");
261 return DBUS_HANDLER_RESULT_HANDLED;
263 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
267 static DBusHandlerResult
268 btrCore_BTMediaEndpointHandler_cb (
269 DBusConnection* apDBusConn,
270 DBusMessage* apDBusMsg,
273 DBusMessage* lpDBusReply = NULL;
276 lpcPath = dbus_message_get_path(apDBusMsg);
280 BTRCORELOG_INFO (
"endpoint_handler: MediaEndpoint\n");
282 if (dbus_message_is_method_call(apDBusMsg,
"org.bluez.MediaEndpoint",
"SelectConfiguration")) {
283 BTRCORELOG_DEBUG (
"MediaEndpoint-SelectConfiguration\n");
284 lpDBusReply = btrCore_BTMediaEndpointSelectConfiguration(apDBusMsg);
286 else if (dbus_message_is_method_call(apDBusMsg,
"org.bluez.MediaEndpoint",
"SetConfiguration")) {
287 BTRCORELOG_DEBUG (
"MediaEndpoint-SetConfiguration\n");
288 lpDBusReply = btrCore_BTMediaEndpointSetConfiguration(apDBusMsg);
290 else if (dbus_message_is_method_call(apDBusMsg,
"org.bluez.MediaEndpoint",
"ClearConfiguration")) {
291 BTRCORELOG_DEBUG (
"MediaEndpoint-ClearConfiguration\n");
292 lpDBusReply = btrCore_BTMediaEndpointClearConfiguration(apDBusMsg);
295 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
299 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
300 dbus_message_unref(lpDBusReply);
303 return DBUS_HANDLER_RESULT_HANDLED;
307 static DBusHandlerResult
308 btrCore_BTAgentMessageHandler_cb (
309 DBusConnection* apDBusConn,
310 DBusMessage* apDBusMsg,
313 if (dbus_message_is_method_call(apDBusMsg,
"org.bluez.Agent",
"Release"))
314 return btrCore_BTAgentRelease (apDBusConn, apDBusMsg, apvUserData);
316 if (dbus_message_is_method_call(apDBusMsg,
"org.bluez.Agent",
"RequestPinCode"))
317 return btrCore_BTAgentRequestPincode(apDBusConn, apDBusMsg, apvUserData);
319 if (dbus_message_is_method_call(apDBusMsg,
"org.bluez.Agent",
"RequestPasskey"))
320 return btrCore_BTAgentRequestPasskey(apDBusConn, apDBusMsg, apvUserData);
322 if (dbus_message_is_method_call(apDBusMsg,
"org.bluez.Agent",
"RequestConfirmation"))
323 return btrCore_BTAgentRequestConfirmation(apDBusConn, apDBusMsg, apvUserData);
325 if (dbus_message_is_method_call(apDBusMsg,
"org.bluez.Agent",
"Authorize"))
326 return btrCore_BTAgentAuthorize(apDBusConn, apDBusMsg, apvUserData);
328 if (dbus_message_is_method_call(apDBusMsg,
"org.bluez.Agent",
"Cancel"))
329 return btrCore_BTAgentCancelMessage(apDBusConn, apDBusMsg, apvUserData);
331 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
336 btrCore_BTGetDefaultAdapterPath (
339 DBusMessage* lpDBusMsg = NULL;
340 DBusMessage* lpDBusReply = NULL;
341 const char* lpReplyPath = NULL;
346 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
351 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
355 dbus_error_init(&lDBusErr);
356 lpDBusReply = dbus_connection_send_with_reply_and_block(gpDBusConn, lpDBusMsg, -1, &lDBusErr);
357 dbus_message_unref(lpDBusMsg);
360 BTRCORELOG_ERROR (
"Can't find Default adapter\n");
361 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
365 lDBusOp = dbus_message_get_args(lpDBusReply, &lDBusErr, DBUS_TYPE_OBJECT_PATH, &lpReplyPath, DBUS_TYPE_INVALID);
366 dbus_message_unref(lpDBusReply);
369 BTRCORELOG_ERROR (
"Can't get lpDBusReply arguments\n");
370 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
374 dbus_connection_flush(gpDBusConn);
376 if (gpcBTDAdapterPath) {
377 free(gpcBTDAdapterPath);
378 gpcBTDAdapterPath = NULL;
381 gpcBTDAdapterPath = strdup(lpReplyPath);
382 return gpcBTDAdapterPath;
387 btrCore_BTReleaseDefaultAdapterPath (
390 if (gpcBTDAdapterPath) {
391 free(gpcBTDAdapterPath);
392 gpcBTDAdapterPath = NULL;
399 static DBusHandlerResult
400 btrCore_BTAgentRelease (
401 DBusConnection* apDBusConn,
402 DBusMessage* apDBusMsg,
405 DBusMessage* lpDBusReply = NULL;
407 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_INVALID)) {
408 BTRCORELOG_ERROR (
"Invalid arguments for Release method");
409 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
412 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
415 BTRCORELOG_ERROR (
"Unable to create lpDBusReply message\n");
416 return DBUS_HANDLER_RESULT_NEED_MEMORY;
419 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
420 dbus_connection_flush(apDBusConn);
422 dbus_message_unref(lpDBusReply);
424 return DBUS_HANDLER_RESULT_HANDLED;
428 static DBusHandlerResult
429 btrCore_BTAgentRequestPincode (
430 DBusConnection* apDBusConn,
431 DBusMessage* apDBusMsg,
434 DBusMessage* lpDBusReply = NULL;
435 const char* lpcPath = NULL;
437 if (!gpcBTOutPassCode)
438 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
440 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_OBJECT_PATH, &lpcPath, DBUS_TYPE_INVALID)) {
441 BTRCORELOG_ERROR (
"Invalid arguments for RequestPinCode method");
442 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
446 lpDBusReply = dbus_message_new_error(apDBusMsg,
"org.bluez.Error.Rejected",
"");
450 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
452 BTRCORELOG_ERROR (
"Can't create lpDBusReply message\n");
453 return DBUS_HANDLER_RESULT_NEED_MEMORY;
456 BTRCORELOG_DEBUG (
"Pincode request for device %s\n", lpcPath);
457 dbus_message_append_args(lpDBusReply, DBUS_TYPE_STRING, &gpcBTOutPassCode, DBUS_TYPE_INVALID);
460 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
461 dbus_connection_flush(apDBusConn);
463 dbus_message_unref(lpDBusReply);
465 return DBUS_HANDLER_RESULT_HANDLED;
469 static DBusHandlerResult
470 btrCore_BTAgentRequestPasskey (
471 DBusConnection* apDBusConn,
472 DBusMessage* apDBusMsg,
475 DBusMessage* lpDBusReply = NULL;
476 const char* lpcPath = NULL;
477 unsigned int ui32PassCode= 0;
479 if (!gpcBTOutPassCode)
480 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
482 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_OBJECT_PATH, &lpcPath, DBUS_TYPE_INVALID)) {
483 BTRCORELOG_ERROR (
"Incorrect args btrCore_BTAgentRequestPasskey");
484 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
487 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
489 BTRCORELOG_ERROR (
"Can't create lpDBusReply message\n");
490 return DBUS_HANDLER_RESULT_NEED_MEMORY;
493 BTRCORELOG_DEBUG (
"Pass code request for device %s\n", lpcPath);
494 ui32PassCode = strtoul(gpcBTOutPassCode, NULL, 10);
495 dbus_message_append_args(lpDBusReply, DBUS_TYPE_UINT32, &ui32PassCode, DBUS_TYPE_INVALID);
497 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
498 dbus_connection_flush(apDBusConn);
499 dbus_message_unref(lpDBusReply);
501 return DBUS_HANDLER_RESULT_HANDLED;
505 static DBusHandlerResult
506 btrCore_BTAgentRequestConfirmation (
507 DBusConnection* apDBusConn,
508 DBusMessage* apDBusMsg,
511 DBusMessage* lpDBusReply = NULL;
512 const char* lpcPath = NULL;
513 unsigned int ui32PassCode= 0;
521 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_OBJECT_PATH, &lpcPath, DBUS_TYPE_UINT32, &ui32PassCode, DBUS_TYPE_INVALID)) {
522 BTRCORELOG_ERROR (
"Invalid arguments for Authorize method");
523 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
527 BTRCORELOG_DEBUG (
"btrCore_BTAgentRequestConfirmation: PASS Code for %s is %6d\n",lpcPath, ui32PassCode);
529 if (gfpcBConnectionIntimation && lpcPath) {
533 BTRCORELOG_INFO (
"calling ConnIntimation cb for %s - OpRet = %d\n", lpcPath, i32OpRet);
534 yesNo = gfpcBConnectionIntimation(enBTDevUnknown, &lstBTDeviceInfo, ui32PassCode, gpcBConnIntimUserData);
537 gpcBConnAuthPassKey = ui32PassCode;
541 BTRCORELOG_ERROR (
"Sorry, you cant connect....\n");
542 lpDBusReply = dbus_message_new_error(apDBusMsg,
"org.bluez.Error.Rejected",
"");
545 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
550 BTRCORELOG_ERROR (
"Can't create lpDBusReply message\n");
551 return DBUS_HANDLER_RESULT_NEED_MEMORY;
554 BTRCORELOG_INFO (
"Intimating request for %s\n", lpcPath);
555 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
556 dbus_connection_flush(apDBusConn);
557 dbus_message_unref(lpDBusReply);
558 return DBUS_HANDLER_RESULT_HANDLED;
563 static DBusHandlerResult
564 btrCore_BTAgentAuthorize (
565 DBusConnection* apDBusConn,
566 DBusMessage* apDBusMsg,
569 DBusMessage* lpDBusReply = NULL;
570 const char* lpcPath = NULL;
571 const char* uuid = NULL;
578 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_OBJECT_PATH, &lpcPath, DBUS_TYPE_STRING, &uuid, DBUS_TYPE_INVALID)) {
579 BTRCORELOG_ERROR (
"Invalid arguments for Authorize method");
580 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
583 if (gfpcBConnectionAuthentication && lpcPath) {
587 BTRCORELOG_DEBUG (
"calling ConnAuth cb for %s - OpRet = %d\n", lpcPath, i32OpRet);
588 yesNo = gfpcBConnectionAuthentication(enBTDevUnknown, &lstBTDeviceInfo, gpcBConnAuthUserData);
591 gpcBConnAuthPassKey = 0;
595 BTRCORELOG_ERROR (
"Sorry, you cant connect....\n");
596 lpDBusReply = dbus_message_new_error(apDBusMsg,
"org.bluez.Error.Rejected",
"");
599 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
604 BTRCORELOG_ERROR (
"Can't create lpDBusReply message\n");
605 return DBUS_HANDLER_RESULT_NEED_MEMORY;
608 BTRCORELOG_INFO (
"Authorizing request for %s\n", lpcPath);
609 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
610 dbus_connection_flush(apDBusConn);
611 dbus_message_unref(lpDBusReply);
612 return DBUS_HANDLER_RESULT_HANDLED;
617 static DBusHandlerResult
618 btrCore_BTAgentCancelMessage (
619 DBusConnection* apDBusConn,
620 DBusMessage* apDBusMsg,
623 DBusMessage *lpDBusReply;
625 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_INVALID)) {
626 BTRCORELOG_ERROR (
"Invalid arguments for confirmation method");
627 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
629 BTRCORELOG_INFO (
"Request canceled\n");
630 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
633 BTRCORELOG_ERROR (
"Can't create lpDBusReply message\n");
634 return DBUS_HANDLER_RESULT_NEED_MEMORY;
637 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
638 dbus_connection_flush(apDBusConn);
640 dbus_message_unref(lpDBusReply);
641 return DBUS_HANDLER_RESULT_HANDLED;
646 btrCore_BTSendMethodCall (
647 const char* objectpath,
648 const char* interfacename,
649 const char* methodname
651 const char* busname =
"org.bluez";
653 DBusMessage* lpDBusMsg = NULL;
654 DBusMessage* lpDBusReply = NULL;
655 DBusPendingCall* lpDBusPendC = NULL;
658 lpDBusMsg = dbus_message_new_method_call(busname,
663 BTRCORELOG_ERROR (
"Cannot allocate DBus message!\n");
668 if (!dbus_connection_send_with_reply(gpDBusConn, lpDBusMsg, &lpDBusPendC, -1)) {
669 BTRCORELOG_ERROR (
"failed to send message!\n");
672 dbus_connection_flush(gpDBusConn);
673 dbus_message_unref(lpDBusMsg);
676 dbus_pending_call_block(lpDBusPendC);
677 lpDBusReply = dbus_pending_call_steal_reply(lpDBusPendC);
678 dbus_pending_call_unref(lpDBusPendC);
680 if (dbus_message_get_type(lpDBusReply) == DBUS_MESSAGE_TYPE_ERROR) {
681 BTRCORELOG_ERROR (
"Error : %s\n\n", dbus_message_get_error_name(lpDBusReply));
682 dbus_message_unref(lpDBusReply);
691 btrCore_BTParseDevice (
692 DBusMessage* apDBusMsg,
695 DBusMessageIter arg_i;
696 DBusMessageIter element_i;
697 DBusMessageIter variant_i;
698 const char* pcKey = NULL;
699 const char* pcBTDevAddr = NULL;
705 unsigned short ui16Vendor = 0;
706 unsigned short ui16VendorSource = 0;
707 unsigned short ui16Product = 0;
708 unsigned short ui16Version = 0;
709 unsigned int ui32Class = 0;
711 const char* pcName = NULL;
712 const char* pcAddress = NULL;
713 const char* pcAlias = NULL;
714 const char* pcIcon = NULL;
716 if (!dbus_message_iter_init(apDBusMsg, &arg_i)) {
717 BTRCORELOG_ERROR (
"dbus_message_iter_init Failed\n");
721 if (!dbus_message_get_args( apDBusMsg, NULL,
722 DBUS_TYPE_STRING, &pcBTDevAddr,
723 DBUS_TYPE_INVALID)) {
724 BTRCORELOG_ERROR (
"dbus_message_get_args Failed\n");
728 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
729 if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_ARRAY) {
730 dbus_message_iter_next(&arg_i);
731 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
733 if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_ARRAY) {
734 BTRCORELOG_ERROR (
"Unknown Prop structure from Bluez\n");
739 dbus_message_iter_recurse(&arg_i, &element_i);
740 while (dbus_message_iter_get_arg_type(&element_i) != DBUS_TYPE_INVALID) {
741 if (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) {
742 DBusMessageIter dict_i;
744 dbus_message_iter_recurse(&element_i, &dict_i);
745 dbus_message_iter_get_basic(&dict_i, &pcKey);
747 if (strcmp (pcKey,
"Address") == 0) {
748 dbus_message_iter_next(&dict_i);
749 dbus_message_iter_recurse(&dict_i, &variant_i);
750 dbus_message_iter_get_basic(&variant_i, &pcAddress);
752 BTRCORELOG_INFO (
"apstBTDeviceInfo->pcAddress : %s\n", apstBTDeviceInfo->pcAddress);
754 else if (strcmp (pcKey,
"Name") == 0) {
755 dbus_message_iter_next(&dict_i);
756 dbus_message_iter_recurse(&dict_i, &variant_i);
757 dbus_message_iter_get_basic(&variant_i, &pcName);
759 BTRCORELOG_INFO (
"apstBTDeviceInfo->pcName: %s\n", apstBTDeviceInfo->pcName);
762 else if (strcmp (pcKey,
"Vendor") == 0) {
763 dbus_message_iter_next(&dict_i);
764 dbus_message_iter_recurse(&dict_i, &variant_i);
765 dbus_message_iter_get_basic(&variant_i, &ui16Vendor);
766 apstBTDeviceInfo->ui16Vendor = ui16Vendor;
767 BTRCORELOG_INFO (
"apstBTDeviceInfo->ui16Vendor = %d\n", apstBTDeviceInfo->ui16Vendor);
769 else if (strcmp (pcKey,
"VendorSource") == 0) {
770 dbus_message_iter_next(&dict_i);
771 dbus_message_iter_recurse(&dict_i, &variant_i);
772 dbus_message_iter_get_basic(&variant_i, &ui16VendorSource);
773 apstBTDeviceInfo->ui16VendorSource = ui16VendorSource;
774 BTRCORELOG_INFO (
"apstBTDeviceInfo->ui16VendorSource = %d\n", apstBTDeviceInfo->ui16VendorSource);
776 else if (strcmp (pcKey,
"Product") == 0) {
777 dbus_message_iter_next(&dict_i);
778 dbus_message_iter_recurse(&dict_i, &variant_i);
779 dbus_message_iter_get_basic(&variant_i, &ui16Product);
780 apstBTDeviceInfo->ui16Product = ui16Product;
781 BTRCORELOG_INFO (
"apstBTDeviceInfo->ui16Product = %d\n", apstBTDeviceInfo->ui16Product);
783 else if (strcmp (pcKey,
"Version") == 0) {
784 dbus_message_iter_next(&dict_i);
785 dbus_message_iter_recurse(&dict_i, &variant_i);
786 dbus_message_iter_get_basic(&variant_i, &ui16Version);
787 apstBTDeviceInfo->ui16Version = ui16Version;
788 BTRCORELOG_INFO (
"apstBTDeviceInfo->ui16Version = %d\n", apstBTDeviceInfo->ui16Version);
790 else if (strcmp (pcKey,
"Icon") == 0) {
791 dbus_message_iter_next(&dict_i);
792 dbus_message_iter_recurse(&dict_i, &variant_i);
793 dbus_message_iter_get_basic(&variant_i, &pcIcon);
795 BTRCORELOG_ERROR (
"apstBTDeviceInfo->pcIcon: %s\n", apstBTDeviceInfo->pcIcon);
797 else if (strcmp (pcKey,
"Class") == 0) {
798 dbus_message_iter_next(&dict_i);
799 dbus_message_iter_recurse(&dict_i, &variant_i);
800 dbus_message_iter_get_basic(&variant_i, &ui32Class);
801 apstBTDeviceInfo->ui32Class = ui32Class;
802 BTRCORELOG_INFO (
"apstBTDeviceInfo->ui32Class: %d\n", apstBTDeviceInfo->ui32Class);
804 else if (strcmp (pcKey,
"Paired") == 0) {
805 dbus_message_iter_next(&dict_i);
806 dbus_message_iter_recurse(&dict_i, &variant_i);
807 dbus_message_iter_get_basic(&variant_i, &bPaired);
808 apstBTDeviceInfo->bPaired = bPaired;
809 BTRCORELOG_ERROR (
"apstBTDeviceInfo->bPaired = %d\n", apstBTDeviceInfo->bPaired);
811 else if (strcmp (pcKey,
"Connected") == 0) {
812 dbus_message_iter_next(&dict_i);
813 dbus_message_iter_recurse(&dict_i, &variant_i);
814 dbus_message_iter_get_basic(&variant_i, &bConnected);
815 apstBTDeviceInfo->bConnected = bConnected;
816 BTRCORELOG_INFO (
"apstBTDeviceInfo->bConnected = %d\n", apstBTDeviceInfo->bConnected);
818 else if (strcmp (pcKey,
"Trusted") == 0) {
819 dbus_message_iter_next(&dict_i);
820 dbus_message_iter_recurse(&dict_i, &variant_i);
821 dbus_message_iter_get_basic(&variant_i, &bTrusted);
822 apstBTDeviceInfo->bTrusted = bTrusted;
823 BTRCORELOG_INFO (
"apstBTDeviceInfo->bTrusted = %d\n", apstBTDeviceInfo->bTrusted);
825 else if (strcmp (pcKey,
"Blocked") == 0) {
826 dbus_message_iter_next(&dict_i);
827 dbus_message_iter_recurse(&dict_i, &variant_i);
828 dbus_message_iter_get_basic(&variant_i, &bBlocked);
829 apstBTDeviceInfo->bBlocked = bBlocked;
830 BTRCORELOG_INFO (
"apstBTDeviceInfo->bBlocked = %d\n", apstBTDeviceInfo->bBlocked);
832 else if (strcmp (pcKey,
"Alias") == 0) {
833 dbus_message_iter_next(&dict_i);
834 dbus_message_iter_recurse(&dict_i, &variant_i);
835 dbus_message_iter_get_basic(&variant_i, &pcAlias);
837 BTRCORELOG_INFO (
"apstBTDeviceInfo->pcAlias: %s\n", apstBTDeviceInfo->pcAlias);
839 else if (strcmp (pcKey,
"RSSI") == 0) {
840 dbus_message_iter_next(&dict_i);
841 dbus_message_iter_recurse(&dict_i, &variant_i);
842 dbus_message_iter_get_basic(&variant_i, &i16RSSI);
843 apstBTDeviceInfo->i32RSSI = i16RSSI;
844 BTRCORELOG_INFO (
"apstBTDeviceInfo->i32RSSI = %d i16RSSI = %d\n", apstBTDeviceInfo->i32RSSI, i16RSSI);
846 else if (strcmp (pcKey,
"UUIDs") == 0) {
847 dbus_message_iter_next(&dict_i);
848 dbus_message_iter_recurse(&dict_i, &variant_i);
850 dbus_type = dbus_message_iter_get_arg_type (&variant_i);
851 if (dbus_type == DBUS_TYPE_ARRAY) {
853 DBusMessageIter variant_j;
854 dbus_message_iter_recurse(&variant_i, &variant_j);
856 while ((dbus_type = dbus_message_iter_get_arg_type (&variant_j)) != DBUS_TYPE_INVALID)
861 dbus_message_iter_get_basic (&variant_j, &pVal);
862 BTRCORELOG_INFO (
"UUID value is %s\n", pVal);
866 dbus_message_iter_next (&variant_j);
871 BTRCORELOG_ERROR (
"apstBTDeviceInfo->Services; Not an Array\n");
876 if (!dbus_message_iter_next(&element_i))
882 if (strlen(apstBTDeviceInfo->pcAlias))
883 strncpy(apstBTDeviceInfo->pcName, apstBTDeviceInfo->pcAlias, strlen(apstBTDeviceInfo->pcAlias));
889 btrCore_BTParsePropertyChange (
890 DBusMessage* apDBusMsg,
893 DBusMessageIter arg_i, variant_i;
898 const char* lpcDBusMsgObjPath= dbus_message_get_path(apDBusMsg);
899 char* lpcinBtDevAddr = strstr(lpcDBusMsgObjPath,
"/dev_") + strlen(
"/dev_");
900 char* lpcstBtDevAddr = apstBTDeviceInfo->pcAddress;
901 int i32BtDevAddrLen = strlen(lpcinBtDevAddr);
904 for (i32LoopIdx = 0; i32LoopIdx < i32BtDevAddrLen; i32LoopIdx++) {
905 if (lpcinBtDevAddr[i32LoopIdx] ==
'_')
906 lpcstBtDevAddr[i32LoopIdx] =
':';
908 lpcstBtDevAddr[i32LoopIdx] = lpcinBtDevAddr[i32LoopIdx];
911 BTRCORELOG_DEBUG(
"Path = %s Address = %s\n", lpcDBusMsgObjPath, lpcstBtDevAddr);
913 if (!dbus_message_iter_init(apDBusMsg, &arg_i)) {
914 BTRCORELOG_ERROR (
"GetProperties lpDBusReply has no arguments.");
917 if (!dbus_message_get_args( apDBusMsg, NULL,
918 DBUS_TYPE_STRING, &bd_addr,
919 DBUS_TYPE_INVALID)) {
920 BTRCORELOG_ERROR (
"Invalid arguments for NameOwnerChanged signal");
924 BTRCORELOG_INFO (
" Name: %s\n", bd_addr);
925 if (strcmp(bd_addr,
"State") == 0) {
926 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
929 if (dbus_type == DBUS_TYPE_STRING) {
930 dbus_message_iter_next(&arg_i);
931 dbus_message_iter_recurse(&arg_i, &variant_i);
932 dbus_message_iter_get_basic(&variant_i, &value);
935 if (strcmp(gpcDeviceCurrState, value) != 0) {
936 strncpy(apstBTDeviceInfo->pcDevicePrevState, gpcDeviceCurrState,
BT_MAX_STR_LEN - 1);
937 strncpy(apstBTDeviceInfo->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
942 else if (strcmp(bd_addr,
"Connected") == 0) {
946 if ((strcmp (gpcDeviceCurrState,
"connecting") == 0) ||
947 (strcmp (gpcDeviceCurrState,
"playing") == 0))
949 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
950 if (dbus_type == DBUS_TYPE_BOOLEAN)
952 dbus_message_iter_next(&arg_i);
953 dbus_message_iter_recurse(&arg_i, &variant_i);
954 dbus_message_iter_get_basic(&variant_i, &isConnected);
956 if (1 == isConnected)
958 else if (0 == isConnected)
959 value =
"disconnected";
961 strncpy(apstBTDeviceInfo->pcDevicePrevState, gpcDeviceCurrState,
BT_MAX_STR_LEN - 1);
962 strncpy(apstBTDeviceInfo->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
972 btrCore_BTMediaEndpointSelectConfiguration (
973 DBusMessage* apDBusMsg
976 void* lpInputMediaCaps;
977 void* lpOutputMediaCaps;
978 DBusMessage* lpDBusReply;
982 dbus_error_init(&lDBusErr);
983 if (!dbus_message_get_args(apDBusMsg, &lDBusErr, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &lpInputMediaCaps, &lDBusArgsSize, DBUS_TYPE_INVALID)) {
984 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
985 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint.Error.InvalidArguments",
"Unable to select configuration");
988 if (gfpcBNegotiateMedia) {
989 if(!(lpOutputMediaCaps = gfpcBNegotiateMedia(lpInputMediaCaps, gpcBNegMediaUserData))) {
990 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint.Error.InvalidArguments",
"Unable to select configuration");
995 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
996 dbus_message_append_args (lpDBusReply, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &lpOutputMediaCaps, lDBusArgsSize, DBUS_TYPE_INVALID);
1002 btrCore_BTMediaEndpointSetConfiguration (
1003 DBusMessage* apDBusMsg
1005 const char* lDevTransportPath = NULL;
1006 const char* lStoredDevTransportPath = NULL;
1007 const char* dev_path = NULL, *uuid = NULL, *routing = NULL;
1009 unsigned char* config = NULL;
1011 int nrec= 0, inbandRingtone = 0;
1012 unsigned short int delay = 0;
1013 unsigned short int volume= 0;
1015 DBusMessageIter lDBusMsgIter;
1016 DBusMessageIter lDBusMsgIterProp;
1017 DBusMessageIter lDBusMsgIterEntry;
1018 DBusMessageIter lDBusMsgIterValue;
1019 DBusMessageIter lDBusMsgIterArr;
1022 dbus_message_iter_init(apDBusMsg, &lDBusMsgIter);
1023 dbus_message_iter_get_basic(&lDBusMsgIter, &lDevTransportPath);
1024 if (!dbus_message_iter_next(&lDBusMsgIter))
1025 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint.Error.InvalidArguments",
"Unable to set configuration");
1027 dbus_message_iter_recurse(&lDBusMsgIter, &lDBusMsgIterProp);
1028 if (dbus_message_iter_get_arg_type(&lDBusMsgIterProp) != DBUS_TYPE_DICT_ENTRY)
1029 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint.Error.InvalidArguments",
"Unable to set configuration");
1031 while (dbus_message_iter_get_arg_type(&lDBusMsgIterProp) == DBUS_TYPE_DICT_ENTRY) {
1035 dbus_message_iter_recurse(&lDBusMsgIterProp, &lDBusMsgIterEntry);
1036 dbus_message_iter_get_basic(&lDBusMsgIterEntry, &key);
1038 dbus_message_iter_next(&lDBusMsgIterEntry);
1039 dbus_message_iter_recurse(&lDBusMsgIterEntry, &lDBusMsgIterValue);
1041 ldBusType = dbus_message_iter_get_arg_type(&lDBusMsgIterValue);
1042 if (strcasecmp(key,
"UUID") == 0) {
1043 if (ldBusType != DBUS_TYPE_STRING)
1044 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint.Error.InvalidArguments",
"Unable to set configuration");
1046 dbus_message_iter_get_basic(&lDBusMsgIterValue, &uuid);
1047 BTRCORELOG_INFO (
"btrCore_BTMediaEndpointSetConfiguration - UUID %s\n", uuid);
1049 else if (strcasecmp(key,
"Device") == 0) {
1050 if (ldBusType != DBUS_TYPE_OBJECT_PATH)
1051 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint.Error.InvalidArguments",
"Unable to set configuration");
1053 dbus_message_iter_get_basic(&lDBusMsgIterValue, &dev_path);
1054 BTRCORELOG_INFO (
"btrCore_BTMediaEndpointSetConfiguration - Device %s\n", dev_path);
1056 else if (strcasecmp(key,
"Codec") == 0) {
1057 if (ldBusType != DBUS_TYPE_BYTE)
1058 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint.Error.InvalidArguments",
"Unable to set configuration");
1060 dbus_message_iter_get_basic(&lDBusMsgIterValue, &codec);
1061 BTRCORELOG_ERROR (
"btrCore_BTMediaEndpointSetConfiguration - Codec %d\n", codec);
1063 else if (strcasecmp(key,
"Configuration") == 0) {
1064 if (ldBusType != DBUS_TYPE_ARRAY)
1065 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint.Error.InvalidArguments",
"Unable to set configuration");
1067 dbus_message_iter_recurse(&lDBusMsgIterValue, &lDBusMsgIterArr);
1068 dbus_message_iter_get_fixed_array(&lDBusMsgIterArr, &config, &size);
1069 BTRCORELOG_INFO (
"btrCore_BTMediaEndpointSetConfiguration - Configuration \n");
1071 else if (strcasecmp(key,
"Delay") == 0) {
1072 if (ldBusType != DBUS_TYPE_UINT16)
1073 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint.Error.InvalidArguments",
"Unable to set configuration");
1075 dbus_message_iter_get_basic(&lDBusMsgIterValue, &delay);
1076 BTRCORELOG_INFO (
"btrCore_BTMediaEndpointSetConfiguration - Delay %d\n", delay);
1078 else if (strcasecmp(key,
"NREC") == 0) {
1079 if (ldBusType != DBUS_TYPE_BOOLEAN)
1080 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint.Error.InvalidArguments",
"Unable to set configuration");
1082 dbus_message_iter_get_basic(&lDBusMsgIterValue, &nrec);
1083 BTRCORELOG_INFO (
"btrCore_BTMediaEndpointSetConfiguration - NREC %d\n", nrec);
1085 else if (strcasecmp(key,
"InbandRingtone") == 0) {
1086 if (ldBusType != DBUS_TYPE_BOOLEAN)
1087 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint.Error.InvalidArguments",
"Unable to set configuration");
1089 dbus_message_iter_get_basic(&lDBusMsgIterValue, &inbandRingtone);
1090 BTRCORELOG_INFO (
"btrCore_BTMediaEndpointSetConfiguration - InbandRingtone %d\n", inbandRingtone);
1092 else if (strcasecmp(key,
"Routing") == 0) {
1093 if (ldBusType != DBUS_TYPE_STRING)
1094 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint.Error.InvalidArguments",
"Unable to set configuration");
1096 dbus_message_iter_get_basic(&lDBusMsgIterValue, &routing);
1097 BTRCORELOG_INFO (
"btrCore_BTMediaEndpointSetConfiguration - routing %s\n", routing);
1099 else if (strcasecmp(key,
"Volume") == 0) {
1100 if (ldBusType != DBUS_TYPE_UINT16)
1101 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint.Error.InvalidArguments",
"Unable to set configuration");
1103 dbus_message_iter_get_basic(&lDBusMsgIterValue, &volume);
1104 BTRCORELOG_INFO (
"btrCore_BTMediaEndpointSetConfiguration - Volume %d\n", volume);
1107 dbus_message_iter_next(&lDBusMsgIterProp);
1110 BTRCORELOG_INFO (
"Set configuration - Transport Path %s\n", lDevTransportPath);
1112 if (gpcDevTransportPath) {
1113 free(gpcDevTransportPath);
1114 gpcDevTransportPath = NULL;
1117 gpcDevTransportPath = strdup(lDevTransportPath);
1119 if (gfpcBTransportPathMedia) {
1120 if((lStoredDevTransportPath = gfpcBTransportPathMedia(lDevTransportPath, config, gpcBTransPathMediaUserData))) {
1121 BTRCORELOG_INFO (
"Stored - Transport Path 0x%p:%s\n", lStoredDevTransportPath, lStoredDevTransportPath);
1125 return dbus_message_new_method_return(apDBusMsg);
1130 btrCore_BTMediaEndpointClearConfiguration (
1131 DBusMessage* apDBusMsg
1133 DBusMessage* lpDBusReply = NULL;
1134 DBusMessageIter lDBusMsgIter;
1135 const char* lDevTransportPath = NULL;
1136 const char* lStoredDevTransportPath = NULL;
1138 dbus_message_iter_init(apDBusMsg, &lDBusMsgIter);
1139 dbus_message_iter_get_basic(&lDBusMsgIter, &lDevTransportPath);
1140 BTRCORELOG_DEBUG (
"Clear configuration - Transport Path %s\n", lDevTransportPath);
1142 if (gpcDevTransportPath) {
1143 free(gpcDevTransportPath);
1144 gpcDevTransportPath = NULL;
1147 if (gfpcBTransportPathMedia) {
1148 if(!(lStoredDevTransportPath = gfpcBTransportPathMedia(lDevTransportPath, NULL, gpcBTransPathMediaUserData))) {
1149 BTRCORELOG_INFO (
"Cleared - Transport Path %s\n", lDevTransportPath);
1153 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
1164 DBusConnection* lpDBusConn = NULL;
1166 dbus_error_init(&lDBusErr);
1167 lpDBusConn = dbus_bus_get(DBUS_BUS_SYSTEM, &lDBusErr);
1169 if (lpDBusConn == NULL) {
1170 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
1174 BTRCORELOG_INFO (
"DBus Debug DBus Connection Name %s\n", dbus_bus_get_unique_name (lpDBusConn));
1175 gpDBusConn = lpDBusConn;
1177 if (!dbus_connection_add_filter(gpDBusConn, btrCore_BTDBusConnectionFilter_cb, NULL, NULL)) {
1178 BTRCORELOG_ERROR (
"Can't add signal filter - BtrCore_BTInitGetConnection\n");
1183 dbus_bus_add_match(gpDBusConn,
"type='signal',interface='org.bluez.Adapter'", NULL);
1185 gpcBConnAuthPassKey = 0;
1187 gpcBTransPathMediaUserData = NULL;
1188 gpcBNegMediaUserData = NULL;
1189 gpcBConnIntimUserData = NULL;
1190 gpcBConnAuthUserData = NULL;
1191 gpcBDevStatusUserData = NULL;
1192 gfpcBDevStatusUpdate = NULL;
1193 gfpcBNegotiateMedia = NULL;
1194 gfpcBTransportPathMedia = NULL;
1195 gfpcBConnectionIntimation = NULL;
1196 gfpcBConnectionAuthentication = NULL;
1198 return (
void*)gpDBusConn;
1206 if (!gpDBusConn || (gpDBusConn != apBtConn))
1210 if (gpcBTAgentPath) {
1211 free(gpcBTAgentPath);
1212 gpcBTAgentPath = NULL;
1215 if (gpcBTDAdapterPath) {
1216 free(gpcBTDAdapterPath);
1217 gpcBTDAdapterPath = NULL;
1220 if (gpcBTAdapterPath) {
1221 free(gpcBTAdapterPath);
1222 gpcBTAdapterPath = NULL;
1225 gfpcBConnectionAuthentication = NULL;
1226 gfpcBConnectionIntimation = NULL;
1227 gfpcBTransportPathMedia = NULL;
1228 gfpcBNegotiateMedia = NULL;
1229 gfpcBDevStatusUpdate = NULL;
1230 gpcBDevStatusUserData = NULL;
1231 gpcBConnAuthUserData = NULL;
1232 gpcBConnIntimUserData = NULL;
1233 gpcBNegMediaUserData = NULL;
1234 gpcBTransPathMediaUserData = NULL;
1236 gpcBConnAuthPassKey = 0;
1238 dbus_bus_remove_match(gpDBusConn,
"type='signal',interface='org.bluez.Adapter'", NULL);
1240 dbus_connection_remove_filter(gpDBusConn, btrCore_BTDBusConnectionFilter_cb, NULL);
1252 char lDefaultBTPath[128] = {
'\0'};
1254 if (!gpDBusConn || (gpDBusConn != apBtConn))
1257 snprintf(lDefaultBTPath,
sizeof(lDefaultBTPath),
"/org/bluez/agent_%d", getpid());
1259 if (gpcBTAgentPath) {
1260 free(gpcBTAgentPath);
1261 gpcBTAgentPath = NULL;
1264 gpcBTAgentPath = strdup(lDefaultBTPath);
1265 return gpcBTAgentPath;
1273 if (!gpDBusConn || (gpDBusConn != apBtConn))
1276 if (gpcBTAgentPath) {
1277 free(gpcBTAgentPath);
1278 gpcBTAgentPath = NULL;
1288 const char* apBtAdapter,
1289 const char* apBtAgentPath,
1290 const char* capabilities
1292 DBusMessage* lpDBusMsg = NULL;
1293 DBusMessage* lpDBusReply = NULL;
1296 if (!gpDBusConn || (gpDBusConn != apBtConn))
1300 if (!dbus_connection_register_object_path(gpDBusConn, apBtAgentPath, &gDBusAgentVTable, NULL)) {
1301 BTRCORELOG_ERROR (
"Error registering object path for agent\n");
1305 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
1307 "org.bluez.Adapter",
1310 BTRCORELOG_ERROR (
"Error allocating new method call\n");
1314 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_OBJECT_PATH, &apBtAgentPath, DBUS_TYPE_STRING, &capabilities, DBUS_TYPE_INVALID);
1317 dbus_error_init(&lDBusErr);
1318 lpDBusReply = dbus_connection_send_with_reply_and_block(gpDBusConn, lpDBusMsg, -1, &lDBusErr);
1319 dbus_message_unref(lpDBusMsg);
1322 BTRCORELOG_ERROR (
"Unable to register agent\n");
1323 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
1327 dbus_message_unref(lpDBusReply);
1329 dbus_connection_flush(gpDBusConn);
1338 const char* apBtAdapter,
1339 const char* apBtAgentPath
1341 DBusMessage* lpDBusMsg = NULL;
1342 DBusMessage* lpDBusReply = NULL;
1345 if (!gpDBusConn || (gpDBusConn != apBtConn))
1349 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
1351 "org.bluez.Adapter",
1354 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
1358 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_OBJECT_PATH, &apBtAgentPath, DBUS_TYPE_INVALID);
1361 dbus_error_init(&lDBusErr);
1362 lpDBusReply = dbus_connection_send_with_reply_and_block(gpDBusConn, lpDBusMsg, -1, &lDBusErr);
1363 dbus_message_unref(lpDBusMsg);
1366 BTRCORELOG_ERROR (
"Can't unregister agent\n");
1367 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
1371 dbus_message_unref(lpDBusReply);
1373 dbus_connection_flush(gpDBusConn);
1375 if (!dbus_connection_unregister_object_path(gpDBusConn, apBtAgentPath)) {
1376 BTRCORELOG_ERROR (
"Error unregistering object path for agent\n");
1387 unsigned int* apBtNumAdapters,
1388 char** apcArrBtAdapterPath
1390 DBusMessage* lpDBusReply = NULL;
1392 dbus_bool_t lDBusOp;
1393 char** paths = NULL;
1398 if (!gpDBusConn || (gpDBusConn != apBtConn))
1402 lpDBusReply = btrCore_BTSendMethodCall(
"/",
"org.bluez.Manager",
"ListAdapters");
1404 BTRCORELOG_ERROR (
"org.bluez.Manager.ListAdapters returned an error\n");
1409 dbus_error_init(&lDBusErr);
1410 lDBusOp = dbus_message_get_args(lpDBusReply, &lDBusErr, DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &paths, &num, DBUS_TYPE_INVALID);
1411 dbus_message_unref(lpDBusReply);
1414 BTRCORELOG_ERROR (
"org.bluez.Manager.GetProperties parsing failed\n");
1415 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
1420 if (apBtNumAdapters && apcArrBtAdapterPath) {
1421 *apBtNumAdapters = num;
1423 for (i = 0; i < num; i++) {
1424 if (*(apcArrBtAdapterPath + i)) {
1425 BTRCORELOG_INFO (
"Adapter Path: %d is %s\n", i, paths[i]);
1426 strncpy(*(apcArrBtAdapterPath + i), paths[i], BD_NAME_LEN);
1440 const char* apBtAdapter
1442 DBusMessage* lpDBusMsg = NULL;
1443 DBusMessage* lpDBusReply = NULL;
1444 const char* lpReplyPath = NULL;
1447 dbus_bool_t lDBusOp;
1449 if (!gpDBusConn || (gpDBusConn != apBtConn))
1453 return btrCore_BTGetDefaultAdapterPath();
1455 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
1457 "org.bluez.Manager",
1460 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
1464 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_STRING, &apBtAdapter, DBUS_TYPE_INVALID);
1466 dbus_error_init(&lDBusErr);
1467 lpDBusReply = dbus_connection_send_with_reply_and_block(gpDBusConn, lpDBusMsg, -1, &lDBusErr);
1468 dbus_message_unref(lpDBusMsg);
1471 BTRCORELOG_ERROR (
"Can't find adapter %s\n", apBtAdapter);
1472 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
1476 lDBusOp = dbus_message_get_args(lpDBusReply, &lDBusErr, DBUS_TYPE_OBJECT_PATH, &lpReplyPath, DBUS_TYPE_INVALID);
1477 dbus_message_unref(lpDBusReply);
1480 BTRCORELOG_ERROR (
"Can't get lpDBusReply arguments\n");
1481 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
1485 dbus_connection_flush(gpDBusConn);
1487 if (gpcBTAdapterPath) {
1488 free(gpcBTAdapterPath);
1489 gpcBTAdapterPath = NULL;
1492 gpcBTAdapterPath = strndup(lpReplyPath, strlen(lpReplyPath));
1494 return gpcBTAdapterPath;
1501 const char* apBtAdapter
1503 if (!gpDBusConn || (gpDBusConn != apBtConn))
1507 return btrCore_BTReleaseDefaultAdapterPath();
1510 if (gpcBTAdapterPath) {
1511 if (gpcBTAdapterPath != apBtAdapter) {
1512 BTRCORELOG_ERROR (
"ERROR: Looks like Adapter path has been changed by User\n");
1514 free(gpcBTAdapterPath);
1515 gpcBTAdapterPath = NULL;
1525 char* apBtOutIfceName,
1526 char* apBtOutVersion
1528 FILE* lfpVersion = NULL;
1529 char lcpVersion[8] = {
'\0'};
1531 if (!gpDBusConn || (gpDBusConn != apBtConn))
1534 if (!apBtOutIfceName || !apBtOutVersion)
1537 lfpVersion = popen(
"/usr/sbin/bluetoothd --version",
"r");
1538 if ((lfpVersion == NULL)) {
1539 BTRCORELOG_ERROR (
"Failed to run Version command\n");
1540 strncpy(lcpVersion,
"4.XXX", strlen(
"4.XXX"));
1543 if (fgets(lcpVersion,
sizeof(lcpVersion)-1, lfpVersion) == NULL) {
1544 BTRCORELOG_ERROR (
"Failed to Valid Version\n");
1545 strncpy(lcpVersion,
"4.XXX", strlen(
"4.XXX"));
1552 strncpy(apBtOutIfceName,
"Bluez", strlen(
"Bluez"));
1553 strncpy(apBtOutVersion, lcpVersion, strlen(lcpVersion));
1562 const char* apcBtOpIfcePath,
1569 DBusMessage* lpDBusReply = NULL;
1570 DBusMessageIter arg_i;
1571 DBusMessageIter element_i;
1572 DBusMessageIter variant_i;
1574 const char* pParsedKey = NULL;
1575 const char* pParsedValueString = NULL;
1576 int parsedValueNumber = 0;
1577 unsigned int parsedValueUnsignedNumber = 0;
1578 unsigned short parsedValueUnsignedShort = 0;
1580 const char* lDBusKey = NULL;
1581 int lDBusType = DBUS_TYPE_INVALID;
1583 const char* pInterface = NULL;
1584 const char* pAdapterInterface =
"org.bluez.Adapter";
1585 const char* pDeviceInterface =
"org.bluez.Device";
1586 const char* pMediaTransInterface=
"org.bluez.MediaTransport";
1588 if (!gpDBusConn || (gpDBusConn != apBtConn))
1591 if ((!apcBtOpIfcePath) || (!apvVal)) {
1592 BTRCORELOG_ERROR (
"enBTRCoreInvalidArg - enBTRCoreInitFailure\n");
1596 switch (aenBtOpIfceType) {
1598 pInterface = pAdapterInterface;
1599 switch (aunBtOpIfceProp.enBtAdapterProp) {
1600 case enBTAdPropName:
1601 lDBusType = DBUS_TYPE_STRING;
1604 case enBTAdPropAddress:
1605 lDBusType = DBUS_TYPE_STRING;
1606 lDBusKey =
"Address";
1608 case enBTAdPropPowered:
1609 lDBusType = DBUS_TYPE_BOOLEAN;
1610 lDBusKey =
"Powered";
1612 case enBTAdPropDiscoverable:
1613 lDBusType = DBUS_TYPE_BOOLEAN;
1614 lDBusKey =
"Discoverable";
1616 case enBTAdPropDiscoverableTimeOut:
1617 lDBusType = DBUS_TYPE_UINT32;
1618 lDBusKey =
"DiscoverableTimeout";
1620 case enBTAdPropUnknown:
1622 BTRCORELOG_ERROR (
"Invalid Adapter Property\n");
1627 pInterface = pDeviceInterface;
1628 switch (aunBtOpIfceProp.enBtDeviceProp) {
1629 case enBTDevPropPaired:
1630 lDBusType = DBUS_TYPE_BOOLEAN;
1631 lDBusKey =
"Paired";
1633 case enBTDevPropConnected:
1634 lDBusType = DBUS_TYPE_BOOLEAN;
1635 lDBusKey =
"Connected";
1637 case enBTDevPropVendor:
1638 lDBusType = DBUS_TYPE_UINT16;
1639 lDBusKey =
"Vendor";
1641 case enBTDevPropUnknown:
1643 BTRCORELOG_ERROR (
"Invalid Device Property\n");
1647 case enBTMediaTransport:
1648 pInterface = pMediaTransInterface;
1649 switch (aunBtOpIfceProp.enBtMediaTransportProp) {
1650 case enBTMedTPropDelay:
1651 lDBusType = DBUS_TYPE_UINT16;
1654 case enBTMedTPropUnknown:
1656 BTRCORELOG_ERROR (
"Invalid MediaTransport Property\n");
1662 BTRCORELOG_ERROR (
"Invalid Operational Interface\n");
1667 dbus_error_init(&lDBusErr);
1668 lpDBusReply = btrCore_BTSendMethodCall(apcBtOpIfcePath, pInterface,
"GetProperties");
1670 BTRCORELOG_ERROR (
"%s.GetProperties returned an error: '%s'\n", pInterface, lDBusErr.message);
1672 dbus_error_free(&lDBusErr);
1675 if (!dbus_message_iter_init(lpDBusReply, &arg_i)) {
1676 BTRCORELOG_ERROR (
"GetProperties lpDBusReply has no arguments.");
1679 else if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_ARRAY) {
1680 BTRCORELOG_ERROR (
"GetProperties argument is not an array.");
1684 dbus_message_iter_recurse(&arg_i, &element_i);
1685 while (dbus_message_iter_get_arg_type(&element_i) != DBUS_TYPE_INVALID) {
1686 if (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) {
1687 DBusMessageIter dict_i;
1688 dbus_message_iter_recurse(&element_i, &dict_i);
1689 dbus_message_iter_get_basic(&dict_i, &pParsedKey);
1691 if ((pParsedKey) && (strcmp (pParsedKey, lDBusKey) == 0)) {
1692 dbus_message_iter_next(&dict_i);
1693 dbus_message_iter_recurse(&dict_i, &variant_i);
1694 if (lDBusType == DBUS_TYPE_STRING) {
1695 dbus_message_iter_get_basic(&variant_i, &pParsedValueString);
1697 strncpy (apvVal, pParsedValueString, BD_NAME_LEN);
1699 else if (lDBusType == DBUS_TYPE_UINT16) {
1700 unsigned short* ptr = (
unsigned short*) apvVal;
1701 dbus_message_iter_get_basic(&variant_i, &parsedValueUnsignedShort);
1703 *ptr = parsedValueUnsignedShort;
1705 else if (lDBusType == DBUS_TYPE_UINT32) {
1706 unsigned int* ptr = (
unsigned int*) apvVal;
1707 dbus_message_iter_get_basic(&variant_i, &parsedValueUnsignedNumber);
1709 *ptr = parsedValueUnsignedNumber;
1712 int* ptr = (
int*) apvVal;
1713 dbus_message_iter_get_basic(&variant_i, &parsedValueNumber);
1715 *ptr = parsedValueNumber;
1722 if (!dbus_message_iter_next(&element_i))
1727 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
1729 dbus_message_unref(lpDBusReply);
1739 const char* apcBtOpIfcePath,
1745 DBusMessage* lpDBusMsg = NULL;
1746 DBusMessage* lpDBusReply = NULL;
1747 DBusMessageIter lDBusMsgIter;
1748 DBusMessageIter lDBusMsgIterValue;
1751 const char* lDBusTypeAsString;
1753 const char* lDBusKey = NULL;
1754 int lDBusType = DBUS_TYPE_INVALID;
1756 const char* pInterface = NULL;
1757 const char* pAdapterInterface =
"org.bluez.Adapter";
1758 const char* pDeviceInterface =
"org.bluez.Device";
1759 const char* pMediaTransInterface=
"org.bluez.MediaTransport";
1762 if (!gpDBusConn || (gpDBusConn != apBtConn) || !apvVal)
1765 if ((!apcBtOpIfcePath) || (!apvVal)) {
1766 BTRCORELOG_ERROR (
"enBTRCoreInvalidArg - enBTRCoreInitFailure\n");
1771 switch (aenBtOpIfceType) {
1773 pInterface = pAdapterInterface;
1774 switch (aunBtOpIfceProp.enBtAdapterProp) {
1775 case enBTAdPropName:
1776 lDBusType = DBUS_TYPE_STRING;
1779 case enBTAdPropAddress:
1780 lDBusType = DBUS_TYPE_STRING;
1781 lDBusKey =
"Address";
1783 case enBTAdPropPowered:
1784 lDBusType = DBUS_TYPE_BOOLEAN;
1785 lDBusKey =
"Powered";
1787 case enBTAdPropDiscoverable:
1788 lDBusType = DBUS_TYPE_BOOLEAN;
1789 lDBusKey =
"Discoverable";
1791 case enBTAdPropDiscoverableTimeOut:
1792 lDBusType = DBUS_TYPE_UINT32;
1793 lDBusKey =
"DiscoverableTimeout";
1795 case enBTAdPropUnknown:
1797 BTRCORELOG_ERROR (
"Invalid Adapter Property\n");
1802 pInterface = pDeviceInterface;
1803 switch (aunBtOpIfceProp.enBtDeviceProp) {
1804 case enBTDevPropPaired:
1805 lDBusType = DBUS_TYPE_BOOLEAN;
1806 lDBusKey =
"Paired";
1808 case enBTDevPropConnected:
1809 lDBusType = DBUS_TYPE_BOOLEAN;
1810 lDBusKey =
"Connected";
1812 case enBTDevPropVendor:
1813 lDBusType = DBUS_TYPE_UINT16;
1814 lDBusKey =
"Vendor";
1816 case enBTDevPropUnknown:
1818 BTRCORELOG_ERROR (
"Invalid Device Property\n");
1822 case enBTMediaTransport:
1823 pInterface = pMediaTransInterface;
1824 switch (aunBtOpIfceProp.enBtMediaTransportProp) {
1825 case enBTMedTPropDelay:
1826 lDBusType = DBUS_TYPE_UINT16;
1829 case enBTMedTPropUnknown:
1831 BTRCORELOG_ERROR (
"Invalid MediaTransport Property\n");
1837 BTRCORELOG_ERROR (
"Invalid Operational Interface\n");
1842 switch (lDBusType) {
1843 case DBUS_TYPE_BOOLEAN:
1844 lDBusTypeAsString = DBUS_TYPE_BOOLEAN_AS_STRING;
1846 case DBUS_TYPE_UINT32:
1847 lDBusTypeAsString = DBUS_TYPE_UINT32_AS_STRING;
1849 case DBUS_TYPE_UINT16:
1850 lDBusTypeAsString = DBUS_TYPE_UINT16_AS_STRING;
1852 case DBUS_TYPE_STRING:
1853 lDBusTypeAsString = DBUS_TYPE_STRING_AS_STRING;
1856 BTRCORELOG_ERROR (
"Invalid DBus Type\n");
1861 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
1866 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
1871 dbus_message_iter_init_append(lpDBusMsg, &lDBusMsgIter);
1872 dbus_message_iter_append_basic(&lDBusMsgIter, DBUS_TYPE_STRING, &lDBusKey);
1873 dbus_message_iter_open_container(&lDBusMsgIter, DBUS_TYPE_VARIANT, lDBusTypeAsString, &lDBusMsgIterValue);
1874 dbus_message_iter_append_basic(&lDBusMsgIterValue, lDBusType, apvVal);
1875 dbus_message_iter_close_container(&lDBusMsgIter, &lDBusMsgIterValue);
1877 dbus_error_init(&lDBusErr);
1878 lpDBusReply = dbus_connection_send_with_reply_and_block(gpDBusConn, lpDBusMsg, -1, &lDBusErr);
1879 dbus_message_unref(lpDBusMsg);
1882 BTRCORELOG_ERROR (
"Reply Null\n");
1883 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
1887 dbus_message_unref(lpDBusReply);
1889 dbus_connection_flush(gpDBusConn);
1898 const char* apBtAdapter,
1899 const char* apBtAgentPath
1901 dbus_bool_t lDBusOp;
1902 DBusMessage* lpDBusMsg = NULL;
1904 if (!gpDBusConn || (gpDBusConn != apBtConn))
1907 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
1909 "org.bluez.Adapter",
1912 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
1916 lDBusOp = dbus_connection_send(gpDBusConn, lpDBusMsg, NULL);
1917 dbus_message_unref(lpDBusMsg);
1920 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
1924 dbus_connection_flush(gpDBusConn);
1933 const char* apBtAdapter,
1934 const char* apBtAgentPath
1936 dbus_bool_t lDBusOp;
1937 DBusMessage* lpDBusMsg = NULL;
1939 if (!gpDBusConn || (gpDBusConn != apBtConn))
1942 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
1944 "org.bluez.Adapter",
1947 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
1951 lDBusOp = dbus_connection_send(gpDBusConn, lpDBusMsg, NULL);
1952 dbus_message_unref(lpDBusMsg);
1955 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
1959 dbus_connection_flush(gpDBusConn);
1968 const char* apBtAdapter,
1969 const char* apBtAgentPath
1978 const char* apBtAdapter,
1979 const char* apBtAgentPath
1988 const char* apBtAdapter,
1993 char** paths = NULL;
1997 if (!gpDBusConn || (gpDBusConn != apBtConn) || !apBtAdapter || !pPairedDeviceInfo)
2002 dbus_error_init(&lDBusErr);
2003 DBusMessage* lpDBusReply = btrCore_BTSendMethodCall(apBtAdapter,
"org.bluez.Adapter",
"ListDevices");
2004 if (lpDBusReply != NULL) {
2005 if (!dbus_message_get_args(lpDBusReply, &lDBusErr, DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &paths, &num, DBUS_TYPE_INVALID)) {
2006 BTRCORELOG_ERROR (
"org.bluez.Adapter.ListDevices returned an error: '%s'\n", lDBusErr.message);
2010 pPairedDeviceInfo->numberOfDevices = num;
2013 for ( i = 0; i < num; i++) {
2014 strcpy(pPairedDeviceInfo->devicePath[i], paths[i]);
2016 dbus_message_unref(lpDBusReply);
2019 for ( i = 0; i < num; i++) {
2020 lpDBusReply = btrCore_BTSendMethodCall(pPairedDeviceInfo->devicePath[i],
"org.bluez.Device",
"GetProperties");
2021 if (lpDBusReply != NULL) {
2022 memset (&apstBTDeviceInfo, 0,
sizeof(apstBTDeviceInfo));
2023 if (0 != btrCore_BTParseDevice(lpDBusReply, &apstBTDeviceInfo)) {
2024 BTRCORELOG_ERROR (
"Parsing the device %s failed..\n", pPairedDeviceInfo->devicePath[i]);
2025 dbus_message_unref(lpDBusReply);
2029 memcpy (&pPairedDeviceInfo->deviceInfo[i], &apstBTDeviceInfo,
sizeof(apstBTDeviceInfo));
2032 dbus_message_unref(lpDBusReply);
2042 const char* apBtAdapter,
2043 unsigned int* apui32PairedDevCnt,
2044 char** apcArrPairedDevPath
2046 DBusMessage* lpDBusReply = NULL;
2048 dbus_bool_t lDBusOp;
2052 char** paths = NULL;
2055 if (!gpDBusConn || (gpDBusConn != apBtConn) || !apBtAdapter || !apui32PairedDevCnt || !apcArrPairedDevPath)
2059 lpDBusReply = btrCore_BTSendMethodCall(apBtAdapter,
"org.bluez.Adapter",
"ListDevices");
2061 BTRCORELOG_ERROR (
"org.bluez.Adapter.ListDevices returned an error\n");
2066 dbus_error_init(&lDBusErr);
2067 lDBusOp = dbus_message_get_args(lpDBusReply, &lDBusErr, DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &paths, &num, DBUS_TYPE_INVALID);
2068 dbus_message_unref(lpDBusReply);
2072 BTRCORELOG_ERROR (
"org.bluez.Adapter.ListDevices parsing failed\n");
2073 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2077 for ( i = 0; i < num; i++) {
2078 if (apcArrPairedDevPath[i]) {
2079 strcpy(apcArrPairedDevPath[i], paths[i]);
2084 *apui32PairedDevCnt = num;
2094 const char* apcDevPath,
2097 DBusMessage* lpDBusMsg = NULL;
2098 DBusMessage* lpDBusReply = NULL;
2100 DBusMessageIter arg_i, element_i;
2101 DBusMessageIter dict_i;
2107 char* pSearchString =
"";
2108 char* pUUIDValue =
"uuid value=\"0x";
2109 char* pProfileName =
"text value=\"";
2110 int lengthOfUUID = strlen (pUUIDValue);
2111 int lengthOfProfile = strlen (pProfileName);
2114 int isUUIDFound = 0;
2115 int isProfileFound = 0;
2118 if (!gpDBusConn || (gpDBusConn != apBtConn) || !pProfileList)
2121 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
2124 "DiscoverServices");
2126 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
2130 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_STRING, &pSearchString, DBUS_TYPE_INVALID);
2132 dbus_error_init(&lDBusErr);
2133 lpDBusReply = dbus_connection_send_with_reply_and_block(gpDBusConn, lpDBusMsg, 2500, &lDBusErr);
2134 dbus_message_unref(lpDBusMsg);
2137 BTRCORELOG_ERROR (
"Discover Services FAILED\n");
2138 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2142 if (!dbus_message_iter_init(lpDBusReply, &arg_i)) {
2143 BTRCORELOG_ERROR (
"DiscoverServices information lpDBusReply empty");
2144 dbus_message_unref(lpDBusReply);
2148 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
2151 dbus_message_iter_recurse(&arg_i, &element_i);
2152 dbus_type = dbus_message_iter_get_arg_type(&element_i);
2155 while (dbus_message_iter_get_arg_type(&element_i) != DBUS_TYPE_INVALID) {
2156 dbus_type = dbus_message_iter_get_arg_type(&element_i);
2159 if (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) {
2163 dbus_message_iter_recurse(&element_i, &dict_i);
2164 dbus_type = dbus_message_iter_get_arg_type(&dict_i);
2167 dbus_message_iter_next(&dict_i);
2168 dbus_type = dbus_message_iter_get_arg_type(&dict_i);
2170 dbus_message_iter_get_basic(&dict_i, &value);
2173 ret = strstr(value, pUUIDValue);
2175 ret += lengthOfUUID;
2182 pProfileList->profile[count].uuid_value = strtol(buff, NULL, 16);
2186 ret = strstr(value, pProfileName);
2190 ret += lengthOfProfile;
2191 ptr = strchr(ret,
'"');
2196 strncpy (pProfileList->profile[count].profile_name, ret, index);
2203 if ((isUUIDFound) && (isProfileFound)) {
2205 pProfileList->numberOfService = count;
2210 if (!dbus_message_iter_next(&element_i))
2215 dbus_message_unref(lpDBusReply);
2225 const char* apcDevPath,
2226 const char* apcSearchString,
2229 DBusMessage* lpDBusMsg = NULL;
2230 DBusMessage* lpDBusReply = NULL;
2232 DBusMessageIter arg_i;
2233 DBusMessageIter element_i;
2234 DBusMessageIter dict_i;
2241 if (!gpDBusConn || (gpDBusConn != apBtConn))
2245 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
2248 "DiscoverServices");
2250 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
2255 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_STRING, &apcSearchString, DBUS_TYPE_INVALID);
2258 dbus_error_init(&lDBusErr);
2259 lpDBusReply = dbus_connection_send_with_reply_and_block(gpDBusConn, lpDBusMsg, -1, &lDBusErr);
2260 dbus_message_unref(lpDBusMsg);
2263 BTRCORELOG_ERROR (
"Failure attempting to Discover Services\n");
2264 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2268 if (!dbus_message_iter_init(lpDBusReply, &arg_i)) {
2269 BTRCORELOG_ERROR (
"DiscoverServices lpDBusReply has no information.");
2270 dbus_message_unref(lpDBusReply);
2274 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
2277 dbus_message_iter_recurse(&arg_i, &element_i);
2278 dbus_type = dbus_message_iter_get_arg_type(&element_i);
2281 while (dbus_message_iter_get_arg_type(&element_i) != DBUS_TYPE_INVALID) {
2282 dbus_type = dbus_message_iter_get_arg_type(&element_i);
2285 if (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) {
2287 dbus_message_iter_recurse(&element_i, &dict_i);
2288 dbus_type = dbus_message_iter_get_arg_type(&dict_i);
2291 dbus_message_iter_next(&dict_i);
2292 dbus_type = dbus_message_iter_get_arg_type(&dict_i);
2294 dbus_message_iter_get_basic(&dict_i, &value);
2297 if (apcDataString != NULL) {
2298 strcpy(apcDataString, value);
2302 ret = strstr(value, apcSearchString);
2314 if (!dbus_message_iter_next(&element_i))
2319 dbus_message_unref(lpDBusReply);
2329 const char* apBtAdapter,
2330 const char* apBtAgentPath,
2331 const char* apcDevPath,
2334 DBusMessage* lpDBusMsg = NULL;
2335 DBusMessage* lpDBusReply = NULL;
2337 char deviceOpString[64] = {
'\0'};
2342 const char* capabilities =
"NoInputNoOutput";
2344 const char* capabilities =
"DisplayYesNo";
2347 if (!gpDBusConn || (gpDBusConn != apBtConn) || !apBtAdapter || !apBtAgentPath || !apcDevPath || (aenBTAdpOp == enBTAdpOpUnknown))
2351 switch (aenBTAdpOp) {
2352 case enBTAdpOpFindPairedDev:
2353 strcpy(deviceOpString,
"FindDevice");
2355 case enBTAdpOpCreatePairedDev:
2356 strcpy(deviceOpString,
"CreatePairedDevice");
2358 case enBTAdpOpRemovePairedDev:
2359 strcpy(deviceOpString,
"RemoveDevice");
2361 case enBTAdpOpUnknown:
2370 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
2372 "org.bluez.Adapter",
2375 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
2379 if (aenBTAdpOp == enBTAdpOpFindPairedDev) {
2380 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_STRING, &apcDevPath, DBUS_TYPE_INVALID);
2382 else if (aenBTAdpOp == enBTAdpOpRemovePairedDev) {
2383 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_OBJECT_PATH, &apcDevPath, DBUS_TYPE_INVALID);
2385 else if (aenBTAdpOp == enBTAdpOpCreatePairedDev) {
2386 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_STRING, &apcDevPath,
2387 DBUS_TYPE_OBJECT_PATH, &apBtAgentPath,
2388 DBUS_TYPE_STRING, &capabilities,
2392 dbus_error_init(&lDBusErr);
2393 lpDBusReply = dbus_connection_send_with_reply_and_block(gpDBusConn, lpDBusMsg, -1, &lDBusErr);
2394 dbus_message_unref(lpDBusMsg);
2397 BTRCORELOG_ERROR (
"Pairing failed...\n");
2398 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2402 dbus_message_unref(lpDBusReply);
2411 const char* apcDevPath
2413 FILE* lfpL2Ping = NULL;
2415 char lcpL2PingIp[64] = {
'\0'};
2416 char lcpL2PingOp[512] = {
'\0'};
2418 if (!gpDBusConn || (gpDBusConn != apBtConn))
2424 snprintf(lcpL2PingIp, 128,
"l2ping -i hci0 -c 3 -s 2 -d 2 %s", apcDevPath);
2425 BTRCORELOG_INFO (
"lcpL2PingIp: %s\n", lcpL2PingIp);
2426 #ifdef LIBSYSWRAPPER_BUILD
2427 lfpL2Ping = v_secure_popen(
"r",
"l2ping -i hci0 -c 3 -s 2 -d 2 %s", apcDevPath);
2429 lfpL2Ping = popen(lcpL2PingIp,
"r");
2431 if ((lfpL2Ping == NULL)) {
2432 BTRCORELOG_ERROR (
"Failed to run BTIsDeviceConnectable command\n");
2435 if (fgets(lcpL2PingOp,
sizeof(lcpL2PingOp)-1, lfpL2Ping) == NULL) {
2436 BTRCORELOG_ERROR (
"Failed to Output of l2ping\n");
2439 BTRCORELOG_WARN (
"Output of l2ping = %s\n", lcpL2PingOp);
2440 if (!strstr(lcpL2PingOp,
"Host is down")) {
2444 #ifdef LIBSYSWRAPPER_BUILD
2445 v_secure_pclose(lfpL2Ping);
2458 const char* apDevPath,
2461 dbus_bool_t lDBusOp;
2462 DBusMessage* lpDBusMsg = NULL;
2463 char larDBusIfce[64] = {
'\0'};
2465 if (!gpDBusConn || (gpDBusConn != apBtConn) || !apDevPath)
2468 switch (aenBTDeviceType) {
2469 case enBTDevAudioSink:
2470 strncpy(larDBusIfce,
"org.bluez.AudioSink", strlen(
"org.bluez.AudioSink"));
2472 case enBTDevAudioSource:
2473 strncpy(larDBusIfce,
"org.bluez.AudioSource", strlen(
"org.bluez.AudioSource"));
2475 case enBTDevHFPHeadset:
2476 strncpy(larDBusIfce,
"org.bluez.Headset", strlen(
"org.bluez.Headset"));
2478 case enBTDevHFPHeadsetGateway:
2479 strncpy(larDBusIfce,
"org.bluez.HeadsetGateway", strlen(
"org.bluez.HeadsetGateway"));
2481 case enBTDevUnknown:
2483 strncpy(larDBusIfce,
"org.bluez.AudioSink", strlen(
"org.bluez.AudioSink"));
2487 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
2492 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
2496 lDBusOp = dbus_connection_send(gpDBusConn, lpDBusMsg, NULL);
2497 dbus_message_unref(lpDBusMsg);
2500 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
2504 dbus_connection_flush(gpDBusConn);
2513 const char* apDevPath,
2516 dbus_bool_t lDBusOp;
2517 DBusMessage* lpDBusMsg = NULL;
2518 char larDBusIfce[64] = {
'\0'};
2520 if (!gpDBusConn || (gpDBusConn != apBtConn) || !apDevPath)
2523 switch (aenBTDevType) {
2524 case enBTDevAudioSink:
2525 strncpy(larDBusIfce,
"org.bluez.AudioSink", strlen(
"org.bluez.AudioSink"));
2527 case enBTDevAudioSource:
2528 strncpy(larDBusIfce,
"org.bluez.AudioSource", strlen(
"org.bluez.AudioSource"));
2530 case enBTDevHFPHeadset:
2531 strncpy(larDBusIfce,
"org.bluez.Headset", strlen(
"org.bluez.Headset"));
2533 case enBTDevHFPHeadsetGateway:
2534 strncpy(larDBusIfce,
"org.bluez.HeadsetGateway", strlen(
"org.bluez.HeadsetGateway"));
2536 case enBTDevUnknown:
2538 strncpy(larDBusIfce,
"org.bluez.AudioSink", strlen(
"org.bluez.AudioSink"));
2542 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
2547 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
2551 lDBusOp = dbus_connection_send(gpDBusConn, lpDBusMsg, NULL);
2552 dbus_message_unref(lpDBusMsg);
2555 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
2559 dbus_connection_flush(gpDBusConn);
2568 const char* apBtAdapter,
2571 void* apBtMediaCodec,
2572 void* apBtMediaCapabilities,
2573 int apBtMediaCapabilitiesSize,
2574 int abBtMediaDelayReportEnable
2576 DBusMessage* lpDBusMsg = NULL;
2577 DBusMessage* lpDBusReply = NULL;
2579 DBusMessageIter lDBusMsgIter;
2580 DBusMessageIter lDBusMsgIterArr;
2581 dbus_bool_t lDBusOp;
2582 dbus_bool_t lBtMediaDelayReport = FALSE;
2584 const char* lpBtMediaType;
2586 if (!gpDBusConn || (gpDBusConn != apBtConn))
2589 switch (aenBTDevType) {
2590 case enBTDevAudioSink:
2591 lpBtMediaType = BT_MEDIA_A2DP_SOURCE_ENDPOINT;
2592 dbus_bus_add_match(gpDBusConn,
"type='signal',interface='org.bluez.AudioSink'", NULL);
2594 case enBTDevAudioSource:
2595 lpBtMediaType = BT_MEDIA_A2DP_SINK_ENDPOINT;
2596 dbus_bus_add_match(gpDBusConn,
"type='signal',interface='org.bluez.AudioSource'", NULL);
2598 case enBTDevHFPHeadset:
2599 lpBtMediaType = BT_MEDIA_A2DP_SOURCE_ENDPOINT;
2600 dbus_bus_add_match(gpDBusConn,
"type='signal',interface='org.bluez.Headset'", NULL);
2602 case enBTDevHFPHeadsetGateway:
2603 lpBtMediaType = BT_MEDIA_A2DP_SOURCE_ENDPOINT;
2604 dbus_bus_add_match(gpDBusConn,
"type='signal',interface='org.bluez.HeadsetGateway'", NULL);
2606 case enBTDevUnknown:
2608 lpBtMediaType = BT_MEDIA_A2DP_SOURCE_ENDPOINT;
2609 dbus_bus_add_match(gpDBusConn,
"type='signal',interface='org.bluez.AudioSink'", NULL);
2613 if (abBtMediaDelayReportEnable)
2614 lBtMediaDelayReport =
TRUE;
2616 lDBusOp = dbus_connection_register_object_path(gpDBusConn, lpBtMediaType, &gDBusMediaEndpointVTable, NULL);
2618 BTRCORELOG_ERROR (
"Can't Register Media Object\n");
2622 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
2625 "RegisterEndpoint");
2627 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
2631 dbus_message_iter_init_append (lpDBusMsg, &lDBusMsgIter);
2632 dbus_message_iter_append_basic (&lDBusMsgIter, DBUS_TYPE_OBJECT_PATH, &lpBtMediaType);
2633 dbus_message_iter_open_container (&lDBusMsgIter, DBUS_TYPE_ARRAY,
"{sv}", &lDBusMsgIterArr);
2635 DBusMessageIter lDBusMsgIterDict, lDBusMsgIterVariant;
2637 int type = DBUS_TYPE_STRING;
2639 dbus_message_iter_open_container (&lDBusMsgIterArr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDict);
2640 dbus_message_iter_append_basic (&lDBusMsgIterDict, DBUS_TYPE_STRING, &key);
2641 dbus_message_iter_open_container (&lDBusMsgIterDict, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterVariant);
2642 dbus_message_iter_append_basic (&lDBusMsgIterVariant, type, &apBtUUID);
2643 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterVariant);
2644 dbus_message_iter_close_container (&lDBusMsgIterArr, &lDBusMsgIterDict);
2647 DBusMessageIter lDBusMsgIterDict, lDBusMsgIterVariant;
2648 char* key =
"Codec";
2649 int type = DBUS_TYPE_BYTE;
2651 dbus_message_iter_open_container (&lDBusMsgIterArr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDict);
2652 dbus_message_iter_append_basic (&lDBusMsgIterDict, DBUS_TYPE_STRING, &key);
2653 dbus_message_iter_open_container (&lDBusMsgIterDict, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterVariant);
2654 dbus_message_iter_append_basic (&lDBusMsgIterVariant, type, &apBtMediaCodec);
2655 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterVariant);
2656 dbus_message_iter_close_container (&lDBusMsgIterArr, &lDBusMsgIterDict);
2659 DBusMessageIter lDBusMsgIterDict, lDBusMsgIterVariant;
2660 char* key =
"DelayReporting";
2661 int type = DBUS_TYPE_BOOLEAN;
2663 dbus_message_iter_open_container (&lDBusMsgIterArr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDict);
2664 dbus_message_iter_append_basic (&lDBusMsgIterDict, DBUS_TYPE_STRING, &key);
2665 dbus_message_iter_open_container (&lDBusMsgIterDict, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterVariant);
2666 dbus_message_iter_append_basic (&lDBusMsgIterVariant, type, &lBtMediaDelayReport);
2667 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterVariant);
2668 dbus_message_iter_close_container (&lDBusMsgIterArr, &lDBusMsgIterDict);
2671 DBusMessageIter lDBusMsgIterDict, lDBusMsgIterVariant, lDBusMsgIterSubArray;
2672 char* key =
"Capabilities";
2673 int type = DBUS_TYPE_BYTE;
2675 char array_type[5] =
"a";
2676 strncat (array_type, (
char*)&type,
sizeof(array_type));
2678 dbus_message_iter_open_container (&lDBusMsgIterArr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDict);
2679 dbus_message_iter_append_basic (&lDBusMsgIterDict, DBUS_TYPE_STRING, &key);
2680 dbus_message_iter_open_container (&lDBusMsgIterDict, DBUS_TYPE_VARIANT, array_type, &lDBusMsgIterVariant);
2681 dbus_message_iter_open_container (&lDBusMsgIterVariant, DBUS_TYPE_ARRAY, (
char *)&type, &lDBusMsgIterSubArray);
2682 dbus_message_iter_append_fixed_array (&lDBusMsgIterSubArray, type, &apBtMediaCapabilities, apBtMediaCapabilitiesSize);
2683 dbus_message_iter_close_container (&lDBusMsgIterVariant, &lDBusMsgIterSubArray);
2684 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterVariant);
2685 dbus_message_iter_close_container (&lDBusMsgIterArr, &lDBusMsgIterDict);
2687 dbus_message_iter_close_container (&lDBusMsgIter, &lDBusMsgIterArr);
2690 dbus_error_init(&lDBusErr);
2691 lpDBusReply = dbus_connection_send_with_reply_and_block(gpDBusConn, lpDBusMsg, -1, &lDBusErr);
2692 dbus_message_unref(lpDBusMsg);
2695 BTRCORELOG_ERROR (
"Reply Null\n");
2696 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2700 dbus_message_unref(lpDBusReply);
2702 dbus_connection_flush(gpDBusConn);
2711 const char* apBtAdapter,
2714 DBusMessage* lpDBusMsg = NULL;
2715 dbus_bool_t lDBusOp;
2717 const char* lpBtMediaType;
2719 if (!gpDBusConn || (gpDBusConn != apBtConn))
2722 switch (aenBTDevType) {
2723 case enBTDevAudioSink:
2724 lpBtMediaType = BT_MEDIA_A2DP_SOURCE_ENDPOINT;
2726 case enBTDevAudioSource:
2727 lpBtMediaType = BT_MEDIA_A2DP_SINK_ENDPOINT;
2729 case enBTDevHFPHeadset:
2730 lpBtMediaType = BT_MEDIA_A2DP_SOURCE_ENDPOINT;
2732 case enBTDevHFPHeadsetGateway:
2733 lpBtMediaType = BT_MEDIA_A2DP_SOURCE_ENDPOINT;
2735 case enBTDevUnknown:
2737 lpBtMediaType = BT_MEDIA_A2DP_SOURCE_ENDPOINT;
2742 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
2745 "UnregisterEndpoint");
2747 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
2751 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_OBJECT_PATH, &lpBtMediaType, DBUS_TYPE_INVALID);
2753 lDBusOp = dbus_connection_send(gpDBusConn, lpDBusMsg, NULL);
2754 dbus_message_unref(lpDBusMsg);
2757 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
2761 lDBusOp = dbus_connection_unregister_object_path(gpDBusConn, lpBtMediaType);
2763 BTRCORELOG_ERROR (
"Can't Register Media Object\n");
2767 switch (aenBTDevType) {
2768 case enBTDevAudioSink:
2769 dbus_bus_remove_match(gpDBusConn,
"type='signal',interface='org.bluez.AudioSink'", NULL);
2771 case enBTDevAudioSource:
2772 dbus_bus_remove_match(gpDBusConn,
"type='signal',interface='org.bluez.AudioSource'", NULL);
2774 case enBTDevHFPHeadset:
2775 dbus_bus_remove_match(gpDBusConn,
"type='signal',interface='org.bluez.Headset'", NULL);
2777 case enBTDevHFPHeadsetGateway:
2778 dbus_bus_remove_match(gpDBusConn,
"type='signal',interface='org.bluez.HeadsetGateway'", NULL);
2780 case enBTDevUnknown:
2782 dbus_bus_remove_match(gpDBusConn,
"type='signal',interface='org.bluez.AudioSink'", NULL);
2786 dbus_connection_flush(gpDBusConn);
2795 char* apcDevTransportPath,
2800 DBusMessage* lpDBusMsg = NULL;
2801 DBusMessage* lpDBusReply = NULL;
2802 DBusMessageIter lDBusMsgIter;
2804 dbus_bool_t lDBusOp;
2808 char *access_type =
"rw";
2810 if (!gpDBusConn || (gpDBusConn != apBtConn) || !apcDevTransportPath)
2813 dbus_bus_add_match(gpDBusConn,
"type='signal',interface='org.bluez.MediaTransport',member='PropertyChanged'", NULL);
2815 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
2816 apcDevTransportPath,
2817 "org.bluez.MediaTransport",
2820 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
2824 dbus_message_iter_init_append (lpDBusMsg, &lDBusMsgIter);
2825 dbus_message_iter_append_basic (&lDBusMsgIter, DBUS_TYPE_STRING, &access_type);
2828 dbus_error_init(&lDBusErr);
2829 lpDBusReply = dbus_connection_send_with_reply_and_block(gpDBusConn, lpDBusMsg, -1, &lDBusErr);
2830 dbus_message_unref(lpDBusMsg);
2833 BTRCORELOG_ERROR (
"Reply Null\n");
2834 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2838 lDBusOp = dbus_message_get_args(lpDBusReply, &lDBusErr,
2839 DBUS_TYPE_UNIX_FD, dataPathFd,
2840 DBUS_TYPE_UINT16, dataReadMTU,
2841 DBUS_TYPE_UINT16, dataWriteMTU,
2844 dbus_message_unref(lpDBusReply);
2847 BTRCORELOG_ERROR (
"Can't get lpDBusReply arguments\n");
2848 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2852 dbus_connection_flush(gpDBusConn);
2861 char* apcDevTransportPath
2863 DBusMessage* lpDBusMsg = NULL;
2864 DBusMessage* lpDBusReply = NULL;
2865 DBusMessageIter lDBusMsgIter;
2870 char *access_type =
"rw";
2872 if (!gpDBusConn || (gpDBusConn != apBtConn) || !apcDevTransportPath)
2875 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
2876 apcDevTransportPath,
2877 "org.bluez.MediaTransport",
2880 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
2884 dbus_message_iter_init_append (lpDBusMsg, &lDBusMsgIter);
2885 dbus_message_iter_append_basic (&lDBusMsgIter, DBUS_TYPE_STRING, &access_type);
2888 dbus_error_init(&lDBusErr);
2889 lpDBusReply = dbus_connection_send_with_reply_and_block(gpDBusConn, lpDBusMsg, -1, &lDBusErr);
2890 dbus_message_unref(lpDBusMsg);
2893 BTRCORELOG_ERROR (
"Reply Null\n");
2894 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2898 dbus_message_unref(lpDBusReply);
2900 dbus_connection_flush(gpDBusConn);
2902 dbus_bus_remove_match(gpDBusConn,
"type='signal',interface='org.bluez.MediaTransport',member='PropertyChanged'", NULL);
2912 if (!gpDBusConn || (gpDBusConn != apBtConn))
2915 if(dbus_connection_read_write_dispatch(gpDBusConn, 25) !=
TRUE) {
2924 BtrCore_BTRegisterDevStatusUpdatecB (
2926 fPtr_BtrCore_BTDevStatusUpdate_cB afpcBDevStatusUpdate,
2929 if (!gpDBusConn || (gpDBusConn != apBtConn))
2932 if (!afpcBDevStatusUpdate)
2935 gfpcBDevStatusUpdate = afpcBDevStatusUpdate;
2936 gpcBDevStatusUserData = apUserData;
2943 BtrCore_BTRegisterMediaStatusUpdatecB (
2945 fPtr_BtrCore_BTMediaStatusUpdate_cB afpcBMediaStatusUpdate,
2954 BtrCore_BTRegisterConnIntimationcB (
2956 fPtr_BtrCore_BTConnIntim_cB afpcBConnIntim,
2959 if (!gpDBusConn || (gpDBusConn != apBtConn))
2962 if (!afpcBConnIntim)
2965 gfpcBConnectionIntimation = afpcBConnIntim;
2966 gpcBConnIntimUserData = apUserData;
2973 BtrCore_BTRegisterConnAuthcB (
2975 fPtr_BtrCore_BTConnAuth_cB afpcBConnAuth,
2978 if (!gpDBusConn || (gpDBusConn != apBtConn))
2984 gfpcBConnectionAuthentication = afpcBConnAuth;
2985 gpcBConnAuthUserData = apUserData;
2992 BtrCore_BTRegisterNegotiateMediacB (
2994 const char* apBtAdapter,
2995 fPtr_BtrCore_BTNegotiateMedia_cB afpcBNegotiateMedia,
2998 if (!gpDBusConn || (gpDBusConn != apBtConn))
3001 if (!apBtAdapter || !afpcBNegotiateMedia)
3004 gfpcBNegotiateMedia = afpcBNegotiateMedia;
3005 gpcBNegMediaUserData = apUserData;
3012 BtrCore_BTRegisterTransportPathMediacB (
3014 const char* apBtAdapter,
3015 fPtr_BtrCore_BTTransportPathMedia_cB afpcBTransportPathMedia,
3018 if (!gpDBusConn || (gpDBusConn != apBtConn))
3021 if (!apBtAdapter || !afpcBTransportPathMedia)
3024 gfpcBTransportPathMedia = afpcBTransportPathMedia;
3025 gpcBTransPathMediaUserData = apUserData;
3032 BtrCore_BTRegisterMediaPlayerPathcB (
3034 const char* apBtAdapter,
3035 fPtr_BtrCore_BTMediaPlayerPath_cB afpcBTMediaPlayerPath,
3047 const char* apDevPath,
3050 dbus_bool_t lDBusOp;
3051 DBusMessage* lpDBusMsg = NULL;
3052 char mediaOper[16] = {
'\0'};
3053 enBTMediaControl aenBTMediaOper = *(enBTMediaControl*)aBTMediaOper;
3055 if (!gpDBusConn || (gpDBusConn != apBtConn) || !apDevPath)
3058 switch (aenBTMediaOper) {
3060 strcpy(mediaOper,
"Play");
3062 case enBTMediaPause:
3063 strcpy(mediaOper,
"Pause");
3066 strcpy(mediaOper,
"Stop");
3069 strcpy(mediaOper,
"Next");
3071 case enBTMediaPrevious:
3072 strcpy(mediaOper,
"Previous");
3074 case enBTMediaFastForward:
3075 strcpy(mediaOper,
"FastForward");
3077 case enBTMediaRewind:
3078 strcpy(mediaOper,
"Rewind");
3080 case enBTMediaVolumeUp:
3081 strcpy(mediaOper,
"VolumeUp");
3083 case enBTMediaVolumeDown:
3084 strcpy(mediaOper,
"VolumeDown");
3089 lpDBusMsg = dbus_message_new_method_call(
"org.bluez",
3091 "org.bluez.Control",
3094 BTRCORELOG_ERROR (
"Cannot allocate Dbus message to play media file\n\n");
3098 lDBusOp = dbus_connection_send(gpDBusConn, lpDBusMsg, NULL);
3099 dbus_message_unref(lpDBusMsg);
3102 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
3106 dbus_connection_flush(gpDBusConn);
3114 const char* apBtMediaPlayerPath,
3115 const char* mediaProperty,
3116 void* mediaPropertyValue
3123 char* BtrCore_BTGetPlayerObjectPath (
void* apBtConn,
const char* apBtDevPath)