34 #include <dbus/dbus.h>
37 #include "btrCore_logger.h"
40 #include "btrCore_bt_ifce.h"
42 #ifdef LIBSYSWRAPPER_BUILD
43 #include "secure_wrapper.h"
46 #define DBUS_INTERFACE_OBJECT_MANAGER "org.freedesktop.DBus.ObjectManager"
48 #define BT_DBUS_BLUEZ_PATH "org.bluez"
50 #define BT_DBUS_BLUEZ_ADAPTER_PATH "org.bluez.Adapter1"
52 #define BT_DBUS_BLUEZ_DEVICE_PATH "org.bluez.Device1"
54 #define BT_DBUS_BLUEZ_AGENT_PATH "org.bluez.Agent1"
55 #define BT_DBUS_BLUEZ_AGENT_MGR_PATH "org.bluez.AgentManager1"
57 #define BT_DBUS_BLUEZ_MEDIA_PATH "org.bluez.Media1"
58 #define BT_DBUS_BLUEZ_MEDIA_ENDPOINT_PATH "org.bluez.MediaEndpoint1"
59 #define BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH "org.bluez.MediaTransport1"
60 #define BT_DBUS_BLUEZ_MEDIA_CTRL_PATH "org.bluez.MediaControl1"
61 #define BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH "org.bluez.MediaPlayer1"
62 #define BT_DBUS_BLUEZ_MEDIA_ITEM_PATH "org.bluez.MediaItem1"
63 #define BT_DBUS_BLUEZ_MEDIA_FOLDER_PATH "org.bluez.MediaFolder1"
65 #define BT_DBUS_BLUEZ_GATT_SERVICE_PATH "org.bluez.GattService1"
66 #define BT_DBUS_BLUEZ_GATT_CHAR_PATH "org.bluez.GattCharacteristic1"
67 #define BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH "org.bluez.GattDescriptor1"
68 #define BT_DBUS_BLUEZ_GATT_MGR_PATH "org.bluez.GattManager1"
70 #define BT_DBUS_BLUEZ_LE_ADV_PATH "org.bluez.LEAdvertisement1"
71 #define BT_DBUS_BLUEZ_LE_ADV_MGR_PATH "org.bluez.LEAdvertisingManager1"
73 #define BT_MEDIA_SBC_A2DP_SINK_ENDPOINT "/MediaEndpoint/SBC/A2DP/Sink"
74 #define BT_MEDIA_SBC_A2DP_SOURCE_ENDPOINT "/MediaEndpoint/SBC/A2DP/Source"
75 #define BT_MEDIA_MP3_A2DP_SINK_ENDPOINT "/MediaEndpoint/Mp3/A2DP/Sink"
76 #define BT_MEDIA_MP3_A2DP_SOURCE_ENDPOINT "/MediaEndpoint/Mp3/A2DP/Source"
77 #define BT_MEDIA_AAC_A2DP_SINK_ENDPOINT "/MediaEndpoint/AAC/A2DP/Sink"
78 #define BT_MEDIA_AAC_A2DP_SOURCE_ENDPOINT "/MediaEndpoint/AAC/A2DP/Source"
79 #define BT_MEDIA_PCM_HFP_AG_ENDPOINT "/MediaEndpoint/PCM/HFP/AudioGateway"
80 #define BT_MEDIA_SBC_HFP_AG_ENDPOINT "/MediaEndpoint/SBC/HFP/AudioGateway"
81 #define BT_MEDIA_PCM_HFP_HS_ENDPOINT "/MediaEndpoint/PCM/HFP/Headset"
83 #define BT_LE_GATT_SERVER_ENDPOINT "/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX"
84 #define BT_LE_GATT_SERVER_ADVERTISEMENT "/LeGattAdvert"
86 #define BT_BLUEZ_VERSION_5_45 "5.45"
87 #define BT_BLUEZ_VERSION_5_48 "5.48"
88 #define BT_BLUEZ_VERSION_5_54 "5.54"
92 unsigned char ui8Codec;
95 unsigned short ui16Delay;
96 unsigned short ui16Volume;
102 DBusConnection* pDBusConn;
105 char* pcBTDAdapterPath;
106 char* pcBTDAdapterAddr;
107 char* pcBTAdapterPath;
108 char* pcDevTransportPath;
110 char* pcBTOutPassCode;
112 void* pcBAdapterStatusUserData;
113 void* pcBDevStatusUserData;
114 void* pcBMediaStatusUserData;
115 void* pcBNegMediaUserData;
116 void* pcBTransPathMediaUserData;
117 void* pcBMediaPlayerPathUserData;
118 void* pcBMediaBrowserPathUserData;
119 void* pcBConnIntimUserData;
120 void* pcBConnAuthUserData;
121 void* pcBLePathUserData;
122 void* pcBLeAdvUserData;
126 unsigned int ui32cBConnAuthPassKey;
127 unsigned int ui32DevLost;
129 unsigned int ui32IsAdapterDiscovering;
145 fPtr_BtrCore_BTAdapterStatusUpdateCb fpcBAdapterStatusUpdate;
146 fPtr_BtrCore_BTDevStatusUpdateCb fpcBDevStatusUpdate;
147 fPtr_BtrCore_BTMediaStatusUpdateCb fpcBMediaStatusUpdate;
148 fPtr_BtrCore_BTNegotiateMediaCb fpcBNegotiateMedia;
149 fPtr_BtrCore_BTTransportPathMediaCb fpcBTransportPathMedia;
150 fPtr_BtrCore_BTMediaPlayerPathCb fpcBTMediaPlayerPath;
151 fPtr_BtrCore_BTMediaBrowserPathCb fpcBTMediaBrowserPath;
152 fPtr_BtrCore_BTConnIntimCb fpcBConnectionIntimation;
153 fPtr_BtrCore_BTConnAuthCb fpcBConnectionAuthentication;
154 fPtr_BtrCore_BTLeGattPathCb fpcBTLeGattPath;
155 fPtr_BtrCore_BTLeAdvertisementCb fpcBTLeAdvPath;
161 static int btrCore_BTHandleDusError (DBusError* aDBusErr,
int aErrline,
const char* aErrfunc);
162 static const char* btrCore_DBusType2Name (
int ai32DBusMessageType);
163 static enBTDeviceType btrCore_BTMapServiceClasstoDevType(
unsigned int aui32Class);
164 static enBTDeviceType btrCore_BTMapDevClasstoDevType(
unsigned int aui32Class);
165 static char* btrCore_BTGetDefaultAdapterPath (
stBtIfceHdl* apstlhBtIfce);
166 static int btrCore_BTReleaseDefaultAdapterPath (
stBtIfceHdl* apstlhBtIfce);
167 static int btrCore_BTGetDevAddressFromDevPath (
const char* deviceIfcePath,
char* devAddr);
168 static tBTMediaItemId btrCore_BTGetMediaItemIdFromMediaPath (
const char* mediaIfcePath);
169 static enBTMediaFolderType btrCore_BTGetMediaFolderType (
const char* apcFolderType);
170 static const char* btrCore_BTGetMediaItemAbsoluteName (
const char* apcMediaItemName);
172 static DBusHandlerResult btrCore_BTAgentRelease (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
173 static DBusHandlerResult btrCore_BTAgentRequestPincode (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
174 static DBusHandlerResult btrCore_BTAgentRequestPasskey (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
175 static DBusHandlerResult btrCore_BTAgentRequestConfirmation(DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
176 static DBusHandlerResult btrCore_BTAgentAuthorize (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
177 static DBusHandlerResult btrCore_BTAgentDisplayPinCodePassKey (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
bool abPinCode,
void* apvUserData);
178 static DBusHandlerResult btrCore_BTAgentCancelMessage (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
180 static DBusMessage* btrCore_BTSendMethodCall (DBusConnection* apDBusConn,
const char* objectpath,
const char* interfacename,
const char* methodname);
181 static void btrCore_BTPendingCallCheckReply (DBusPendingCall* apDBusPendC,
void* apvUserData);
183 static int btrCore_BTParseAdapter (DBusMessageIter* apDBusMsgIter,
stBTAdapterInfo* apstBTAdapterInfo);
184 static int btrCore_BTGetDeviceInfo (DBusConnection* apDBusConn,
stBTDeviceInfo* apstBTDeviceInfo,
const char* apcIface);
185 static int btrCore_BTParseDevice (DBusMessage* apDBusMsg,
stBTDeviceInfo* apstBTDeviceInfo);
188 static int btrCore_BTParsePropertyChange (DBusMessage* apDBusMsg,
stBTDeviceInfo* apstBTDeviceInfo);
189 static int btrCore_BTGetGattInfo (
enBTOpIfceType aenBTOpIfceType,
void* apvGattInfo,
const char* apcIface);
192 static int btrCore_BTGetMediaInfo (DBusConnection* apDBusConn,
stBTMediaInfo* apstBTDeviceInfo,
const char* apcIface);
193 static int btrCore_BTParseMediaTransport (DBusMessage* apDBusMsg,
stBTMediaInfo* apstBTMediaInfo);
194 static int btrCore_BTParseMediaTrackMetadata (DBusMessage* apDBusMsg,
stBTMediaTrackInfo* apstBTMediaTrackInfo);
196 static DBusMessage* btrCore_BTMediaEndpointSelectConfiguration (DBusMessage* apDBusMsg,
enBTDeviceType aenBTDeviceType,
enBTMediaType aenBTMediaType,
void* apvUserData);
197 static DBusMessage* btrCore_BTMediaEndpointSetConfiguration (DBusMessage* apDBusMsg,
enBTDeviceType aenBTDeviceType,
enBTMediaType aenBTMediaType,
void* apvUserData);
198 static DBusMessage* btrCore_BTMediaEndpointClearConfiguration (DBusMessage* apDBusMsg,
enBTDeviceType aenBTDeviceType,
enBTMediaType aenBTMediaType,
void* apvUserData);
200 static int btrCore_BTGetMediaIfceProperty (DBusConnection* apDBusConn,
const char* apBtObjectPath,
const char* apBtInterfacePath,
const char* mediaProperty,
void* mediaPropertyValue);
202 static DBusMessage* btrCore_BTRegisterGattService (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
stBtIfceHdl* apstlhBtIfce,
stBTLeGattService *lpstBTRCoreLeGattService,
int aNumOfGattServices);
203 static int btrCore_BTUnRegisterGattService (DBusConnection* apDBusConn,
const char* apui8SCDGattPath);
204 static int btrCore_BTRegisterLeAdvGetProp (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
stBtIfceHdl* apstlhBtIfce);
206 static int btrCore_BTReleaseLEGattObjPath(
char* apstObjPath,
void* apvUserData);
208 static DBusHandlerResult btrCore_BTDBusConnectionFilterCb (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
209 static DBusHandlerResult btrCore_BTMediaEndpointHandlerCb (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
210 static DBusHandlerResult btrCore_BTAgentMessageHandlerCb (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
211 static DBusHandlerResult btrCore_BTLeGattEndpointHandlerCb(DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
212 static DBusHandlerResult btrCore_BTLeGattMessageHandlerCb (DBusConnection* apDBusConn, DBusMessage* apDBusMsg,
void* apvUserData);
215 static const DBusObjectPathVTable gDBusMediaEndpointVTable = {
216 .message_function = btrCore_BTMediaEndpointHandlerCb,
219 static const DBusObjectPathVTable gDBusAgentVTable = {
220 .message_function = btrCore_BTAgentMessageHandlerCb,
223 static const DBusObjectPathVTable gDBusLeGattEndpointVTable = {
224 .message_function = btrCore_BTLeGattEndpointHandlerCb,
227 static const DBusObjectPathVTable gDBusLeGattSCDVTable = {
228 .message_function = btrCore_BTLeGattMessageHandlerCb,
234 btrCore_BTHandleDusError (
235 DBusError* apDBusErr,
237 const char* apErrfunc
239 if (dbus_error_is_set(apDBusErr)) {
240 BTRCORELOG_ERROR (
"%d\t: %s - DBus Error is %s - Name: %s \n", aErrline, apErrfunc, apDBusErr->message, apDBusErr->name);
241 dbus_error_free(apDBusErr);
249 btrCore_DBusType2Name (
252 switch (ai32MessageType) {
253 case DBUS_MESSAGE_TYPE_SIGNAL:
255 case DBUS_MESSAGE_TYPE_METHOD_CALL:
257 case DBUS_MESSAGE_TYPE_METHOD_RETURN:
258 return "MethodReturn";
259 case DBUS_MESSAGE_TYPE_ERROR:
267 btrCore_BTMapServiceClasstoDevType (
268 unsigned int aui32Class
279 if (0x40000u & aui32Class) {
280 BTRCORELOG_DEBUG (
"Its a enBTDevAudioSink : Rendering Class of Service\n");
281 lenBtDevType = enBTDevAudioSink;
283 else if (0x80000u & aui32Class) {
284 if (enBTDCMicrophone & aui32Class) {
285 BTRCORELOG_DEBUG (
"Its a enBTDevAudioSource : Capturing Service and Mic Device\n");
286 lenBtDevType = enBTDevAudioSource;
290 else if ((0x200000u & aui32Class) && ((0x500u & aui32Class) != 0x500u )) {
291 if (enBTDCMicrophone & aui32Class) {
292 BTRCORELOG_DEBUG (
"Its a enBTDevAudioSource : Audio Class of Service and Mic Device\n");
293 lenBtDevType = enBTDevAudioSource;
296 BTRCORELOG_DEBUG (
"Its a enBTDevAudioSink : Audio Class of Service. Not a Mic\n");
297 lenBtDevType = enBTDevAudioSink;
300 else if (0x400000u & aui32Class) {
301 BTRCORELOG_DEBUG (
"Its a enBTDevAudioSink : Telephony Class of Service\n");
302 lenBtDevType = enBTDevAudioSink;
309 btrCore_BTMapDevClasstoDevType (
310 unsigned int aui32Class
314 if ((lenBtDevType = btrCore_BTMapServiceClasstoDevType(aui32Class)) != enBTDevUnknown)
318 if (((aui32Class & 0x100u) == 0x100u) ||
319 ((aui32Class & 0x200u) == 0x200u) ||
320 ((aui32Class & 0x400u) == 0x400u) ||
321 ((aui32Class & 0x500u) == 0x500u) ||
322 ((aui32Class & 0x540u) == 0x540u) ||
323 ((aui32Class & 0x580u) == 0x580u) ||
324 ((aui32Class & 0x5C0u) == 0x5C0u) ||
325 ((aui32Class & 0x504u) == 0x504u) ||
326 ((aui32Class & 0x508u) == 0x508u) ||
327 ((aui32Class & 0x50Cu) == 0x50Cu)) {
329 unsigned int ui32DevClassID = aui32Class & 0xFFFu;
331 switch (ui32DevClassID){
332 case enBTDCSmartPhone:
334 case enBTDCMicrophone:
335 BTRCORELOG_DEBUG (
"Its a enBTDevAudioSource\n");
336 lenBtDevType = enBTDevAudioSource;
338 case enBTDCWearableHeadset:
339 case enBTDCHeadphones:
340 case enBTDCLoudspeaker:
341 case enBTDCHIFIAudioDevice:
342 BTRCORELOG_DEBUG (
"Its a enBTDevAudioSink\n");
343 lenBtDevType = enBTDevAudioSink;
347 case enBTDCMouseKeyBoard:
350 case enBTDCAudioRemote:
351 BTRCORELOG_DEBUG (
"Its a enBTDevHID\n");
352 lenBtDevType = enBTDevHID;
355 BTRCORELOG_DEBUG (
"Its a enBTDevUnknown\n");
356 lenBtDevType = enBTDevUnknown;
365 btrCore_BTGetDevAddressFromDevPath (
366 const char* deviceIfcePath,
370 deviceIfcePath = strstr(deviceIfcePath,
"dev") + 4;
372 devAddr[0] = deviceIfcePath[0];
373 devAddr[1] = deviceIfcePath[1];
375 devAddr[3] = deviceIfcePath[3];
376 devAddr[4] = deviceIfcePath[4];
378 devAddr[6] = deviceIfcePath[6];
379 devAddr[7] = deviceIfcePath[7];
381 devAddr[9] = deviceIfcePath[9];
382 devAddr[10] = deviceIfcePath[10];
384 devAddr[12] = deviceIfcePath[12];
385 devAddr[13] = deviceIfcePath[13];
387 devAddr[15] = deviceIfcePath[15];
388 devAddr[16] = deviceIfcePath[16];
395 static tBTMediaItemId
396 btrCore_BTGetMediaItemIdFromMediaPath (
397 const char* mediaIfcePath
399 tBTMediaItemId mediaItemId = 0;
401 unsigned int ui32Index = 0;
404 ptr = strstr(mediaIfcePath,
"item");
408 while (ptr && *ptr) {
409 if (*ptr<=57 && *ptr>=48) {
410 iArray[ui32Index++] = *ptr;
415 iArray[ui32Index] =
'\0';
424 mediaItemId = strtoull (iArray + ui32Index++, NULL, 10);
425 }
while ((mediaItemId > LLONG_MAX) || (mediaItemId == 0));
428 if (strstr(mediaIfcePath,
"NowPlaying")) {
429 mediaItemId |= 0x8000000000000000;
431 else if (!strstr(mediaIfcePath,
"Filesystem")) {
432 mediaItemId = 0xFFFFFFFFFFFFFFFF;
439 btrCore_BTGetMediaItemAbsoluteName (
440 const char* apcMediaItemName
447 if (!apcMediaItemName) {
451 ptr = &apcMediaItemName[strlen(apcMediaItemName)];
453 while (--ptr >= apcMediaItemName && *ptr !=
'/');
458 static enBTMediaFolderType
459 btrCore_BTGetMediaFolderType (
460 const char* apcFolderType
462 enBTMediaFolderType eMediaFolderType;
464 if (!strncmp(apcFolderType,
"albums", strlen(
"albums"))) {
465 eMediaFolderType = enBTMediaFldTypAlbum;
467 if (!strncmp(apcFolderType,
"artists", strlen(
"artists"))) {
468 eMediaFolderType = enBTMediaFldTypArtist;
470 if (!strncmp(apcFolderType,
"genres", strlen(
"genres"))) {
471 eMediaFolderType = enBTMediaFldTypGenre;
473 if (!strncmp(apcFolderType,
"compilation", strlen(
"compilation"))) {
474 eMediaFolderType = enBTMediaFldTypCompilation;
476 if (!strncmp(apcFolderType,
"playlists", strlen(
"playlists"))) {
477 eMediaFolderType = enBTMediaFldTypPlayList;
479 if (!strncmp(apcFolderType,
"titles", strlen(
"titles"))) {
480 eMediaFolderType = enBTMediaFldTypTrackList;
482 if (!strncmp(apcFolderType,
"mixed", strlen(
"mixed"))) {
483 eMediaFolderType = enBTMediaFldTypTrackList;
485 if (!strncmp(apcFolderType,
"track", strlen(
"track"))) {
486 eMediaFolderType = enBTMediaFldTypTrack;
489 eMediaFolderType = enBTMediaFldTypTrackList;
492 return eMediaFolderType;
496 btrCore_BTGetDefaultAdapterPath (
499 DBusMessage* lpDBusReply = NULL;
500 DBusMessageIter rootIter;
503 bool adapterFound = FALSE;
509 lpDBusReply = btrCore_BTSendMethodCall(apstlhBtIfce->pDBusConn,
"/", DBUS_INTERFACE_OBJECT_MANAGER,
"GetManagedObjects");
512 dbus_message_iter_init(lpDBusReply, &rootIter) &&
513 DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&rootIter)) {
515 DBusMessageIter arrayElementIter;
516 dbus_message_iter_recurse(&rootIter, &arrayElementIter);
518 while (!adapterFound) {
520 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&arrayElementIter)) {
521 DBusMessageIter dictEntryIter;
523 dbus_message_iter_recurse(&arrayElementIter,&dictEntryIter );
524 if (DBUS_TYPE_OBJECT_PATH == dbus_message_iter_get_arg_type(&dictEntryIter)) {
525 dbus_message_iter_get_basic(&dictEntryIter, &adapter_path);
530 dbus_message_iter_next(&dictEntryIter);
531 if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&dictEntryIter)) {
532 DBusMessageIter innerArrayIter;
534 dbus_message_iter_recurse(&dictEntryIter, &innerArrayIter);
536 while (dbus_message_iter_has_next(&innerArrayIter)) {
538 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&innerArrayIter)) {
539 DBusMessageIter innerDictEntryIter;
540 dbus_message_iter_recurse(&innerArrayIter,&innerDictEntryIter );
542 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter)) {
544 dbus_message_iter_get_basic(&innerDictEntryIter, &dbusObject);
548 if (strcmp(dbusObject, BT_DBUS_BLUEZ_ADAPTER_PATH) == 0) {
556 dbus_message_iter_next(&innerDictEntryIter);
557 if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&innerDictEntryIter)) {
558 DBusMessageIter innerArrayIter2;
559 dbus_message_iter_recurse(&innerDictEntryIter, &innerArrayIter2);
561 while (dbus_message_iter_has_next(&innerArrayIter2)) {
562 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&innerArrayIter2)) {
563 DBusMessageIter innerDictEntryIter2;
565 dbus_message_iter_recurse(&innerArrayIter2,&innerDictEntryIter2);
566 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter2)) {
568 dbus_message_iter_get_basic(&innerDictEntryIter2, &dbusObject2);
572 dbus_message_iter_next(&innerDictEntryIter2);
573 DBusMessageIter innerDictEntryIter3;
576 dbus_message_iter_recurse(&innerDictEntryIter2,&innerDictEntryIter3);
577 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter3)) {
578 dbus_message_iter_get_basic(&innerDictEntryIter3, &dbusObject3);
583 else if (DBUS_TYPE_BOOLEAN == dbus_message_iter_get_arg_type(&innerDictEntryIter3)) {
584 bool *device_prop = FALSE;
585 dbus_message_iter_get_basic(&innerDictEntryIter3, &device_prop);
590 if (!dbus_message_iter_has_next(&innerArrayIter2)) {
594 dbus_message_iter_next(&innerArrayIter2);
600 if (!dbus_message_iter_has_next(&innerArrayIter)) {
604 dbus_message_iter_next(&innerArrayIter);
609 if (!dbus_message_iter_has_next(&arrayElementIter)) {
613 dbus_message_iter_next(&arrayElementIter);
618 dbus_message_unref(lpDBusReply);
621 if (apstlhBtIfce->pcBTDAdapterPath) {
622 BTRCORELOG_WARN (
"Default Adapter Path is : %s - %p\n", apstlhBtIfce->pcBTDAdapterPath, apstlhBtIfce->pcBTDAdapterPath);
625 return apstlhBtIfce->pcBTDAdapterPath;
630 btrCore_BTReleaseDefaultAdapterPath (
633 if (apstlhBtIfce->pcBTDAdapterAddr) {
634 BTRCORELOG_WARN (
"Adapter Addr is : %s - %p\n", apstlhBtIfce->pcBTDAdapterAddr, apstlhBtIfce->pcBTDAdapterAddr);
635 free(apstlhBtIfce->pcBTDAdapterAddr);
636 apstlhBtIfce->pcBTDAdapterAddr = NULL;
639 if (apstlhBtIfce->pcBTDAdapterPath) {
640 BTRCORELOG_WARN (
"Default Adapter Path is : %s - %p\n", apstlhBtIfce->pcBTDAdapterPath, apstlhBtIfce->pcBTDAdapterPath);
641 free(apstlhBtIfce->pcBTDAdapterPath);
642 apstlhBtIfce->pcBTDAdapterPath = NULL;
649 static DBusHandlerResult
650 btrCore_BTAgentRelease (
651 DBusConnection* apDBusConn,
652 DBusMessage* apDBusMsg,
655 DBusMessage* lpDBusReply = NULL;
661 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_INVALID)) {
662 BTRCORELOG_ERROR (
"Invalid arguments for Release method");
663 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
666 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
669 BTRCORELOG_ERROR (
"Unable to create lpDBusReply message\n");
670 return DBUS_HANDLER_RESULT_NEED_MEMORY;
673 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
674 dbus_connection_flush(apDBusConn);
676 dbus_message_unref(lpDBusReply);
678 return DBUS_HANDLER_RESULT_HANDLED;
682 static DBusHandlerResult
683 btrCore_BTAgentRequestPincode (
684 DBusConnection* apDBusConn,
685 DBusMessage* apDBusMsg,
688 DBusMessage* lpDBusReply = NULL;
689 const char* lpcPath = NULL;
693 if (!pstlhBtIfce->pcBTOutPassCode)
694 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
696 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_OBJECT_PATH, &lpcPath, DBUS_TYPE_INVALID)) {
697 BTRCORELOG_ERROR (
"Invalid arguments for RequestPinCode method");
698 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
701 if (pstlhBtIfce->i32DoReject) {
702 lpDBusReply = dbus_message_new_error(apDBusMsg,
"org.bluez.Error.Rejected",
"");
706 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
708 BTRCORELOG_ERROR (
"Can't create lpDBusReply message\n");
709 return DBUS_HANDLER_RESULT_NEED_MEMORY;
712 BTRCORELOG_INFO (
"Pincode request for device %s\n", lpcPath);
713 dbus_message_append_args(lpDBusReply, DBUS_TYPE_STRING, &pstlhBtIfce->pcBTOutPassCode, DBUS_TYPE_INVALID);
716 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
717 dbus_connection_flush(apDBusConn);
719 dbus_message_unref(lpDBusReply);
721 return DBUS_HANDLER_RESULT_HANDLED;
725 static DBusHandlerResult
726 btrCore_BTAgentRequestPasskey (
727 DBusConnection* apDBusConn,
728 DBusMessage* apDBusMsg,
731 DBusMessage* lpDBusReply = NULL;
732 const char* lpcPath = NULL;
733 unsigned int ui32PassCode= 0;
737 if (!pstlhBtIfce->pcBTOutPassCode)
738 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
740 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_OBJECT_PATH, &lpcPath, DBUS_TYPE_INVALID)) {
741 BTRCORELOG_ERROR (
"Incorrect args btrCore_BTAgentRequestPasskey");
742 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
745 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
747 BTRCORELOG_ERROR (
"Can't create lpDBusReply message\n");
748 return DBUS_HANDLER_RESULT_NEED_MEMORY;
751 BTRCORELOG_INFO (
"Pass code request for device %s\n", lpcPath);
752 ui32PassCode = strtoul(pstlhBtIfce->pcBTOutPassCode, NULL, 10);
753 dbus_message_append_args(lpDBusReply, DBUS_TYPE_UINT32, &ui32PassCode, DBUS_TYPE_INVALID);
755 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
756 dbus_connection_flush(apDBusConn);
757 dbus_message_unref(lpDBusReply);
759 return DBUS_HANDLER_RESULT_HANDLED;
763 static DBusHandlerResult
764 btrCore_BTAgentRequestConfirmation (
765 DBusConnection* apDBusConn,
766 DBusMessage* apDBusMsg,
769 DBusMessage* lpDBusReply = NULL;
770 const char* lpcPath = NULL;
771 unsigned int ui32PassCode= 0;
781 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_OBJECT_PATH, &lpcPath, DBUS_TYPE_UINT32, &ui32PassCode, DBUS_TYPE_INVALID)) {
782 BTRCORELOG_ERROR (
"Invalid arguments for Authorize method");
783 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
787 BTRCORELOG_INFO (
"btrCore_BTAgentRequestConfirmation: PASS Code for %s is %6d\n", lpcPath, ui32PassCode);
790 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, &lstBTDeviceInfo, lpcPath);
791 enBTDeviceType lenBTDevType = btrCore_BTMapDevClasstoDevType(lstBTDeviceInfo.ui32Class);
794 if (pstlhBtIfce->fpcBConnectionIntimation) {
795 BTRCORELOG_INFO (
"calling ConnIntimation cb for %s - OpRet = %d\n", lpcPath, i32OpRet);
796 yesNo = pstlhBtIfce->fpcBConnectionIntimation(lenBTDevType, &lstBTDeviceInfo, ui32PassCode, 1, pstlhBtIfce->pcBConnIntimUserData);
800 pstlhBtIfce->ui32cBConnAuthPassKey = ui32PassCode;
804 BTRCORELOG_ERROR (
"Sorry, you cant connect....\n");
805 lpDBusReply = dbus_message_new_error(apDBusMsg,
"org.bluez.Error.Rejected",
"");
808 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
813 BTRCORELOG_ERROR (
"Can't create lpDBusReply message\n");
814 return DBUS_HANDLER_RESULT_NEED_MEMORY;
817 BTRCORELOG_INFO (
"Intimating request for %s\n", lpcPath);
818 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
819 dbus_connection_flush(apDBusConn);
820 dbus_message_unref(lpDBusReply);
821 return DBUS_HANDLER_RESULT_HANDLED;
825 static DBusHandlerResult
826 btrCore_BTAgentDisplayPinCodePassKey (
827 DBusConnection* apDBusConn,
828 DBusMessage* apDBusMsg,
832 DBusMessage* lpDBusReply = NULL;
833 const char* lpcPath = NULL;
834 const char* pinCode = NULL;
835 unsigned int ui32PassCode= 0;
842 if (abPinCode ==
TRUE) {
843 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_OBJECT_PATH, &lpcPath, DBUS_TYPE_STRING, &pinCode, DBUS_TYPE_INVALID)) {
844 BTRCORELOG_ERROR (
"Invalid arguments for PINCode Display method");
845 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
847 BTRCORELOG_INFO (
"btrCore_BTAgentDisplayPinCode: PINCode is @@%s@@\n", pinCode);
848 ui32PassCode = (
unsigned int) atoi(pinCode);
849 BTRCORELOG_DEBUG (
"btrCore_BTAgentDisplayPinCode: PINCode in decimal @@%06d@@\n", ui32PassCode);
852 unsigned short ui16Entered = 0;
853 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_OBJECT_PATH, &lpcPath, DBUS_TYPE_UINT32, &ui32PassCode, DBUS_TYPE_UINT16, &ui16Entered, DBUS_TYPE_INVALID)) {
854 BTRCORELOG_ERROR (
"Invalid arguments for PINCode Display method");
855 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
857 BTRCORELOG_DEBUG (
"btrCore_BTAgentDisplayPassKey : PassKey in decimal @@%06d@@ Entered is %d\n", ui32PassCode, ui16Entered);
861 btrCore_BTGetDeviceInfo(apDBusConn, &lstBTDeviceInfo, lpcPath);
862 lenBTDevType = btrCore_BTMapDevClasstoDevType(lstBTDeviceInfo.ui32Class);
863 pstlhBtIfce->ui32cBConnAuthPassKey = ui32PassCode;
866 if (pstlhBtIfce->fpcBConnectionIntimation) {
867 pstlhBtIfce->fpcBConnectionIntimation(lenBTDevType, &lstBTDeviceInfo, ui32PassCode, 0, pstlhBtIfce->pcBConnIntimUserData);
871 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
872 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
873 dbus_connection_flush(apDBusConn);
874 dbus_message_unref(lpDBusReply);
875 return DBUS_HANDLER_RESULT_HANDLED;
878 static DBusHandlerResult
879 btrCore_BTAgentAuthorize (
880 DBusConnection* apDBusConn,
881 DBusMessage* apDBusMsg,
884 DBusMessage* lpDBusReply = NULL;
885 const char* lpcPath = NULL;
886 const char* uuid = NULL;
897 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_OBJECT_PATH, &lpcPath, DBUS_TYPE_STRING, &uuid, DBUS_TYPE_INVALID)) {
898 BTRCORELOG_ERROR (
"Invalid arguments for Authorize method");
899 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
903 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, &lstBTDeviceInfo, lpcPath);
904 lenBTDevType = btrCore_BTMapDevClasstoDevType(lstBTDeviceInfo.ui32Class);
906 if (pstlhBtIfce->fpcBConnectionAuthentication) {
907 BTRCORELOG_INFO (
"calling ConnAuth cb for %s - OpRet = %d\n", lpcPath, i32OpRet);
908 yesNo = pstlhBtIfce->fpcBConnectionAuthentication(lenBTDevType, &lstBTDeviceInfo, pstlhBtIfce->pcBConnAuthUserData);
912 pstlhBtIfce->ui32cBConnAuthPassKey = 0;
916 BTRCORELOG_ERROR (
"Sorry, you cant connect....\n");
917 lpDBusReply = dbus_message_new_error(apDBusMsg,
"org.bluez.Error.Rejected",
"");
920 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
925 BTRCORELOG_ERROR (
"Can't create lpDBusReply message\n");
926 return DBUS_HANDLER_RESULT_NEED_MEMORY;
929 BTRCORELOG_INFO (
"Authorizing request for %s\n", lpcPath);
930 if (enBTDevAudioSource == lenBTDevType && yesNo) {
931 strcpy(lstBTDeviceInfo.pcDeviceCurrState,
"connected");
933 if (pstlhBtIfce->fpcBDevStatusUpdate) {
934 pstlhBtIfce->fpcBDevStatusUpdate(lenBTDevType, enBTDevStPropChanged, &lstBTDeviceInfo, pstlhBtIfce->pcBDevStatusUserData);
938 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
939 dbus_connection_flush(apDBusConn);
940 dbus_message_unref(lpDBusReply);
941 return DBUS_HANDLER_RESULT_HANDLED;
946 static DBusHandlerResult
947 btrCore_BTAgentCancelMessage (
948 DBusConnection* apDBusConn,
949 DBusMessage* apDBusMsg,
952 DBusMessage* lpDBusReply = NULL;
957 if (!dbus_message_get_args(apDBusMsg, NULL, DBUS_TYPE_INVALID)) {
958 BTRCORELOG_ERROR (
"Invalid arguments for confirmation method");
959 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
961 BTRCORELOG_INFO (
"Request canceled\n");
962 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
965 BTRCORELOG_ERROR (
"Can't create lpDBusReply message\n");
966 return DBUS_HANDLER_RESULT_NEED_MEMORY;
969 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
970 dbus_connection_flush(apDBusConn);
972 dbus_message_unref(lpDBusReply);
973 return DBUS_HANDLER_RESULT_HANDLED;
978 btrCore_BTSendMethodCall (
979 DBusConnection* apDBusConn,
980 const char* apcObjectPath,
981 const char* apcInterface,
982 const char* apcMethod
984 DBusMessage* lpDBusMsg = NULL;
985 DBusMessage* lpDBusReply = NULL;
986 DBusPendingCall* lpDBusPendC = NULL;
989 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
995 BTRCORELOG_ERROR (
"Cannot allocate DBus message!\n");
999 if (!dbus_connection_send_with_reply(apDBusConn, lpDBusMsg, &lpDBusPendC, -1)) {
1000 BTRCORELOG_ERROR (
"failed to send message!\n");
1004 dbus_connection_flush(apDBusConn);
1006 if (lpDBusPendC != NULL) {
1007 dbus_pending_call_block(lpDBusPendC);
1009 if ((lpDBusReply = dbus_pending_call_steal_reply(lpDBusPendC))) {
1010 if (dbus_message_get_type(lpDBusReply) == DBUS_MESSAGE_TYPE_ERROR) {
1011 BTRCORELOG_ERROR (
"Error : %s\n\n", dbus_message_get_error_name(lpDBusReply));
1012 dbus_message_unref(lpDBusReply);
1017 dbus_pending_call_unref(lpDBusPendC);
1021 dbus_message_unref(lpDBusMsg);
1029 btrCore_BTPendingCallCheckReply (
1030 DBusPendingCall* apDBusPendC,
1033 DBusMessage *lpDBusReply = NULL;
1036 BTRCORELOG_DEBUG(
"btrCore_BTPendingCallCheckReply\n");
1038 if ((lpDBusReply = dbus_pending_call_steal_reply(apDBusPendC))) {
1039 dbus_error_init(&lDBusErr);
1040 if (dbus_set_error_from_message(&lDBusErr, lpDBusReply) ==
TRUE) {
1041 BTRCORELOG_ERROR (
"Error : %s\n\n", dbus_message_get_error_name(lpDBusReply));
1042 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
1045 dbus_message_unref(lpDBusReply);
1048 dbus_pending_call_unref(apDBusPendC);
1053 btrCore_BTParseAdapter (
1054 DBusMessageIter* apDBusMsgIter,
1057 DBusMessageIter dict_iter;
1058 DBusMessageIter dict_entry_iter;
1059 DBusMessageIter dict_entry_value_iter;
1061 const char* pcKey = NULL;
1062 const char* pcVal = NULL;
1065 for (dbus_message_iter_recurse(apDBusMsgIter, &dict_iter);
1066 (dbus_type = dbus_message_iter_get_arg_type(&dict_iter)) != DBUS_TYPE_INVALID;
1067 dbus_message_iter_next(&dict_iter)) {
1069 if (dbus_type == DBUS_TYPE_DICT_ENTRY) {
1070 dbus_message_iter_recurse(&dict_iter, &dict_entry_iter);
1072 dbus_message_iter_get_basic(&dict_entry_iter, &pcKey);
1075 if (!dbus_message_iter_next(&dict_entry_iter) || dbus_message_iter_get_arg_type(&dict_entry_iter) != DBUS_TYPE_VARIANT)
1078 dbus_message_iter_recurse(&dict_entry_iter, &dict_entry_value_iter);
1079 dbus_type = dbus_message_iter_get_arg_type (&dict_entry_value_iter);
1081 if (strcmp (pcKey,
"Address") == 0 && dbus_type == DBUS_TYPE_STRING) {
1082 dbus_message_iter_get_basic(&dict_entry_value_iter, &pcVal);
1084 BTRCORELOG_TRACE (
"pcAddress = %s\n", apstBTAdapterInfo->pcAddress);
1086 else if (strcmp (pcKey,
"Name") == 0 && dbus_type == DBUS_TYPE_STRING) {
1087 dbus_message_iter_get_basic(&dict_entry_value_iter, &pcVal);
1089 BTRCORELOG_TRACE (
"pcName = %s\n", apstBTAdapterInfo->pcName);
1091 else if (strcmp (pcKey,
"Alias") == 0 && dbus_type == DBUS_TYPE_STRING) {
1092 dbus_message_iter_get_basic(&dict_entry_value_iter, &pcVal);
1094 BTRCORELOG_TRACE (
"pcAlias = %s\n", apstBTAdapterInfo->pcAlias);
1096 else if (strcmp (pcKey,
"Class") == 0 && dbus_type == DBUS_TYPE_UINT32) {
1097 dbus_message_iter_get_basic(&dict_entry_value_iter, &apstBTAdapterInfo->ui32Class);
1098 BTRCORELOG_TRACE (
"ui32Class = %u\n", apstBTAdapterInfo->ui32Class);
1100 else if (strcmp (pcKey,
"Powered") == 0 && dbus_type == DBUS_TYPE_BOOLEAN) {
1101 dbus_message_iter_get_basic(&dict_entry_value_iter, &apstBTAdapterInfo->bPowered);
1102 BTRCORELOG_TRACE (
"bPowered = %d\n", apstBTAdapterInfo->bPowered);
1104 else if (strcmp (pcKey,
"Discoverable") == 0 && dbus_type == DBUS_TYPE_BOOLEAN) {
1105 dbus_message_iter_get_basic(&dict_entry_value_iter, &apstBTAdapterInfo->bDiscoverable);
1106 BTRCORELOG_TRACE (
"bDiscoverable = %d\n", apstBTAdapterInfo->bDiscoverable);
1108 else if (strcmp (pcKey,
"DiscoverableTimeout") == 0 && dbus_type == DBUS_TYPE_UINT32) {
1109 dbus_message_iter_get_basic(&dict_entry_value_iter, &apstBTAdapterInfo->ui32DiscoverableTimeout);
1110 BTRCORELOG_TRACE (
"ui32DiscoverableTimeout = %u\n", apstBTAdapterInfo->ui32DiscoverableTimeout);
1112 else if (strcmp (pcKey,
"Pairable") == 0 && dbus_type == DBUS_TYPE_BOOLEAN) {
1113 dbus_message_iter_get_basic(&dict_entry_value_iter, &apstBTAdapterInfo->bPairable);
1114 BTRCORELOG_TRACE (
"bPairable = %d\n", apstBTAdapterInfo->bPairable);
1116 else if (strcmp (pcKey,
"PairableTimeout") == 0 && dbus_type == DBUS_TYPE_UINT32) {
1117 dbus_message_iter_get_basic(&dict_entry_value_iter, &apstBTAdapterInfo->ui32PairableTimeout);
1118 BTRCORELOG_TRACE (
"ui32PairableTimeout = %u\n", apstBTAdapterInfo->ui32PairableTimeout);
1120 else if (strcmp (pcKey,
"Discovering") == 0 && dbus_type == DBUS_TYPE_BOOLEAN) {
1121 dbus_message_iter_get_basic(&dict_entry_value_iter, &apstBTAdapterInfo->bDiscovering);
1122 BTRCORELOG_DEBUG (
"bDiscovering = %d\n", apstBTAdapterInfo->bDiscovering);
1124 else if (strcmp (pcKey,
"Modalias") == 0 && dbus_type == DBUS_TYPE_STRING) {
1125 dbus_message_iter_get_basic(&dict_entry_value_iter, &pcVal);
1127 BTRCORELOG_TRACE (
"pcModalias = %s\n", apstBTAdapterInfo->pcModalias);
1129 else if (strcmp (pcKey,
"UUIDs") == 0 && dbus_type == DBUS_TYPE_ARRAY) {
1130 DBusMessageIter uuid_array_iter;
1132 for (dbus_message_iter_recurse(&dict_entry_value_iter, &uuid_array_iter);
1133 (dbus_type = dbus_message_iter_get_arg_type (&uuid_array_iter)) != DBUS_TYPE_INVALID;
1134 dbus_message_iter_next (&uuid_array_iter)) {
1136 dbus_message_iter_get_basic (&uuid_array_iter, &pcVal);
1138 BTRCORELOG_TRACE (
"UUID value is %s\n", apstBTAdapterInfo->ppcUUIDs[count]);
1151 btrCore_BTGetDeviceInfo (
1152 DBusConnection* apDBusConn,
1154 const char* apcIface
1156 char* pdeviceInterface = BT_DBUS_BLUEZ_DEVICE_PATH;
1157 DBusMessage* lpDBusMsg = NULL;
1158 DBusMessage* lpDBusReply = NULL;
1160 DBusPendingCall* lpDBusPendC;
1166 BTRCORELOG_DEBUG (
"Getting properties for the device %s\n", apcIface);
1168 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
1170 DBUS_INTERFACE_PROPERTIES,
1173 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_STRING, &pdeviceInterface, DBUS_TYPE_INVALID);
1175 dbus_error_init(&lDBusErr);
1176 if (!dbus_connection_send_with_reply(apDBusConn, lpDBusMsg, &lpDBusPendC, -1)) {
1177 BTRCORELOG_ERROR (
"failed to send message");
1181 dbus_connection_flush(apDBusConn);
1182 dbus_message_unref(lpDBusMsg);
1185 dbus_pending_call_block(lpDBusPendC);
1186 lpDBusReply = dbus_pending_call_steal_reply(lpDBusPendC);
1187 dbus_pending_call_unref(lpDBusPendC);
1189 if (lpDBusReply != NULL) {
1190 if (0 != btrCore_BTParseDevice(lpDBusReply, apstBTDeviceInfo)) {
1191 BTRCORELOG_ERROR (
"Parsing the device %s failed..\n", apcIface);
1192 dbus_message_unref(lpDBusReply);
1197 dbus_message_unref(lpDBusReply);
1202 dbus_message_unref(lpDBusReply);
1208 btrCore_BTParseDevice (
1209 DBusMessage* apDBusMsg,
1212 DBusMessageIter arg_i;
1213 DBusMessageIter element_i;
1214 DBusMessageIter variant_i;
1217 const char* pcKey = NULL;
1222 unsigned short ui16Vendor = 0;
1223 unsigned short ui16VendorSource = 0;
1224 unsigned short ui16Product = 0;
1225 unsigned short ui16Version = 0;
1226 unsigned int ui32Class = 0;
1228 const char* pcName = NULL;
1229 const char* pcAddress = NULL;
1230 const char* pcAlias = NULL;
1231 const char* pcDevAdapterObjPath = NULL;
1232 const char* pcIcon = NULL;
1233 unsigned short ui16Appearance = 0;
1235 if (!dbus_message_iter_init(apDBusMsg, &arg_i)) {
1236 BTRCORELOG_ERROR (
"dbus_message_iter_init Failed\n");
1240 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
1241 if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_ARRAY) {
1242 dbus_message_iter_next(&arg_i);
1243 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
1245 if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_ARRAY) {
1246 BTRCORELOG_ERROR (
"Unknown Prop structure from Bluez\n");
1251 dbus_message_iter_recurse(&arg_i, &element_i);
1252 while (dbus_message_iter_get_arg_type(&element_i) != DBUS_TYPE_INVALID) {
1253 if (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) {
1254 DBusMessageIter dict_i;
1256 dbus_message_iter_recurse(&element_i, &dict_i);
1257 dbus_message_iter_get_basic(&dict_i, &pcKey);
1259 if (strcmp (pcKey,
"Address") == 0) {
1260 dbus_message_iter_next(&dict_i);
1261 dbus_message_iter_recurse(&dict_i, &variant_i);
1262 dbus_message_iter_get_basic(&variant_i, &pcAddress);
1263 strncpy(apstBTDeviceInfo->pcAddress, pcAddress,
BT_MAX_STR_LEN-1);
1264 BTRCORELOG_TRACE (
"pcAddress = %s\n", apstBTDeviceInfo->pcAddress);
1267 char lcDevVen[4] = {
'\0'};
1269 lcDevVen[0]=pcAddress[12];
1270 lcDevVen[1]=pcAddress[15];
1271 lcDevVen[2]=pcAddress[16];
1273 ui16Vendor = strtoll(lcDevVen, NULL, 16);
1274 apstBTDeviceInfo->ui16Vendor = ui16Vendor;
1275 BTRCORELOG_TRACE (
"ui16Vendor = %d\n", apstBTDeviceInfo->ui16Vendor);
1278 else if (strcmp (pcKey,
"Appearance") == 0) {
1279 dbus_message_iter_next(&dict_i);
1280 dbus_message_iter_recurse(&dict_i, &variant_i);
1281 dbus_message_iter_get_basic(&variant_i, &ui16Appearance);
1282 apstBTDeviceInfo->ui16Appearance = ui16Appearance;
1283 BTRCORELOG_TRACE (
"ui16Appeaerance = %d\n", apstBTDeviceInfo->ui16Appearance);
1285 else if (strcmp (pcKey,
"Name") == 0) {
1286 dbus_message_iter_next(&dict_i);
1287 dbus_message_iter_recurse(&dict_i, &variant_i);
1288 dbus_message_iter_get_basic(&variant_i, &pcName);
1290 BTRCORELOG_TRACE (
"pcName = %s\n", apstBTDeviceInfo->pcName);
1293 else if (strcmp (pcKey,
"Vendor") == 0) {
1294 dbus_message_iter_next(&dict_i);
1295 dbus_message_iter_recurse(&dict_i, &variant_i);
1296 dbus_message_iter_get_basic(&variant_i, &ui16Vendor);
1297 apstBTDeviceInfo->ui16Vendor = ui16Vendor;
1298 BTRCORELOG_TRACE (
"ui16Vendor = %d\n", apstBTDeviceInfo->ui16Vendor);
1300 else if (strcmp (pcKey,
"VendorSource") == 0) {
1301 dbus_message_iter_next(&dict_i);
1302 dbus_message_iter_recurse(&dict_i, &variant_i);
1303 dbus_message_iter_get_basic(&variant_i, &ui16VendorSource);
1304 apstBTDeviceInfo->ui16VendorSource = ui16VendorSource;
1305 BTRCORELOG_TRACE (
"ui16VendorSource= %d\n", apstBTDeviceInfo->ui16VendorSource);
1307 else if (strcmp (pcKey,
"Product") == 0) {
1308 dbus_message_iter_next(&dict_i);
1309 dbus_message_iter_recurse(&dict_i, &variant_i);
1310 dbus_message_iter_get_basic(&variant_i, &ui16Product);
1311 apstBTDeviceInfo->ui16Product = ui16Product;
1312 BTRCORELOG_TRACE (
"ui16Product = %d\n", apstBTDeviceInfo->ui16Product);
1314 else if (strcmp (pcKey,
"Version") == 0) {
1315 dbus_message_iter_next(&dict_i);
1316 dbus_message_iter_recurse(&dict_i, &variant_i);
1317 dbus_message_iter_get_basic(&variant_i, &ui16Version);
1318 apstBTDeviceInfo->ui16Version = ui16Version;
1319 BTRCORELOG_TRACE (
"ui16Version = %d\n", apstBTDeviceInfo->ui16Version);
1321 else if (strcmp (pcKey,
"Icon") == 0) {
1322 dbus_message_iter_next(&dict_i);
1323 dbus_message_iter_recurse(&dict_i, &variant_i);
1324 dbus_message_iter_get_basic(&variant_i, &pcIcon);
1326 BTRCORELOG_TRACE (
"pcIcon = %s\n", apstBTDeviceInfo->pcIcon);
1328 else if (strcmp (pcKey,
"Class") == 0) {
1329 dbus_message_iter_next(&dict_i);
1330 dbus_message_iter_recurse(&dict_i, &variant_i);
1331 dbus_message_iter_get_basic(&variant_i, &ui32Class);
1332 apstBTDeviceInfo->ui32Class = ui32Class;
1333 BTRCORELOG_DEBUG (
"ui32Class = %d\n", apstBTDeviceInfo->ui32Class);
1335 else if (strcmp (pcKey,
"Paired") == 0) {
1336 dbus_message_iter_next(&dict_i);
1337 dbus_message_iter_recurse(&dict_i, &variant_i);
1338 dbus_message_iter_get_basic(&variant_i, &bPaired);
1339 apstBTDeviceInfo->bPaired = bPaired;
1340 BTRCORELOG_DEBUG (
"bPaired = %d\n", apstBTDeviceInfo->bPaired);
1342 else if (strcmp (pcKey,
"Connected") == 0) {
1343 dbus_message_iter_next(&dict_i);
1344 dbus_message_iter_recurse(&dict_i, &variant_i);
1345 dbus_message_iter_get_basic(&variant_i, &bConnected);
1346 apstBTDeviceInfo->bConnected = bConnected;
1347 BTRCORELOG_DEBUG (
"bConnected = %d\n", apstBTDeviceInfo->bConnected);
1349 else if (strcmp (pcKey,
"Trusted") == 0) {
1350 dbus_message_iter_next(&dict_i);
1351 dbus_message_iter_recurse(&dict_i, &variant_i);
1352 dbus_message_iter_get_basic(&variant_i, &bTrusted);
1353 apstBTDeviceInfo->bTrusted = bTrusted;
1354 BTRCORELOG_TRACE (
"bTrusted = %d\n", apstBTDeviceInfo->bTrusted);
1356 else if (strcmp (pcKey,
"Blocked") == 0) {
1357 dbus_message_iter_next(&dict_i);
1358 dbus_message_iter_recurse(&dict_i, &variant_i);
1359 dbus_message_iter_get_basic(&variant_i, &bBlocked);
1360 apstBTDeviceInfo->bBlocked = bBlocked;
1361 BTRCORELOG_TRACE (
"bBlocked = %d\n", apstBTDeviceInfo->bBlocked);
1363 else if (strcmp (pcKey,
"Alias") == 0) {
1364 dbus_message_iter_next(&dict_i);
1365 dbus_message_iter_recurse(&dict_i, &variant_i);
1366 dbus_message_iter_get_basic(&variant_i, &pcAlias);
1368 BTRCORELOG_TRACE (
"pcAlias = %s\n", apstBTDeviceInfo->pcAlias);
1370 else if (strcmp (pcKey,
"Adapter") == 0) {
1371 dbus_message_iter_next(&dict_i);
1372 dbus_message_iter_recurse(&dict_i, &variant_i);
1373 dbus_message_iter_get_basic(&variant_i, &pcDevAdapterObjPath);
1374 BTRCORELOG_TRACE (
"pcDevAdapterObjPath = %s\n", pcDevAdapterObjPath);
1376 else if (strcmp (pcKey,
"RSSI") == 0) {
1377 dbus_message_iter_next(&dict_i);
1378 dbus_message_iter_recurse(&dict_i, &variant_i);
1379 dbus_message_iter_get_basic(&variant_i, &i16RSSI);
1380 apstBTDeviceInfo->i32RSSI = i16RSSI;
1381 BTRCORELOG_DEBUG (
"i32RSSI = %d\n", apstBTDeviceInfo->i32RSSI);
1383 else if (strcmp (pcKey,
"UUIDs") == 0) {
1384 dbus_message_iter_next(&dict_i);
1385 dbus_message_iter_recurse(&dict_i, &variant_i);
1387 dbus_type = dbus_message_iter_get_arg_type (&variant_i);
1388 if (dbus_type == DBUS_TYPE_ARRAY) {
1390 DBusMessageIter variant_j;
1391 dbus_message_iter_recurse(&variant_i, &variant_j);
1393 while ((dbus_type = dbus_message_iter_get_arg_type (&variant_j)) != DBUS_TYPE_INVALID) {
1396 dbus_message_iter_get_basic (&variant_j, &pVal);
1397 BTRCORELOG_TRACE (
"UUID value is %s\n", pVal);
1401 dbus_message_iter_next (&variant_j);
1405 BTRCORELOG_ERROR (
"Services; Not an Array\n");
1408 else if (strcmp (pcKey,
"ServiceData") == 0) {
1409 dbus_message_iter_next(&dict_i);
1410 dbus_message_iter_recurse(&dict_i, &variant_i);
1411 dbus_type = dbus_message_iter_get_arg_type (&variant_i);
1413 if (dbus_type == DBUS_TYPE_ARRAY) {
1414 DBusMessageIter variant_j;
1416 dbus_message_iter_recurse(&variant_i, &variant_j);
1419 DBusMessageIter dict_j;
1423 while ((dbus_message_iter_get_arg_type (&variant_j) == DBUS_TYPE_DICT_ENTRY) &&
1425 const char* uuid_str = NULL;
1426 dbus_message_iter_recurse(&variant_j, &dict_j);
1427 dbus_message_iter_get_basic(&dict_j, &uuid_str);
1430 strncpy(apstBTDeviceInfo->saServices[count].pcUUIDs, uuid_str, (
BT_MAX_UUID_STR_LEN - 1));
1433 DBusMessageIter variant_k;
1434 dbus_message_iter_next(&dict_j);
1435 dbus_message_iter_recurse(&dict_j, &variant_k);
1437 dbus_type = dbus_message_iter_get_arg_type (&variant_k);
1438 if (dbus_type == DBUS_TYPE_ARRAY) {
1439 DBusMessageIter variant_l;
1440 uint8_t *service_data;
1443 dbus_message_iter_recurse(&variant_k, &variant_l);
1444 dbus_message_iter_get_fixed_array(&variant_l, &service_data, &len);
1446 if(service_data && len) {
1448 apstBTDeviceInfo->saServices[count].len = len;
1449 memcpy(apstBTDeviceInfo->saServices[count].pcData, service_data, len);
1452 BTRCORELOG_ERROR (
"Failed to populate the ServiceData since the ServiceData length [%d] is more than BT_MAX_SERVICE_DATA_LEN [%d].\n", len,
BT_MAX_SERVICE_DATA_LEN);
1461 BTRCORELOG_TRACE (
"Service advertisement data, Data is: \n " );
1462 BTRCORELOG_TRACE (
"------------------\n" );
1463 for (
int i =0; i < apstBTDeviceInfo->saServices[count].len; i++){
1464 BTRCORELOG_TRACE (
"ServiceData[%d] = [%x]\n ", i, apstBTDeviceInfo->saServices[count].pcData[i]);
1466 BTRCORELOG_TRACE (
"------------------\n" );
1469 dbus_message_iter_next (&variant_j);
1475 if (!dbus_message_iter_next(&element_i)) {
1481 if (strlen(apstBTDeviceInfo->pcAlias))
1482 strncpy(apstBTDeviceInfo->pcName, apstBTDeviceInfo->pcAlias,
BT_MAX_STR_LEN-1);
1489 btrCore_BTParsePropertyChange (
1490 DBusMessage* apDBusMsg,
1493 DBusMessageIter arg_i, variant_i;
1495 const char* bd_addr;
1498 if (!dbus_message_iter_init(apDBusMsg, &arg_i)) {
1499 BTRCORELOG_ERROR (
"GetProperties lpDBusReply has no arguments.");
1502 if (!dbus_message_get_args( apDBusMsg, NULL,
1503 DBUS_TYPE_STRING, &bd_addr,
1504 DBUS_TYPE_INVALID)) {
1505 BTRCORELOG_ERROR (
"Invalid arguments for NameOwnerChanged signal");
1509 BTRCORELOG_ERROR (
" Name: %s\n",bd_addr);
1510 if (strcmp(bd_addr,
"State") == 0) {
1511 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
1514 if (dbus_type == DBUS_TYPE_STRING) {
1515 dbus_message_iter_next(&arg_i);
1516 dbus_message_iter_recurse(&arg_i, &variant_i);
1517 dbus_message_iter_get_basic(&variant_i, &value);
1519 strncpy(apstBTDeviceInfo->pcDevicePrevState, gpcDeviceCurrState,
BT_MAX_STR_LEN - 1);
1520 strncpy(apstBTDeviceInfo->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
1531 btrCore_BTGetGattInfo (
1534 const char* apcIface
1536 char* pGattInterface = NULL;
1537 DBusMessage* lpDBusMsg = NULL;
1538 DBusMessage* lpDBusReply = NULL;
1540 DBusPendingCall* lpDBusPendC;
1545 BTRCORELOG_DEBUG (
"Getting properties for the Gatt Ifce %s\n", apcIface);
1547 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
1549 DBUS_INTERFACE_PROPERTIES,
1552 if (aenBTOpIfceType == enBTGattService) {
1553 pGattInterface = BT_DBUS_BLUEZ_GATT_SERVICE_PATH;
1554 }
else if (aenBTOpIfceType == enBTGattCharacteristic) {
1555 pGattInterface = BT_DBUS_BLUEZ_GATT_CHAR_PATH;
1556 }
else if (aenBTOpIfceType == enBTGattDescriptor) {
1557 pGattInterface = BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH;
1560 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_STRING, &pGattInterface, DBUS_TYPE_INVALID);
1562 dbus_error_init(&lDBusErr);
1563 if (!dbus_connection_send_with_reply(gpDBusConn, lpDBusMsg, &lpDBusPendC, -1)) {
1564 BTRCORELOG_ERROR (
"failed to send message");
1568 dbus_connection_flush(gpDBusConn);
1569 dbus_message_unref(lpDBusMsg);
1572 dbus_pending_call_block(lpDBusPendC);
1573 lpDBusReply = dbus_pending_call_steal_reply(lpDBusPendC);
1574 dbus_pending_call_unref(lpDBusPendC);
1576 if (lpDBusReply != NULL) {
1578 DBusMessageIter arg_i;
1579 DBusMessageIter element_i;
1580 DBusMessageIter variant_i;
1584 char *devicePath = NULL;
1585 char *servicePath = NULL;
1586 char *characteristicPath = NULL;
1592 int fCount = 0, vCount = 0;
1594 if (!dbus_message_iter_init(lpDBusReply, &arg_i)) {
1595 BTRCORELOG_ERROR (
"dbus_message_iter_init Failed\n");
1599 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
1600 if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_ARRAY) {
1601 dbus_message_iter_next(&arg_i);
1602 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
1604 if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_ARRAY) {
1605 BTRCORELOG_ERROR (
"Unknown Prop structure from Bluez\n");
1610 dbus_message_iter_recurse(&arg_i, &element_i);
1611 while (dbus_message_iter_get_arg_type(&element_i) != DBUS_TYPE_INVALID) {
1612 if (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) {
1613 DBusMessageIter dict_i;
1615 dbus_message_iter_recurse(&element_i, &dict_i);
1616 dbus_message_iter_get_basic(&dict_i, &pcKey);
1618 if (strcmp (pcKey,
"UUID") == 0) {
1619 dbus_message_iter_next(&dict_i);
1620 dbus_message_iter_recurse(&dict_i, &variant_i);
1621 dbus_message_iter_get_basic(&variant_i, &uuid);
1622 BTRCORELOG_INFO (
"UUID : %s\n", uuid);
1624 else if (strcmp (pcKey,
"Device") == 0) {
1625 dbus_message_iter_next(&dict_i);
1626 dbus_message_iter_recurse(&dict_i, &variant_i);
1627 dbus_message_iter_get_basic(&variant_i, &devicePath);
1629 BTRCORELOG_INFO (
"Device : %s\n", devicePath);
1631 else if (strcmp (pcKey,
"Service") == 0) {
1632 dbus_message_iter_next(&dict_i);
1633 dbus_message_iter_recurse(&dict_i, &variant_i);
1634 dbus_message_iter_get_basic(&variant_i, &servicePath);
1636 BTRCORELOG_INFO (
"Service : %s\n", servicePath);
1638 else if (strcmp (pcKey,
"Characteristic") == 0) {
1639 dbus_message_iter_next(&dict_i);
1640 dbus_message_iter_recurse(&dict_i, &variant_i);
1641 dbus_message_iter_get_basic(&variant_i, &characteristicPath);
1643 BTRCORELOG_INFO (
"Characteristic : %s\n", characteristicPath);
1645 else if (strcmp (pcKey,
"Primary") == 0) {
1646 dbus_message_iter_next(&dict_i);
1647 dbus_message_iter_recurse(&dict_i, &variant_i);
1648 dbus_message_iter_get_basic(&variant_i, &primary);
1650 BTRCORELOG_INFO (
"Primary : %d\n", primary);
1652 else if (strcmp (pcKey,
"Notifying") == 0) {
1653 dbus_message_iter_next(&dict_i);
1654 dbus_message_iter_recurse(&dict_i, &variant_i);
1655 dbus_message_iter_get_basic(&variant_i, ¬ifying);
1657 BTRCORELOG_INFO (
"notifying : %d\n", notifying);
1659 else if (strcmp (pcKey,
"Flags") == 0) {
1660 dbus_message_iter_next(&dict_i);
1661 dbus_message_iter_recurse(&dict_i, &variant_i);
1663 dbus_type = dbus_message_iter_get_arg_type (&variant_i);
1664 if (dbus_type == DBUS_TYPE_ARRAY) {
1665 DBusMessageIter variant_j;
1666 dbus_message_iter_recurse(&variant_i, &variant_j);
1668 while ((dbus_type = dbus_message_iter_get_arg_type (&variant_j)) != DBUS_TYPE_INVALID) {
1669 if ((dbus_type == DBUS_TYPE_STRING)) {
1671 dbus_message_iter_get_basic (&variant_j, &pVal);
1672 BTRCORELOG_INFO (
"Flags value is %s\n", pVal);
1676 dbus_message_iter_next (&variant_j);
1680 BTRCORELOG_ERROR (
"Services; Not an Array\n");
1683 else if (strcmp (pcKey,
"Value") == 0) {
1684 dbus_message_iter_next(&dict_i);
1685 dbus_message_iter_recurse(&dict_i, &variant_i);
1687 dbus_type = dbus_message_iter_get_arg_type (&variant_i);
1688 if (dbus_type == DBUS_TYPE_ARRAY) {
1689 DBusMessageIter variant_j;
1690 dbus_message_iter_recurse(&variant_i, &variant_j);
1692 while ((dbus_type = dbus_message_iter_get_arg_type (&variant_j)) != DBUS_TYPE_INVALID) {
1693 if ((dbus_type == DBUS_TYPE_BYTE)) {
1695 dbus_message_iter_get_basic (&variant_j, &pVal);
1696 BTRCORELOG_INFO (
"Value is %s\n", pVal);
1700 dbus_message_iter_next (&variant_j);
1704 BTRCORELOG_ERROR (
"Services; Not an Array\n");
1709 if (!dbus_message_iter_next(&element_i)) {
1714 dbus_message_unref(lpDBusReply);
1716 if (aenBTOpIfceType == enBTGattService) {
1717 stBTGattServiceInfo* gattServiceInfo = (stBTGattServiceInfo*)apvGattInfo;
1720 strncpy(gattServiceInfo->gattDevicePath, devicePath,
BT_MAX_STR_LEN - 1);
1721 gattServiceInfo->ui16Primary = primary;
1723 else if (aenBTOpIfceType == enBTGattCharacteristic) {
1724 stBTGattCharInfo* gattCharInfo = (stBTGattCharInfo*)apvGattInfo;
1728 strncpy(gattCharInfo->gattServicePath, servicePath,
BT_MAX_STR_LEN - 1);
1729 gattCharInfo->ui16Notifying = notifying;
1730 for (;i<fCount;i++) {
1737 else if (aenBTOpIfceType == enBTGattDescriptor) {
1738 stBTGattDescInfo* gattDescInfo = (stBTGattDescInfo*)apvGattInfo;
1742 strncpy(gattDescInfo->gattCharPath, characteristicPath,
BT_MAX_STR_LEN - 1);
1743 for (;i<fCount;i++) {
1758 btrCore_BTGetMediaInfo (
1759 DBusConnection* apDBusConn,
1761 const char* apcIface
1763 char* pdeviceInterface = BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH;
1764 DBusMessage* lpDBusMsg = NULL;
1765 DBusMessage* lpDBusReply = NULL;
1767 DBusPendingCall* lpDBusPendC;
1773 BTRCORELOG_DEBUG (
"Getting properties for the Media Ifce %s\n", apcIface);
1775 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
1777 DBUS_INTERFACE_PROPERTIES,
1780 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_STRING, &pdeviceInterface, DBUS_TYPE_INVALID);
1782 dbus_error_init(&lDBusErr);
1783 if (!dbus_connection_send_with_reply(apDBusConn, lpDBusMsg, &lpDBusPendC, -1)) {
1784 BTRCORELOG_ERROR (
"failed to send message");
1788 dbus_connection_flush(apDBusConn);
1789 dbus_message_unref(lpDBusMsg);
1792 dbus_pending_call_block(lpDBusPendC);
1793 lpDBusReply = dbus_pending_call_steal_reply(lpDBusPendC);
1794 dbus_pending_call_unref(lpDBusPendC);
1796 if (lpDBusReply != NULL) {
1797 if (0 != btrCore_BTParseMediaTransport(lpDBusReply, apstBTMediaInfo)) {
1798 BTRCORELOG_ERROR (
"Parsing the device %s failed..\n", apcIface);
1799 dbus_message_unref(lpDBusReply);
1803 dbus_message_unref(lpDBusReply);
1808 dbus_message_unref(lpDBusReply);
1815 btrCore_BTParseMediaTransport (
1816 DBusMessage* apDBusMsg,
1819 DBusMessageIter arg_i;
1820 DBusMessageIter element_i;
1821 DBusMessageIter variant_i;
1825 unsigned char ui8Codec = 0;
1826 char* pcState = NULL;
1827 char* pcUUID = NULL;
1828 unsigned short ui16Delay = 0;
1829 unsigned short ui16Volume = 0;
1831 if (!dbus_message_iter_init(apDBusMsg, &arg_i)) {
1832 BTRCORELOG_ERROR (
"dbus_message_iter_init Failed\n");
1836 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
1837 if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_ARRAY) {
1838 dbus_message_iter_next(&arg_i);
1839 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
1841 if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_ARRAY) {
1842 BTRCORELOG_ERROR (
"Unknown Prop structure from Bluez\n");
1847 dbus_message_iter_recurse(&arg_i, &element_i);
1848 while (dbus_message_iter_get_arg_type(&element_i) != DBUS_TYPE_INVALID) {
1849 if (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) {
1850 DBusMessageIter dict_i;
1852 dbus_message_iter_recurse(&element_i, &dict_i);
1853 dbus_message_iter_get_basic(&dict_i, &pcKey);
1855 if (strcmp (pcKey,
"Codec") == 0) {
1856 dbus_message_iter_next(&dict_i);
1857 dbus_message_iter_recurse(&dict_i, &variant_i);
1858 dbus_message_iter_get_basic(&variant_i, &ui8Codec);
1859 apstBTMediaInfo->ui8Codec = ui8Codec;
1860 BTRCORELOG_INFO (
"apstBTMediaInfo->ui8Codec : %d\n", apstBTMediaInfo->ui8Codec);
1862 else if (strcmp (pcKey,
"State") == 0) {
1863 dbus_message_iter_next(&dict_i);
1864 dbus_message_iter_recurse(&dict_i, &variant_i);
1865 dbus_message_iter_get_basic(&variant_i, &pcState);
1867 BTRCORELOG_INFO (
"apstBTMediaInfo->pcState: %s\n", apstBTMediaInfo->pcState);
1870 else if (strcmp (pcKey,
"UUID") == 0) {
1871 dbus_message_iter_next(&dict_i);
1872 dbus_message_iter_recurse(&dict_i, &variant_i);
1873 dbus_message_iter_get_basic(&variant_i, &pcUUID);
1875 BTRCORELOG_INFO (
"apstBTMediaInfo->pcUUID: %s\n", apstBTMediaInfo->pcUUID);
1877 else if (strcmp (pcKey,
"Delay") == 0) {
1878 dbus_message_iter_next(&dict_i);
1879 dbus_message_iter_recurse(&dict_i, &variant_i);
1880 dbus_message_iter_get_basic(&variant_i, &ui16Delay);
1881 apstBTMediaInfo->ui16Delay = ui16Delay;
1882 BTRCORELOG_INFO (
"apstBTMediaInfo->ui16Delay = %d\n", apstBTMediaInfo->ui16Delay);
1884 else if (strcmp (pcKey,
"Volume") == 0) {
1885 dbus_message_iter_next(&dict_i);
1886 dbus_message_iter_recurse(&dict_i, &variant_i);
1887 dbus_message_iter_get_basic(&variant_i, &ui16Volume);
1888 apstBTMediaInfo->ui16Volume = ui16Volume;
1889 BTRCORELOG_INFO (
"apstBTMediaInfo->ui16Volume = %d\n", apstBTMediaInfo->ui16Volume);
1893 if (!dbus_message_iter_next(&element_i)) {
1905 btrCore_BTParseMediaTrackMetadata (
1906 DBusMessage* apDBusMsg,
1909 int dbus_type = DBUS_TYPE_INVALID;
1910 DBusMessageIter lDBusReplyIter;
1911 DBusMessageIter arrayMsgIter;
1912 DBusMessageIter dictMsgIter;
1913 DBusMessageIter element;
1914 DBusMessageIter elementBasic;
1916 unsigned int ui32Value = 0;
1918 char* pcValue =
"\0";
1921 BTRCORELOG_ERROR (
"DBusMessage is NULL !\n");
1925 if (!dbus_message_iter_init(apDBusMsg, &lDBusReplyIter)) {
1926 BTRCORELOG_ERROR (
"dbus_message_iter_init Failed\n");
1930 if ((dbus_message_iter_get_arg_type (&lDBusReplyIter)) == DBUS_TYPE_INVALID) {
1931 BTRCORELOG_ERROR (
"DBUS_TYPE_INVALID\n");
1935 dbus_message_iter_recurse(&lDBusReplyIter, &arrayMsgIter);
1936 if ((dbus_message_iter_get_arg_type (&arrayMsgIter)) == DBUS_TYPE_INVALID) {
1937 BTRCORELOG_ERROR (
"DBUS_TYPE_INVALID\n");
1941 dbus_message_iter_recurse(&arrayMsgIter, &dictMsgIter);
1944 while ((dbus_type = dbus_message_iter_get_arg_type(&dictMsgIter)) != DBUS_TYPE_INVALID) {
1945 if (DBUS_TYPE_DICT_ENTRY == dbus_type) {
1946 dbus_message_iter_recurse(&dictMsgIter,&element);
1948 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&element)) {
1949 dbus_message_iter_get_basic(&element, &pcKey);
1951 if (!strcmp(
"Album", pcKey)) {
1952 dbus_message_iter_next(&element);
1953 dbus_message_iter_recurse(&element, &elementBasic);
1954 dbus_message_iter_get_basic(&elementBasic, &pcValue);
1956 BTRCORELOG_DEBUG (
"lpstBTMediaTrackInfo->pcAlbum : %s\n", apstBTMediaTrackInfo->pcAlbum);
1958 else if (!strcmp(
"Artist", pcKey)) {
1959 dbus_message_iter_next(&element);
1960 dbus_message_iter_recurse(&element, &elementBasic);
1961 dbus_message_iter_get_basic(&elementBasic, &pcValue);
1962 strncpy(apstBTMediaTrackInfo->pcArtist, pcValue,
BT_MAX_STR_LEN);
1963 BTRCORELOG_DEBUG (
"lpstBTMediaTrackInfo->pcArtist : %s\n", apstBTMediaTrackInfo->pcArtist);
1965 else if (!strcmp(
"Genre", pcKey)) {
1966 dbus_message_iter_next(&element);
1967 dbus_message_iter_recurse(&element, &elementBasic);
1968 dbus_message_iter_get_basic(&elementBasic, &pcValue);
1970 BTRCORELOG_DEBUG (
"lpstBTMediaTrackInfo->pcGenre : %s\n", apstBTMediaTrackInfo->pcGenre);
1972 else if (!strcmp(
"Title", pcKey)) {
1973 dbus_message_iter_next(&element);
1974 dbus_message_iter_recurse(&element, &elementBasic);
1975 dbus_message_iter_get_basic(&elementBasic, &pcValue);
1977 BTRCORELOG_DEBUG (
"lpstBTMediaTrackInfo->pcTitle : %s\n", apstBTMediaTrackInfo->pcTitle);
1979 else if (!strcmp(
"NumberOfTracks", pcKey)) {
1980 dbus_message_iter_next(&element);
1981 dbus_message_iter_recurse(&element, &elementBasic);
1982 dbus_message_iter_get_basic(&elementBasic, (
void*)&ui32Value);
1983 apstBTMediaTrackInfo->ui32NumberOfTracks = ui32Value;
1984 BTRCORELOG_DEBUG (
"lpstBTMediaTrackInfo->ui32NumberOfTracks : %d\n", apstBTMediaTrackInfo->ui32NumberOfTracks);
1986 else if (!strcmp(
"TrackNumber", pcKey)) {
1987 dbus_message_iter_next(&element);
1988 dbus_message_iter_recurse(&element, &elementBasic);
1989 dbus_message_iter_get_basic(&elementBasic, (
void*)&ui32Value);
1990 apstBTMediaTrackInfo->ui32TrackNumber = ui32Value;
1991 BTRCORELOG_DEBUG (
"lpstBTMediaTrackInfo->ui32TrackNumber : %d\n", apstBTMediaTrackInfo->ui32TrackNumber);
1993 else if (!strcmp(
"Duration", pcKey)) {
1994 dbus_message_iter_next(&element);
1995 dbus_message_iter_recurse(&element, &elementBasic);
1996 dbus_message_iter_get_basic(&elementBasic, (
void*)&ui32Value);
1997 apstBTMediaTrackInfo->ui32Duration = ui32Value;
1998 BTRCORELOG_DEBUG (
"lpstBTMediaTrackInfo->ui32Duration : %d\n", apstBTMediaTrackInfo->ui32Duration);
2003 if (!dbus_message_iter_has_next(&dictMsgIter)) {
2007 dbus_message_iter_next(&dictMsgIter);
2016 btrCore_BTMediaEndpointSelectConfiguration (
2017 DBusMessage* apDBusMsg,
2022 DBusMessage* lpDBusReply = NULL;
2024 void* lpMediaCapsInput = NULL;
2025 void* lpMediaCapsOutput= NULL;
2030 dbus_error_init(&lDBusErr);
2032 if (!dbus_message_get_args(apDBusMsg, &lDBusErr, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &lpMediaCapsInput, &lDBusArgsSize, DBUS_TYPE_INVALID)) {
2033 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2034 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint1.Error.InvalidArguments",
"Unable to select configuration");
2037 if (pstlhBtIfce->fpcBNegotiateMedia) {
2038 if(pstlhBtIfce->fpcBNegotiateMedia(lpMediaCapsInput, &lpMediaCapsOutput, aenBTDeviceType, aenBTMediaType, pstlhBtIfce->pcBNegMediaUserData)) {
2039 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint1.Error.InvalidArguments",
"Unable to select configuration");
2043 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
2044 dbus_message_append_args (lpDBusReply, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &lpMediaCapsOutput, lDBusArgsSize, DBUS_TYPE_INVALID);
2051 btrCore_BTMediaEndpointSetConfiguration (
2052 DBusMessage* apDBusMsg,
2057 const char* lpcDevTransportPath = NULL;
2058 const char* lpcDevPath = NULL;
2059 const char* lpcUuid = NULL;
2060 unsigned char* lpui8Config = NULL;
2061 int i32ConfSize = 0;
2063 DBusMessageIter lDBusMsgIter;
2064 DBusMessageIter lDBusMsgIterProp;
2065 DBusMessageIter lDBusMsgIterEntry;
2066 DBusMessageIter lDBusMsgIterValue;
2067 DBusMessageIter lDBusMsgIterArr;
2072 dbus_message_iter_init(apDBusMsg, &lDBusMsgIter);
2073 dbus_message_iter_get_basic(&lDBusMsgIter, &lpcDevTransportPath);
2074 if (!dbus_message_iter_next(&lDBusMsgIter))
2075 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint1.Error.InvalidArguments",
"Unable to set configuration");
2077 dbus_message_iter_recurse(&lDBusMsgIter, &lDBusMsgIterProp);
2078 if (dbus_message_iter_get_arg_type(&lDBusMsgIterProp) != DBUS_TYPE_DICT_ENTRY)
2079 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint1.Error.InvalidArguments",
"Unable to set configuration");
2081 while (dbus_message_iter_get_arg_type(&lDBusMsgIterProp) == DBUS_TYPE_DICT_ENTRY) {
2085 dbus_message_iter_recurse(&lDBusMsgIterProp, &lDBusMsgIterEntry);
2086 dbus_message_iter_get_basic(&lDBusMsgIterEntry, &key);
2088 dbus_message_iter_next(&lDBusMsgIterEntry);
2089 dbus_message_iter_recurse(&lDBusMsgIterEntry, &lDBusMsgIterValue);
2091 ldBusType = dbus_message_iter_get_arg_type(&lDBusMsgIterValue);
2092 if (strcasecmp(key,
"UUID") == 0) {
2093 if (ldBusType != DBUS_TYPE_STRING)
2094 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint1.Error.InvalidArguments",
"Unable to set configuration");
2096 dbus_message_iter_get_basic(&lDBusMsgIterValue, &lpcUuid);
2098 else if (strcasecmp(key,
"Device") == 0) {
2099 if (ldBusType != DBUS_TYPE_OBJECT_PATH)
2100 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint1.Error.InvalidArguments",
"Unable to set configuration");
2102 dbus_message_iter_get_basic(&lDBusMsgIterValue, &lpcDevPath);
2104 else if (strcasecmp(key,
"Configuration") == 0) {
2105 if (ldBusType != DBUS_TYPE_ARRAY)
2106 return dbus_message_new_error(apDBusMsg,
"org.bluez.MediaEndpoint1.Error.InvalidArguments",
"Unable to set configuration");
2108 dbus_message_iter_recurse(&lDBusMsgIterValue, &lDBusMsgIterArr);
2109 dbus_message_iter_get_fixed_array(&lDBusMsgIterArr, &lpui8Config, &i32ConfSize);
2111 dbus_message_iter_next(&lDBusMsgIterProp);
2114 BTRCORELOG_INFO (
"Set configuration - Transport Path %s\n", lpcDevTransportPath);
2115 BTRCORELOG_INFO (
"Set configuration - Transport Path UUID %s\n", lpcUuid);
2116 BTRCORELOG_TRACE(
"Set configuration - Device Path %s\n", lpcDevPath);
2118 if (pstlhBtIfce->pcDevTransportPath) {
2119 free(pstlhBtIfce->pcDevTransportPath);
2120 pstlhBtIfce->pcDevTransportPath = NULL;
2123 pstlhBtIfce->pcDevTransportPath = strdup(lpcDevTransportPath);
2125 if (pstlhBtIfce->fpcBTransportPathMedia) {
2126 if(!pstlhBtIfce->fpcBTransportPathMedia(lpcDevTransportPath, lpcUuid, lpui8Config, aenBTDeviceType, aenBTMediaType, pstlhBtIfce->pcBTransPathMediaUserData)) {
2127 BTRCORELOG_INFO (
"Stored - Transport Path: %s\n", lpcDevTransportPath);
2131 return dbus_message_new_method_return(apDBusMsg);
2136 btrCore_BTMediaEndpointClearConfiguration (
2137 DBusMessage* apDBusMsg,
2142 DBusMessage* lpDBusReply;
2144 DBusMessageIter lDBusMsgIter;
2145 const char* lDevTransportPath = NULL;
2150 dbus_error_init(&lDBusErr);
2151 dbus_message_iter_init(apDBusMsg, &lDBusMsgIter);
2152 dbus_message_iter_get_basic(&lDBusMsgIter, &lDevTransportPath);
2153 BTRCORELOG_DEBUG (
"Clear configuration - Transport Path %s\n", lDevTransportPath);
2155 if (pstlhBtIfce->pcDevTransportPath) {
2156 free(pstlhBtIfce->pcDevTransportPath);
2157 pstlhBtIfce->pcDevTransportPath = NULL;
2160 if (pstlhBtIfce->fpcBTransportPathMedia) {
2161 if(!pstlhBtIfce->fpcBTransportPathMedia(lDevTransportPath, NULL, NULL, aenBTDeviceType, aenBTMediaType, pstlhBtIfce->pcBTransPathMediaUserData)) {
2162 BTRCORELOG_INFO (
"Cleared - Transport Path %s\n", lDevTransportPath);
2166 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
2173 btrCore_BTGetMediaIfceProperty (
2174 DBusConnection* apDBusConn,
2175 const char* apBtObjectPath,
2176 const char* apBtInterfacePath,
2177 const char* property,
2180 DBusMessage* lpDBusMsg = NULL;
2181 DBusMessage* lpDBusReply = NULL;
2183 DBusMessageIter lDBusMsgIter;
2184 DBusMessageIter lDBusReplyIter;
2185 DBusMessageIter element;
2186 int dbus_type = DBUS_TYPE_INVALID;
2189 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
2191 DBUS_INTERFACE_PROPERTIES,
2194 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
2199 dbus_message_iter_init_append(lpDBusMsg, &lDBusMsgIter);
2200 dbus_message_iter_append_basic(&lDBusMsgIter, DBUS_TYPE_STRING, &apBtInterfacePath);
2201 dbus_message_iter_append_basic(&lDBusMsgIter, DBUS_TYPE_STRING, &property);
2203 dbus_error_init(&lDBusErr);
2204 lpDBusReply = dbus_connection_send_with_reply_and_block(apDBusConn, lpDBusMsg, -1, &lDBusErr);
2205 dbus_message_unref(lpDBusMsg);
2208 BTRCORELOG_ERROR (
"lpDBusReply NULL\n");
2209 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2213 dbus_connection_flush(apDBusConn);
2215 dbus_message_iter_init(lpDBusReply, &lDBusReplyIter);
2216 if ((dbus_message_iter_get_arg_type (&lDBusReplyIter)) == DBUS_TYPE_INVALID) {
2217 BTRCORELOG_ERROR (
"DBUS_TYPE_INVALID\n");
2218 dbus_message_unref(lpDBusReply);
2222 dbus_message_iter_recurse(&lDBusReplyIter, &element);
2223 dbus_type = dbus_message_iter_get_arg_type(&element);
2225 if (DBUS_TYPE_STRING == dbus_type ||
2226 DBUS_TYPE_UINT32 == dbus_type ||
2227 DBUS_TYPE_BOOLEAN == dbus_type ||
2228 DBUS_TYPE_OBJECT_PATH == dbus_type ||
2229 DBUS_TYPE_UINT16 == dbus_type ||
2230 DBUS_TYPE_UINT64 == dbus_type ||
2231 DBUS_TYPE_INT16 == dbus_type ||
2232 DBUS_TYPE_INT32 == dbus_type ||
2233 DBUS_TYPE_INT64 == dbus_type ||
2234 DBUS_TYPE_BYTE == dbus_type ||
2235 DBUS_TYPE_DOUBLE == dbus_type) {
2236 dbus_message_iter_get_basic(&element, propertyValue);
2239 dbus_message_unref(lpDBusReply);
2244 btrCore_BTGattGetCharFlag (
2245 unsigned short aflag,
2253 const char *lGattFlags[
BT_MAX_UUID_STR_LEN] = {
"read",
"write",
"encrypt-read",
"encrypt-write",
"encrypt-authenticated-read",
2254 "encrypt-authenticated-write",
"secure-read",
"secure-write",
"notify",
"indicate",
2255 "broadcast",
"write-without-response",
"authenticated-signed-writes",
"reliable-write",
2256 "writable-auxiliaries"
2259 for (index = 0; index < nMaxFlags; index++) {
2260 if ((aflag & (1 << index)) != 0) {
2271 btrCore_BTRegisterGattService (
2272 DBusConnection* apDBusConn,
2273 DBusMessage* apDBusMsg,
2276 int aNumOfGattServices
2278 DBusMessage* lpDBusReply = NULL;
2279 DBusMessageIter lDBusMsgIter;
2280 DBusMessageIter lDBusMsgIterDict;
2282 dbus_bool_t lDBusOp;
2283 const char* lui8ConnName = NULL;
2287 if (!dbus_message_iter_init(apDBusMsg, &lDBusMsgIter)) {
2288 BTRCORELOG_TRACE(
"Message has no arguments!\n");
2290 else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&lDBusMsgIter)) {
2291 BTRCORELOG_TRACE(
"Argument is not string!\n");
2294 dbus_message_iter_get_basic(&lDBusMsgIter, ¶m);
2297 BTRCORELOG_TRACE(
"Method called with %s\n", param);
2299 lui8ConnName = dbus_bus_get_unique_name(apDBusConn);
2300 BTRCORELOG_DEBUG(
"!!! Gatt connection name : %s\n", lui8ConnName);
2302 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
2304 dbus_message_iter_init_append(lpDBusReply, &lDBusMsgIter);
2305 dbus_message_iter_open_container(&lDBusMsgIter,
2307 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2308 DBUS_TYPE_OBJECT_PATH_AS_STRING
2309 DBUS_TYPE_ARRAY_AS_STRING
2310 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2311 DBUS_TYPE_STRING_AS_STRING
2312 DBUS_TYPE_ARRAY_AS_STRING
2313 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2314 DBUS_TYPE_STRING_AS_STRING
2315 DBUS_TYPE_VARIANT_AS_STRING
2316 DBUS_DICT_ENTRY_END_CHAR_AS_STRING
2317 DBUS_DICT_ENTRY_END_CHAR_AS_STRING
2318 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
2321 for (
int serviceIndex = 0; serviceIndex < aNumOfGattServices; serviceIndex++) {
2322 stBTLeGattService *lpstBTRCoreLeGattService = &apstBTRCoreLeGattService[serviceIndex];
2324 const char* lpui8SrvGattPath = strdup(lpstBTRCoreLeGattService->servicePath);
2325 BTRCORELOG_INFO(
"Inside btrCore_BTRegisterGattService - %s \n", lpui8SrvGattPath);
2328 dbus_error_init(&lDBusErr);
2329 lDBusOp = dbus_connection_try_register_object_path(apDBusConn, lpui8SrvGattPath, &gDBusLeGattSCDVTable, apstlhBtIfce, &lDBusErr);
2331 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2332 BTRCORELOG_ERROR(
"Can't Register Le Gatt Object - %s\n", lpui8SrvGattPath);
2336 DBusMessageIter lDBusMsgIterDictObjPath, lDBusMsgIterDictArr;
2338 dbus_message_iter_open_container(&lDBusMsgIterDict, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictObjPath);
2339 dbus_message_iter_append_basic(&lDBusMsgIterDictObjPath, DBUS_TYPE_OBJECT_PATH, &lpui8SrvGattPath);
2340 dbus_message_iter_open_container(&lDBusMsgIterDictObjPath,
2342 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2343 DBUS_TYPE_STRING_AS_STRING
2344 DBUS_TYPE_ARRAY_AS_STRING
2345 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2346 DBUS_TYPE_STRING_AS_STRING
2347 DBUS_TYPE_VARIANT_AS_STRING
2348 DBUS_DICT_ENTRY_END_CHAR_AS_STRING
2349 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
2350 &lDBusMsgIterDictArr);
2352 DBusMessageIter lDBusMsgIterDictStrIfce, lDBusMsgIterDictArrStr;
2353 char* lpcIfce = BT_DBUS_BLUEZ_GATT_SERVICE_PATH;
2355 dbus_message_iter_open_container(&lDBusMsgIterDictArr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStrIfce);
2356 dbus_message_iter_append_basic(&lDBusMsgIterDictStrIfce, DBUS_TYPE_STRING, &lpcIfce);
2357 dbus_message_iter_open_container(&lDBusMsgIterDictStrIfce,
2359 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2360 DBUS_TYPE_STRING_AS_STRING
2361 DBUS_TYPE_VARIANT_AS_STRING
2362 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
2363 &lDBusMsgIterDictArrStr);
2365 DBusMessageIter lDBusMsgIterDictStrUUID;
2366 DBusMessageIter lDBusMsgIterValue;
2368 int type = DBUS_TYPE_STRING;
2369 const char* lpServiceUUID = lpstBTRCoreLeGattService->serviceUuid;
2370 BTRCORELOG_DEBUG(
" Service UUID is %s\n", lpServiceUUID );
2372 dbus_message_iter_open_container(&lDBusMsgIterDictArrStr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStrUUID);
2373 dbus_message_iter_append_basic(&lDBusMsgIterDictStrUUID, DBUS_TYPE_STRING, &key);
2374 dbus_message_iter_open_container(&lDBusMsgIterDictStrUUID, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterValue);
2375 dbus_message_iter_append_basic(&lDBusMsgIterValue, type, &lpServiceUUID);
2376 dbus_message_iter_close_container(&lDBusMsgIterDictStrUUID, &lDBusMsgIterValue);
2377 dbus_message_iter_close_container (&lDBusMsgIterDictArrStr, &lDBusMsgIterDictStrUUID);
2380 DBusMessageIter lDBusMsgIterDictBoolPri;
2381 DBusMessageIter lDBusMsgIterValue;
2382 char* key =
"Primary";
2383 int type = DBUS_TYPE_BOOLEAN;
2384 dbus_bool_t lbBtPrimaryGatt = lpstBTRCoreLeGattService->serviceType;
2386 dbus_message_iter_open_container(&lDBusMsgIterDictArrStr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictBoolPri);
2387 dbus_message_iter_append_basic(&lDBusMsgIterDictBoolPri, DBUS_TYPE_STRING, &key);
2388 dbus_message_iter_open_container(&lDBusMsgIterDictBoolPri, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterValue);
2389 dbus_message_iter_append_basic(&lDBusMsgIterValue, type, &lbBtPrimaryGatt);
2390 dbus_message_iter_close_container(&lDBusMsgIterDictBoolPri, &lDBusMsgIterValue);
2391 dbus_message_iter_close_container(&lDBusMsgIterDictArrStr, &lDBusMsgIterDictBoolPri);
2393 dbus_message_iter_close_container(&lDBusMsgIterDictStrIfce, &lDBusMsgIterDictArrStr);
2394 dbus_message_iter_close_container(&lDBusMsgIterDictArr, &lDBusMsgIterDictStrIfce);
2396 dbus_message_iter_close_container(&lDBusMsgIterDictObjPath, &lDBusMsgIterDictArr);
2397 dbus_message_iter_close_container(&lDBusMsgIterDict, &lDBusMsgIterDictObjPath);
2401 for (
int index = 0; index < lpstBTRCoreLeGattService->ui16NumberOfGattChar; index++) {
2402 stBTLeGattChar *lpstBTRCoreLeGattChar = &lpstBTRCoreLeGattService->astBTRGattChar[index];
2403 const char* lpui8ChrGattPath = strdup(lpstBTRCoreLeGattChar->charPath);
2405 DBusMessageIter lDBusMsgIterDictObjPath, lDBusMsgIterDictArr;
2406 BTRCORELOG_DEBUG(
" Char path is %s\n", lpui8ChrGattPath);
2408 dbus_error_init(&lDBusErr);
2409 lDBusOp = dbus_connection_try_register_object_path(apDBusConn, lpui8ChrGattPath, &gDBusLeGattSCDVTable, apstlhBtIfce, &lDBusErr);
2411 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2412 BTRCORELOG_ERROR(
"Can't Register Le Gatt Object - %s\n", lpui8ChrGattPath);
2415 dbus_message_iter_open_container(&lDBusMsgIterDict, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictObjPath);
2416 dbus_message_iter_append_basic(&lDBusMsgIterDictObjPath, DBUS_TYPE_OBJECT_PATH, &lpui8ChrGattPath);
2417 dbus_message_iter_open_container(&lDBusMsgIterDictObjPath,
2419 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2420 DBUS_TYPE_STRING_AS_STRING
2421 DBUS_TYPE_ARRAY_AS_STRING
2422 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2423 DBUS_TYPE_STRING_AS_STRING
2424 DBUS_TYPE_VARIANT_AS_STRING
2425 DBUS_DICT_ENTRY_END_CHAR_AS_STRING
2426 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
2427 &lDBusMsgIterDictArr);
2429 DBusMessageIter lDBusMsgIterDictStrIfce, lDBusMsgIterDictArrStr;
2430 char* lpcIfce = BT_DBUS_BLUEZ_GATT_CHAR_PATH;
2432 dbus_message_iter_open_container(&lDBusMsgIterDictArr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStrIfce);
2433 dbus_message_iter_append_basic(&lDBusMsgIterDictStrIfce, DBUS_TYPE_STRING, &lpcIfce);
2434 dbus_message_iter_open_container(&lDBusMsgIterDictStrIfce,
2436 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2437 DBUS_TYPE_STRING_AS_STRING
2438 DBUS_TYPE_VARIANT_AS_STRING
2439 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
2440 &lDBusMsgIterDictArrStr);
2442 DBusMessageIter lDBusMsgIterDictStrUUID;
2443 DBusMessageIter lDBusMsgIterValue;
2445 int type = DBUS_TYPE_STRING;
2446 const char* lpCharUUID = lpstBTRCoreLeGattChar->charUuid;
2448 dbus_message_iter_open_container(&lDBusMsgIterDictArrStr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStrUUID);
2449 dbus_message_iter_append_basic(&lDBusMsgIterDictStrUUID, DBUS_TYPE_STRING, &key);
2450 dbus_message_iter_open_container(&lDBusMsgIterDictStrUUID, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterValue);
2451 dbus_message_iter_append_basic(&lDBusMsgIterValue, type, &lpCharUUID);
2452 dbus_message_iter_close_container(&lDBusMsgIterDictStrUUID, &lDBusMsgIterValue);
2453 dbus_message_iter_close_container(&lDBusMsgIterDictArrStr, &lDBusMsgIterDictStrUUID);
2456 DBusMessageIter lDBusMsgIterDictStrUUID;
2457 DBusMessageIter lDBusMsgIterValue;
2458 char* key =
"Service";
2459 int type = DBUS_TYPE_OBJECT_PATH;
2461 dbus_message_iter_open_container(&lDBusMsgIterDictArrStr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStrUUID);
2462 dbus_message_iter_append_basic(&lDBusMsgIterDictStrUUID, DBUS_TYPE_STRING, &key);
2463 dbus_message_iter_open_container(&lDBusMsgIterDictStrUUID, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterValue);
2464 dbus_message_iter_append_basic(&lDBusMsgIterValue, type, &lpui8SrvGattPath);
2465 dbus_message_iter_close_container(&lDBusMsgIterDictStrUUID, &lDBusMsgIterValue);
2466 dbus_message_iter_close_container(&lDBusMsgIterDictArrStr, &lDBusMsgIterDictStrUUID);
2469 DBusMessageIter lDBusMsgIterDictStrUUID;
2470 DBusMessageIter lDBusMsgIterVariant;
2471 DBusMessageIter lDBusMsgIterSubArray;
2472 char* key =
"Flags";
2473 int type = DBUS_TYPE_STRING;
2476 char array_type[5] =
"a";
2478 strncat (array_type, (
char*)&type,
sizeof(array_type) -
sizeof(type));
2480 btrCore_BTGattGetCharFlag(lpstBTRCoreLeGattChar->charFlags, lppui8Props, BT_MAX_NUM_GATT_CHAR_FLAGS, &nFlags);
2482 dbus_message_iter_open_container(&lDBusMsgIterDictArrStr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStrUUID);
2483 dbus_message_iter_append_basic(&lDBusMsgIterDictStrUUID, DBUS_TYPE_STRING, &key);
2484 dbus_message_iter_open_container(&lDBusMsgIterDictStrUUID, DBUS_TYPE_VARIANT, array_type, &lDBusMsgIterVariant);
2485 dbus_message_iter_open_container(&lDBusMsgIterVariant, DBUS_TYPE_ARRAY, (
char *)&type, &lDBusMsgIterSubArray);
2486 for (
int index = 0; index < nFlags; index++) {
2487 const char* lpCharFlag = lppui8Props[index];
2488 dbus_message_iter_append_basic(&lDBusMsgIterSubArray, type, &lpCharFlag);
2490 dbus_message_iter_close_container (&lDBusMsgIterVariant, &lDBusMsgIterSubArray);
2491 dbus_message_iter_close_container (&lDBusMsgIterDictStrUUID, &lDBusMsgIterVariant);
2492 dbus_message_iter_close_container (&lDBusMsgIterDictArrStr, &lDBusMsgIterDictStrUUID);
2495 DBusMessageIter lDBusMsgIterDictBoolPri;
2496 DBusMessageIter lDBusMsgIterValue;
2497 char* key =
"Notifying";
2498 int type = DBUS_TYPE_BOOLEAN;
2499 dbus_bool_t lbNotify = FALSE;
2501 BTRCORELOG_WARN(
"Characteristics flag is - %d\n", lpstBTRCoreLeGattChar->charFlags);
2502 if ((lpstBTRCoreLeGattChar->charFlags & BT_GATT_CHAR_FLAG_NOTIFY) == BT_GATT_CHAR_FLAG_NOTIFY) {
2504 BTRCORELOG_WARN(
"Notification flag is - %d\n", (
int)lbNotify);
2507 dbus_message_iter_open_container(&lDBusMsgIterDictArrStr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictBoolPri);
2508 dbus_message_iter_append_basic(&lDBusMsgIterDictBoolPri, DBUS_TYPE_STRING, &key);
2509 dbus_message_iter_open_container(&lDBusMsgIterDictBoolPri, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterValue);
2510 dbus_message_iter_append_basic(&lDBusMsgIterValue, type, &lbNotify);
2511 dbus_message_iter_close_container(&lDBusMsgIterDictBoolPri, &lDBusMsgIterValue);
2512 dbus_message_iter_close_container(&lDBusMsgIterDictArrStr, &lDBusMsgIterDictBoolPri);
2515 dbus_message_iter_close_container(&lDBusMsgIterDictStrIfce, &lDBusMsgIterDictArrStr);
2516 dbus_message_iter_close_container(&lDBusMsgIterDictArr, &lDBusMsgIterDictStrIfce);
2518 dbus_message_iter_close_container(&lDBusMsgIterDictObjPath, &lDBusMsgIterDictArr);
2519 dbus_message_iter_close_container(&lDBusMsgIterDict, &lDBusMsgIterDictObjPath);
2522 for (
int DescIndex = 0; DescIndex < lpstBTRCoreLeGattChar->ui16NumberOfGattDesc; DescIndex++) {
2523 stBTLeGattDesc *lpstCoreLeGattDesc = &lpstBTRCoreLeGattChar->atBTRGattDesc[DescIndex];
2524 const char* lpui8DescGattPath = strdup(lpstCoreLeGattDesc->descPath);
2525 DBusMessageIter lDBusMsgIterDictObjPath, lDBusMsgIterDictArr;
2527 dbus_error_init(&lDBusErr);
2528 lDBusOp = dbus_connection_try_register_object_path(apDBusConn, lpui8DescGattPath, &gDBusLeGattSCDVTable, apstlhBtIfce, &lDBusErr);
2530 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2531 BTRCORELOG_ERROR(
"Can't Register Le Gatt Object - %s\n", lpui8DescGattPath);
2534 dbus_message_iter_open_container(&lDBusMsgIterDict, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictObjPath);
2535 dbus_message_iter_append_basic(&lDBusMsgIterDictObjPath, DBUS_TYPE_OBJECT_PATH, &lpui8DescGattPath);
2536 dbus_message_iter_open_container(&lDBusMsgIterDictObjPath,
2538 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2539 DBUS_TYPE_STRING_AS_STRING
2540 DBUS_TYPE_ARRAY_AS_STRING
2541 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2542 DBUS_TYPE_STRING_AS_STRING
2543 DBUS_TYPE_VARIANT_AS_STRING
2544 DBUS_DICT_ENTRY_END_CHAR_AS_STRING
2545 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
2546 &lDBusMsgIterDictArr);
2548 DBusMessageIter lDBusMsgIterDictStrIfce, lDBusMsgIterDictArrStr;
2549 char* lpcIfce = BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH;
2551 dbus_message_iter_open_container(&lDBusMsgIterDictArr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStrIfce);
2552 dbus_message_iter_append_basic(&lDBusMsgIterDictStrIfce, DBUS_TYPE_STRING, &lpcIfce);
2553 dbus_message_iter_open_container(&lDBusMsgIterDictStrIfce,
2555 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2556 DBUS_TYPE_STRING_AS_STRING
2557 DBUS_TYPE_VARIANT_AS_STRING
2558 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
2559 &lDBusMsgIterDictArrStr);
2561 DBusMessageIter lDBusMsgIterDictStrUUID;
2562 DBusMessageIter lDBusMsgIterValue;
2564 int type = DBUS_TYPE_STRING;
2565 const char* lpDescUUID = lpstCoreLeGattDesc->descUuid;
2567 dbus_message_iter_open_container(&lDBusMsgIterDictArrStr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStrUUID);
2568 dbus_message_iter_append_basic(&lDBusMsgIterDictStrUUID, DBUS_TYPE_STRING, &key);
2569 dbus_message_iter_open_container(&lDBusMsgIterDictStrUUID, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterValue);
2570 dbus_message_iter_append_basic(&lDBusMsgIterValue, type, &lpDescUUID);
2571 dbus_message_iter_close_container(&lDBusMsgIterDictStrUUID, &lDBusMsgIterValue);
2572 dbus_message_iter_close_container(&lDBusMsgIterDictArrStr, &lDBusMsgIterDictStrUUID);
2575 DBusMessageIter lDBusMsgIterDictStrUUID;
2576 DBusMessageIter lDBusMsgIterValue;
2577 char* key =
"Characteristic";
2578 int type = DBUS_TYPE_OBJECT_PATH;
2580 dbus_message_iter_open_container(&lDBusMsgIterDictArrStr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStrUUID);
2581 dbus_message_iter_append_basic(&lDBusMsgIterDictStrUUID, DBUS_TYPE_STRING, &key);
2582 dbus_message_iter_open_container(&lDBusMsgIterDictStrUUID, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterValue);
2583 dbus_message_iter_append_basic(&lDBusMsgIterValue, type, &lpui8ChrGattPath);
2584 dbus_message_iter_close_container(&lDBusMsgIterDictStrUUID, &lDBusMsgIterValue);
2585 dbus_message_iter_close_container(&lDBusMsgIterDictArrStr, &lDBusMsgIterDictStrUUID);
2588 DBusMessageIter lDBusMsgIterDictStrUUID;
2589 DBusMessageIter lDBusMsgIterVariant;
2590 DBusMessageIter lDBusMsgIterSubArray;
2591 char* key =
"Flags";
2592 int type = DBUS_TYPE_STRING;
2595 char array_type[5] =
"a";
2596 strncat(array_type, (
char*)&type,
sizeof(array_type) -
sizeof(type));
2598 btrCore_BTGattGetCharFlag(lpstCoreLeGattDesc->descFlags, lppui8Props, BT_MAX_NUM_GATT_DESC_FLAGS, &nFlags);
2600 dbus_message_iter_open_container(&lDBusMsgIterDictArrStr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStrUUID);
2601 dbus_message_iter_append_basic(&lDBusMsgIterDictStrUUID, DBUS_TYPE_STRING, &key);
2602 dbus_message_iter_open_container(&lDBusMsgIterDictStrUUID, DBUS_TYPE_VARIANT, array_type, &lDBusMsgIterVariant);
2603 dbus_message_iter_open_container(&lDBusMsgIterVariant, DBUS_TYPE_ARRAY, (
char *)&type, &lDBusMsgIterSubArray);
2604 for (
int index = 0; index < nFlags; index++)
2606 const char* lpCharFlag = lppui8Props[index];
2607 dbus_message_iter_append_basic(&lDBusMsgIterSubArray, type, &lpCharFlag);
2609 dbus_message_iter_close_container(&lDBusMsgIterVariant, &lDBusMsgIterSubArray);
2610 dbus_message_iter_close_container(&lDBusMsgIterDictStrUUID, &lDBusMsgIterVariant);
2611 dbus_message_iter_close_container(&lDBusMsgIterDictArrStr, &lDBusMsgIterDictStrUUID);
2615 dbus_message_iter_close_container(&lDBusMsgIterDictStrIfce, &lDBusMsgIterDictArrStr);
2616 dbus_message_iter_close_container(&lDBusMsgIterDictArr, &lDBusMsgIterDictStrIfce);
2618 dbus_message_iter_close_container(&lDBusMsgIterDictObjPath, &lDBusMsgIterDictArr);
2619 dbus_message_iter_close_container(&lDBusMsgIterDict, &lDBusMsgIterDictObjPath);
2621 free((
void*)lpui8DescGattPath);
2623 free((
void*)lpui8ChrGattPath);
2625 free((
void*)lpui8SrvGattPath);
2627 dbus_message_iter_close_container (&lDBusMsgIter, &lDBusMsgIterDict);
2629 BTRCORELOG_ERROR (
"RETURNING - %p\n", lpDBusReply);
2635 btrCore_BTUnRegisterGattService (
2636 DBusConnection* apDBusConn,
2637 const char* apui8SCDGattPath
2639 dbus_bool_t lDBusOp;
2642 BTRCORELOG_TRACE(
"Inside btrCore_BTUnRegisterGattService\n");
2648 btrCore_BTReleaseLEGattObjPath (
2652 dbus_bool_t lDBusOp;
2655 lDBusOp = dbus_connection_unregister_object_path(pstlhBtIfce->pDBusConn, apstObjPath);
2657 BTRCORELOG_ERROR(
"Can't unregister object path %s for Gatt!\n", apstObjPath);
2666 btrCore_BTLEGattOps (
2667 DBusMessage* apDBusMsg,
2672 DBusMessage* lpDBusReply = NULL;
2674 void* lpLEGattOutput = NULL;
2675 DBusMessageIter lDBusReplyIter, lDBusNextIter;
2676 DBusMessageIter element;
2677 int dbus_type = DBUS_TYPE_INVALID;
2678 char propertyValue[BT_MAX_GATT_OP_DATA_LEN] = {
'\0'};
2683 const char *path = dbus_message_get_path(apDBusMsg);
2685 switch (aenGattOp) {
2686 case enBTLeGattOpWriteValue: {
2687 BTRCORELOG_INFO(
"enBTLeGattOpWriteValue\n");
2689 dbus_message_iter_init(apDBusMsg, &lDBusReplyIter);
2690 if ((dbus_message_iter_get_arg_type(&lDBusReplyIter)) == DBUS_TYPE_INVALID) {
2691 BTRCORELOG_ERROR(
"DBUS_TYPE_INVALID\n");
2692 dbus_message_unref(apDBusMsg);
2695 dbus_message_iter_recurse(&lDBusReplyIter, &element);
2697 while ((dbus_type = dbus_message_iter_get_arg_type(&element)) != DBUS_TYPE_INVALID) {
2698 if (dbus_type == DBUS_TYPE_BYTE) {
2699 dbus_message_iter_get_basic(&element, &data);
2700 propertyValue[index++] = data;
2703 if (!dbus_message_iter_next(&element)) {
2707 propertyValue[index] =
'\0';
2709 dbus_message_iter_recurse(&element, &lDBusNextIter);
2710 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&lDBusNextIter)) {
2711 DBusMessageIter dictEntryIter;
2712 dbus_message_iter_recurse(&lDBusNextIter, &dictEntryIter);
2713 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&dictEntryIter)) {
2716 dbus_message_iter_get_basic(&dictEntryIter, &dbusObject);
2718 if (0 == strcmp(dbusObject,
"device")) {
2719 if (
true == dbus_message_iter_next(&dictEntryIter)) {
2720 DBusMessageIter variantArray;
2721 dbus_message_iter_recurse(&dictEntryIter, &variantArray);
2722 dbus_type = dbus_message_iter_get_arg_type(&variantArray);
2723 if (DBUS_TYPE_OBJECT_PATH == dbus_message_iter_get_arg_type(&variantArray)) {
2725 dbus_message_iter_get_basic(&variantArray, &path);
2726 strcpy(objectPath, path);
2727 BTRCORELOG_DEBUG(
"object path is %s\n", objectPath);
2735 btrCore_BTGetDeviceInfo(apstlhBtIfce->pDBusConn, &lstBTDeviceInfo, objectPath);
2736 BTRCORELOG_DEBUG(
"device address is %s\n", lstBTDeviceInfo.pcAddress);
2737 BTRCORELOG_DEBUG(
"Received data is %s with length %lu\n", propertyValue, (
unsigned long)strlen(propertyValue));
2740 if (apstlhBtIfce->fpcBTLeGattPath) {
2741 apstlhBtIfce->fpcBTLeGattPath(aenIfceType, aenGattOp, path, lstBTDeviceInfo.pcAddress, enBTDevStPropChanged, propertyValue, apstlhBtIfce->pcBLePathUserData);
2745 case enBTLeGattOpReadValue: {
2746 int lDataLength = 0;
2748 dbus_message_iter_init(apDBusMsg, &lDBusReplyIter);
2749 if ((dbus_message_iter_get_arg_type(&lDBusReplyIter)) == DBUS_TYPE_INVALID) {
2750 BTRCORELOG_ERROR(
"DBUS_TYPE_INVALID\n");
2751 dbus_message_unref(apDBusMsg);
2754 dbus_message_iter_recurse(&lDBusReplyIter, &lDBusNextIter);
2755 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&lDBusNextIter)) {
2756 DBusMessageIter dictEntryIter;
2757 dbus_message_iter_recurse(&lDBusNextIter, &dictEntryIter);
2759 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&dictEntryIter)) {
2761 dbus_message_iter_get_basic(&dictEntryIter, &dbusObject);
2763 if (0 == strcmp(dbusObject,
"device")) {
2764 if (
true == dbus_message_iter_next(&dictEntryIter)) {
2765 DBusMessageIter variantArray;
2766 dbus_message_iter_recurse(&dictEntryIter, &variantArray);
2768 if (DBUS_TYPE_OBJECT_PATH == dbus_message_iter_get_arg_type(&variantArray)) {
2770 dbus_message_iter_get_basic(&variantArray, &path);
2771 strcpy(objectPath, path);
2772 BTRCORELOG_DEBUG(
"object path is %s\n", objectPath);
2780 btrCore_BTGetDeviceInfo(apstlhBtIfce->pDBusConn, &lstBTDeviceInfo, objectPath);
2781 BTRCORELOG_DEBUG(
"device address is %s\n", lstBTDeviceInfo.pcAddress);
2784 if (apstlhBtIfce->fpcBTLeGattPath) {
2785 apstlhBtIfce->fpcBTLeGattPath(aenIfceType, aenGattOp, path, lstBTDeviceInfo.pcAddress, enBTDevStPropChanged, propertyValue, apstlhBtIfce->pcBLePathUserData);
2787 BTRCORELOG_INFO(
"Property value is %s\n", propertyValue);
2788 lDataLength = strlen(propertyValue);
2789 lpLEGattOutput = (
void*)propertyValue;
2792 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
2793 dbus_message_append_args(lpDBusReply, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &lpLEGattOutput, lDataLength, DBUS_TYPE_INVALID);
2806 btrCore_BTRegisterLeAdvGetProp (
2807 DBusConnection* apDBusConn,
2808 DBusMessage* apDBusMsg,
2811 DBusMessage* lpDBusReply = NULL;
2812 DBusMessageIter lDBusMsgIterAdv;
2813 DBusMessageIter lDBusMsgIterDictAdv;
2816 lpDBusReply = dbus_message_new_method_return(apDBusMsg);
2818 dbus_message_iter_init_append(lpDBusReply, &lDBusMsgIterAdv);
2819 dbus_message_iter_open_container(&lDBusMsgIterAdv,
2821 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2822 DBUS_TYPE_STRING_AS_STRING
2823 DBUS_TYPE_VARIANT_AS_STRING
2824 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
2825 &lDBusMsgIterDictAdv);
2828 apstlhBtIfce->fpcBTLeAdvPath(NULL, &lpstCustomAdv, apstlhBtIfce->pcBLeAdvUserData);
2831 DBusMessageIter lDBusMsgIterDictStr, lDBusMsgIterVariant;
2832 char* lpcKey =
"Type";
2833 char* lui8Value =
"";
2834 int i32DBusType = DBUS_TYPE_STRING;
2837 lui8Value = lpstCustomAdv->AdvertisementType;
2838 BTRCORELOG_INFO(
"Advertisement type is %s\n", lui8Value);
2840 dbus_message_iter_open_container(&lDBusMsgIterDictAdv, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStr);
2841 dbus_message_iter_append_basic(&lDBusMsgIterDictStr, DBUS_TYPE_STRING, &lpcKey);
2842 dbus_message_iter_open_container(&lDBusMsgIterDictStr, DBUS_TYPE_VARIANT, (
char *)&i32DBusType, &lDBusMsgIterVariant);
2843 dbus_message_iter_append_basic(&lDBusMsgIterVariant, i32DBusType, &lui8Value);
2844 dbus_message_iter_close_container(&lDBusMsgIterDictStr, &lDBusMsgIterVariant);
2845 dbus_message_iter_close_container(&lDBusMsgIterDictAdv, &lDBusMsgIterDictStr);
2849 if (lpstCustomAdv->numServiceUUID > 0) {
2850 DBusMessageIter lDBusMsgIterDictStr, lDBusMsgIterVariant, lDBusMsgIterSubArray;
2851 char* key =
"ServiceUUIDs";
2852 int type = DBUS_TYPE_STRING;
2854 char array_type[5] =
"a";
2855 strncat(array_type, (
char*)&type,
sizeof(array_type) -
sizeof(type));
2857 dbus_message_iter_open_container(&lDBusMsgIterDictAdv, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStr);
2858 dbus_message_iter_append_basic(&lDBusMsgIterDictStr, DBUS_TYPE_STRING, &key);
2859 dbus_message_iter_open_container(&lDBusMsgIterDictStr, DBUS_TYPE_VARIANT, array_type, &lDBusMsgIterVariant);
2860 dbus_message_iter_open_container(&lDBusMsgIterVariant, DBUS_TYPE_ARRAY, (
char *)&type, &lDBusMsgIterSubArray);
2861 for (
int index = 0; index < lpstCustomAdv->numServiceUUID; index++) {
2862 const char *lppui8Props = lpstCustomAdv->ServiceUUID[index];
2863 BTRCORELOG_INFO(
"Service UUID is %s\n", lpstCustomAdv->ServiceUUID[index]);
2864 dbus_message_iter_append_basic(&lDBusMsgIterSubArray, type, &lppui8Props);
2866 dbus_message_iter_close_container(&lDBusMsgIterVariant, &lDBusMsgIterSubArray);
2867 dbus_message_iter_close_container(&lDBusMsgIterDictStr, &lDBusMsgIterVariant);
2868 dbus_message_iter_close_container(&lDBusMsgIterDictAdv, &lDBusMsgIterDictStr);
2873 if (lpstCustomAdv->numSolicitUUID > 0) {
2874 DBusMessageIter lDBusMsgIterDictStr, lDBusMsgIterVariant, lDBusMsgIterSubArray;
2875 char* key =
"SolicitUUIDs";
2876 int type = DBUS_TYPE_STRING;
2878 char array_type[5] =
"a";
2879 strncat(array_type, (
char*)&type,
sizeof(array_type) -
sizeof(type));
2881 dbus_message_iter_open_container(&lDBusMsgIterDictAdv, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStr);
2882 dbus_message_iter_append_basic(&lDBusMsgIterDictStr, DBUS_TYPE_STRING, &key);
2883 dbus_message_iter_open_container(&lDBusMsgIterDictStr, DBUS_TYPE_VARIANT, array_type, &lDBusMsgIterVariant);
2884 dbus_message_iter_open_container(&lDBusMsgIterVariant, DBUS_TYPE_ARRAY, (
char *)&type, &lDBusMsgIterSubArray);
2885 for (
int index = 0; index < lpstCustomAdv->numSolicitUUID; index++) {
2886 const char *lppui8Props = lpstCustomAdv->SolicitUUID[index];
2887 BTRCORELOG_INFO(
"Solicit UUID is %s\n", lpstCustomAdv->SolicitUUID[index]);
2888 dbus_message_iter_append_basic(&lDBusMsgIterSubArray, type, &lppui8Props);
2890 dbus_message_iter_close_container(&lDBusMsgIterVariant, &lDBusMsgIterSubArray);
2891 dbus_message_iter_close_container(&lDBusMsgIterDictStr, &lDBusMsgIterVariant);
2892 dbus_message_iter_close_container(&lDBusMsgIterDictAdv, &lDBusMsgIterDictStr);
2897 DBusMessageIter lDBusMsgIterDictStr, lDBusMsgIterArrStr, lDBusMsgIterDictVar, lDBusMsgIterArrVar, lDBusMsgIterVarDict, lDBusMsgIterSubArrStr;
2898 char* key =
"ManufacturerData";
2899 int lManfId = lpstCustomAdv->ManfData.ManfID;
2900 int type = DBUS_TYPE_BYTE;
2902 dbus_message_iter_open_container(&lDBusMsgIterDictAdv, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStr);
2903 dbus_message_iter_append_basic(&lDBusMsgIterDictStr, DBUS_TYPE_STRING, &key);
2904 dbus_message_iter_open_container(&lDBusMsgIterDictStr,
2906 DBUS_TYPE_ARRAY_AS_STRING
2907 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2908 DBUS_TYPE_UINT16_AS_STRING
2909 DBUS_TYPE_VARIANT_AS_STRING
2910 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
2911 &lDBusMsgIterDictVar);
2912 dbus_message_iter_open_container(&lDBusMsgIterDictVar,
2914 DBUS_TYPE_UINT16_AS_STRING
2915 DBUS_TYPE_VARIANT_AS_STRING,
2916 &lDBusMsgIterArrVar);
2917 dbus_message_iter_open_container(&lDBusMsgIterArrVar, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterVarDict);
2918 dbus_message_iter_append_basic(&lDBusMsgIterVarDict, DBUS_TYPE_UINT16, &lManfId);
2919 dbus_message_iter_open_container(&lDBusMsgIterVarDict,
2921 DBUS_TYPE_ARRAY_AS_STRING
2922 DBUS_TYPE_BYTE_AS_STRING,
2923 &lDBusMsgIterArrStr);
2924 dbus_message_iter_open_container(&lDBusMsgIterArrStr, DBUS_TYPE_ARRAY, (
char*)&type, &lDBusMsgIterSubArrStr);
2926 for (
int index = 0; index < lpstCustomAdv->ManfData.lenManfData; index++) {
2927 dbus_message_iter_append_basic(&lDBusMsgIterSubArrStr, DBUS_TYPE_BYTE, &lpstCustomAdv->ManfData.data[index]);
2929 dbus_message_iter_close_container(&lDBusMsgIterArrStr, &lDBusMsgIterSubArrStr);
2930 dbus_message_iter_close_container(&lDBusMsgIterVarDict, &lDBusMsgIterArrStr);
2931 dbus_message_iter_close_container(&lDBusMsgIterArrVar, &lDBusMsgIterVarDict);
2932 dbus_message_iter_close_container(&lDBusMsgIterDictVar, &lDBusMsgIterArrVar);
2933 dbus_message_iter_close_container(&lDBusMsgIterDictStr, &lDBusMsgIterDictVar);
2934 dbus_message_iter_close_container(&lDBusMsgIterDictAdv, &lDBusMsgIterDictStr);
2938 DBusMessageIter lDBusMsgIterDictBoolPri;
2939 DBusMessageIter lDBusMsgIterValue;
2940 char* key =
"IncludeTxPower";
2941 int type = DBUS_TYPE_BOOLEAN;
2942 dbus_bool_t lbTxPower = lpstCustomAdv->bTxPower;
2944 dbus_message_iter_open_container(&lDBusMsgIterDictAdv, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictBoolPri);
2945 dbus_message_iter_append_basic (&lDBusMsgIterDictBoolPri, DBUS_TYPE_STRING, &key);
2946 dbus_message_iter_open_container (&lDBusMsgIterDictBoolPri, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterValue);
2947 dbus_message_iter_append_basic (&lDBusMsgIterValue, type, &lbTxPower);
2948 dbus_message_iter_close_container (&lDBusMsgIterDictBoolPri, &lDBusMsgIterValue);
2949 dbus_message_iter_close_container (&lDBusMsgIterDictAdv, &lDBusMsgIterDictBoolPri);
2953 dbus_message_iter_close_container (&lDBusMsgIterAdv, &lDBusMsgIterDictAdv);
2955 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
2956 dbus_connection_flush(apDBusConn);
2958 dbus_message_unref(lpDBusReply);
2971 DBusConnection* lpDBusConn = NULL;
2974 dbus_error_init(&lDBusErr);
2975 lpDBusConn = dbus_bus_get(DBUS_BUS_SYSTEM, &lDBusErr);
2977 if (lpDBusConn == NULL) {
2978 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
2988 pstlhBtIfce->pDBusConn = NULL;
2990 pstlhBtIfce->pcBTAgentPath = NULL;
2991 pstlhBtIfce->pcBTDAdapterPath = NULL;
2992 pstlhBtIfce->pcBTDAdapterAddr = NULL;
2993 pstlhBtIfce->pcBTAdapterPath = NULL;
2994 pstlhBtIfce->pcDevTransportPath = NULL;
2996 pstlhBtIfce->pcBTOutPassCode = NULL;
2998 pstlhBtIfce->i32DoReject = 1;
3000 pstlhBtIfce->ui32cBConnAuthPassKey = 0;
3001 pstlhBtIfce->ui32DevLost = 0;
3003 pstlhBtIfce->ui32IsAdapterDiscovering = 0;
3005 memset(pstlhBtIfce->pcBTVersion,
'\0',
sizeof(
char) *
BT_MAX_STR_LEN);
3006 memset(pstlhBtIfce->pcDeviceCurrState,
'\0',
sizeof(
char) *
BT_MAX_STR_LEN);
3007 memset(pstlhBtIfce->pcLeDeviceCurrState,
'\0',
sizeof(
char) *
BT_MAX_STR_LEN);
3008 memset(pstlhBtIfce->pcLeDeviceAddress,
'\0',
sizeof(
char) *
BT_MAX_STR_LEN);
3009 memset(pstlhBtIfce->pcMediaCurrState,
'\0',
sizeof(
char) *
BT_MAX_STR_LEN);
3012 memset(&pstlhBtIfce->lstBTDeviceInfo, 0,
sizeof(
stBTDeviceInfo));
3013 memset(&pstlhBtIfce->lstBTMediaInfo, 0,
sizeof(
stBTMediaInfo));
3019 strncpy(pstlhBtIfce->pcDeviceCurrState,
"disconnected",
BT_MAX_STR_LEN - 1);
3020 strncpy(pstlhBtIfce->pcLeDeviceCurrState,
"disconnected",
BT_MAX_STR_LEN - 1);
3021 strncpy(pstlhBtIfce->pcLeDeviceAddress,
"none",
BT_MAX_STR_LEN - 1);
3022 strncpy(pstlhBtIfce->pcMediaCurrState,
"none",
BT_MAX_STR_LEN - 1);
3024 pstlhBtIfce->pcBAdapterStatusUserData = NULL;
3025 pstlhBtIfce->pcBDevStatusUserData = NULL;
3026 pstlhBtIfce->pcBMediaStatusUserData = NULL;
3027 pstlhBtIfce->pcBNegMediaUserData = NULL;
3028 pstlhBtIfce->pcBTransPathMediaUserData = NULL;
3029 pstlhBtIfce->pcBMediaPlayerPathUserData = NULL;
3030 pstlhBtIfce->pcBConnIntimUserData = NULL;
3031 pstlhBtIfce->pcBConnAuthUserData = NULL;
3032 pstlhBtIfce->pcBLePathUserData = NULL;
3034 pstlhBtIfce->fpcBAdapterStatusUpdate = NULL;
3035 pstlhBtIfce->fpcBDevStatusUpdate = NULL;
3036 pstlhBtIfce->fpcBMediaStatusUpdate = NULL;
3037 pstlhBtIfce->fpcBNegotiateMedia = NULL;
3038 pstlhBtIfce->fpcBTransportPathMedia = NULL;
3039 pstlhBtIfce->fpcBTMediaPlayerPath = NULL;
3040 pstlhBtIfce->fpcBConnectionIntimation = NULL;
3041 pstlhBtIfce->fpcBConnectionAuthentication = NULL;
3042 pstlhBtIfce->fpcBTLeGattPath = NULL;
3045 BTRCORELOG_INFO (
"DBus Debug DBus Connection Name %s\n", dbus_bus_get_unique_name (lpDBusConn));
3046 pstlhBtIfce->pDBusConn = lpDBusConn;
3049 dbus_bus_add_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_OBJECT_MANAGER
"',member='InterfacesAdded'", NULL);
3050 dbus_bus_add_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_OBJECT_MANAGER
"',member='InterfacesRemoved'", NULL);
3051 dbus_bus_add_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_ADAPTER_PATH
"'", NULL);
3052 dbus_bus_add_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_DEVICE_PATH
"'", NULL);
3053 dbus_bus_add_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH
"'", NULL);
3054 dbus_bus_add_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_MEDIA_CTRL_PATH
"'", NULL);
3055 dbus_bus_add_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH
"'", NULL);
3056 dbus_bus_add_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_MEDIA_ITEM_PATH
"'", NULL);
3057 dbus_bus_add_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_MEDIA_FOLDER_PATH
"'", NULL);
3058 dbus_bus_add_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_LE_ADV_PATH
"'", NULL);
3059 dbus_bus_add_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_GATT_SERVICE_PATH
"'", NULL);
3060 dbus_bus_add_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_GATT_CHAR_PATH
"'", NULL);
3061 dbus_bus_add_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH
"'", NULL);
3064 if (!dbus_connection_add_filter(pstlhBtIfce->pDBusConn, btrCore_BTDBusConnectionFilterCb, pstlhBtIfce, NULL)) {
3065 BTRCORELOG_ERROR (
"Can't add signal filter - BtrCore_BTInitGetConnection\n");
3070 return (
void*)pstlhBtIfce;
3083 dbus_connection_remove_filter(pstlhBtIfce->pDBusConn, btrCore_BTDBusConnectionFilterCb, pstlhBtIfce);
3085 dbus_bus_remove_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH
"'", NULL);
3086 dbus_bus_remove_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_GATT_CHAR_PATH
"'", NULL);
3087 dbus_bus_remove_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_GATT_SERVICE_PATH
"'", NULL);
3088 dbus_bus_remove_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_LE_ADV_PATH
"'", NULL);
3089 dbus_bus_remove_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_MEDIA_FOLDER_PATH
"'", NULL);
3090 dbus_bus_remove_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_MEDIA_ITEM_PATH
"'", NULL);
3091 dbus_bus_remove_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH
"'", NULL);
3092 dbus_bus_remove_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_MEDIA_CTRL_PATH
"'", NULL);
3093 dbus_bus_remove_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH
"'", NULL);
3094 dbus_bus_remove_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_DEVICE_PATH
"'", NULL);
3095 dbus_bus_remove_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_PROPERTIES
"',member='PropertiesChanged'"",arg0='" BT_DBUS_BLUEZ_ADAPTER_PATH
"'", NULL);
3096 dbus_bus_remove_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_OBJECT_MANAGER
"',member='InterfacesRemoved'", NULL);
3097 dbus_bus_remove_match(pstlhBtIfce->pDBusConn,
"type='signal',sender='" BT_DBUS_BLUEZ_PATH
"',interface='" DBUS_INTERFACE_OBJECT_MANAGER
"',member='InterfacesAdded'", NULL);
3099 if (pstlhBtIfce->pcBTAgentPath) {
3100 free(pstlhBtIfce->pcBTAgentPath);
3101 pstlhBtIfce->pcBTAgentPath = NULL;
3104 if (pstlhBtIfce->pcBTDAdapterAddr) {
3105 free(pstlhBtIfce->pcBTDAdapterAddr);
3106 pstlhBtIfce->pcBTDAdapterAddr = NULL;
3109 if (pstlhBtIfce->pcBTDAdapterPath) {
3110 free(pstlhBtIfce->pcBTDAdapterPath);
3111 pstlhBtIfce->pcBTDAdapterPath = NULL;
3114 if (pstlhBtIfce->pcBTAdapterPath) {
3115 free(pstlhBtIfce->pcBTAdapterPath);
3116 pstlhBtIfce->pcBTAdapterPath = NULL;
3120 pstlhBtIfce->pcBLePathUserData = NULL;
3121 pstlhBtIfce->pcBConnAuthUserData = NULL;
3122 pstlhBtIfce->pcBConnIntimUserData = NULL;
3123 pstlhBtIfce->pcBMediaPlayerPathUserData = NULL;
3124 pstlhBtIfce->pcBTransPathMediaUserData = NULL;
3125 pstlhBtIfce->pcBNegMediaUserData = NULL;
3126 pstlhBtIfce->pcBMediaStatusUserData = NULL;
3127 pstlhBtIfce->pcBDevStatusUserData = NULL;
3128 pstlhBtIfce->pcBAdapterStatusUserData = NULL;
3131 pstlhBtIfce->fpcBTLeGattPath = NULL;
3132 pstlhBtIfce->fpcBConnectionAuthentication = NULL;
3133 pstlhBtIfce->fpcBConnectionIntimation = NULL;
3134 pstlhBtIfce->fpcBTMediaPlayerPath = NULL;
3135 pstlhBtIfce->fpcBTransportPathMedia = NULL;
3136 pstlhBtIfce->fpcBNegotiateMedia = NULL;
3137 pstlhBtIfce->fpcBMediaStatusUpdate = NULL;
3138 pstlhBtIfce->fpcBDevStatusUpdate = NULL;
3139 pstlhBtIfce->fpcBAdapterStatusUpdate = NULL;
3142 pstlhBtIfce->ui32IsAdapterDiscovering = 0;
3143 pstlhBtIfce->ui32DevLost = 0;
3144 pstlhBtIfce->ui32cBConnAuthPassKey = 0;
3145 pstlhBtIfce->i32DoReject = 0;
3148 pstlhBtIfce->pDBusConn = NULL;
3169 snprintf(lDefaultBTPath,
sizeof(lDefaultBTPath),
"/org/bluez/agent_%d", getpid());
3171 if (pstlhBtIfce->pcBTAgentPath) {
3172 free(pstlhBtIfce->pcBTAgentPath);
3173 pstlhBtIfce->pcBTAgentPath = NULL;
3176 pstlhBtIfce->pcBTAgentPath = strdup(lDefaultBTPath);
3177 BTRCORELOG_INFO (
"Agent Path: %s\n", pstlhBtIfce->pcBTAgentPath);
3178 return pstlhBtIfce->pcBTAgentPath;
3192 if (pstlhBtIfce->pcBTAgentPath) {
3193 free(pstlhBtIfce->pcBTAgentPath);
3194 pstlhBtIfce->pcBTAgentPath = NULL;
3203 void* apstBtIfceHdl,
3204 const char* apBtAdapter,
3205 const char* apBtAgentPath,
3206 const char* capabilities
3209 DBusMessage* lpDBusMsg = NULL;
3210 DBusMessage* lpDBusReply = NULL;
3212 dbus_bool_t lDBusOp;
3217 dbus_error_init(&lDBusErr);
3218 lDBusOp = dbus_connection_try_register_object_path(pstlhBtIfce->pDBusConn, apBtAgentPath, &gDBusAgentVTable, pstlhBtIfce, &lDBusErr);
3220 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
3221 BTRCORELOG_ERROR (
"Error registering object path for agent - %s\n", apBtAgentPath);
3223 if (strcmp(lDBusErr.name, DBUS_ERROR_OBJECT_PATH_IN_USE) != 0)
3227 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
3229 BT_DBUS_BLUEZ_AGENT_MGR_PATH,
3232 BTRCORELOG_ERROR (
"Error allocating new method call\n");
3236 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_OBJECT_PATH, &apBtAgentPath, DBUS_TYPE_STRING, &capabilities, DBUS_TYPE_INVALID);
3239 dbus_error_init(&lDBusErr);
3240 lpDBusReply = dbus_connection_send_with_reply_and_block(pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
3241 dbus_message_unref(lpDBusMsg);
3244 BTRCORELOG_ERROR (
"Unable to register agent\n");
3245 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
3249 dbus_message_unref(lpDBusReply);
3251 dbus_connection_flush(pstlhBtIfce->pDBusConn);
3253 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
3255 BT_DBUS_BLUEZ_AGENT_MGR_PATH,
3256 "RequestDefaultAgent");
3258 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
3262 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_OBJECT_PATH, &apBtAgentPath, DBUS_TYPE_INVALID);
3265 dbus_error_init(&lDBusErr);
3266 lpDBusReply = dbus_connection_send_with_reply_and_block(pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
3267 dbus_message_unref(lpDBusMsg);
3270 BTRCORELOG_ERROR (
"Can't unregister agent\n");
3271 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
3275 dbus_message_unref(lpDBusReply);
3277 dbus_connection_flush(pstlhBtIfce->pDBusConn);
3285 void* apstBtIfceHdl,
3286 const char* apBtAdapter,
3287 const char* apBtAgentPath
3290 DBusMessage* lpDBusMsg = NULL;
3291 DBusMessage* lpDBusReply = NULL;
3298 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
3300 BT_DBUS_BLUEZ_AGENT_MGR_PATH,
3303 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
3307 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_OBJECT_PATH, &apBtAgentPath, DBUS_TYPE_INVALID);
3310 dbus_error_init(&lDBusErr);
3311 lpDBusReply = dbus_connection_send_with_reply_and_block(pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
3312 dbus_message_unref(lpDBusMsg);
3315 BTRCORELOG_ERROR (
"Can't unregister agent\n");
3316 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
3320 dbus_message_unref(lpDBusReply);
3322 dbus_connection_flush(pstlhBtIfce->pDBusConn);
3324 if (!dbus_connection_unregister_object_path(pstlhBtIfce->pDBusConn, apBtAgentPath)) {
3325 BTRCORELOG_ERROR (
"Error unregistering object path for agent\n");
3332 if (!strncmp(pstlhBtIfce->pcBTVersion, BT_BLUEZ_VERSION_5_54, strlen(BT_BLUEZ_VERSION_5_54)) || !strncmp(pstlhBtIfce->pcBTVersion, BT_BLUEZ_VERSION_5_48, strlen(BT_BLUEZ_VERSION_5_48)) )
3336 lunBtOpAdapProp.enBtAdapterProp = enBTAdPropPairable;
3337 if (
BtrCore_BTSetProp(apstBtIfceHdl, apBtAdapter, enBTAdapter, lunBtOpAdapProp, &isPairable)) {
3338 BTRCORELOG_ERROR (
"Set Adapter Property enBTAdPropPairable - FAILED\n");
3349 void* apstBtIfceHdl,
3350 unsigned int* apBtNumAdapters,
3364 DBusMessage* lpDBusReply = NULL;
3365 DBusMessageIter rootIter;
3366 bool adapterFound = FALSE;
3376 lpDBusReply = btrCore_BTSendMethodCall(pstlhBtIfce->pDBusConn,
"/", DBUS_INTERFACE_OBJECT_MANAGER,
"GetManagedObjects");
3378 BTRCORELOG_ERROR (
"org.bluez.Manager.ListAdapters returned an error\n");
3390 if (dbus_message_iter_init(lpDBusReply, &rootIter) &&
3391 DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&rootIter)) {
3393 DBusMessageIter arrayElementIter;
3394 dbus_message_iter_recurse(&rootIter, &arrayElementIter);
3396 while (!adapterFound) {
3397 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&arrayElementIter)) {
3399 DBusMessageIter dictEntryIter;
3400 dbus_message_iter_recurse(&arrayElementIter,&dictEntryIter );
3402 if (DBUS_TYPE_OBJECT_PATH == dbus_message_iter_get_arg_type(&dictEntryIter)) {
3403 dbus_message_iter_get_basic(&dictEntryIter, &adapter_path);
3408 dbus_message_iter_next(&dictEntryIter);
3409 if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&dictEntryIter)) {
3410 DBusMessageIter innerArrayIter;
3411 dbus_message_iter_recurse(&dictEntryIter, &innerArrayIter);
3414 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&innerArrayIter)) {
3415 DBusMessageIter innerDictEntryIter;
3416 dbus_message_iter_recurse(&innerArrayIter,&innerDictEntryIter );
3418 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter)) {
3420 dbus_message_iter_get_basic(&innerDictEntryIter, &dbusObject);
3424 if (strcmp(dbusObject, BT_DBUS_BLUEZ_ADAPTER_PATH) == 0) {
3435 dbus_message_iter_next(&innerDictEntryIter);
3436 if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&innerDictEntryIter)) {
3437 DBusMessageIter innerArrayIter2;
3438 dbus_message_iter_recurse(&innerDictEntryIter, &innerArrayIter2);
3440 while (dbus_message_iter_has_next(&innerArrayIter2)) {
3442 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&innerArrayIter2)) {
3443 DBusMessageIter innerDictEntryIter2;
3444 dbus_message_iter_recurse(&innerArrayIter2,&innerDictEntryIter2);
3446 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter2)) {
3447 dbus_message_iter_get_basic(&innerDictEntryIter2, &dbusObject2);
3451 dbus_message_iter_next(&innerDictEntryIter2);
3452 DBusMessageIter innerDictEntryIter3;
3455 dbus_message_iter_recurse(&innerDictEntryIter2,&innerDictEntryIter3);
3456 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter3)) {
3457 dbus_message_iter_get_basic(&innerDictEntryIter3, &dbusObject3);
3462 else if (DBUS_TYPE_BOOLEAN == dbus_message_iter_get_arg_type(&innerDictEntryIter3)) {
3463 bool *device_prop = FALSE;
3464 dbus_message_iter_get_basic(&innerDictEntryIter3, &device_prop);
3468 if (!dbus_message_iter_has_next(&innerArrayIter2)) {
3472 dbus_message_iter_next(&innerArrayIter2);
3478 if (!dbus_message_iter_has_next(&innerArrayIter)) {
3482 dbus_message_iter_next(&innerArrayIter);
3487 if (!dbus_message_iter_has_next(&arrayElementIter)) {
3491 dbus_message_iter_next(&arrayElementIter);
3498 if (apBtNumAdapters && apcArrBtAdapterPath) {
3499 *apBtNumAdapters = num;
3501 for (c = 0; c < num; c++) {
3502 if (apcArrBtAdapterPath[c]) {
3503 if (*(apcArrBtAdapterPath[c]) ==
'\0') {
3504 BTRCORELOG_DEBUG (
"Adapter Path %d is: %s\n", c, &paths[c][0]);
3509 BTRCORELOG_DEBUG (
"Adapter Path %d is: %s\n", c, &paths[c][0]);
3510 BTRCORELOG_DEBUG (
"Existing Adapter Path is: %s\n", apcArrBtAdapterPath[c]);
3517 dbus_message_unref(lpDBusReply);
3525 void* apstBtIfceHdl,
3526 const char* apBtAdapter
3529 char* pui8DefAdapterPath = NULL;
3530 char* pui8AdapterPath1 =
"/org/bluez/hci0";
3531 char* pui8AdapterPath2 =
"/org/bluez/hci1";
3532 char* pui8AdapterPath3 =
"/org/bluez/hci2";
3542 if (!pstlhBtIfce->pcBTAdapterPath && ((pui8DefAdapterPath = btrCore_BTGetDefaultAdapterPath(pstlhBtIfce)) != NULL)) {
3543 BTRCORELOG_WARN (
"Got Default Adapter Path is : %s - %p\n", pui8DefAdapterPath, pui8DefAdapterPath);
3544 pstlhBtIfce->pcBTAdapterPath = strndup(pui8DefAdapterPath, strlen(pui8DefAdapterPath));
3547 else if (strcmp(apBtAdapter, bt1) == 0) {
3548 if (!pstlhBtIfce->pcBTAdapterPath) {
3549 pstlhBtIfce->pcBTAdapterPath = strndup(pui8AdapterPath1, strlen(pui8AdapterPath1));
3552 else if (strcmp(apBtAdapter, bt2) == 0) {
3553 if (!pstlhBtIfce->pcBTAdapterPath) {
3554 pstlhBtIfce->pcBTAdapterPath = strndup(pui8AdapterPath2, strlen(pui8AdapterPath2));
3557 else if (strcmp(apBtAdapter, bt3) == 0) {
3558 if (!pstlhBtIfce->pcBTAdapterPath) {
3559 pstlhBtIfce->pcBTAdapterPath = strndup(pui8AdapterPath3, strlen(pui8AdapterPath3));
3563 if (!pstlhBtIfce->pcBTAdapterPath && ((pui8DefAdapterPath = btrCore_BTGetDefaultAdapterPath(pstlhBtIfce)) != NULL)) {
3564 pstlhBtIfce->pcBTAdapterPath = strndup(pui8DefAdapterPath, strlen(pui8DefAdapterPath));
3569 BTRCORELOG_WARN (
"Adapter Path is : %s - %p\n", pstlhBtIfce->pcBTAdapterPath, pstlhBtIfce->pcBTAdapterPath);
3570 return pstlhBtIfce->pcBTAdapterPath;
3576 void* apstBtIfceHdl,
3577 const char* apBtAdapter
3586 btrCore_BTReleaseDefaultAdapterPath(pstlhBtIfce);
3589 if (pstlhBtIfce->pcBTAdapterPath) {
3591 BTRCORELOG_WARN (
"Adapter Path is : %s - %p\n", pstlhBtIfce->pcBTAdapterPath, pstlhBtIfce->pcBTAdapterPath);
3592 if (pstlhBtIfce->pcBTAdapterPath != apBtAdapter) {
3593 BTRCORELOG_ERROR (
"ERROR: Looks like Adapter path has been changed by User\n");
3596 free(pstlhBtIfce->pcBTAdapterPath);
3597 pstlhBtIfce->pcBTAdapterPath = NULL;
3600 BTRCORELOG_WARN (
"Freed Adapter\n");
3608 void* apstBtIfceHdl,
3609 char* apBtOutIfceName,
3610 char* apBtOutVersion
3613 FILE* lfpVersion = NULL;
3616 if (!apstBtIfceHdl || !apBtOutIfceName || !apBtOutVersion)
3626 lfpVersion = popen(
"/usr/lib/bluez5/bluetooth/bluetoothd --version",
"r");
3627 if ((lfpVersion == NULL)) {
3628 BTRCORELOG_ERROR (
"Failed to run Version command\n");
3629 strncpy(lcpVersion,
"5.XXX", strlen(
"5.XXX") + 1);
3633 if (fgets(lcpVersion,
sizeof(lcpVersion)-1, lfpVersion) == NULL) {
3634 BTRCORELOG_ERROR (
"Failed to Valid Version\n");
3635 strncpy(lcpVersion,
"5.XXX",
sizeof(lcpVersion));
3636 lcpVersion[
sizeof(lcpVersion) - 1] =
'\0';
3638 }
while (strstr(lcpVersion,
"breakpad") || strstr(lcpVersion,
"Breakpad"));
3644 strncpy(apBtOutIfceName,
"Bluez", strlen(
"Bluez") + 1);
3645 strncpy(apBtOutVersion, lcpVersion, strlen(lcpVersion) + 1);
3646 strncpy(pstlhBtIfce->pcBTVersion, lcpVersion, strlen(lcpVersion));
3648 BTRCORELOG_WARN (
"Bluez Version - %s\n", apBtOutVersion);
3656 void* apstBtIfceHdl,
3657 const char* apcBtOpIfcePath,
3665 DBusMessage* lpDBusMsg = NULL;
3666 DBusMessage* lpDBusReply = NULL;
3667 DBusPendingCall* lpDBusPendC = NULL;
3668 DBusMessageIter arg_i;
3669 DBusMessageIter element_i;
3670 DBusMessageIter variant_i;
3673 const char* pParsedKey = NULL;
3674 const char* pParsedValueString = NULL;
3675 int parsedValueNumber = 0;
3676 unsigned int parsedValueUnsignedNumber = 0;
3677 unsigned short parsedValueUnsignedShort = 0;
3679 const char* lDBusKey = NULL;
3680 int lDBusType = DBUS_TYPE_INVALID;
3681 int i32StoreDefAdpAddr = 0;
3683 const char* pInterface = NULL;
3684 const char* pAdapterInterface = BT_DBUS_BLUEZ_ADAPTER_PATH;
3685 const char* pDeviceInterface = BT_DBUS_BLUEZ_DEVICE_PATH;
3686 const char* pMediaTransInterface = BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH;
3687 const char* pGattServiceInterface = BT_DBUS_BLUEZ_GATT_SERVICE_PATH;
3688 const char* pGattCharInterface = BT_DBUS_BLUEZ_GATT_CHAR_PATH;
3689 const char* pGattDescInterface = BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH;
3695 if ((!apcBtOpIfcePath) || (!apvVal)) {
3696 BTRCORELOG_ERROR (
"enBTRCoreInvalidArg - enBTRCoreInitFailure\n");
3701 switch (aenBtOpIfceType) {
3703 pInterface = pAdapterInterface;
3704 switch (aunBtOpIfceProp.enBtAdapterProp) {
3705 case enBTAdPropName:
3706 lDBusType = DBUS_TYPE_STRING;
3709 case enBTAdPropAddress:
3710 lDBusType = DBUS_TYPE_STRING;
3711 lDBusKey =
"Address";
3712 if (!strncmp(apcBtOpIfcePath, pstlhBtIfce->pcBTDAdapterPath, strlen(pstlhBtIfce->pcBTDAdapterPath))) {
3713 i32StoreDefAdpAddr = 1;
3716 case enBTAdPropPowered:
3717 lDBusType = DBUS_TYPE_BOOLEAN;
3718 lDBusKey =
"Powered";
3720 case enBTAdPropDiscoverable:
3721 lDBusType = DBUS_TYPE_BOOLEAN;
3722 lDBusKey =
"Discoverable";
3724 case enBTAdPropDiscoverableTimeOut:
3725 lDBusType = DBUS_TYPE_UINT32;
3726 lDBusKey =
"DiscoverableTimeout";
3728 case enBTAdPropPairable:
3729 lDBusType = DBUS_TYPE_BOOLEAN;
3730 lDBusKey =
"Pairable";
3732 case enBTAdPropUnknown:
3734 BTRCORELOG_ERROR (
"Invalid Adapter Property\n");
3739 pInterface = pDeviceInterface;
3740 switch (aunBtOpIfceProp.enBtDeviceProp) {
3741 case enBTDevPropPaired:
3742 lDBusType = DBUS_TYPE_BOOLEAN;
3743 lDBusKey =
"Paired";
3745 case enBTDevPropConnected:
3746 lDBusType = DBUS_TYPE_BOOLEAN;
3747 lDBusKey =
"Connected";
3749 case enBTDevPropVendor:
3750 lDBusType = DBUS_TYPE_UINT16;
3751 lDBusKey =
"Vendor";
3753 case enBTDevPropSrvRslvd:
3754 lDBusType = DBUS_TYPE_BOOLEAN;
3755 lDBusKey =
"ServicesResolved";
3757 case enBTDevPropUnknown:
3759 BTRCORELOG_ERROR (
"Invalid Device Property\n");
3763 case enBTMediaTransport:
3764 pInterface = pMediaTransInterface;
3765 switch (aunBtOpIfceProp.enBtMediaTransportProp) {
3766 case enBTMedTPropDelay:
3767 lDBusType = DBUS_TYPE_UINT16;
3770 case enBTMedTPropVol:
3771 lDBusType = DBUS_TYPE_UINT16;
3772 lDBusKey =
"Volume";
3774 case enBTMedTPropState:
3775 lDBusType = DBUS_TYPE_STRING;
3778 case enBTMedTPropUnknown:
3780 BTRCORELOG_ERROR (
"Invalid MediaTransport Property\n");
3784 case enBTGattService:
3785 pInterface = pGattServiceInterface;
3786 switch (aunBtOpIfceProp.enBtGattServiceProp) {
3787 case enBTGattSPropUUID:
3788 lDBusType = DBUS_TYPE_STRING;
3791 case enBTGattSPropPrimary:
3792 lDBusType = DBUS_TYPE_BOOLEAN;
3793 lDBusKey =
"Primary";
3795 case enBTGattSPropDevice:
3796 lDBusType = DBUS_TYPE_OBJECT_PATH;
3797 lDBusKey =
"Device";
3799 case enBTGattSPropUnknown:
3801 BTRCORELOG_ERROR (
"Invalid GattService Property\n");
3805 case enBTGattCharacteristic:
3806 pInterface = pGattCharInterface;
3807 switch (aunBtOpIfceProp.enBtGattCharProp) {
3808 case enBTGattCPropUUID:
3809 lDBusType = DBUS_TYPE_STRING;
3812 case enBTGattCPropService:
3813 lDBusType = DBUS_TYPE_OBJECT_PATH;
3814 lDBusKey =
"Service";
3816 case enBTGattCPropValue:
3817 lDBusType = DBUS_TYPE_ARRAY;
3820 case enBTGattCPropNotifying:
3821 lDBusType = DBUS_TYPE_BOOLEAN;
3822 lDBusKey =
"Notifying";
3824 case enBTGattCPropFlags:
3825 lDBusType = DBUS_TYPE_ARRAY;
3828 case enBTGattCPropUnknown:
3830 BTRCORELOG_ERROR (
"Invalid GattCharacteristic Property\n");
3834 case enBTGattDescriptor:
3835 pInterface = pGattDescInterface;
3836 switch (aunBtOpIfceProp.enBtGattDescProp) {
3837 case enBTGattDPropUUID:
3838 lDBusType = DBUS_TYPE_STRING;
3841 case enBTGattDPropCharacteristic:
3842 lDBusType = DBUS_TYPE_OBJECT_PATH;
3843 lDBusKey =
"Characteristic";
3845 case enBTGattDPropValue:
3846 lDBusType = DBUS_TYPE_ARRAY;
3849 case enBTGattDPropFlags:
3850 lDBusType = DBUS_TYPE_ARRAY;
3853 case enBTGattDPropUnknown:
3855 BTRCORELOG_ERROR (
"Invalid GattDescriptor Property\n");
3861 BTRCORELOG_ERROR (
"Invalid Operational Interface\n");
3866 if (!lDBusKey || (lDBusType == DBUS_TYPE_INVALID)) {
3867 BTRCORELOG_ERROR (
"Invalid Interface Property\n");
3872 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
3874 DBUS_INTERFACE_PROPERTIES,
3877 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_STRING, &pInterface, DBUS_TYPE_INVALID);
3879 dbus_error_init(&lDBusErr);
3880 if (!dbus_connection_send_with_reply(pstlhBtIfce->pDBusConn, lpDBusMsg, &lpDBusPendC, -1)) {
3881 BTRCORELOG_ERROR (
"failed to send message\n");
3885 dbus_connection_flush(pstlhBtIfce->pDBusConn);
3889 BTRCORELOG_ERROR (
"%s.GetProperties returned an error\n", pInterface);
3891 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
3892 dbus_message_unref(lpDBusMsg);
3896 dbus_pending_call_block(lpDBusPendC);
3897 lpDBusReply = dbus_pending_call_steal_reply(lpDBusPendC);
3901 BTRCORELOG_ERROR (
"%s.GetProperties returned an error\n", pInterface);
3903 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
3904 dbus_pending_call_unref(lpDBusPendC);
3905 dbus_message_unref(lpDBusMsg);
3910 if (!dbus_message_iter_init(lpDBusReply, &arg_i)) {
3911 BTRCORELOG_ERROR (
"GetProperties lpDBusReply has no arguments.\n");
3914 else if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_ARRAY) {
3915 BTRCORELOG_ERROR (
"GetProperties argument is not an array.\n");
3919 dbus_message_iter_recurse(&arg_i, &element_i);
3920 while (dbus_message_iter_get_arg_type(&element_i) != DBUS_TYPE_INVALID) {
3921 if (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) {
3922 DBusMessageIter dict_i;
3923 dbus_message_iter_recurse(&element_i, &dict_i);
3924 dbus_message_iter_get_basic(&dict_i, &pParsedKey);
3926 if ((pParsedKey) && (strcmp (pParsedKey, lDBusKey) == 0)) {
3927 dbus_message_iter_next(&dict_i);
3928 dbus_message_iter_recurse(&dict_i, &variant_i);
3929 if (lDBusType == DBUS_TYPE_STRING) {
3930 dbus_message_iter_get_basic(&variant_i, &pParsedValueString);
3934 if (i32StoreDefAdpAddr && !pstlhBtIfce->pcBTDAdapterAddr) {
3938 else if (lDBusType == DBUS_TYPE_UINT16) {
3939 unsigned short* ptr = (
unsigned short*) apvVal;
3940 dbus_message_iter_get_basic(&variant_i, &parsedValueUnsignedShort);
3942 *ptr = parsedValueUnsignedShort;
3944 else if (lDBusType == DBUS_TYPE_UINT32) {
3945 unsigned int* ptr = (
unsigned int*) apvVal;
3946 dbus_message_iter_get_basic(&variant_i, &parsedValueUnsignedNumber);
3948 *ptr = parsedValueUnsignedNumber;
3950 else if (lDBusType == DBUS_TYPE_OBJECT_PATH) {
3951 dbus_message_iter_get_basic(&variant_i, &pParsedValueString);
3955 else if (lDBusType == DBUS_TYPE_ARRAY) {
3956 DBusMessageIter variantArray;
3957 dbus_message_iter_recurse(&variant_i, &variantArray);
3958 int lType = dbus_message_iter_get_arg_type(&variantArray);
3961 if (lType == DBUS_TYPE_STRING) {
3964 while (dbus_message_iter_get_arg_type(&variantArray) != DBUS_TYPE_INVALID) {
3966 dbus_message_iter_get_basic(&variantArray, &pParsedValueString);
3969 if (!dbus_message_iter_next(&variantArray)) {
3974 if (lType == DBUS_TYPE_BYTE) {
3975 unsigned char chr =
'\0';
3976 char hex[] =
"0123456789abcdef";
3977 char *byteStream = (
char*)apvVal;
3979 while (dbus_message_iter_get_arg_type(&variantArray) != DBUS_TYPE_INVALID) {
3981 dbus_message_iter_get_basic(&variantArray, &chr);
3982 byteStream[lIndex++] = hex[chr >> 4];
3983 byteStream[lIndex++] = hex[chr & 0x0F];
3985 if (!dbus_message_iter_next(&variantArray)) {
3989 byteStream[lIndex] =
'\0';
3993 int* ptr = (
int*) apvVal;
3994 dbus_message_iter_get_basic(&variant_i, &parsedValueNumber);
3996 *ptr = parsedValueNumber;
4003 if (!dbus_message_iter_next(&element_i))
4008 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
4010 dbus_message_unref(lpDBusReply);
4011 dbus_pending_call_unref(lpDBusPendC);
4012 dbus_message_unref(lpDBusMsg);
4026 void* apstBtIfceHdl,
4027 const char* apcBtOpIfcePath,
4033 DBusMessage* lpDBusMsg = NULL;
4034 DBusMessage* lpDBusReply = NULL;
4035 DBusMessageIter lDBusMsgIter;
4036 DBusMessageIter lDBusMsgIterValue;
4039 const char* lDBusTypeAsString;
4041 const char* lDBusKey = NULL;
4042 int lDBusType = DBUS_TYPE_INVALID;
4044 const char* pInterface = NULL;
4045 const char* pAdapterInterface = BT_DBUS_BLUEZ_ADAPTER_PATH;
4046 const char* pDeviceInterface = BT_DBUS_BLUEZ_DEVICE_PATH;
4047 const char* pMediaTransInterface= BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH;
4048 const char* pGattCharInterface = BT_DBUS_BLUEZ_GATT_CHAR_PATH;
4054 switch (aenBtOpIfceType) {
4056 pInterface = pAdapterInterface;
4057 switch (aunBtOpIfceProp.enBtAdapterProp) {
4058 case enBTAdPropName:
4059 lDBusType = DBUS_TYPE_STRING;
4062 case enBTAdPropAddress:
4063 lDBusType = DBUS_TYPE_STRING;
4064 lDBusKey =
"Address";
4066 case enBTAdPropPowered:
4067 lDBusType = DBUS_TYPE_BOOLEAN;
4068 lDBusKey =
"Powered";
4070 case enBTAdPropDiscoverable:
4071 lDBusType = DBUS_TYPE_BOOLEAN;
4072 lDBusKey =
"Discoverable";
4074 case enBTAdPropDiscoverableTimeOut:
4075 lDBusType = DBUS_TYPE_UINT32;
4076 lDBusKey =
"DiscoverableTimeout";
4078 case enBTAdPropPairable:
4079 lDBusType = DBUS_TYPE_BOOLEAN;
4080 lDBusKey =
"Pairable";
4082 case enBTAdPropUnknown:
4084 BTRCORELOG_ERROR (
"Invalid Adapter Property\n");
4089 pInterface = pDeviceInterface;
4090 switch (aunBtOpIfceProp.enBtDeviceProp) {
4091 case enBTDevPropPaired:
4092 lDBusType = DBUS_TYPE_BOOLEAN;
4093 lDBusKey =
"Paired";
4095 case enBTDevPropConnected:
4096 lDBusType = DBUS_TYPE_BOOLEAN;
4097 lDBusKey =
"Connected";
4099 case enBTDevPropVendor:
4100 lDBusType = DBUS_TYPE_UINT16;
4101 lDBusKey =
"Vendor";
4103 case enBTDevPropUnknown:
4105 BTRCORELOG_ERROR (
"Invalid Device Property\n");
4109 case enBTMediaTransport:
4110 pInterface = pMediaTransInterface;
4111 switch (aunBtOpIfceProp.enBtMediaTransportProp) {
4112 case enBTMedTPropDelay:
4113 lDBusType = DBUS_TYPE_UINT16;
4116 case enBTMedTPropVol:
4117 lDBusType = DBUS_TYPE_UINT16;
4118 lDBusKey =
"Volume";
4120 case enBTMedTPropState:
4121 case enBTMedTPropUnknown:
4123 BTRCORELOG_ERROR (
"Invalid MediaTransport Property\n");
4127 case enBTGattCharacteristic:
4128 pInterface = pGattCharInterface;
4129 switch (aunBtOpIfceProp.enBtGattCharProp) {
4130 case enBTGattCPropUUID:
4131 lDBusType = DBUS_TYPE_STRING;
4134 case enBTGattCPropService:
4135 lDBusType = DBUS_TYPE_OBJECT_PATH;
4136 lDBusKey =
"Service";
4138 case enBTGattCPropValue:
4139 lDBusType = DBUS_TYPE_ARRAY;
4142 case enBTGattCPropNotifying:
4143 lDBusType = DBUS_TYPE_BOOLEAN;
4144 BTRCORELOG_INFO(
"Key is notifying\n");
4145 lDBusKey =
"Notifying";
4147 case enBTGattCPropFlags:
4148 lDBusType = DBUS_TYPE_ARRAY;
4151 case enBTGattCPropUnknown:
4153 BTRCORELOG_ERROR(
"Invalid GattCharacteristic Property\n");
4159 BTRCORELOG_ERROR (
"Invalid Operational Interface\n");
4164 if (!lDBusKey || (lDBusType == DBUS_TYPE_INVALID)) {
4165 BTRCORELOG_ERROR (
"Invalid Interface Property\n");
4170 switch (lDBusType) {
4171 case DBUS_TYPE_BOOLEAN:
4172 lDBusTypeAsString = DBUS_TYPE_BOOLEAN_AS_STRING;
4174 case DBUS_TYPE_UINT32:
4175 lDBusTypeAsString = DBUS_TYPE_UINT32_AS_STRING;
4177 case DBUS_TYPE_UINT16:
4178 lDBusTypeAsString = DBUS_TYPE_UINT16_AS_STRING;
4180 case DBUS_TYPE_STRING:
4181 lDBusTypeAsString = DBUS_TYPE_STRING_AS_STRING;
4183 case DBUS_TYPE_ARRAY:
4184 lDBusTypeAsString = DBUS_TYPE_ARRAY_AS_STRING;
4187 BTRCORELOG_ERROR (
"Invalid DBus Type\n");
4191 if(aenBtOpIfceType == enBTGattCharacteristic) {
4192 lpDBusMsg = dbus_message_new_signal(apcBtOpIfcePath,
4193 DBUS_INTERFACE_PROPERTIES,
4194 "PropertiesChanged");
4197 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
4199 DBUS_INTERFACE_PROPERTIES,
4203 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
4208 if (aenBtOpIfceType == enBTGattCharacteristic) {
4209 char* pVlaue = (
char*)apvVal;
4210 BTRCORELOG_INFO(
"Notified Value is %s with length %lu\n", pVlaue, (
unsigned long)strlen(pVlaue));
4212 DBusMessageIter lDBusMsgIter, signal_iter;
4213 DBusMessageIter lDBusMsgIterDictStr, lDBusMsgIterSubArray, lDBusMsgIterVariant;
4214 char* Prop =
"Value";
4215 int type = DBUS_TYPE_BYTE;
4217 char array_type[5] =
"a";
4218 strncat(array_type, (
char*)&type,
sizeof(array_type) -
sizeof(type));
4220 dbus_message_iter_init_append(lpDBusMsg, &signal_iter);
4221 dbus_message_iter_append_basic(&signal_iter, DBUS_TYPE_STRING, &pGattCharInterface);
4222 dbus_message_iter_open_container(&signal_iter, DBUS_TYPE_ARRAY,
"{sv}", &lDBusMsgIter);
4223 dbus_message_iter_open_container(&lDBusMsgIter, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStr);
4224 dbus_message_iter_append_basic(&lDBusMsgIterDictStr, DBUS_TYPE_STRING, &Prop);
4225 dbus_message_iter_open_container(&lDBusMsgIterDictStr, DBUS_TYPE_VARIANT, array_type, &lDBusMsgIterVariant);
4226 dbus_message_iter_open_container(&lDBusMsgIterVariant, DBUS_TYPE_ARRAY, (
char *)&type, &lDBusMsgIterSubArray);
4227 for (
int i = 0; i < strlen(pVlaue); i++) {
4228 dbus_message_iter_append_basic(&lDBusMsgIterSubArray, DBUS_TYPE_BYTE, &(pVlaue[i]));
4230 dbus_message_iter_close_container(&lDBusMsgIterVariant, &lDBusMsgIterSubArray);
4231 dbus_message_iter_close_container(&lDBusMsgIterDictStr, &lDBusMsgIterVariant);
4232 dbus_message_iter_close_container(&lDBusMsgIter, &lDBusMsgIterDictStr);
4233 dbus_message_iter_close_container(&signal_iter, &lDBusMsgIter);
4236 dbus_message_iter_init_append(lpDBusMsg, &lDBusMsgIter);
4237 dbus_message_iter_append_basic(&lDBusMsgIter, DBUS_TYPE_STRING, &pInterface);
4238 dbus_message_iter_append_basic(&lDBusMsgIter, DBUS_TYPE_STRING, &lDBusKey);
4239 dbus_message_iter_open_container(&lDBusMsgIter, DBUS_TYPE_VARIANT, lDBusTypeAsString, &lDBusMsgIterValue);
4240 dbus_message_iter_append_basic(&lDBusMsgIterValue, lDBusType, apvVal);
4241 dbus_message_iter_close_container(&lDBusMsgIter, &lDBusMsgIterValue);
4245 const char* lsignature = dbus_message_get_signature(lpDBusMsg);
4246 int li32MessageType;
4247 const char* lpcSender;
4248 const char* lpcDestination;
4249 BTRCORELOG_INFO(
"Signature is %s\n", lsignature);
4251 li32MessageType = dbus_message_get_type(lpDBusMsg);
4252 lpcSender = dbus_message_get_sender(lpDBusMsg);
4253 lpcDestination = dbus_message_get_destination(lpDBusMsg);
4255 BTRCORELOG_TRACE (
"%s Sender=%s -> Dest=%s Path=%s; Interface=%s; Member=%s\n",
4256 btrCore_DBusType2Name(li32MessageType),
4257 lpcSender ? lpcSender :
"Null",
4258 lpcDestination ? lpcDestination :
"Null",
4259 dbus_message_get_path(lpDBusMsg),
4260 dbus_message_get_interface(lpDBusMsg),
4261 dbus_message_get_member(lpDBusMsg));
4262 dbus_error_init(&lDBusErr);
4263 lpDBusReply = dbus_connection_send_with_reply_and_block(pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
4264 dbus_message_unref(lpDBusMsg);
4267 BTRCORELOG_ERROR (
"lpDBusReply Null\n");
4268 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
4272 dbus_message_unref(lpDBusReply);
4274 dbus_connection_flush(pstlhBtIfce->pDBusConn);
4282 void* apstBtIfceHdl,
4283 const char* apBtAdapter,
4284 const char* apBtAgentPath
4287 DBusMessage* lpDBusMsg = NULL;
4288 dbus_bool_t lDBusOp;
4294 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
4296 BT_DBUS_BLUEZ_ADAPTER_PATH,
4299 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
4303 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
4304 dbus_message_unref(lpDBusMsg);
4307 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
4311 dbus_connection_flush(pstlhBtIfce->pDBusConn);
4319 void* apstBtIfceHdl,
4320 const char* apBtAdapter,
4321 const char* apBtAgentPath
4324 DBusMessage* lpDBusMsg = NULL;
4325 dbus_bool_t lDBusOp;
4331 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
4333 BT_DBUS_BLUEZ_ADAPTER_PATH,
4337 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
4341 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
4342 dbus_message_unref(lpDBusMsg);
4345 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
4349 dbus_connection_flush(pstlhBtIfce->pDBusConn);
4361 void* apstBtIfceHdl,
4362 const char* apBtAdapter,
4363 const char* apBtAgentPath
4366 DBusMessage* lpDBusMsg = NULL;
4367 dbus_bool_t lDBusOp;
4368 DBusMessageIter lDBusMsgIter;
4369 DBusMessageIter lDBusMsgIterDict;
4375 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
4377 BT_DBUS_BLUEZ_ADAPTER_PATH,
4378 "SetDiscoveryFilter");
4380 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
4385 dbus_message_iter_init_append(lpDBusMsg, &lDBusMsgIter);
4386 dbus_message_iter_open_container(&lDBusMsgIter,
4388 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
4389 DBUS_TYPE_STRING_AS_STRING
4390 DBUS_TYPE_VARIANT_AS_STRING
4391 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
4394 DBusMessageIter lDBusMsgIterDictStr, lDBusMsgIterVariant;
4395 char* lpcKey =
"Transport";
4396 char* lpcValue =
"le";
4397 int i32DBusType = DBUS_TYPE_STRING;
4399 dbus_message_iter_open_container(&lDBusMsgIterDict, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStr);
4400 dbus_message_iter_append_basic (&lDBusMsgIterDictStr, DBUS_TYPE_STRING, &lpcKey);
4401 dbus_message_iter_open_container (&lDBusMsgIterDictStr, DBUS_TYPE_VARIANT, (
char *)&i32DBusType, &lDBusMsgIterVariant);
4402 dbus_message_iter_append_basic (&lDBusMsgIterVariant, i32DBusType, &lpcValue);
4403 dbus_message_iter_close_container (&lDBusMsgIterDictStr, &lDBusMsgIterVariant);
4404 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterDictStr);
4407 DBusMessageIter lDBusMsgIterDictStr, lDBusMsgIterVariant, lDBusMsgIterSubArray;
4408 char* lpcKey =
"UUIDs";
4409 int i32DBusType = DBUS_TYPE_STRING;
4414 char array_type[5] =
"a";
4415 strncat (array_type, (
char*)&i32DBusType,
sizeof(array_type) -
sizeof(i32DBusType));
4417 const char *lppui8Props[] = { apcBtSrvUUID1, apcBtSrvUUID2, apcBtSrvUUID3, NULL };
4419 dbus_message_iter_open_container(&lDBusMsgIterDict, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStr);
4420 dbus_message_iter_append_basic (&lDBusMsgIterDictStr, DBUS_TYPE_STRING, &lpcKey);
4421 dbus_message_iter_open_container (&lDBusMsgIterDictStr, DBUS_TYPE_VARIANT, array_type, &lDBusMsgIterVariant);
4422 dbus_message_iter_open_container (&lDBusMsgIterVariant, DBUS_TYPE_ARRAY, (
char *)&i32DBusType, &lDBusMsgIterSubArray);
4423 dbus_message_iter_append_basic (&lDBusMsgIterSubArray, i32DBusType, &lppui8Props);
4424 dbus_message_iter_close_container (&lDBusMsgIterVariant, &lDBusMsgIterSubArray);
4425 dbus_message_iter_close_container (&lDBusMsgIterDictStr, &lDBusMsgIterVariant);
4426 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterDictStr);
4433 DBusMessageIter lDBusMsgIterDictStr, lDBusMsgIterVariant;
4434 char* lpcKey =
"RSSI";
4435 short lpcValue = -64;
4436 int i32DBusType = DBUS_TYPE_INT16;
4438 dbus_message_iter_open_container(&lDBusMsgIterDict, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStr);
4439 dbus_message_iter_append_basic (&lDBusMsgIterDictStr, DBUS_TYPE_STRING, &lpcKey);
4440 dbus_message_iter_open_container (&lDBusMsgIterDictStr, DBUS_TYPE_VARIANT, (
char *)&i32DBusType, &lDBusMsgIterVariant);
4441 dbus_message_iter_append_basic (&lDBusMsgIterVariant, i32DBusType, &lpcValue);
4442 dbus_message_iter_close_container (&lDBusMsgIterDictStr, &lDBusMsgIterVariant);
4443 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterDictStr);
4447 dbus_message_iter_close_container (&lDBusMsgIter, &lDBusMsgIterDict);
4450 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
4451 dbus_message_unref(lpDBusMsg);
4454 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
4458 dbus_connection_flush(pstlhBtIfce->pDBusConn);
4466 void* apstBtIfceHdl,
4467 const char* apBtAdapter,
4468 const char* apBtAgentPath
4471 DBusMessage* lpDBusMsg = NULL;
4472 dbus_bool_t lDBusOp;
4473 DBusMessageIter lDBusMsgIter, lDBusMsgIterDict;
4480 BTRCORELOG_WARN (
"Failed to Stop Discovery\n");
4484 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
4486 BT_DBUS_BLUEZ_ADAPTER_PATH,
4487 "SetDiscoveryFilter");
4489 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
4494 dbus_message_iter_init_append(lpDBusMsg, &lDBusMsgIter);
4495 dbus_message_iter_open_container(&lDBusMsgIter,
4497 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
4498 DBUS_TYPE_STRING_AS_STRING
4499 DBUS_TYPE_VARIANT_AS_STRING
4500 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
4505 dbus_message_iter_close_container (&lDBusMsgIter, &lDBusMsgIterDict);
4508 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
4509 dbus_message_unref(lpDBusMsg);
4512 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
4516 dbus_connection_flush(pstlhBtIfce->pDBusConn);
4524 void* apstBtIfceHdl,
4525 const char* apBtAdapter,
4526 const char* apBtAgentPath
4529 DBusMessage* lpDBusMsg = NULL;
4530 dbus_bool_t lDBusOp;
4531 DBusMessageIter lDBusMsgIter;
4532 DBusMessageIter lDBusMsgIterDict;
4538 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
4540 BT_DBUS_BLUEZ_ADAPTER_PATH,
4541 "SetDiscoveryFilter");
4543 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
4548 dbus_message_iter_init_append(lpDBusMsg, &lDBusMsgIter);
4549 dbus_message_iter_open_container(&lDBusMsgIter,
4551 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
4552 DBUS_TYPE_STRING_AS_STRING
4553 DBUS_TYPE_VARIANT_AS_STRING
4554 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
4557 DBusMessageIter lDBusMsgIterDictStr, lDBusMsgIterVariant;
4558 char* lpcKey =
"Transport";
4559 char* lpcValue =
"bredr";
4560 int i32DBusType = DBUS_TYPE_STRING;
4562 dbus_message_iter_open_container(&lDBusMsgIterDict, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStr);
4563 dbus_message_iter_append_basic (&lDBusMsgIterDictStr, DBUS_TYPE_STRING, &lpcKey);
4564 dbus_message_iter_open_container (&lDBusMsgIterDictStr, DBUS_TYPE_VARIANT, (
char *)&i32DBusType, &lDBusMsgIterVariant);
4565 dbus_message_iter_append_basic (&lDBusMsgIterVariant, i32DBusType, &lpcValue);
4566 dbus_message_iter_close_container (&lDBusMsgIterDictStr, &lDBusMsgIterVariant);
4567 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterDictStr);
4569 dbus_message_iter_close_container (&lDBusMsgIter, &lDBusMsgIterDict);
4572 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
4573 dbus_message_unref(lpDBusMsg);
4576 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
4580 dbus_connection_flush(pstlhBtIfce->pDBusConn);
4588 void* apstBtIfceHdl,
4589 const char* apBtAdapter,
4590 const char* apBtAgentPath
4593 DBusMessage* lpDBusMsg = NULL;
4594 dbus_bool_t lDBusOp;
4595 DBusMessageIter lDBusMsgIter, lDBusMsgIterDict;
4602 BTRCORELOG_WARN (
"Failed to Stop Discovery\n");
4606 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
4608 BT_DBUS_BLUEZ_ADAPTER_PATH,
4609 "SetDiscoveryFilter");
4611 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
4616 dbus_message_iter_init_append(lpDBusMsg, &lDBusMsgIter);
4617 dbus_message_iter_open_container(&lDBusMsgIter,
4619 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
4620 DBUS_TYPE_STRING_AS_STRING
4621 DBUS_TYPE_VARIANT_AS_STRING
4622 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
4627 dbus_message_iter_close_container (&lDBusMsgIter, &lDBusMsgIterDict);
4630 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
4631 dbus_message_unref(lpDBusMsg);
4634 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
4638 dbus_connection_flush(pstlhBtIfce->pDBusConn);
4647 void* apstBtIfceHdl,
4648 const char* apBtAdapter,
4652 DBusMessage* lpDBusMsg = NULL;
4653 DBusMessage* lpDBusReply = NULL;
4654 DBusMessageIter rootIter;
4656 bool adapterFound = FALSE;
4658 char* pdeviceInterface = BT_DBUS_BLUEZ_DEVICE_PATH;
4671 if (!apstBtIfceHdl || !apBtAdapter || !pPairedDeviceInfo)
4675 dbus_error_init(&lDBusErr);
4676 lpDBusReply = btrCore_BTSendMethodCall(pstlhBtIfce->pDBusConn,
"/", DBUS_INTERFACE_OBJECT_MANAGER,
"GetManagedObjects");
4678 BTRCORELOG_ERROR (
"org.bluez.Manager.ListAdapters returned an error: '%s'\n", lDBusErr.message);
4679 dbus_error_free(&lDBusErr);
4687 if (dbus_message_iter_init(lpDBusReply, &rootIter) &&
4688 DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&rootIter)) {
4690 DBusMessageIter arrayElementIter;
4691 dbus_message_iter_recurse(&rootIter, &arrayElementIter);
4693 while(!adapterFound) {
4694 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&arrayElementIter)) {
4696 DBusMessageIter dictEntryIter;
4697 dbus_message_iter_recurse(&arrayElementIter,&dictEntryIter );
4699 if (DBUS_TYPE_OBJECT_PATH == dbus_message_iter_get_arg_type(&dictEntryIter)) {
4700 dbus_message_iter_get_basic(&dictEntryIter, &adapter_path);
4705 dbus_message_iter_next(&dictEntryIter);
4706 if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&dictEntryIter)) {
4707 DBusMessageIter innerArrayIter;
4708 dbus_message_iter_recurse(&dictEntryIter, &innerArrayIter);
4710 while (dbus_message_iter_has_next(&innerArrayIter)) {
4711 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&innerArrayIter)) {
4712 DBusMessageIter innerDictEntryIter;
4713 dbus_message_iter_recurse(&innerArrayIter,&innerDictEntryIter );
4715 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter)) {
4717 dbus_message_iter_get_basic(&innerDictEntryIter, &dbusObject);
4722 dbus_message_iter_next(&innerDictEntryIter);
4723 if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&innerDictEntryIter)) {
4724 DBusMessageIter innerArrayIter2;
4725 dbus_message_iter_recurse(&innerDictEntryIter, &innerArrayIter2);
4727 while (dbus_message_iter_has_next(&innerArrayIter2)) {
4728 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&innerArrayIter2)) {
4729 DBusMessageIter innerDictEntryIter2;
4730 dbus_message_iter_recurse(&innerArrayIter2,&innerDictEntryIter2);
4732 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter2)) {
4733 dbus_message_iter_get_basic(&innerDictEntryIter2, &dbusObject2);
4738 dbus_message_iter_next(&innerDictEntryIter2);
4739 DBusMessageIter innerDictEntryIter3;
4742 dbus_message_iter_recurse(&innerDictEntryIter2,&innerDictEntryIter3);
4743 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter3)) {
4744 dbus_message_iter_get_basic(&innerDictEntryIter3, &dbusObject3);
4749 else if (DBUS_TYPE_BOOLEAN == dbus_message_iter_get_arg_type(&innerDictEntryIter3)) {
4750 bool *device_prop = FALSE;
4751 dbus_message_iter_get_basic(&innerDictEntryIter3, &device_prop);
4753 if (strcmp(dbusObject2,
"Paired") == 0 && device_prop) {
4760 if (!dbus_message_iter_has_next(&innerArrayIter2)) {
4764 dbus_message_iter_next(&innerArrayIter2);
4770 if (!dbus_message_iter_has_next(&innerArrayIter)) {
4774 dbus_message_iter_next(&innerArrayIter);
4779 if (!dbus_message_iter_has_next(&arrayElementIter)) {
4783 dbus_message_iter_next(&arrayElementIter);
4792 pPairedDeviceInfo->numberOfDevices = num;
4795 for ( i = 0; i < num; i++) {
4800 dbus_message_unref(lpDBusReply);
4804 for ( i = 0; i < num; i++) {
4805 DBusPendingCall* lpDBusPendC = NULL;
4807 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
4808 pPairedDeviceInfo->devicePath[i],
4809 DBUS_INTERFACE_PROPERTIES,
4811 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_STRING, &pdeviceInterface, DBUS_TYPE_INVALID);
4813 dbus_error_init(&lDBusErr);
4815 if (!dbus_connection_send_with_reply(pstlhBtIfce->pDBusConn, lpDBusMsg, &lpDBusPendC, -1)) {
4816 BTRCORELOG_ERROR (
"failed to send message");
4820 dbus_connection_flush(pstlhBtIfce->pDBusConn);
4821 dbus_message_unref(lpDBusMsg);
4824 if (lpDBusPendC != NULL) {
4825 dbus_pending_call_block(lpDBusPendC);
4826 lpDBusReply = dbus_pending_call_steal_reply(lpDBusPendC);
4827 dbus_pending_call_unref(lpDBusPendC);
4829 if (lpDBusReply != NULL) {
4833 if (0 != btrCore_BTParseDevice(lpDBusReply, &apstBTDeviceInfo)) {
4834 BTRCORELOG_ERROR (
"Parsing the device %s failed..\n", pPairedDeviceInfo->devicePath[i]);
4835 dbus_message_unref(lpDBusReply);
4839 memcpy (&pPairedDeviceInfo->deviceInfo[i], &apstBTDeviceInfo,
sizeof(
stBTDeviceInfo));
4842 dbus_message_unref(lpDBusReply);
4848 BTRCORELOG_TRACE (
"Exiting\n");
4856 void* apstBtIfceHdl,
4857 const char* apcDevPath,
4861 DBusMessage* lpDBusMsg = NULL;
4862 DBusMessage* lpDBusReply = NULL;
4864 DBusMessageIter args;
4865 DBusMessageIter MsgIter;
4866 DBusPendingCall* lpDBusPendC;
4868 const char* apcSearchString =
"UUIDs";
4869 const char* pDeviceInterface= BT_DBUS_BLUEZ_DEVICE_PATH;
4875 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
4877 DBUS_INTERFACE_PROPERTIES,
4880 dbus_message_iter_init_append(lpDBusMsg, &args);
4881 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_STRING, &pDeviceInterface, DBUS_TYPE_INVALID);
4883 dbus_error_init(&lDBusErr);
4884 if (!dbus_connection_send_with_reply(pstlhBtIfce->pDBusConn, lpDBusMsg, &lpDBusPendC, -1)) {
4885 BTRCORELOG_ERROR (
"failed to send message");
4889 dbus_connection_flush(pstlhBtIfce->pDBusConn);
4890 dbus_message_unref(lpDBusMsg);
4893 dbus_pending_call_block(lpDBusPendC);
4894 lpDBusReply = dbus_pending_call_steal_reply(lpDBusPendC);
4895 dbus_pending_call_unref(lpDBusPendC);
4898 dbus_message_iter_init(lpDBusReply, &MsgIter);
4905 if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&MsgIter)) {
4906 DBusMessageIter arrayElementIter;
4907 dbus_message_iter_recurse(&MsgIter, &arrayElementIter);
4908 while (dbus_message_iter_has_next(&arrayElementIter)) {
4909 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&arrayElementIter)) {
4911 dbus_message_iter_get_basic(&arrayElementIter, &dbusObject2);
4912 if (strcmp(apcSearchString, dbusObject2) == 0) {
4920 if (!dbus_message_iter_has_next(&arrayElementIter)) {
4924 dbus_message_iter_next(&arrayElementIter);
4935 void* apstBtIfceHdl,
4936 const char* apcDevPath,
4937 const char* apcSearchString,
4941 DBusMessage* lpDBusMsg = NULL;
4942 DBusMessage* lpDBusReply = NULL;
4944 DBusMessageIter arg_i, element_i;
4945 DBusMessageIter dict_i;
4952 if (!apstBtIfceHdl || !apcDevPath)
4957 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
4959 BT_DBUS_BLUEZ_DEVICE_PATH,
4960 "DiscoverServices");
4963 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
4968 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_STRING, &apcSearchString, DBUS_TYPE_INVALID);
4970 dbus_error_init(&lDBusErr);
4971 lpDBusReply = dbus_connection_send_with_reply_and_block(pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
4972 dbus_message_unref(lpDBusMsg);
4975 BTRCORELOG_ERROR (
"Failure attempting to Discover Services\n");
4976 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
4980 if (!dbus_message_iter_init(lpDBusReply, &arg_i)) {
4981 BTRCORELOG_ERROR (
"DiscoverServices lpDBusReply has no information.");
4985 dbus_type = dbus_message_iter_get_arg_type(&arg_i);
4988 dbus_message_iter_recurse(&arg_i, &element_i);
4989 dbus_type = dbus_message_iter_get_arg_type(&element_i);
4992 while (dbus_message_iter_get_arg_type(&element_i) != DBUS_TYPE_INVALID) {
4993 dbus_type = dbus_message_iter_get_arg_type(&element_i);
4996 if (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) {
4998 dbus_message_iter_recurse(&element_i, &dict_i);
4999 dbus_type = dbus_message_iter_get_arg_type(&dict_i);
5002 dbus_message_iter_next(&dict_i);
5003 dbus_type = dbus_message_iter_get_arg_type(&dict_i);
5005 dbus_message_iter_get_basic(&dict_i, &value);
5008 if (apcDataString != NULL) {
5009 strcpy(apcDataString, value);
5013 ret = strstr(value, apcSearchString);
5025 if (!dbus_message_iter_next(&element_i))
5038 void* apstBtIfceHdl,
5039 const char* apBtAdapter,
5040 const char* apBtAgentPath,
5041 const char* apcDevPath,
5045 DBusMessage* lpDBusMsg = NULL;
5046 DBusMessage* lpDBusReply = NULL;
5048 DBusMessageIter rootIter;
5049 bool adapterFound = FALSE;
5050 char* adapter_path = NULL;
5059 if (!apstBtIfceHdl || !apBtAdapter || !apBtAgentPath || !apcDevPath || (aenBTAdpOp == enBTAdpOpUnknown))
5063 switch (aenBTAdpOp) {
5064 case enBTAdpOpFindPairedDev:
5065 strcpy(deviceOpString,
"FindDevice");
5067 case enBTAdpOpCreatePairedDev:
5068 case enBTAdpOpCreatePairedDevASync:
5069 strcpy(deviceOpString,
"Pair");
5071 case enBTAdpOpRemovePairedDev:
5072 strcpy(deviceOpString,
"RemoveDevice");
5074 case enBTAdpOpUnknown:
5084 if (aenBTAdpOp == enBTAdpOpFindPairedDev) {
5085 lpDBusReply = btrCore_BTSendMethodCall(pstlhBtIfce->pDBusConn,
"/", DBUS_INTERFACE_OBJECT_MANAGER,
"GetManagedObjects");
5088 dbus_message_iter_init(lpDBusReply, &rootIter) &&
5089 DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&rootIter)) {
5091 DBusMessageIter arrayElementIter;
5092 dbus_message_iter_recurse(&rootIter, &arrayElementIter);
5094 while(!adapterFound) {
5095 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&arrayElementIter)) {
5097 DBusMessageIter dictEntryIter;
5098 dbus_message_iter_recurse(&arrayElementIter,&dictEntryIter );
5100 if (DBUS_TYPE_OBJECT_PATH == dbus_message_iter_get_arg_type(&dictEntryIter)) {
5101 dbus_message_iter_get_basic(&dictEntryIter, &adapter_path);
5106 dbus_message_iter_next(&dictEntryIter);
5107 if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&dictEntryIter)) {
5108 DBusMessageIter innerArrayIter;
5109 dbus_message_iter_recurse(&dictEntryIter, &innerArrayIter);
5111 while (dbus_message_iter_has_next(&innerArrayIter)) {
5112 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&innerArrayIter)) {
5113 DBusMessageIter innerDictEntryIter;
5114 dbus_message_iter_recurse(&innerArrayIter,&innerDictEntryIter );
5116 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter)) {
5118 dbus_message_iter_get_basic(&innerDictEntryIter, &dbusObject);
5124 dbus_message_iter_next(&innerDictEntryIter);
5125 if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&innerDictEntryIter)) {
5126 DBusMessageIter innerArrayIter2;
5127 dbus_message_iter_recurse(&innerDictEntryIter, &innerArrayIter2);
5129 while (dbus_message_iter_has_next(&innerArrayIter2)) {
5130 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&innerArrayIter2)) {
5131 DBusMessageIter innerDictEntryIter2;
5132 dbus_message_iter_recurse(&innerArrayIter2,&innerDictEntryIter2);
5133 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter2)) {
5135 dbus_message_iter_get_basic(&innerDictEntryIter2, &dbusObject2);
5140 dbus_message_iter_next(&innerDictEntryIter2);
5141 DBusMessageIter innerDictEntryIter3;
5144 dbus_message_iter_recurse(&innerDictEntryIter2,&innerDictEntryIter3);
5145 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter3)) {
5146 dbus_message_iter_get_basic(&innerDictEntryIter3, &dbusObject3);
5150 if (strcmp(apcDevPath, objectData) == 0) {
5152 adapterFound =
TRUE;
5156 else if (DBUS_TYPE_BOOLEAN == dbus_message_iter_get_arg_type(&innerDictEntryIter3)) {
5157 bool *device_prop = FALSE;
5158 dbus_message_iter_get_basic(&innerDictEntryIter3, &device_prop);
5162 if (!dbus_message_iter_has_next(&innerArrayIter2)) {
5166 dbus_message_iter_next(&innerArrayIter2);
5172 if (!dbus_message_iter_has_next(&innerArrayIter)) {
5176 dbus_message_iter_next(&innerArrayIter);
5181 if (!dbus_message_iter_has_next(&arrayElementIter)) {
5185 dbus_message_iter_next(&arrayElementIter);
5190 dbus_message_unref(lpDBusReply);
5194 else if (aenBTAdpOp == enBTAdpOpRemovePairedDev) {
5195 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
5197 BT_DBUS_BLUEZ_ADAPTER_PATH,
5200 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
5204 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_OBJECT_PATH, &apcDevPath, DBUS_TYPE_INVALID);
5206 dbus_error_init(&lDBusErr);
5207 lpDBusReply = dbus_connection_send_with_reply_and_block(pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
5208 dbus_message_unref(lpDBusMsg);
5211 BTRCORELOG_ERROR (
"UnPairing failed...\n");
5212 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
5216 dbus_message_unref(lpDBusReply);
5219 else if ((aenBTAdpOp == enBTAdpOpCreatePairedDev) || (aenBTAdpOp == enBTAdpOpCreatePairedDevASync)) {
5220 lpDBusReply = btrCore_BTSendMethodCall(pstlhBtIfce->pDBusConn,
"/", DBUS_INTERFACE_OBJECT_MANAGER,
"GetManagedObjects");
5223 dbus_message_iter_init(lpDBusReply, &rootIter) &&
5224 DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&rootIter)) {
5226 DBusMessageIter arrayElementIter;
5227 dbus_message_iter_recurse(&rootIter, &arrayElementIter);
5229 while (!adapterFound) {
5230 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&arrayElementIter)) {
5232 DBusMessageIter dictEntryIter;
5233 dbus_message_iter_recurse(&arrayElementIter,&dictEntryIter );
5235 if (DBUS_TYPE_OBJECT_PATH == dbus_message_iter_get_arg_type(&dictEntryIter)) {
5236 dbus_message_iter_get_basic(&dictEntryIter, &adapter_path);
5241 dbus_message_iter_next(&dictEntryIter);
5242 if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&dictEntryIter)) {
5243 DBusMessageIter innerArrayIter;
5244 dbus_message_iter_recurse(&dictEntryIter, &innerArrayIter);
5246 while (dbus_message_iter_has_next(&innerArrayIter)) {
5247 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&innerArrayIter)) {
5248 DBusMessageIter innerDictEntryIter;
5249 dbus_message_iter_recurse(&innerArrayIter,&innerDictEntryIter );
5251 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter)) {
5253 dbus_message_iter_get_basic(&innerDictEntryIter, &dbusObject);
5258 dbus_message_iter_next(&innerDictEntryIter);
5259 if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&innerDictEntryIter)) {
5260 DBusMessageIter innerArrayIter2;
5261 dbus_message_iter_recurse(&innerDictEntryIter, &innerArrayIter2);
5263 while (dbus_message_iter_has_next(&innerArrayIter2)) {
5264 if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&innerArrayIter2)) {
5265 DBusMessageIter innerDictEntryIter2;
5266 dbus_message_iter_recurse(&innerArrayIter2,&innerDictEntryIter2);
5268 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter2)) {
5270 dbus_message_iter_get_basic(&innerDictEntryIter2, &dbusObject2);
5274 dbus_message_iter_next(&innerDictEntryIter2);
5275 DBusMessageIter innerDictEntryIter3;
5278 dbus_message_iter_recurse(&innerDictEntryIter2,&innerDictEntryIter3);
5279 if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&innerDictEntryIter3)) {
5280 dbus_message_iter_get_basic(&innerDictEntryIter3, &dbusObject3);
5283 if (strcmp(apcDevPath, objectData) == 0) {
5285 strcpy(deviceObjectPath,adapter_path);
5286 adapterFound =
TRUE;
5290 else if (DBUS_TYPE_BOOLEAN == dbus_message_iter_get_arg_type(&innerDictEntryIter3)) {
5291 bool *device_prop = FALSE;
5292 dbus_message_iter_get_basic(&innerDictEntryIter3, &device_prop);
5296 if (!dbus_message_iter_has_next(&innerArrayIter2)) {
5300 dbus_message_iter_next(&innerArrayIter2);
5306 if (!dbus_message_iter_has_next(&innerArrayIter)) {
5310 dbus_message_iter_next(&innerArrayIter);
5315 if (!dbus_message_iter_has_next(&arrayElementIter)) {
5319 dbus_message_iter_next(&arrayElementIter);
5324 dbus_message_unref(lpDBusReply);
5329 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
5331 BT_DBUS_BLUEZ_DEVICE_PATH,
5334 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
5337 if (enBTAdpOpCreatePairedDev == aenBTAdpOp) {
5338 dbus_error_init(&lDBusErr);
5339 lpDBusReply = dbus_connection_send_with_reply_and_block(pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
5340 dbus_message_unref(lpDBusMsg);
5343 BTRCORELOG_ERROR (
"Pairing failed...\n");
5344 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
5348 dbus_message_unref(lpDBusReply);
5355 DBusPendingCall* lpDBusPendC = NULL;
5356 if (!dbus_connection_send_with_reply(pstlhBtIfce->pDBusConn, lpDBusMsg, &lpDBusPendC, -1)) {
5357 BTRCORELOG_ERROR (
"failed to send message!\n");
5359 dbus_pending_call_set_notify(lpDBusPendC, btrCore_BTPendingCallCheckReply, NULL, NULL);
5361 dbus_connection_flush(pstlhBtIfce->pDBusConn);
5362 dbus_message_unref(lpDBusMsg);
5372 void* apstBtIfceHdl,
5373 const char* apcDevPath
5376 FILE* lfpL2Ping = NULL;
5381 if (!apstBtIfceHdl || !apcDevPath)
5386 snprintf(lcpL2PingIp,
BT_MAX_STR_LEN/2,
"l2ping -i hci0 -c 3 -s 2 -d 2 %s", apcDevPath);
5387 BTRCORELOG_INFO (
"lcpL2PingIp: %s\n", lcpL2PingIp);
5388 #ifdef LIBSYSWRAPPER_BUILD
5389 lfpL2Ping = v_secure_popen(
"r",
"l2ping -i hci0 -c 3 -s 2 -d 2 %s", apcDevPath);
5391 lfpL2Ping = popen(lcpL2PingIp,
"r");
5393 if ((lfpL2Ping == NULL)) {
5394 BTRCORELOG_ERROR (
"Failed to run BTIsDeviceConnectable command\n");
5397 if (fgets(lcpL2PingOp,
sizeof(lcpL2PingOp)-1, lfpL2Ping) == NULL) {
5398 BTRCORELOG_ERROR (
"Failed to Output of l2ping\n");
5401 BTRCORELOG_WARN (
"Output of l2ping = %s\n", lcpL2PingOp);
5402 if (!strstr(lcpL2PingOp,
"Host is down")) {
5406 #ifdef LIBSYSWRAPPER_BUILD
5407 v_secure_pclose(lfpL2Ping);
5419 void* apstBtIfceHdl,
5420 const char* apDevPath,
5424 DBusMessage* lpDBusMsg = NULL;
5425 dbus_bool_t lDBusOp;
5427 if (!apstBtIfceHdl || !apDevPath)
5431 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
5433 BT_DBUS_BLUEZ_DEVICE_PATH,
5437 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
5441 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
5442 dbus_message_unref(lpDBusMsg);
5445 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
5449 dbus_connection_flush(pstlhBtIfce->pDBusConn);
5457 void* apstBtIfceHdl,
5458 const char* apDevPath,
5462 DBusMessage* lpDBusMsg = NULL;
5463 dbus_bool_t lDBusOp;
5465 if (!apstBtIfceHdl || !apDevPath)
5469 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
5471 BT_DBUS_BLUEZ_DEVICE_PATH,
5475 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
5479 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
5480 dbus_message_unref(lpDBusMsg);
5483 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
5487 dbus_connection_flush(pstlhBtIfce->pDBusConn);
5498 FILE* lfpBtErtm = NULL;
5503 if (!apstBtIfceHdl || !pstlhBtIfce)
5510 snprintf(lcpBtErtmIp,
BT_MAX_STR_LEN/2,
"echo 0 > /sys/module/bluetooth/parameters/disable_ertm");
5511 BTRCORELOG_INFO (
"lcpBtErtmIp: %s\n", lcpBtErtmIp);
5513 #ifdef LIBSYSWRAPPER_BUILD
5514 lfpBtErtm = v_secure_popen(
"r", lcpBtErtmIp);
5516 lfpBtErtm = popen(lcpBtErtmIp,
"r");
5518 if (lfpBtErtm == NULL) {
5519 BTRCORELOG_ERROR (
"Failed to run BTEnableEnhancedRetransmissionMode command\n");
5522 if (fgets(lcpBtErtmOp,
sizeof(lcpBtErtmOp)-1, lfpBtErtm) == NULL) {
5523 BTRCORELOG_INFO (
"Success - Output of BtErtm\n");
5527 BTRCORELOG_WARN (
"Failed Output of BtErtm = %s\n", lcpBtErtmOp);
5528 if (!strstr(lcpBtErtmOp,
"Permission denied")) {
5529 BTRCORELOG_WARN (
"Check path = %s\n", lcpBtErtmIp);
5532 #ifdef LIBSYSWRAPPER_BUILD
5533 v_secure_pclose(lfpBtErtm);
5548 FILE* lfpBtErtm = NULL;
5553 if (!apstBtIfceHdl || !pstlhBtIfce)
5560 snprintf(lcpBtErtmIp,
BT_MAX_STR_LEN/2,
"echo 1 > /sys/module/bluetooth/parameters/disable_ertm");
5561 BTRCORELOG_INFO (
"lcpBtErtmIp: %s\n", lcpBtErtmIp);
5563 #ifdef LIBSYSWRAPPER_BUILD
5564 lfpBtErtm = v_secure_popen(
"r", lcpBtErtmIp);
5566 lfpBtErtm = popen(lcpBtErtmIp,
"r");
5568 if ((lfpBtErtm == NULL)) {
5569 BTRCORELOG_ERROR (
"Failed to run BTDisableEnhancedRetransmissionMode command\n");
5572 if (fgets(lcpBtErtmOp,
sizeof(lcpBtErtmOp)-1, lfpBtErtm) == NULL) {
5573 BTRCORELOG_INFO (
"Success - Output of BtErtm\n");
5577 BTRCORELOG_WARN (
"Failed Output of BtErtm = %s\n", lcpBtErtmOp);
5578 if (!strstr(lcpBtErtmOp,
"Permission denied")) {
5579 BTRCORELOG_WARN (
"Check path = %s\n", lcpBtErtmIp);
5582 #ifdef LIBSYSWRAPPER_BUILD
5583 v_secure_pclose(lfpBtErtm);
5595 void* apstBtIfceHdl,
5596 const char* apBtAdapter,
5599 const char* apBtUUID,
5600 void* apBtMediaCapabilities,
5601 int apBtMediaCapabilitiesSize,
5602 int abBtMediaDelayReportEnable
5605 DBusMessage* lpDBusMsg = NULL;
5606 DBusMessage* lpDBusReply = NULL;
5608 DBusMessageIter lDBusMsgIter;
5609 DBusMessageIter lDBusMsgIterArr;
5610 dbus_bool_t lDBusOp;
5611 dbus_bool_t lBtMediaDelayReport = FALSE;
5613 const char* lpBtMediaEpObjPath;
5620 switch (aenBTMediaType) {
5621 case enBTMediaTypePCM:
5624 case enBTMediaTypeSBC:
5627 case enBTMediaTypeMP3:
5630 case enBTMediaTypeAAC:
5633 case enBTMediaTypeUnknown:
5640 switch (aenBTDevType) {
5641 case enBTDevAudioSink:
5643 lpBtMediaEpObjPath = BT_MEDIA_SBC_A2DP_SOURCE_ENDPOINT;
5646 lpBtMediaEpObjPath = BT_MEDIA_MP3_A2DP_SOURCE_ENDPOINT;
5649 lpBtMediaEpObjPath = BT_MEDIA_AAC_A2DP_SOURCE_ENDPOINT;
5652 lpBtMediaEpObjPath = BT_MEDIA_SBC_A2DP_SOURCE_ENDPOINT;
5655 case enBTDevAudioSource:
5657 lpBtMediaEpObjPath = BT_MEDIA_SBC_A2DP_SINK_ENDPOINT;
5660 lpBtMediaEpObjPath = BT_MEDIA_MP3_A2DP_SINK_ENDPOINT;
5663 lpBtMediaEpObjPath = BT_MEDIA_AAC_A2DP_SINK_ENDPOINT;
5666 lpBtMediaEpObjPath = BT_MEDIA_SBC_A2DP_SINK_ENDPOINT;
5669 case enBTDevHFPHeadset:
5671 lpBtMediaEpObjPath = BT_MEDIA_PCM_HFP_AG_ENDPOINT;
5674 lpBtMediaEpObjPath = BT_MEDIA_SBC_HFP_AG_ENDPOINT;
5677 lpBtMediaEpObjPath = BT_MEDIA_PCM_HFP_AG_ENDPOINT;
5680 case enBTDevHFPAudioGateway:
5681 lpBtMediaEpObjPath = BT_MEDIA_PCM_HFP_HS_ENDPOINT;
5683 case enBTDevUnknown:
5685 lpBtMediaEpObjPath = BT_MEDIA_SBC_A2DP_SOURCE_ENDPOINT;
5689 if (abBtMediaDelayReportEnable)
5690 lBtMediaDelayReport =
TRUE;
5692 dbus_error_init(&lDBusErr);
5693 lDBusOp = dbus_connection_try_register_object_path(pstlhBtIfce->pDBusConn, lpBtMediaEpObjPath, &gDBusMediaEndpointVTable, pstlhBtIfce, &lDBusErr);
5695 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
5696 BTRCORELOG_ERROR (
"Can't Register Media Object - %s\n", lpBtMediaEpObjPath);
5698 if (strcmp(lDBusErr.name, DBUS_ERROR_OBJECT_PATH_IN_USE) != 0)
5702 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
5704 BT_DBUS_BLUEZ_MEDIA_PATH,
5705 "RegisterEndpoint");
5707 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
5711 dbus_message_iter_init_append (lpDBusMsg, &lDBusMsgIter);
5712 dbus_message_iter_append_basic (&lDBusMsgIter, DBUS_TYPE_OBJECT_PATH, &lpBtMediaEpObjPath);
5713 dbus_message_iter_open_container (&lDBusMsgIter, DBUS_TYPE_ARRAY,
"{sv}", &lDBusMsgIterArr);
5715 DBusMessageIter lDBusMsgIterDict, lDBusMsgIterVariant;
5717 int type = DBUS_TYPE_STRING;
5719 dbus_message_iter_open_container (&lDBusMsgIterArr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDict);
5720 dbus_message_iter_append_basic (&lDBusMsgIterDict, DBUS_TYPE_STRING, &key);
5721 dbus_message_iter_open_container (&lDBusMsgIterDict, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterVariant);
5722 dbus_message_iter_append_basic (&lDBusMsgIterVariant, type, &apBtUUID);
5723 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterVariant);
5724 dbus_message_iter_close_container (&lDBusMsgIterArr, &lDBusMsgIterDict);
5727 DBusMessageIter lDBusMsgIterDict, lDBusMsgIterVariant;
5728 char* key =
"Codec";
5729 int type = DBUS_TYPE_BYTE;
5731 dbus_message_iter_open_container (&lDBusMsgIterArr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDict);
5732 dbus_message_iter_append_basic (&lDBusMsgIterDict, DBUS_TYPE_STRING, &key);
5733 dbus_message_iter_open_container (&lDBusMsgIterDict, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterVariant);
5734 dbus_message_iter_append_basic (&lDBusMsgIterVariant, type, &lBtMediaCodec);
5735 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterVariant);
5736 dbus_message_iter_close_container (&lDBusMsgIterArr, &lDBusMsgIterDict);
5739 DBusMessageIter lDBusMsgIterDict, lDBusMsgIterVariant;
5740 char* key =
"DelayReporting";
5741 int type = DBUS_TYPE_BOOLEAN;
5743 dbus_message_iter_open_container (&lDBusMsgIterArr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDict);
5744 dbus_message_iter_append_basic (&lDBusMsgIterDict, DBUS_TYPE_STRING, &key);
5745 dbus_message_iter_open_container (&lDBusMsgIterDict, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterVariant);
5746 dbus_message_iter_append_basic (&lDBusMsgIterVariant, type, &lBtMediaDelayReport);
5747 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterVariant);
5748 dbus_message_iter_close_container (&lDBusMsgIterArr, &lDBusMsgIterDict);
5751 DBusMessageIter lDBusMsgIterDict, lDBusMsgIterVariant, lDBusMsgIterSubArray;
5752 char* key =
"Capabilities";
5753 int type = DBUS_TYPE_BYTE;
5755 char array_type[5] =
"a";
5756 strncat (array_type, (
char*)&type,
sizeof(array_type) -
sizeof(type));
5758 dbus_message_iter_open_container (&lDBusMsgIterArr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDict);
5759 dbus_message_iter_append_basic (&lDBusMsgIterDict, DBUS_TYPE_STRING, &key);
5760 dbus_message_iter_open_container (&lDBusMsgIterDict, DBUS_TYPE_VARIANT, array_type, &lDBusMsgIterVariant);
5761 dbus_message_iter_open_container (&lDBusMsgIterVariant, DBUS_TYPE_ARRAY, (
char *)&type, &lDBusMsgIterSubArray);
5762 dbus_message_iter_append_fixed_array (&lDBusMsgIterSubArray, type, &apBtMediaCapabilities, apBtMediaCapabilitiesSize);
5763 dbus_message_iter_close_container (&lDBusMsgIterVariant, &lDBusMsgIterSubArray);
5764 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterVariant);
5765 dbus_message_iter_close_container (&lDBusMsgIterArr, &lDBusMsgIterDict);
5767 dbus_message_iter_close_container (&lDBusMsgIter, &lDBusMsgIterArr);
5770 dbus_error_init(&lDBusErr);
5771 lpDBusReply = dbus_connection_send_with_reply_and_block (pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
5772 dbus_message_unref(lpDBusMsg);
5775 BTRCORELOG_ERROR (
"lpDBusReply Null\n");
5776 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
5780 dbus_message_unref(lpDBusReply);
5782 dbus_connection_flush(pstlhBtIfce->pDBusConn);
5790 void* apstBtIfceHdl,
5791 const char* apBtAdapter,
5796 DBusMessage* lpDBusMsg = NULL;
5797 dbus_bool_t lDBusOp;
5799 const char* lpBtMediaEpObjPath;
5806 switch (aenBTMediaType) {
5807 case enBTMediaTypePCM:
5810 case enBTMediaTypeSBC:
5813 case enBTMediaTypeMP3:
5816 case enBTMediaTypeAAC:
5819 case enBTMediaTypeUnknown:
5826 switch (aenBTDevType) {
5827 case enBTDevAudioSink:
5829 lpBtMediaEpObjPath = BT_MEDIA_SBC_A2DP_SOURCE_ENDPOINT;
5832 lpBtMediaEpObjPath = BT_MEDIA_MP3_A2DP_SOURCE_ENDPOINT;
5835 lpBtMediaEpObjPath = BT_MEDIA_AAC_A2DP_SOURCE_ENDPOINT;
5838 lpBtMediaEpObjPath = BT_MEDIA_SBC_A2DP_SOURCE_ENDPOINT;
5841 case enBTDevAudioSource:
5843 lpBtMediaEpObjPath = BT_MEDIA_SBC_A2DP_SINK_ENDPOINT;
5846 lpBtMediaEpObjPath = BT_MEDIA_MP3_A2DP_SINK_ENDPOINT;
5849 lpBtMediaEpObjPath = BT_MEDIA_AAC_A2DP_SINK_ENDPOINT;
5852 lpBtMediaEpObjPath = BT_MEDIA_SBC_A2DP_SINK_ENDPOINT;
5855 case enBTDevHFPHeadset:
5857 lpBtMediaEpObjPath = BT_MEDIA_PCM_HFP_AG_ENDPOINT;
5860 lpBtMediaEpObjPath = BT_MEDIA_SBC_HFP_AG_ENDPOINT;
5863 lpBtMediaEpObjPath = BT_MEDIA_PCM_HFP_AG_ENDPOINT;
5866 case enBTDevHFPAudioGateway:
5867 lpBtMediaEpObjPath = BT_MEDIA_PCM_HFP_HS_ENDPOINT;
5869 case enBTDevUnknown:
5871 lpBtMediaEpObjPath = BT_MEDIA_SBC_A2DP_SOURCE_ENDPOINT;
5876 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
5878 BT_DBUS_BLUEZ_MEDIA_PATH,
5879 "UnregisterEndpoint");
5882 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
5886 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_OBJECT_PATH, &lpBtMediaEpObjPath, DBUS_TYPE_INVALID);
5888 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
5889 dbus_message_unref(lpDBusMsg);
5892 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
5896 lDBusOp = dbus_connection_unregister_object_path(pstlhBtIfce->pDBusConn, lpBtMediaEpObjPath);
5898 BTRCORELOG_ERROR (
"Can't Register Media Object\n");
5903 dbus_connection_flush(pstlhBtIfce->pDBusConn);
5911 void* apstBtIfceHdl,
5912 char* apcDevTransportPath,
5918 DBusMessage* lpDBusMsg = NULL;
5919 DBusMessage* lpDBusReply = NULL;
5921 dbus_bool_t lDBusOp;
5923 if (!apstBtIfceHdl || !apcDevTransportPath)
5927 lpDBusMsg = dbus_message_new_method_call (BT_DBUS_BLUEZ_PATH,
5928 apcDevTransportPath,
5929 BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH,
5933 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
5937 dbus_error_init(&lDBusErr);
5938 lpDBusReply = dbus_connection_send_with_reply_and_block (pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
5939 dbus_message_unref(lpDBusMsg);
5942 BTRCORELOG_ERROR (
"lpDBusReply Null\n");
5943 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
5947 lDBusOp = dbus_message_get_args(lpDBusReply, &lDBusErr,
5948 DBUS_TYPE_UNIX_FD, dataPathFd,
5949 DBUS_TYPE_UINT16, dataReadMTU,
5950 DBUS_TYPE_UINT16, dataWriteMTU,
5952 dbus_message_unref(lpDBusReply);
5955 BTRCORELOG_ERROR (
"Can't get lpDBusReply arguments\n");
5956 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
5960 dbus_connection_flush(pstlhBtIfce->pDBusConn);
5968 void* apstBtIfceHdl,
5969 char* apcDevTransportPath
5972 DBusMessage* lpDBusMsg = NULL;
5973 DBusMessage* lpDBusReply = NULL;
5976 if (!apstBtIfceHdl || !apcDevTransportPath)
5980 lpDBusMsg = dbus_message_new_method_call (BT_DBUS_BLUEZ_PATH,
5981 apcDevTransportPath,
5982 BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH,
5986 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
5991 dbus_error_init(&lDBusErr);
5992 lpDBusReply = dbus_connection_send_with_reply_and_block (pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
5993 dbus_message_unref(lpDBusMsg);
5996 BTRCORELOG_ERROR (
"lpDBusReply Null\n");
5997 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
6001 dbus_message_unref(lpDBusReply);
6003 dbus_connection_flush(pstlhBtIfce->pDBusConn);
6011 void* apstBtIfceHdl,
6012 unsigned int aui32AckTOutms
6015 FILE* lHciDataAck = NULL;
6025 snprintf(lcpHciDataWriteAckTOutIp,
BT_MAX_STR_LEN/2,
"hcitool -i hci0 cmd 0x03 0x0028 0x0C 0x00 0x%02x 0x00", aui32AckTOutms);
6026 BTRCORELOG_INFO (
"lcpHciDataWriteAckTOutIp: %s\n", lcpHciDataWriteAckTOutIp);
6028 lHciDataAck = popen(lcpHciDataWriteAckTOutIp,
"r");
6029 if ((lHciDataAck == NULL)) {
6030 BTRCORELOG_ERROR (
"Failed to run lcpHciDataWriteAckTOutIp command\n");
6033 if (fgets(lcpHciDataWriteAckTOutOp,
sizeof(lcpHciDataWriteAckTOutOp)-1, lHciDataAck) == NULL) {
6034 BTRCORELOG_ERROR (
"Failed to Output of lcpHciDataWriteAckTOutIp\n");
6037 BTRCORELOG_WARN (
"Output of lcpHciDataWriteAckTOutIp = %s\n", lcpHciDataWriteAckTOutOp);
6038 if (strstr(lcpHciDataWriteAckTOutOp,
"HCI Command: ogf 0x03, ocf 0x0028, plen 4")) {
6043 pclose(lHciDataAck);
6054 void* apstBtIfceHdl,
6055 const char* apBtDevPath
6058 char* playerObjectPath = NULL;
6059 bool isConnected = FALSE;
6061 if (!apstBtIfceHdl || !apBtDevPath) {
6062 BTRCORELOG_ERROR (
"Invalid args!!!");
6067 if (btrCore_BTGetMediaIfceProperty(pstlhBtIfce->pDBusConn, apBtDevPath, BT_DBUS_BLUEZ_MEDIA_CTRL_PATH,
"Connected", (
void*)&isConnected)) {
6068 BTRCORELOG_ERROR (
"Failed to get %s property : Connected!!!", BT_DBUS_BLUEZ_MEDIA_CTRL_PATH);
6072 if (FALSE == isConnected) {
6073 BTRCORELOG_WARN (
"%s is not connected", BT_DBUS_BLUEZ_MEDIA_CTRL_PATH);
6077 if (btrCore_BTGetMediaIfceProperty(pstlhBtIfce->pDBusConn, apBtDevPath, BT_DBUS_BLUEZ_MEDIA_CTRL_PATH,
"Player", (
void*)&playerObjectPath)) {
6078 BTRCORELOG_ERROR (
"Failed to get %s property : Player!!!", BT_DBUS_BLUEZ_MEDIA_CTRL_PATH);
6082 return playerObjectPath;
6090 void* apstBtIfceHdl,
6091 const char* apMediaPlayerPath,
6095 dbus_bool_t lDBusOp;
6096 DBusMessage* lpDBusMsg = NULL;
6097 char mediaOper[16] =
"\0";
6098 char* mediaProp = NULL;
6099 char* propValue = NULL;
6101 if (!apstBtIfceHdl || !apMediaPlayerPath) {
6102 BTRCORELOG_ERROR (
"Invalid args!!!");
6107 switch (aenBTMediaOper) {
6108 case enBTMediaCtrlPlay:
6109 strcpy(mediaOper,
"Play");
6111 case enBTMediaCtrlPause:
6112 strcpy(mediaOper,
"Pause");
6114 case enBTMediaCtrlStop:
6115 strcpy(mediaOper,
"Stop");
6117 case enBTMediaCtrlNext:
6118 strcpy(mediaOper,
"Next");
6120 case enBTMediaCtrlPrevious:
6121 strcpy(mediaOper,
"Previous");
6123 case enBTMediaCtrlFastForward:
6124 strcpy(mediaOper,
"FastForward");
6126 case enBTMediaCtrlRewind:
6127 strcpy(mediaOper,
"Rewind");
6129 case enBTMediaCtrlVolumeUp:
6130 strcpy(mediaOper,
"VolumeUp");
6132 case enBTMediaCtrlVolumeDown:
6133 strcpy(mediaOper,
"VolumeDown");
6135 case enBTMediaCtrlEqlzrOff:
6136 mediaProp =
"Equalizer";
6139 case enBTMediaCtrlEqlzrOn:
6140 mediaProp =
"Equalizer";
6143 case enBTMediaCtrlShflOff:
6144 mediaProp =
"Shuffle";
6147 case enBTMediaCtrlShflAllTracks:
6148 mediaProp =
"Shuffle";
6149 propValue =
"alltracks";
6151 case enBTMediaCtrlShflGroup:
6152 mediaProp =
"Shuffle";
6153 propValue =
"group";
6155 case enBTMediaCtrlRptOff:
6156 mediaProp =
"Repeat";
6159 case enBTMediaCtrlRptSingleTrack:
6160 mediaProp =
"Repeat";
6161 propValue =
"singletrack";
6163 case enBTMediaCtrlRptAllTracks:
6164 mediaProp =
"Repeat";
6165 propValue =
"alltracks";
6167 case enBTMediaCtrlRptGroup:
6168 mediaProp =
"Repeat";
6169 propValue =
"group";
6177 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
6179 BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH,
6184 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
6186 DBUS_INTERFACE_PROPERTIES,
6189 DBusMessageIter lDBusMsgIter;
6190 DBusMessageIter lDBusMsgIterValue;
6191 const char* mediaPlayerIfce = BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH;
6192 const char* lDBusTypeAsString = DBUS_TYPE_STRING_AS_STRING;
6194 dbus_message_iter_init_append(lpDBusMsg, &lDBusMsgIter);
6195 dbus_message_iter_append_basic(&lDBusMsgIter, DBUS_TYPE_STRING, &mediaPlayerIfce);
6196 dbus_message_iter_append_basic(&lDBusMsgIter, DBUS_TYPE_STRING, &mediaProp);
6197 dbus_message_iter_open_container(&lDBusMsgIter, DBUS_TYPE_VARIANT, lDBusTypeAsString, &lDBusMsgIterValue);
6198 dbus_message_iter_append_basic(&lDBusMsgIterValue, DBUS_TYPE_STRING, &propValue);
6199 dbus_message_iter_close_container(&lDBusMsgIter, &lDBusMsgIterValue);
6203 BTRCORELOG_ERROR (
"Unknown Media Control Command!\n");
6207 if (lpDBusMsg == NULL) {
6208 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
6212 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
6213 dbus_message_unref(lpDBusMsg);
6216 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
6220 dbus_connection_flush(pstlhBtIfce->pDBusConn);
6227 void* apstBtIfceHdl,
6228 const char* apBtDataPath,
6233 if (!apstBtIfceHdl) {
6234 BTRCORELOG_ERROR (
"Inavalid args - BtIfceHdl : %p\n", apstBtIfceHdl);
6241 return btrCore_BTGetMediaIfceProperty(pstlhBtIfce->pDBusConn, apBtDataPath, BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH,
"State", pState);
6247 void* apstBtIfceHdl,
6248 const char* apBtMediaPlayerPath,
6249 const char* mediaProperty,
6250 void* mediaPropertyValue
6254 if (!apstBtIfceHdl) {
6255 BTRCORELOG_ERROR (
"Inavalid args - BtIfceHdl : %p\n", apstBtIfceHdl);
6262 return btrCore_BTGetMediaIfceProperty(pstlhBtIfce->pDBusConn, apBtMediaPlayerPath, BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH, mediaProperty, mediaPropertyValue);
6268 void* apstBtIfceHdl,
6269 const char* apBtMediaPlayerPath,
6270 unsigned int* aui32NumberOfItems
6274 if (!apstBtIfceHdl) {
6275 BTRCORELOG_ERROR (
"Inavalid args - BtIfceHdl : %p\n", apstBtIfceHdl);
6281 return btrCore_BTGetMediaIfceProperty (pstlhBtIfce->pDBusConn, apBtMediaPlayerPath, BT_DBUS_BLUEZ_MEDIA_FOLDER_PATH,
"NumberOfItems", (
void*)aui32NumberOfItems);
6288 void* apstBtIfceHdl,
6289 const char* apBtAdapterPath,
6290 char* mediaProperty,
6294 DBusMessage* lpDBusMsg = NULL;
6295 DBusMessage* lpDBusReply = NULL;
6297 DBusMessageIter lDBusMsgIter;
6298 DBusMessageIter lDBusMsgIterValue;
6299 const char* mediaPlayerPath = BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH;
6300 const char* lDBusTypeAsString = DBUS_TYPE_STRING_AS_STRING;
6302 char* mediaPlayerObjectPath = NULL;
6304 if (!apstBtIfceHdl || !pValue || !apBtAdapterPath)
6310 if (mediaPlayerObjectPath == NULL) {
6315 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
6316 mediaPlayerObjectPath,
6317 DBUS_INTERFACE_PROPERTIES,
6321 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
6325 dbus_message_iter_init_append(lpDBusMsg, &lDBusMsgIter);
6326 dbus_message_iter_append_basic(&lDBusMsgIter, DBUS_TYPE_STRING, &mediaPlayerPath);
6327 dbus_message_iter_append_basic(&lDBusMsgIter, DBUS_TYPE_STRING, &mediaProperty);
6328 dbus_message_iter_open_container(&lDBusMsgIter, DBUS_TYPE_VARIANT, lDBusTypeAsString, &lDBusMsgIterValue);
6329 dbus_message_iter_append_basic(&lDBusMsgIterValue, DBUS_TYPE_STRING, pValue);
6330 dbus_message_iter_close_container(&lDBusMsgIter, &lDBusMsgIterValue);
6332 dbus_error_init(&lDBusErr);
6333 lpDBusReply = dbus_connection_send_with_reply_and_block(pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
6334 dbus_message_unref(lpDBusMsg);
6337 BTRCORELOG_ERROR (
"lpDBusReply Null\n");
6338 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
6342 dbus_message_unref(lpDBusReply);
6344 dbus_connection_flush(pstlhBtIfce->pDBusConn);
6353 void* apstBtIfceHdl,
6354 const char* apBtmediaObjectPath,
6358 char* pcProperty =
"Track";
6359 DBusMessage* lpDBusMsg = NULL;
6360 DBusMessage* lpDBusReply = NULL;
6361 DBusMessageIter lDBusMsgIter;
6363 char* mediaInterfacePath = BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH;
6366 if (!apstBtIfceHdl || !apBtmediaObjectPath) {
6367 BTRCORELOG_ERROR (
"Media Object Path is NULL!!!");
6371 if (strstr(apBtmediaObjectPath,
"item")) {
6372 mediaInterfacePath = BT_DBUS_BLUEZ_MEDIA_ITEM_PATH;
6373 pcProperty =
"Metadata";
6376 BTRCORELOG_ERROR(
"[#####TESTING]Calling with : %s | %s | %s\n", mediaInterfacePath, pcProperty, apBtmediaObjectPath);
6379 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
6380 apBtmediaObjectPath,
6381 DBUS_INTERFACE_PROPERTIES,
6385 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
6389 dbus_message_iter_init_append(lpDBusMsg, &lDBusMsgIter);
6391 dbus_message_iter_append_basic(&lDBusMsgIter, DBUS_TYPE_STRING, &mediaInterfacePath);
6392 dbus_message_iter_append_basic(&lDBusMsgIter, DBUS_TYPE_STRING, &pcProperty);
6395 dbus_error_init(&lDBusErr);
6396 lpDBusReply = dbus_connection_send_with_reply_and_block(pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
6397 dbus_message_unref(lpDBusMsg);
6399 dbus_connection_flush(pstlhBtIfce->pDBusConn);
6402 if (btrCore_BTParseMediaTrackMetadata(lpDBusReply, apstBTMediaTrackInfo)) {
6403 BTRCORELOG_ERROR (
"Failed to parse MetaData !\n");
6404 dbus_message_unref (lpDBusReply);
6409 BTRCORELOG_ERROR (
"lpDBusReply NULL\n");
6410 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
6414 dbus_message_unref (lpDBusReply);
6420 tBTMediaItemId aBTcurrMediaItemId,
6421 tBTMediaItemId aBTdestMediaItemId
6423 tBTMediaItemId currItemId = 0;
6424 tBTMediaItemId destItemId = 0;
6425 tBTMediaItemId comnItemId = 0;
6429 while (destItemId = destItemId*10 + aBTdestMediaItemId/powerIdx%10, aBTdestMediaItemId/(powerIdx*=10));
6432 while (currItemId = currItemId*10 + aBTcurrMediaItemId/powerIdx%10, aBTcurrMediaItemId/(powerIdx*=10));
6435 while (comnItemId = comnItemId*10 + currItemId*10/powerIdx%10, powerIdx*=10, (currItemId*10/powerIdx || destItemId*10/powerIdx) && destItemId%powerIdx == currItemId%powerIdx);
6442 void* apstBtIfceHdl,
6443 const char* apBtmediaPlayerObjectPath,
6444 const char* apBtdestMediaFolderPath
6447 DBusMessage* lpDBusMsg = NULL;
6448 DBusMessage* lpDBusReply = NULL;
6451 if (!apstBtIfceHdl || !apBtmediaPlayerObjectPath || !apBtdestMediaFolderPath) {
6452 BTRCORELOG_ERROR (
"Invalid Args!!!\n");
6457 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
6458 apBtmediaPlayerObjectPath,
6459 BT_DBUS_BLUEZ_MEDIA_FOLDER_PATH,
6462 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
6466 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_OBJECT_PATH, &apBtdestMediaFolderPath, DBUS_TYPE_INVALID);
6468 dbus_error_init(&lDBusErr);
6470 lpDBusReply = dbus_connection_send_with_reply_and_block (pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
6472 dbus_message_unref(lpDBusMsg);
6474 dbus_connection_flush(pstlhBtIfce->pDBusConn);
6477 dbus_message_unref (lpDBusReply);
6486 void* apstBtIfceHdl,
6487 const char* apBtMediaPlayerObjectPath,
6489 unsigned int apBtMediaFolderStartIndex,
6490 unsigned int apBtMediaFolderEndIndex,
6491 const char* apBtMediaFilter,
6492 int apBtMediaFilterSize
6495 DBusMessage* lpDBusMsg = NULL;
6496 DBusMessage* lpDBusReply = NULL;
6498 DBusMessageIter lDBusMsgIter;
6499 DBusMessageIter lDBusMsgIterArr;
6502 if (!apstBtIfceHdl || !apBtMediaPlayerObjectPath) {
6503 BTRCORELOG_ERROR (
"Invalid Args!!!\n");
6507 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
6508 apBtMediaPlayerObjectPath,
6509 BT_DBUS_BLUEZ_MEDIA_FOLDER_PATH,
6512 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
6516 dbus_message_iter_init_append (lpDBusMsg, &lDBusMsgIter);
6517 dbus_message_iter_open_container (&lDBusMsgIter,
6519 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
6520 DBUS_TYPE_STRING_AS_STRING
6521 DBUS_TYPE_VARIANT_AS_STRING
6522 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
6524 if (apBtMediaFolderEndIndex) {
6526 DBusMessageIter lDBusMsgIterDict, lDBusMsgIterVariant;
6527 char* key =
"Start";
6528 int type = DBUS_TYPE_UINT32;
6530 dbus_message_iter_open_container (&lDBusMsgIterArr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDict);
6531 dbus_message_iter_append_basic (&lDBusMsgIterDict, DBUS_TYPE_STRING, &key);
6532 dbus_message_iter_open_container (&lDBusMsgIterDict, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterVariant);
6533 dbus_message_iter_append_basic (&lDBusMsgIterVariant, type, &apBtMediaFolderStartIndex);
6534 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterVariant);
6535 dbus_message_iter_close_container (&lDBusMsgIterArr, &lDBusMsgIterDict);
6538 DBusMessageIter lDBusMsgIterDict, lDBusMsgIterVariant;
6540 int type = DBUS_TYPE_UINT32;
6542 dbus_message_iter_open_container (&lDBusMsgIterArr, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDict);
6543 dbus_message_iter_append_basic (&lDBusMsgIterDict, DBUS_TYPE_STRING, &key);
6544 dbus_message_iter_open_container (&lDBusMsgIterDict, DBUS_TYPE_VARIANT, (
char *)&type, &lDBusMsgIterVariant);
6545 dbus_message_iter_append_basic (&lDBusMsgIterVariant, type, &apBtMediaFolderEndIndex);
6546 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterVariant);
6547 dbus_message_iter_close_container (&lDBusMsgIterArr, &lDBusMsgIterDict);
6568 dbus_message_iter_close_container (&lDBusMsgIter, &lDBusMsgIterArr);
6570 dbus_error_init(&lDBusErr);
6571 lpDBusReply = dbus_connection_send_with_reply_and_block (pstlhBtIfce->pDBusConn, lpDBusMsg, DBUS_TIMEOUT_INFINITE, &lDBusErr);
6572 dbus_message_unref(lpDBusMsg);
6575 BTRCORELOG_ERROR (
"lpDBusReply Null\n");
6576 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
6580 dbus_connection_flush(pstlhBtIfce->pDBusConn);
6583 DBusMessageIter lDBusReplyIter;
6584 DBusMessageIter dictMsgIter, subDictMsgIter;
6585 DBusMessageIter element, subElementMgsIter, subVarElementMsgIter;
6588 unsigned int ui32Value = 0;
6589 int dbus_type = DBUS_TYPE_INVALID;
6591 dbus_message_iter_init(lpDBusReply, &lDBusReplyIter);
6593 if ((dbus_message_iter_get_arg_type (&lDBusReplyIter)) == DBUS_TYPE_INVALID) {
6594 BTRCORELOG_ERROR (
"lDBusReplyIter - DBUS_TYPE_INVALID\n");
6595 dbus_message_unref(lpDBusReply);
6599 dbus_message_iter_recurse(&lDBusReplyIter, &dictMsgIter);
6601 while ((dbus_type = dbus_message_iter_get_arg_type(&dictMsgIter)) != DBUS_TYPE_INVALID) {
6602 if (DBUS_TYPE_DICT_ENTRY == dbus_type) {
6603 dbus_message_iter_recurse(&dictMsgIter, &element);
6605 if (DBUS_TYPE_OBJECT_PATH == dbus_message_iter_get_arg_type(&element)) {
6606 dbus_message_iter_get_basic(&element, &pcKey);
6608 dbus_message_iter_next(&element);
6611 dbus_message_iter_recurse(&element, &subDictMsgIter);
6613 btrCore_BTParseMediaTrackMetadata ();
6616 if (!dbus_message_iter_has_next(&dictMsgIter)) {
6620 dbus_message_iter_next(&dictMsgIter);
6625 dbus_message_unref(lpDBusReply);
6633 void* apstBtIfceHdl,
6634 const char* apBtMediaItemObjectPath
6637 DBusMessage* lpDBusMsg = NULL;
6638 dbus_bool_t lDBusOp;
6640 if (!apstBtIfceHdl || !apBtMediaItemObjectPath) {
6641 BTRCORELOG_ERROR (
"Invalid Args!!!\n");
6646 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
6647 apBtMediaItemObjectPath,
6648 BT_DBUS_BLUEZ_MEDIA_ITEM_PATH,
6651 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
6655 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
6657 dbus_message_unref(lpDBusMsg);
6660 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
6664 dbus_connection_flush(pstlhBtIfce->pDBusConn);
6671 BtrCore_BTAddTrackItemToPlayList (
6672 void* apstBtIfceHdl,
6673 const char* apBtMediaItemObjectPath
6676 DBusMessage* lpDBusMsg = NULL;
6677 dbus_bool_t lDBusOp;
6679 if (!apstBtIfceHdl || !apBtMediaItemObjectPath) {
6680 BTRCORELOG_ERROR (
"Invalid Args!!!\n");
6685 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
6686 apBtMediaItemObjectPath,
6687 BT_DBUS_BLUEZ_MEDIA_ITEM_PATH,
6690 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
6694 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
6696 dbus_message_unref(lpDBusMsg);
6699 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
6703 dbus_connection_flush(pstlhBtIfce->pDBusConn);
6711 void* apstBtIfceHdl,
6712 const char* apBtAdapter
6715 DBusMessage* lpDBusMsg = NULL;
6716 DBusPendingCall* lpDBusPendCAdv = NULL;
6717 DBusMessageIter lDBusMsgIterAdv;
6718 DBusMessageIter lDBusMsgIterDictAdv;
6719 const char* lpBtLeGattAdvEpPath;
6721 if ((NULL == apstBtIfceHdl) || (NULL == apBtAdapter)) {
6726 BTRCORELOG_INFO(
"Registering advertisement\n");
6728 memset(pstlhBtIfce->stBTLeCustAdvt.pui8AdvertPath,
'\0',
BT_MAX_STR_LEN);
6729 strncpy(pstlhBtIfce->stBTLeCustAdvt.pui8AdvertPath, apBtAdapter, strlen(apBtAdapter));
6730 strncat(pstlhBtIfce->stBTLeCustAdvt.pui8AdvertPath, BT_LE_GATT_SERVER_ADVERTISEMENT, (
sizeof(pstlhBtIfce->stBTLeCustAdvt.pui8AdvertPath) - strlen(pstlhBtIfce->stBTLeCustAdvt.pui8AdvertPath) -1));
6732 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
6734 BT_DBUS_BLUEZ_LE_ADV_MGR_PATH,
6735 "RegisterAdvertisement");
6737 BTRCORELOG_ERROR(
"Can't allocate new method call\n");
6741 lpBtLeGattAdvEpPath = pstlhBtIfce->stBTLeCustAdvt.pui8AdvertPath;
6742 dbus_message_iter_init_append(lpDBusMsg, &lDBusMsgIterAdv);
6743 dbus_message_iter_append_basic(&lDBusMsgIterAdv, DBUS_TYPE_OBJECT_PATH, &lpBtLeGattAdvEpPath);
6745 dbus_message_iter_open_container(&lDBusMsgIterAdv,
6747 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
6748 DBUS_TYPE_STRING_AS_STRING
6749 DBUS_TYPE_VARIANT_AS_STRING
6750 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
6751 &lDBusMsgIterDictAdv);
6753 dbus_message_iter_close_container(&lDBusMsgIterAdv, &lDBusMsgIterDictAdv);
6756 if (!dbus_connection_send_with_reply(pstlhBtIfce->pDBusConn, lpDBusMsg, &lpDBusPendCAdv, -1)) {
6758 BTRCORELOG_ERROR(
"failed to send message!\n");
6761 dbus_pending_call_set_notify(lpDBusPendCAdv, btrCore_BTPendingCallCheckReply, NULL, NULL);
6763 dbus_connection_flush(pstlhBtIfce->pDBusConn);
6764 dbus_message_unref(lpDBusMsg);
6766 BTRCORELOG_ERROR(
"Exiting!!!!\n");
6772 void* apstBtIfceHdl,
6773 const char* apBtAdapter
6776 DBusMessage* lpDBusMsg = NULL;
6777 DBusPendingCall* lpDBusPendC = NULL;
6780 DBusMessageIter lDBusMsgIter;
6781 DBusMessageIter lDBusMsgIterDict;
6782 dbus_bool_t lDBusOp;
6784 const char* lpBtLeGattSrvEpPath = BT_LE_GATT_SERVER_ENDPOINT;
6786 if (!apstBtIfceHdl || !apBtAdapter)
6789 if (!strncmp(apBtAdapter, pstlhBtIfce->pcBTDAdapterPath, strlen(pstlhBtIfce->pcBTDAdapterPath))) {
6793 if (!pstlhBtIfce->pcBTDAdapterAddr) {
6795 lunBtOpAdapProp.enBtAdapterProp = enBTAdPropAddress;
6802 lCurAdapterAddress)) {
6803 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
6808 strncpy(lCurAdapterAddress, pstlhBtIfce->pcBTDAdapterAddr, (strlen(pstlhBtIfce->pcBTDAdapterAddr) <
BT_MAX_DEV_PATH_LEN) ? strlen(pstlhBtIfce->pcBTDAdapterAddr) :
BT_MAX_DEV_PATH_LEN - 1);
6811 char *current_pos = strchr(lCurAdapterAddress,
':');
6812 while (current_pos){
6814 current_pos = strchr(current_pos,
':');
6819 strncpy(pstlhBtIfce->pcBTAdapterGattSrvEpPath, pstlhBtIfce->pcBTDAdapterPath, (strlen(pstlhBtIfce->pcBTDAdapterPath) <
BT_MAX_DEV_PATH_LEN) ? strlen(pstlhBtIfce->pcBTDAdapterPath) :
BT_MAX_DEV_PATH_LEN-1);
6820 strncat(pstlhBtIfce->pcBTAdapterGattSrvEpPath,
"/dev_", (
sizeof(pstlhBtIfce->pcBTAdapterGattSrvEpPath) - strlen(pstlhBtIfce->pcBTAdapterGattSrvEpPath) -1));
6821 strncat(pstlhBtIfce->pcBTAdapterGattSrvEpPath, lCurAdapterAddress, strlen(lCurAdapterAddress));
6823 lpBtLeGattSrvEpPath = pstlhBtIfce->pcBTAdapterGattSrvEpPath;
6826 lpBtLeGattSrvEpPath = BT_LE_GATT_SERVER_ENDPOINT;
6829 dbus_error_init(&lDBusErr);
6830 lDBusOp = dbus_connection_try_register_object_path(pstlhBtIfce->pDBusConn, lpBtLeGattSrvEpPath, &gDBusLeGattEndpointVTable, pstlhBtIfce, &lDBusErr);
6832 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
6833 BTRCORELOG_ERROR (
"Can't Register Le Gatt Object - %s\n", lpBtLeGattSrvEpPath);
6835 if (strcmp(lDBusErr.name, DBUS_ERROR_OBJECT_PATH_IN_USE) != 0)
6840 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
6842 BT_DBUS_BLUEZ_GATT_MGR_PATH,
6843 "RegisterApplication");
6845 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
6849 dbus_message_iter_init_append (lpDBusMsg, &lDBusMsgIter);
6850 dbus_message_iter_append_basic (&lDBusMsgIter, DBUS_TYPE_OBJECT_PATH, &lpBtLeGattSrvEpPath);
6852 dbus_message_iter_open_container(&lDBusMsgIter,
6854 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
6855 DBUS_TYPE_STRING_AS_STRING
6856 DBUS_TYPE_VARIANT_AS_STRING
6857 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
6862 dbus_message_iter_close_container (&lDBusMsgIter, &lDBusMsgIterDict);
6865 if (!dbus_connection_send_with_reply(pstlhBtIfce->pDBusConn, lpDBusMsg, &lpDBusPendC, -1)) {
6866 BTRCORELOG_ERROR (
"failed to send message!\n");
6870 dbus_pending_call_set_notify(lpDBusPendC, btrCore_BTPendingCallCheckReply, NULL, NULL);
6872 dbus_connection_flush(pstlhBtIfce->pDBusConn);
6873 dbus_message_unref(lpDBusMsg);
6881 void* apstBtIfceHdl,
6882 const char* apBtAdapter
6885 DBusMessage* lpDBusMsg = NULL;
6886 dbus_bool_t lDBusOp;
6887 const char* lpBtLeGattSrvEpPath;
6888 const char* lpBtLeGattAdvEpPath;
6890 if (!apstBtIfceHdl || !apBtAdapter)
6893 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
6895 BT_DBUS_BLUEZ_LE_ADV_MGR_PATH,
6896 "UnregisterAdvertisement");
6898 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
6902 lpBtLeGattAdvEpPath = pstlhBtIfce->stBTLeCustAdvt.pui8AdvertPath;
6903 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_OBJECT_PATH, &lpBtLeGattAdvEpPath, DBUS_TYPE_INVALID);
6905 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
6906 dbus_message_unref(lpDBusMsg);
6909 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
6914 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
6916 BT_DBUS_BLUEZ_GATT_MGR_PATH,
6917 "UnregisterApplication");
6919 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
6923 lpBtLeGattSrvEpPath = (pstlhBtIfce->pcBTAdapterGattSrvEpPath[0] ==
'\0') ? BT_LE_GATT_SERVER_ENDPOINT : pstlhBtIfce->pcBTAdapterGattSrvEpPath;
6924 dbus_message_append_args(lpDBusMsg, DBUS_TYPE_OBJECT_PATH, &lpBtLeGattSrvEpPath, DBUS_TYPE_INVALID);
6926 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
6927 dbus_message_unref(lpDBusMsg);
6930 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
6939 if (!pstlhBtIfce->pcBTDAdapterAddr) {
6941 lunBtOpAdapProp.enBtAdapterProp = enBTAdPropAddress;
6948 lCurAdapterAddress)) {
6949 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
6954 strncpy(lCurAdapterAddress, pstlhBtIfce->pcBTDAdapterAddr, (strlen(pstlhBtIfce->pcBTDAdapterAddr) <
BT_MAX_DEV_PATH_LEN) ? strlen(pstlhBtIfce->pcBTDAdapterAddr) :
BT_MAX_DEV_PATH_LEN - 1);
6958 if (pstlhBtIfce->fpcBTLeGattPath) {
6959 pstlhBtIfce->fpcBTLeGattPath(enBTAdvertisement, enBTLeGattOpUnknown, NULL, lCurAdapterAddress, enBTDevStUnknown, (
void*)lpstBTLeGattInfo, pstlhBtIfce->pcBLePathUserData);
6962 for (
int serviceIndex = 0; serviceIndex < lpstBTLeGattInfo->nNumGattServices; serviceIndex++) {
6963 stBTLeGattService *lpstBTLeGattService = &lpstBTLeGattInfo->astBTRGattService[serviceIndex];
6964 btrCore_BTReleaseLEGattObjPath(lpstBTLeGattService->servicePath, (
void*)pstlhBtIfce);
6966 for (
int index = 0; index < lpstBTLeGattService->ui16NumberOfGattChar; index++) {
6967 stBTLeGattChar *lpstBTLeGattChar = &lpstBTLeGattService->astBTRGattChar[index];
6968 btrCore_BTReleaseLEGattObjPath(lpstBTLeGattChar->charPath, (
void*)pstlhBtIfce);
6970 for (
int DescIndex = 0; DescIndex < lpstBTLeGattChar->ui16NumberOfGattDesc; DescIndex++) {
6971 stBTLeGattDesc *lpstBTLeGattDesc = &lpstBTLeGattChar->atBTRGattDesc[DescIndex];
6972 btrCore_BTReleaseLEGattObjPath(lpstBTLeGattDesc->descPath, (
void*)pstlhBtIfce);
6977 lDBusOp = dbus_connection_unregister_object_path(pstlhBtIfce->pDBusConn, lpBtLeGattSrvEpPath);
6979 BTRCORELOG_ERROR (
"Can't Unregister Object\n");
6984 dbus_connection_flush(pstlhBtIfce->pDBusConn);
6986 btrCore_BTUnRegisterGattService((
void*)pstlhBtIfce, NULL);
6988 memset(pstlhBtIfce->stBTLeCustAdvt.pui8AdvertPath,
'\0',
BT_MAX_STR_LEN);
6996 void* apstBtIfceHdl,
6997 const char* apBtGattPath,
7000 char* apLeGatOparg1,
7001 char* apLeGatOparg2,
7005 DBusMessage* lpDBusMsg = NULL;
7006 DBusMessage* lpDBusReply = NULL;
7008 char lcBtGattOpString[64] =
"\0";
7009 char* lpBtGattInterface = NULL;
7012 if (!apstBtIfceHdl || !apBtGattPath) {
7013 BTRCORELOG_ERROR (
"LE Gatt Path is NULL!!!");
7018 if (aenBTOpIfceType == enBTGattCharacteristic) {
7019 lpBtGattInterface = BT_DBUS_BLUEZ_GATT_CHAR_PATH;
7021 else if (aenBTOpIfceType == enBTGattDescriptor) {
7022 lpBtGattInterface = BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH;
7025 switch (aenBTLeGattOp) {
7026 case enBTLeGattOpReadValue:
7027 strcpy(lcBtGattOpString,
"ReadValue");
7029 case enBTLeGattOpWriteValue:
7030 strcpy(lcBtGattOpString,
"WriteValue");
7032 case enBTLeGattOpStartNotify:
7033 strcpy(lcBtGattOpString,
"StartNotify");
7035 case enBTLeGattOpStopNotify:
7036 strcpy(lcBtGattOpString,
"StopNotify");
7038 case enBTLeGattOpUnknown:
7045 BTRCORELOG_ERROR (
"Invalid enBTLeGattOp Option %d !!!", aenBTLeGattOp);
7049 lpDBusMsg = dbus_message_new_method_call(BT_DBUS_BLUEZ_PATH,
7054 BTRCORELOG_ERROR (
"Can't allocate new method call\n");
7058 if (aenBTLeGattOp == enBTLeGattOpWriteValue && apLeGatOparg2) {
7060 BTRCORELOG_TRACE (
"apLeGatOparg2 : %s \n", apLeGatOparg2);
7062 int lWriteByteDataLen = 0;
7063 unsigned short u16idx = 0;
7064 unsigned char u8val = 0;
7065 unsigned char *laptr = (
unsigned char*)apLeGatOparg2;
7072 u8val = *laptr - ((*laptr <= 'f' && *laptr >=
'a')? (
'a'-10) : (*laptr <= 'F' && *laptr >=
'A')? (
'A'-10) :
'0');
7075 lpcLeWriteByteData[u16idx++/2] |= u8val;
7078 lpcLeWriteByteData[u16idx++/2] = u8val << 4;
7084 lpcLeWriteByteData[u16idx] =
'\0';
7085 lWriteByteDataLen = u16idx/2;
7087 for(
int i = 0; i <= lWriteByteDataLen; i++ ) {
7088 BTRCORELOG_TRACE (
"lpcLeWriteByteData[%d] : %02x\n", i, lpcLeWriteByteData[i]);
7091 const unsigned char* lpcLeWriteByteDataC = ((
unsigned char*)lpcLeWriteByteData);
7093 dbus_message_append_args (lpDBusMsg, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &lpcLeWriteByteDataC, lWriteByteDataLen, DBUS_TYPE_INVALID);
7096 DBusMessageIter lDBusMsgIter, lDBusMsgIterDict;
7097 dbus_message_iter_init_append(lpDBusMsg, &lDBusMsgIter);
7098 dbus_message_iter_open_container(&lDBusMsgIter,
7100 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
7101 DBUS_TYPE_STRING_AS_STRING
7102 DBUS_TYPE_VARIANT_AS_STRING
7103 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
7106 DBusMessageIter lDBusMsgIterDictStr, lDBusMsgIterVariant;
7107 char* lpcKey =
"offset";
7108 unsigned short lus16Value = 0;
7109 int i32DBusType = DBUS_TYPE_UINT16;
7111 dbus_message_iter_open_container(&lDBusMsgIterDict, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStr);
7112 dbus_message_iter_append_basic (&lDBusMsgIterDictStr, DBUS_TYPE_STRING, &lpcKey);
7113 dbus_message_iter_open_container (&lDBusMsgIterDictStr, DBUS_TYPE_VARIANT, (
char *)&i32DBusType, &lDBusMsgIterVariant);
7114 dbus_message_iter_append_basic (&lDBusMsgIterVariant, i32DBusType, &lus16Value);
7115 dbus_message_iter_close_container (&lDBusMsgIterDictStr, &lDBusMsgIterVariant);
7116 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterDictStr);
7120 DBusMessageIter lDBusMsgIterDictStr, lDBusMsgIterVariant;
7121 char* lpcKey =
"device";
7122 char* lpcValue = apLeGatOparg1;
7123 int i32DBusType = DBUS_TYPE_OBJECT_PATH;
7125 dbus_message_iter_open_container(&lDBusMsgIterDict, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStr);
7126 dbus_message_iter_append_basic (&lDBusMsgIterDictStr, DBUS_TYPE_STRING, &lpcKey);
7127 dbus_message_iter_open_container (&lDBusMsgIterDictStr, DBUS_TYPE_VARIANT, (
char *)&i32DBusType, &lDBusMsgIterVariant);
7128 dbus_message_iter_append_basic (&lDBusMsgIterVariant, i32DBusType, &lpcValue);
7129 dbus_message_iter_close_container (&lDBusMsgIterDictStr, &lDBusMsgIterVariant);
7130 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterDictStr);
7133 dbus_message_iter_close_container (&lDBusMsgIter, &lDBusMsgIterDict);
7136 else if (aenBTLeGattOp == enBTLeGattOpReadValue) {
7138 DBusMessageIter lDBusMsgIter, lDBusMsgIterDict;
7139 dbus_message_iter_init_append(lpDBusMsg, &lDBusMsgIter);
7140 dbus_message_iter_open_container(&lDBusMsgIter,
7142 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
7143 DBUS_TYPE_STRING_AS_STRING
7144 DBUS_TYPE_VARIANT_AS_STRING
7145 DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
7148 DBusMessageIter lDBusMsgIterDictStr, lDBusMsgIterVariant;
7149 char* lpcKey =
"offset";
7150 unsigned short lus16Value = 0;
7151 int i32DBusType = DBUS_TYPE_UINT16;
7153 dbus_message_iter_open_container(&lDBusMsgIterDict, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStr);
7154 dbus_message_iter_append_basic (&lDBusMsgIterDictStr, DBUS_TYPE_STRING, &lpcKey);
7155 dbus_message_iter_open_container (&lDBusMsgIterDictStr, DBUS_TYPE_VARIANT, (
char *)&i32DBusType, &lDBusMsgIterVariant);
7156 dbus_message_iter_append_basic (&lDBusMsgIterVariant, i32DBusType, &lus16Value);
7157 dbus_message_iter_close_container (&lDBusMsgIterDictStr, &lDBusMsgIterVariant);
7158 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterDictStr);
7161 DBusMessageIter lDBusMsgIterDictStr, lDBusMsgIterVariant;
7162 char* lpcKey =
"device";
7163 char* lpcValue = apLeGatOparg1;
7164 int i32DBusType = DBUS_TYPE_OBJECT_PATH;
7166 dbus_message_iter_open_container(&lDBusMsgIterDict, DBUS_TYPE_DICT_ENTRY, NULL, &lDBusMsgIterDictStr);
7167 dbus_message_iter_append_basic (&lDBusMsgIterDictStr, DBUS_TYPE_STRING, &lpcKey);
7168 dbus_message_iter_open_container (&lDBusMsgIterDictStr, DBUS_TYPE_VARIANT, (
char *)&i32DBusType, &lDBusMsgIterVariant);
7169 dbus_message_iter_append_basic (&lDBusMsgIterVariant, i32DBusType, &lpcValue);
7170 dbus_message_iter_close_container (&lDBusMsgIterDictStr, &lDBusMsgIterVariant);
7171 dbus_message_iter_close_container (&lDBusMsgIterDict, &lDBusMsgIterDictStr);
7173 dbus_message_iter_close_container (&lDBusMsgIter, &lDBusMsgIterDict);
7176 if (aenBTLeGattOp == enBTLeGattOpReadValue) {
7178 dbus_error_init(&lDBusErr);
7179 lpDBusReply = dbus_connection_send_with_reply_and_block(pstlhBtIfce->pDBusConn, lpDBusMsg, -1, &lDBusErr);
7180 dbus_message_unref(lpDBusMsg);
7183 BTRCORELOG_ERROR (
"Send Reply Block Method Failed!!!\n");
7184 btrCore_BTHandleDusError(&lDBusErr, __LINE__, __FUNCTION__);
7188 DBusMessageIter arg_i, element_i;
7189 if (!dbus_message_iter_init(lpDBusReply, &arg_i)) {
7190 BTRCORELOG_ERROR (
"lpDBusReply has no information.");
7194 int dbus_type = DBUS_TYPE_INVALID;
7196 char hexValue[] =
"0123456789abcdef";
7197 unsigned short u16idx = 0;
7200 memset (byteValue, 0,
sizeof(byteValue));
7202 dbus_message_iter_recurse(&arg_i, &element_i);
7204 while ((dbus_type = dbus_message_iter_get_arg_type(&element_i)) != DBUS_TYPE_INVALID) {
7206 if (dbus_type == DBUS_TYPE_BYTE) {
7207 dbus_message_iter_get_basic(&element_i, &ch);
7208 byteValue[u16idx++] = hexValue[ch >> 4];
7209 byteValue[u16idx++] = hexValue[ch & 0x0F];
7211 if (!dbus_message_iter_next(&element_i)) {
7215 byteValue[u16idx] =
'\0';
7217 BTRCORELOG_DEBUG (
"rpLeOpRes : %s\n", rpLeOpRes);
7218 dbus_message_unref(lpDBusReply);
7221 dbus_bool_t lDBusOp;
7223 lDBusOp = dbus_connection_send(pstlhBtIfce->pDBusConn, lpDBusMsg, NULL);
7224 dbus_message_unref(lpDBusMsg);
7227 BTRCORELOG_ERROR (
"Not enough memory for message send\n");
7231 dbus_connection_flush(pstlhBtIfce->pDBusConn);
7248 if(dbus_connection_read_write_dispatch(pstlhBtIfce->pDBusConn, 25) !=
TRUE) {
7258 BtrCore_BTRegisterAdapterStatusUpdateCb (
7259 void* apstBtIfceHdl,
7260 fPtr_BtrCore_BTAdapterStatusUpdateCb afpcBAdapterStatusUpdate,
7265 if (!apstBtIfceHdl || !afpcBAdapterStatusUpdate)
7269 pstlhBtIfce->fpcBAdapterStatusUpdate = afpcBAdapterStatusUpdate;
7270 pstlhBtIfce->pcBAdapterStatusUserData = apUserData;
7277 BtrCore_BTRegisterDevStatusUpdateCb (
7278 void* apstBtIfceHdl,
7279 fPtr_BtrCore_BTDevStatusUpdateCb afpcBDevStatusUpdate,
7284 if (!apstBtIfceHdl || !afpcBDevStatusUpdate)
7288 pstlhBtIfce->fpcBDevStatusUpdate = afpcBDevStatusUpdate;
7289 pstlhBtIfce->pcBDevStatusUserData = apUserData;
7296 BtrCore_BTRegisterMediaStatusUpdateCb (
7297 void* apstBtIfceHdl,
7298 fPtr_BtrCore_BTMediaStatusUpdateCb afpcBMediaStatusUpdate,
7303 if (!apstBtIfceHdl || !afpcBMediaStatusUpdate)
7307 pstlhBtIfce->fpcBMediaStatusUpdate = afpcBMediaStatusUpdate;
7308 pstlhBtIfce->pcBMediaStatusUserData = apUserData;
7314 BtrCore_BTRegisterConnIntimationCb (
7315 void* apstBtIfceHdl,
7316 fPtr_BtrCore_BTConnIntimCb afpcBConnIntim,
7321 if (!apstBtIfceHdl || !afpcBConnIntim)
7325 pstlhBtIfce->fpcBConnectionIntimation = afpcBConnIntim;
7326 pstlhBtIfce->pcBConnIntimUserData = apUserData;
7333 BtrCore_BTRegisterConnAuthCb (
7334 void* apstBtIfceHdl,
7335 fPtr_BtrCore_BTConnAuthCb afpcBConnAuth,
7340 if (!apstBtIfceHdl || !afpcBConnAuth)
7344 pstlhBtIfce->fpcBConnectionAuthentication = afpcBConnAuth;
7345 pstlhBtIfce->pcBConnAuthUserData = apUserData;
7352 BtrCore_BTRegisterNegotiateMediaCb (
7353 void* apstBtIfceHdl,
7354 const char* apBtAdapter,
7355 fPtr_BtrCore_BTNegotiateMediaCb afpcBNegotiateMedia,
7360 if (!apstBtIfceHdl || !apBtAdapter || !afpcBNegotiateMedia)
7364 pstlhBtIfce->fpcBNegotiateMedia = afpcBNegotiateMedia;
7365 pstlhBtIfce->pcBNegMediaUserData = apUserData;
7372 BtrCore_BTRegisterTransportPathMediaCb (
7373 void* apstBtIfceHdl,
7374 const char* apBtAdapter,
7375 fPtr_BtrCore_BTTransportPathMediaCb afpcBTransportPathMedia,
7380 if (!apstBtIfceHdl || !apBtAdapter || !afpcBTransportPathMedia)
7384 pstlhBtIfce->fpcBTransportPathMedia = afpcBTransportPathMedia;
7385 pstlhBtIfce->pcBTransPathMediaUserData = apUserData;
7392 BtrCore_BTRegisterMediaPlayerPathCb (
7393 void* apstBtIfceHdl,
7394 const char* apBtAdapter,
7395 fPtr_BtrCore_BTMediaPlayerPathCb afpcBTMediaPlayerPath,
7400 if (!apstBtIfceHdl || !apBtAdapter || !afpcBTMediaPlayerPath)
7404 pstlhBtIfce->fpcBTMediaPlayerPath = afpcBTMediaPlayerPath;
7405 pstlhBtIfce->pcBMediaPlayerPathUserData = apUserData;
7412 BtrCore_BTRegisterMediaBrowserUpdateCb (
7413 void* apstBtIfceHdl,
7414 fPtr_BtrCore_BTMediaBrowserPathCb afpcBTMediaBrowserPath,
7419 if (!apstBtIfceHdl || !afpcBTMediaBrowserPath)
7423 pstlhBtIfce->fpcBTMediaBrowserPath = afpcBTMediaBrowserPath;
7424 pstlhBtIfce->pcBMediaBrowserPathUserData = apUserData;
7431 BtrCore_BTRegisterLEGattInfoCb (
7432 void* apstBtIfceHdl,
7433 const char* apBtAdapter,
7434 fPtr_BtrCore_BTLeGattPathCb afpcBtLeGattPath,
7439 if (!apstBtIfceHdl || !apBtAdapter || !afpcBtLeGattPath)
7443 pstlhBtIfce->fpcBTLeGattPath = afpcBtLeGattPath;
7444 pstlhBtIfce->pcBLePathUserData = apUserData;
7451 BtrCore_BTRegisterLEAdvInfoCb (
7452 void* apstBtIfceHdl,
7453 const char* apBtAdapter,
7454 fPtr_BtrCore_BTLeAdvertisementCb afpcBtLeAdvPath,
7459 if (!apstBtIfceHdl || !apBtAdapter || !afpcBtLeAdvPath) {
7465 pstlhBtIfce->fpcBTLeAdvPath = afpcBtLeAdvPath;
7466 pstlhBtIfce->pcBLeAdvUserData = apUserData;
7480 static DBusHandlerResult
7481 btrCore_BTDBusConnectionFilterCb (
7482 DBusConnection* apDBusConn,
7483 DBusMessage* apDBusMsg,
7487 int li32MessageType;
7491 const char* lpcSender = NULL;
7492 const char* lpcDestination = NULL;
7495 BTRCORELOG_DEBUG (
"Connection Filter Activated....\n");
7497 if (!apDBusConn || !apDBusMsg || !apvUserData) {
7498 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
7502 pstBTAdapterInfo = &pstlhBtIfce->lstBTAdapterInfo;
7503 pstBTDeviceInfo = &pstlhBtIfce->lstBTDeviceInfo;
7504 pstBTMediaInfo = &pstlhBtIfce->lstBTMediaInfo;
7509 pstBTDeviceInfo->i32RSSI = INT_MIN;
7511 li32MessageType = dbus_message_get_type(apDBusMsg);
7512 lpcSender = dbus_message_get_sender(apDBusMsg);
7513 lpcDestination = dbus_message_get_destination(apDBusMsg);
7515 BTRCORELOG_INFO (
"%s Sender=%s -> Dest=%s Path=%s; Interface=%s; Member=%s\n",
7516 btrCore_DBusType2Name(li32MessageType),
7517 lpcSender ? lpcSender :
"Null",
7518 lpcDestination ? lpcDestination :
"Null",
7519 dbus_message_get_path(apDBusMsg),
7520 dbus_message_get_interface(apDBusMsg),
7521 dbus_message_get_member(apDBusMsg));
7522 const char* lSignature = dbus_message_get_signature(apDBusMsg);
7523 BTRCORELOG_TRACE(
"Signature is %s\n", lSignature);
7525 if (li32MessageType == DBUS_MESSAGE_TYPE_ERROR) {
7526 const char* lpcError = dbus_message_get_error_name(apDBusMsg);
7527 BTRCORELOG_ERROR (
"Error = %s\n", lpcError ? lpcError : NULL);
7529 else if (dbus_message_is_signal(apDBusMsg, DBUS_INTERFACE_PROPERTIES,
"PropertiesChanged")) {
7530 BTRCORELOG_DEBUG (
"Property Changed!\n");
7532 DBusMessageIter lDBusMsgIter;
7533 const char* lpcDBusIface = NULL;
7535 dbus_message_iter_init(apDBusMsg, &lDBusMsgIter);
7536 dbus_message_iter_get_basic(&lDBusMsgIter, &lpcDBusIface);
7537 dbus_message_iter_next(&lDBusMsgIter);
7539 if (dbus_message_iter_get_arg_type(&lDBusMsgIter) == DBUS_TYPE_ARRAY) {
7541 if (!strcmp(lpcDBusIface, BT_DBUS_BLUEZ_ADAPTER_PATH)) {
7542 BTRCORELOG_INFO (
"Property Changed! : %s\n", BT_DBUS_BLUEZ_ADAPTER_PATH);
7545 DBusMessageIter lDBusMsgIterDict, lDBusMsgIter1;
7546 dbus_message_iter_recurse(&lDBusMsgIter, &lDBusMsgIterDict);
7548 while (dbus_message_iter_get_arg_type(&lDBusMsgIterDict) == DBUS_TYPE_DICT_ENTRY) {
7549 dbus_message_iter_recurse (&lDBusMsgIterDict, &lDBusMsgIter1);
7551 if (dbus_message_iter_get_arg_type(&lDBusMsgIter1) == DBUS_TYPE_STRING) {
7554 dbus_message_iter_get_basic(&lDBusMsgIter1, &str);
7555 BTRCORELOG_DEBUG (
"%s received event <%s>\n", BT_DBUS_BLUEZ_ADAPTER_PATH, str);
7571 dbus_message_iter_next(&lDBusMsgIterDict);
7575 const char* adapter_path = dbus_message_get_path(apDBusMsg);
7577 i32OpRet = btrCore_BTParseAdapter(&lDBusMsgIter, pstBTAdapterInfo);
7579 pstlhBtIfce->ui32IsAdapterDiscovering = pstBTAdapterInfo->bDiscovering;
7580 if (pstBTAdapterInfo->bDiscovering) {
7581 BTRCORELOG_INFO (
"Adapter Started Discovering | %d\n", pstlhBtIfce->ui32IsAdapterDiscovering);
7584 BTRCORELOG_INFO (
"Adapter Stopped Discovering | %d\n", pstlhBtIfce->ui32IsAdapterDiscovering);
7588 if (pstlhBtIfce->fpcBAdapterStatusUpdate) {
7589 if(pstlhBtIfce->fpcBAdapterStatusUpdate(enBTAdPropDiscoveryStatus, pstBTAdapterInfo, pstlhBtIfce->pcBAdapterStatusUserData)) {
7594 else if (!strcmp(lpcDBusIface, BT_DBUS_BLUEZ_DEVICE_PATH)) {
7595 BTRCORELOG_INFO (
"Property Changed! : %s\n", BT_DBUS_BLUEZ_DEVICE_PATH);
7596 DBusMessageIter lDBusMsgIterDict;
7597 const char* pui8DevPath = dbus_message_get_path(apDBusMsg);
7598 int settingRSSItoZero = 0;
7599 int bPairingEvent = 0;
7601 int bSrvResolvedEvent = 0;
7602 int bSrvResolved = 0;
7603 int bConnectEvent = 0;
7608 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, pui8DevPath);
7610 dbus_message_iter_recurse(&lDBusMsgIter, &lDBusMsgIterDict);
7612 if (dbus_message_iter_get_arg_type(&lDBusMsgIterDict) == DBUS_TYPE_INVALID) {
7613 settingRSSItoZero = 1;
7614 BTRCORELOG_INFO (
"Setting Dev %s RSSI to 0...\n", pstBTDeviceInfo->pcAddress);
7617 DBusMessageIter lDBusMsgParse;
7619 while (dbus_message_iter_get_arg_type(&lDBusMsgIterDict) == DBUS_TYPE_DICT_ENTRY) {
7620 dbus_message_iter_recurse (&lDBusMsgIterDict, &lDBusMsgParse);
7622 if (dbus_message_iter_get_arg_type(&lDBusMsgParse) == DBUS_TYPE_STRING) {
7623 DBusMessageIter lDBusMsgPropertyValue;
7624 const char *pNameOfProperty = NULL;
7626 dbus_message_iter_get_basic(&lDBusMsgParse, &pNameOfProperty);
7627 BTRCORELOG_DEBUG (
"%s received event <%s>\n", BT_DBUS_BLUEZ_DEVICE_PATH, pNameOfProperty);
7629 if (strcmp (pNameOfProperty,
"Paired") == 0) {
7630 dbus_message_iter_next(&lDBusMsgParse);
7631 dbus_message_iter_recurse(&lDBusMsgParse, &lDBusMsgPropertyValue);
7632 dbus_message_iter_get_basic(&lDBusMsgPropertyValue, &bPaired);
7633 pstBTDeviceInfo->bPaired = bPaired;
7635 BTRCORELOG_DEBUG (
"bPaired = %d\n", bPaired);
7637 else if (strcmp (pNameOfProperty,
"Connected") == 0) {
7638 dbus_message_iter_next(&lDBusMsgParse);
7639 dbus_message_iter_recurse(&lDBusMsgParse, &lDBusMsgPropertyValue);
7640 dbus_message_iter_get_basic(&lDBusMsgPropertyValue, &bConnected);
7642 BTRCORELOG_DEBUG (
"bConnected = %d\n", bConnected);
7644 else if (strcmp (pNameOfProperty,
"ServicesResolved") == 0) {
7645 dbus_message_iter_next(&lDBusMsgParse);
7646 dbus_message_iter_recurse(&lDBusMsgParse, &lDBusMsgPropertyValue);
7647 dbus_message_iter_get_basic(&lDBusMsgPropertyValue, &bSrvResolved);
7648 bSrvResolvedEvent = 1;
7649 BTRCORELOG_DEBUG (
"bServicesResolved = %d\n", bSrvResolved);
7651 else if (strcmp (pNameOfProperty,
"RSSI") == 0) {
7652 dbus_message_iter_next(&lDBusMsgParse);
7653 dbus_message_iter_recurse(&lDBusMsgParse, &lDBusMsgPropertyValue);
7654 dbus_message_iter_get_basic(&lDBusMsgPropertyValue, &i16RSSI);
7655 pstBTDeviceInfo->i32RSSI = i16RSSI;
7657 BTRCORELOG_DEBUG (
"Event - bi32Rssi = %d\n", pstBTDeviceInfo->i32RSSI);
7659 else if (strcmp (pNameOfProperty,
"UUIDs") == 0) {
7660 DBusMessageIter variant_i;
7663 dbus_message_iter_next(&lDBusMsgParse);
7664 dbus_message_iter_recurse(&lDBusMsgParse, &variant_i);
7666 dbus_type = dbus_message_iter_get_arg_type (&variant_i);
7667 if (dbus_type == DBUS_TYPE_ARRAY) {
7669 DBusMessageIter variant_j;
7670 dbus_message_iter_recurse(&variant_i, &variant_j);
7672 while ((dbus_type = dbus_message_iter_get_arg_type (&variant_j)) != DBUS_TYPE_INVALID) {
7675 dbus_message_iter_get_basic (&variant_j, &pVal);
7676 BTRCORELOG_TRACE (
"UUID value is %s\n", pVal);
7680 dbus_message_iter_next (&variant_j);
7684 BTRCORELOG_ERROR (
"Services; Not an Array\n");
7708 dbus_message_iter_next(&lDBusMsgIterDict);
7714 enBTDeviceType lenBTDevType = btrCore_BTMapDevClasstoDevType(pstBTDeviceInfo->ui32Class);
7716 if (bPairingEvent) {
7717 const char* value = NULL;
7718 BTRCORELOG_INFO (
"Parsing Property Changed event figured that its pairing change..\n");
7725 strncpy(pstBTDeviceInfo->pcDevicePrevState, pstlhBtIfce->pcDeviceCurrState,
BT_MAX_STR_LEN - 1);
7726 strncpy(pstBTDeviceInfo->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7727 strncpy(pstlhBtIfce->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7729 lenBtDevState = enBTDevStPropChanged;
7730 if (pstlhBtIfce->fpcBDevStatusUpdate) {
7731 if(pstlhBtIfce->fpcBDevStatusUpdate(lenBTDevType, lenBtDevState, pstBTDeviceInfo, pstlhBtIfce->pcBDevStatusUserData)) {
7735 else if (pstBTDeviceInfo->bPaired) {
7736 if (settingRSSItoZero || bRssiEvent) {
7737 if (pstlhBtIfce->ui32IsAdapterDiscovering || pstBTDeviceInfo->bConnected) {
7738 lenBtDevState = enBTDevStRSSIUpdate;
7742 if (pstBTDeviceInfo->bConnected) {
7743 const char* value =
"connected";
7745 strncpy(pstBTDeviceInfo->pcDevicePrevState, pstlhBtIfce->pcDeviceCurrState,
BT_MAX_STR_LEN - 1);
7746 strncpy(pstBTDeviceInfo->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7747 strncpy(pstlhBtIfce->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7749 lenBtDevState = enBTDevStPropChanged;
7751 else if (!pstBTDeviceInfo->bConnected) {
7752 const char* value =
"disconnected";
7754 strncpy(pstBTDeviceInfo->pcDevicePrevState, pstlhBtIfce->pcDeviceCurrState,
BT_MAX_STR_LEN - 1);
7755 strncpy(pstBTDeviceInfo->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7756 strncpy(pstlhBtIfce->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7758 lenBtDevState = enBTDevStPropChanged;
7760 if (enBTDevAudioSink == lenBTDevType && pstlhBtIfce->ui32DevLost) {
7761 lenBtDevState = enBTDevStLost;
7764 pstlhBtIfce->ui32DevLost = 0;
7767 if (enBTDevAudioSource != lenBTDevType || strcmp(pstlhBtIfce->pcDeviceCurrState,
"connected")) {
7768 if (pstlhBtIfce->fpcBDevStatusUpdate) {
7769 if(pstlhBtIfce->fpcBDevStatusUpdate(lenBTDevType, lenBtDevState, pstBTDeviceInfo, pstlhBtIfce->pcBDevStatusUserData)) {
7773 else if ((enBTDevAudioSource == lenBTDevType) && bSrvResolvedEvent && !strcmp(pstBTDeviceInfo->pcDevicePrevState,
"connected") && !strcmp(pstBTDeviceInfo->pcDeviceCurrState,
"connected")) {
7774 if (pstlhBtIfce->fpcBDevStatusUpdate) {
7775 if(pstlhBtIfce->fpcBDevStatusUpdate(lenBTDevType, lenBtDevState, pstBTDeviceInfo, pstlhBtIfce->pcBDevStatusUserData)) {
7780 else if (!pstBTDeviceInfo->bPaired && !pstBTDeviceInfo->bConnected &&
7781 strncmp(pstlhBtIfce->pcLeDeviceAddress, pstBTDeviceInfo->pcAddress,
7784 if (pstlhBtIfce->ui32IsAdapterDiscovering && settingRSSItoZero) {
7785 lenBtDevState = enBTDevStRSSIUpdate;
7788 lenBtDevState = enBTDevStFound;
7791 if (pstlhBtIfce->fpcBDevStatusUpdate) {
7792 if(pstlhBtIfce->fpcBDevStatusUpdate(lenBTDevType, lenBtDevState, pstBTDeviceInfo, pstlhBtIfce->pcBDevStatusUserData)) {
7796 else if (lenBTDevType == enBTDevUnknown) {
7798 if (bConnectEvent) {
7799 if (pstBTDeviceInfo->bConnected) {
7800 const char* value =
"connected";
7802 strncpy(pstBTDeviceInfo->pcDevicePrevState, pstlhBtIfce->pcLeDeviceCurrState,
BT_MAX_STR_LEN - 1);
7803 strncpy(pstBTDeviceInfo->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7804 strncpy(pstlhBtIfce->pcLeDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7805 strncpy(pstlhBtIfce->pcLeDeviceAddress, pstBTDeviceInfo->pcAddress,
BT_MAX_STR_LEN - 1);
7807 else if (!pstBTDeviceInfo->bConnected) {
7808 const char* value =
"disconnected";
7810 strncpy(pstBTDeviceInfo->pcDevicePrevState, pstlhBtIfce->pcLeDeviceCurrState,
BT_MAX_STR_LEN - 1);
7811 strncpy(pstBTDeviceInfo->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7812 strncpy(pstlhBtIfce->pcLeDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7813 strncpy(pstlhBtIfce->pcLeDeviceAddress,
"none",
BT_MAX_STR_LEN - 1);
7816 lenBTDevType = enBTDevLE;
7817 lenBtDevState = enBTDevStPropChanged;
7819 if (pstlhBtIfce->fpcBDevStatusUpdate) {
7820 if(pstlhBtIfce->fpcBDevStatusUpdate(lenBTDevType, lenBtDevState, pstBTDeviceInfo, pstlhBtIfce->pcBDevStatusUserData)) {
7825 if (bSrvResolvedEvent) {
7826 if (pstlhBtIfce->fpcBTLeGattPath) {
7827 pstlhBtIfce->fpcBTLeGattPath(enBTDevice, enBTLeGattOpUnknown, pui8DevPath, pstBTDeviceInfo->pcAddress, enBTDevStPropChanged, NULL, pstlhBtIfce->pcBLePathUserData);
7830 else if (!bConnectEvent) {
7831 lenBTDevType = enBTDevLE;
7832 lenBtDevState = enBTDevStPropChanged;
7834 if (pstlhBtIfce->fpcBDevStatusUpdate) {
7835 if(pstlhBtIfce->fpcBDevStatusUpdate(lenBTDevType, lenBtDevState, pstBTDeviceInfo, pstlhBtIfce->pcBDevStatusUserData)) {
7840 else if ((lenBTDevType == enBTDevHID)) {
7841 if (bConnectEvent) {
7842 if (pstBTDeviceInfo->bConnected) {
7843 const char* value =
"connected";
7845 strncpy(pstBTDeviceInfo->pcDevicePrevState, pstBTDeviceInfo->pcDeviceCurrState,
BT_MAX_STR_LEN - 1);
7846 strncpy(pstBTDeviceInfo->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7848 else if (!pstBTDeviceInfo->bConnected) {
7849 const char* value =
"disconnected";
7851 strncpy(pstBTDeviceInfo->pcDevicePrevState, pstlhBtIfce->pcDeviceCurrState,
BT_MAX_STR_LEN - 1);
7852 strncpy(pstBTDeviceInfo->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7855 lenBtDevState = enBTDevStPropChanged;
7856 if (pstlhBtIfce->fpcBDevStatusUpdate) {
7857 if(pstlhBtIfce->fpcBDevStatusUpdate(lenBTDevType, lenBtDevState, pstBTDeviceInfo, pstlhBtIfce->pcBDevStatusUserData)) {
7864 else if (!strcmp(lpcDBusIface, BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH)) {
7865 const char* apcMediaTransIface = dbus_message_get_path(apDBusMsg);
7867 unsigned int ui32DeviceIfceLen = strstr(apcMediaTransIface,
"/fd") - apcMediaTransIface;
7869 char* apcDevAddr = NULL;
7871 unsigned short lVolume = 0;
7872 unsigned short lDelay = 0xFFFFu;
7873 char* pcState = NULL;
7875 if (!strncmp(pstlhBtIfce->pcBTVersion, BT_BLUEZ_VERSION_5_54, strlen(BT_BLUEZ_VERSION_5_54))) {
7876 ui32DeviceIfceLen = strstr(apcMediaTransIface,
"/sep") - apcMediaTransIface;
7879 BTRCORELOG_INFO (
"Property Changed! : %s\n", BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH);
7881 DBusMessageIter lDBusMsgIterDict, lDBusMsgIter1, lDBusMsgIterVal;
7882 dbus_message_iter_recurse(&lDBusMsgIter, &lDBusMsgIterDict);
7884 while (dbus_message_iter_get_arg_type(&lDBusMsgIterDict) == DBUS_TYPE_DICT_ENTRY) {
7885 dbus_message_iter_recurse (&lDBusMsgIterDict, &lDBusMsgIter1);
7887 if (dbus_message_iter_get_arg_type(&lDBusMsgIter1) == DBUS_TYPE_STRING) {
7890 dbus_message_iter_get_basic(&lDBusMsgIter1, &str);
7891 BTRCORELOG_DEBUG (
"%s received event <%s>\n", BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH, str);
7898 if (!strncmp(str,
"State", strlen(
"State"))) {
7899 lenBTMedTransProp = enBTMedTPropState;
7900 dbus_message_iter_next(&lDBusMsgIter1);
7901 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
7902 dbus_message_iter_get_basic(&lDBusMsgIterVal, &pcState);
7904 else if (!strncmp(str,
"Volume", strlen(
"Volume"))) {
7905 lenBTMedTransProp = enBTMedTPropVol;
7906 dbus_message_iter_next(&lDBusMsgIter1);
7907 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
7908 dbus_message_iter_get_basic(&lDBusMsgIterVal, &lVolume);
7910 else if (!strncmp(str,
"Delay", strlen(
"Delay"))) {
7911 lenBTMedTransProp = enBTMedTPropDelay;
7912 dbus_message_iter_next(&lDBusMsgIter1);
7913 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
7914 dbus_message_iter_get_basic(&lDBusMsgIterVal, &lDelay);
7917 lenBTMedTransProp = enBTMedTPropUnknown;
7920 dbus_message_iter_next(&lDBusMsgIterDict);
7925 i32OpRet = btrCore_BTGetMediaInfo(apDBusConn, pstBTMediaInfo, apcMediaTransIface);
7927 if ((ui32DeviceIfceLen > 0) && (ui32DeviceIfceLen < (
BT_MAX_STR_LEN - 1))) {
7928 strncpy(apcDeviceIfce, apcMediaTransIface, ui32DeviceIfceLen);
7929 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, apcDeviceIfce);
7931 lenBTDevType = btrCore_BTMapDevClasstoDevType(pstBTDeviceInfo->ui32Class);
7932 apcDevAddr = pstBTDeviceInfo->pcAddress;
7936 switch (lenBTMedTransProp) {
7937 case enBTMedTPropState:
7938 if ((!strcmp(pstlhBtIfce->pcMediaCurrState,
"none")) && (!strcmp(pcState,
"pending"))) {
7939 strcpy(pstlhBtIfce->pcMediaCurrState, pcState);
7941 if (!i32OpRet && pstBTDeviceInfo->bConnected) {
7942 const char* value =
"playing";
7945 strncpy(pstBTDeviceInfo->pcDevicePrevState, pstlhBtIfce->pcDeviceCurrState,
BT_MAX_STR_LEN - 1);
7946 strncpy(pstBTDeviceInfo->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7947 strncpy(pstlhBtIfce->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
7949 if (pstlhBtIfce->fpcBDevStatusUpdate) {
7950 if(pstlhBtIfce->fpcBDevStatusUpdate(lenBTDevType, lenBtDevState, pstBTDeviceInfo, pstlhBtIfce->pcBDevStatusUserData)) {
7956 else if (lenBTDevType == enBTDevAudioSource) {
7957 char* apcDevTransportPath = (
char*)apcMediaTransIface;
7960 if (strcmp(pstlhBtIfce->pcMediaCurrState,
"none") && !strcmp(pcState,
"pending")) {
7962 int dataReadMTU = 0;
7963 int dataWriteMTU = 0;
7966 BTRCORELOG_ERROR (
"Failed to ReAcquire transport path %s\n", apcMediaTransIface);
7969 BTRCORELOG_INFO (
"Successfully ReAcquired transport path %s\n", apcMediaTransIface);
7976 if (!strcmp(pcState,
"idle")) {
7977 lenBtMedTransportSt = enBTMedTransportStIdle;
7978 strncpy(pstlhBtIfce->pcMediaCurrState,
"connected",
BT_MAX_STR_LEN - 1);
7980 else if (!strcmp(pcState,
"pending")) {
7981 lenBtMedTransportSt = enBTMedTransportStPending;
7982 strncpy(pstlhBtIfce->pcMediaCurrState, pcState, strlen(pcState));
7984 else if (!strcmp(pcState,
"active")) {
7985 lenBtMedTransportSt = enBTMedTransportStActive;
7986 strncpy(pstlhBtIfce->pcMediaCurrState,
"playing",
BT_MAX_STR_LEN - 1);
7989 mediaStatusUpdate.aenBtOpIfceType = enBTMediaTransport;
7990 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaTransportProp = lenBTMedTransProp;
7991 mediaStatusUpdate.m_mediaTransportState = lenBtMedTransportSt;
7993 if (pstlhBtIfce->fpcBMediaStatusUpdate) {
7994 if(pstlhBtIfce->fpcBMediaStatusUpdate(lenBTDevType, &mediaStatusUpdate, apcDevAddr, pstlhBtIfce->pcBMediaStatusUserData)) {
7998 else if (lenBTDevType == enBTDevAudioSink) {
7999 if (!i32OpRet && pstBTDeviceInfo->bConnected && pstBTDeviceInfo->bPaired) {
8000 if ((!strcmp(pstlhBtIfce->pcMediaCurrState,
"none")) && (!strcmp(pcState,
"idle"))) {
8001 const char* value =
"connected";
8004 strncpy(pstBTDeviceInfo->pcDevicePrevState, pstlhBtIfce->pcDeviceCurrState,
BT_MAX_STR_LEN - 1);
8005 strncpy(pstBTDeviceInfo->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
8006 strncpy(pstlhBtIfce->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
8008 if (pstlhBtIfce->fpcBDevStatusUpdate) {
8009 if (pstlhBtIfce->fpcBDevStatusUpdate(lenBTDevType, lenBtDevState, pstBTDeviceInfo, pstlhBtIfce->pcBDevStatusUserData)) {
8014 strncpy(pstlhBtIfce->pcMediaCurrState, pcState, strlen(pcState));
8019 case enBTMedTPropDelay:
8020 BTRCORELOG_DEBUG (
"MediaTransport Property - Delay\n");
8022 case enBTMedTPropVol:
8025 BTRCORELOG_DEBUG (
"MediaTransport Property - Volume\n");
8027 mediaStatusUpdate.aenBtOpIfceType = enBTMediaTransport;
8028 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaTransportProp = lenBTMedTransProp;
8029 mediaStatusUpdate.m_mediaTransportVolume = (
unsigned char)((lVolume == 127) ? 255 : lVolume * 2);
8031 if (pstlhBtIfce->fpcBMediaStatusUpdate) {
8032 if(pstlhBtIfce->fpcBMediaStatusUpdate(lenBTDevType, &mediaStatusUpdate, apcDevAddr, pstlhBtIfce->pcBMediaStatusUserData)) {
8037 case enBTMedTPropUnknown:
8039 BTRCORELOG_ERROR (
"MediaTransport Property - Unknown\n");
8043 else if (!strcmp(lpcDBusIface, BT_DBUS_BLUEZ_MEDIA_CTRL_PATH)) {
8045 char* apcDevAddr = NULL;
8048 BTRCORELOG_ERROR (
"Property Changed! : %s\n", BT_DBUS_BLUEZ_MEDIA_CTRL_PATH);
8050 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, dbus_message_get_path(apDBusMsg));
8052 lenBTDevType = btrCore_BTMapDevClasstoDevType(pstBTDeviceInfo->ui32Class);
8053 apcDevAddr = pstBTDeviceInfo->pcAddress;
8057 DBusMessageIter lDBusMsgIterDict, lDBusMsgIter1, lDBusMsgIterVal;
8058 dbus_message_iter_recurse(&lDBusMsgIter, &lDBusMsgIterDict);
8060 while (dbus_message_iter_get_arg_type(&lDBusMsgIterDict) == DBUS_TYPE_DICT_ENTRY) {
8061 dbus_message_iter_recurse (&lDBusMsgIterDict, &lDBusMsgIter1);
8063 if (dbus_message_iter_get_arg_type(&lDBusMsgIter1) == DBUS_TYPE_STRING) {
8065 mediaStatusUpdate.aenBtOpIfceType = enBTMediaControl;
8067 dbus_message_iter_get_basic(&lDBusMsgIter1, &str);
8068 BTRCORELOG_DEBUG (
"%s received event <%s>\n", BT_DBUS_BLUEZ_MEDIA_CTRL_PATH, str);
8074 if (!strncmp(str,
"Connected", strlen(
"Connected"))) {
8075 unsigned char ui8var = 0;
8076 dbus_message_iter_next(&lDBusMsgIter1);
8077 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8078 dbus_message_iter_get_basic(&lDBusMsgIterVal, &ui8var);
8080 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedControlPropConnected;
8081 mediaStatusUpdate.m_mediaPlayerConnected = ui8var;
8083 else if (!strncmp(str,
"Player", strlen(
"Player"))) {
8085 dbus_message_iter_next(&lDBusMsgIter1);
8086 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8087 dbus_message_iter_get_basic(&lDBusMsgIterVal, &lpcPath);
8089 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedControlPropPath;
8091 strncpy(mediaStatusUpdate.m_mediaPlayerPath, lpcPath,
BT_MAX_STR_LEN - 1);
8094 if (pstlhBtIfce->fpcBMediaStatusUpdate) {
8095 if(pstlhBtIfce->fpcBMediaStatusUpdate(lenBTDevType, &mediaStatusUpdate, apcDevAddr, pstlhBtIfce->pcBMediaStatusUserData)) {
8098 dbus_message_iter_next(&lDBusMsgIterDict);
8103 if ((enBTDevAudioSource == lenBTDevType) && pstBTDeviceInfo->bConnected && mediaStatusUpdate.m_mediaPlayerConnected) {
8104 const char* value =
"connected";
8107 strncpy(pstBTDeviceInfo->pcDevicePrevState, pstlhBtIfce->pcDeviceCurrState,
BT_MAX_STR_LEN - 1);
8108 strncpy(pstBTDeviceInfo->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
8109 strncpy(pstlhBtIfce->pcDeviceCurrState, value,
BT_MAX_STR_LEN - 1);
8111 if (pstlhBtIfce->fpcBDevStatusUpdate) {
8112 if(pstlhBtIfce->fpcBDevStatusUpdate(lenBTDevType, lenBtDevState, pstBTDeviceInfo, pstlhBtIfce->pcBDevStatusUserData)) {
8118 else if (!strcmp(lpcDBusIface, BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH)) {
8119 const char* apcMediaPlayerIface = dbus_message_get_path(apDBusMsg);
8121 unsigned int ui32DeviceIfceLen = strstr(apcMediaPlayerIface,
"/player") - apcMediaPlayerIface;
8123 char* apcDevAddr = NULL;
8126 BTRCORELOG_ERROR (
"Property Changed! : %s\n", BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH);
8128 strncpy(apcDeviceIfce, apcMediaPlayerIface, ui32DeviceIfceLen);
8129 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, apcDeviceIfce);
8131 lenBTDevType = btrCore_BTMapDevClasstoDevType(pstBTDeviceInfo->ui32Class);
8132 apcDevAddr = pstBTDeviceInfo->pcAddress;
8137 DBusMessageIter lDBusMsgIterDict, lDBusMsgIter1, lDBusMsgIterVal;
8138 dbus_message_iter_recurse(&lDBusMsgIter, &lDBusMsgIterDict);
8140 while (dbus_message_iter_get_arg_type(&lDBusMsgIterDict) == DBUS_TYPE_DICT_ENTRY) {
8141 dbus_message_iter_recurse (&lDBusMsgIterDict, &lDBusMsgIter1);
8143 if (dbus_message_iter_get_arg_type(&lDBusMsgIter1) == DBUS_TYPE_STRING) {
8145 mediaStatusUpdate.aenBtOpIfceType = enBTMediaPlayer;
8147 dbus_message_iter_get_basic(&lDBusMsgIter1, &str);
8148 BTRCORELOG_DEBUG (
"%s received event <%s>\n", BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH, str);
8164 if (!strncmp(str,
"Name", strlen(
"Name"))) {
8166 dbus_message_iter_next(&lDBusMsgIter1);
8167 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8168 dbus_message_iter_get_basic(&lDBusMsgIterVal, &pcName);
8169 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropName;
8170 strncpy (mediaStatusUpdate.m_mediaPlayerName, pcName,
BT_MAX_STR_LEN - 1);
8172 else if (!strncmp(str,
"Type", strlen(
"Type"))) {
8174 dbus_message_iter_next(&lDBusMsgIter1);
8175 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8176 dbus_message_iter_get_basic(&lDBusMsgIterVal, &pcType);
8177 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropType;
8179 if (!strncmp (
"Audio", pcType, strlen(
"Audio"))) {
8180 mediaStatusUpdate.enMediaPlayerType = enBTMedPlayerTypAudio;
8182 else if (!strncmp (
"Video", pcType, strlen(
"Video"))) {
8183 mediaStatusUpdate.enMediaPlayerType = enBTMedPlayerTypVideo;
8185 else if (!strncmp (
"Audio Broadcasting", pcType, strlen(
"Audio Broadcasting"))) {
8186 mediaStatusUpdate.enMediaPlayerType = enBTMedPlayerTypAudioBroadcasting;
8188 else if (!strncmp (
"Video Broadcasting", pcType, strlen(
"Video Broadcasting"))) {
8189 mediaStatusUpdate.enMediaPlayerType = enBTMedPlayerTypVideoBroadcasting;
8192 else if (!strncmp(str,
"Subtype", strlen(
"Subtype"))) {
8193 char* pcSubtype = 0;
8194 dbus_message_iter_next(&lDBusMsgIter1);
8195 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8196 dbus_message_iter_get_basic(&lDBusMsgIterVal, &pcSubtype);
8197 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropSubtype;
8199 if (!strncmp (
"Audio Book", pcSubtype, strlen(
"Audio Book"))) {
8200 mediaStatusUpdate.enMediaPlayerSubtype = enBTMedPlayerSbTypAudioBook;
8202 else if (!strncmp (
"Podcast", pcSubtype, strlen(
"Podcast"))) {
8203 mediaStatusUpdate.enMediaPlayerSubtype = enBTMedPlayerSbTypPodcast;
8206 else if (!strncmp(str,
"Status", strlen(
"Status"))) {
8208 dbus_message_iter_next(&lDBusMsgIter1);
8209 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8210 dbus_message_iter_get_basic(&lDBusMsgIterVal, &pcStatus);
8211 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropStatus;
8213 if (!strncmp(
"playing", pcStatus, strlen(
"playing"))) {
8214 mediaStatusUpdate.enMediaPlayerStatus = enBTMedPlayerStPlaying;
8216 else if (!strncmp(
"paused", pcStatus, strlen(
"paused"))) {
8217 mediaStatusUpdate.enMediaPlayerStatus = enBTMedPlayerStPaused;
8219 else if (!strncmp(
"forward-seek", pcStatus, strlen(
"forward-seek"))) {
8220 mediaStatusUpdate.enMediaPlayerStatus = enBTMedPlayerStForwardSeek;
8222 else if (!strncmp(
"reverse-seek", pcStatus, strlen(
"reverse-seek"))) {
8223 mediaStatusUpdate.enMediaPlayerStatus = enBTMedPlayerStReverseSeek;
8225 else if (!strncmp(
"stopped", pcStatus, strlen(
"stopped"))) {
8226 mediaStatusUpdate.enMediaPlayerStatus = enBTMedPlayerStStopped;
8228 else if (!strncmp(
"error", pcStatus, strlen(
"error"))) {
8229 mediaStatusUpdate.enMediaPlayerStatus = enBTMedPlayerStError;
8232 else if (!strncmp(str,
"Position", strlen(
"Position"))) {
8233 unsigned int ui32Position = 0;
8234 dbus_message_iter_next(&lDBusMsgIter1);
8235 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8236 dbus_message_iter_get_basic(&lDBusMsgIterVal, &ui32Position);
8237 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropPosition;
8238 mediaStatusUpdate.m_mediaPlayerPosition = ui32Position;
8240 else if (!strncmp(str,
"Track", strlen(
"Track"))) {
8245 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropTrack;
8246 memcpy(&mediaStatusUpdate.m_mediaTrackInfo, &mediaTrackInfo,
sizeof(
stBTMediaTrackInfo));
8249 else if (!strncmp(str,
"Browsable", strlen(
"Browsable"))) {
8250 bool bIsBrowsable = 0;
8251 dbus_message_iter_next(&lDBusMsgIter1);
8252 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8253 dbus_message_iter_get_basic(&lDBusMsgIterVal, &bIsBrowsable);
8254 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropBrowsable;
8255 mediaStatusUpdate.m_mediaPlayerBrowsable = bIsBrowsable;
8257 else if (!strncmp(str,
"Searchable", strlen(
"Searchable"))) {
8258 bool bIsSearchable = 0;
8259 dbus_message_iter_next(&lDBusMsgIter1);
8260 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8261 dbus_message_iter_get_basic(&lDBusMsgIterVal, &bIsSearchable);
8262 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropSearchable;
8263 mediaStatusUpdate.m_mediaPlayerBrowsable = bIsSearchable;
8266 else if (!strncmp(str,
"Playlist", strlen(
"Playlist"))) {
8267 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropPlaylist;
8270 else if (!strncmp(str,
"Equalizer", strlen(
"Equalizer"))) {
8271 char* pcEqualizer = 0;
8272 dbus_message_iter_next(&lDBusMsgIter1);
8273 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8274 dbus_message_iter_get_basic(&lDBusMsgIterVal, &pcEqualizer);
8275 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropEqualizer;
8277 if (!strncmp(
"on", pcEqualizer, strlen(
"on"))) {
8278 mediaStatusUpdate.enMediaPlayerEqualizer = enBTMedPlayerEqualizerOn;
8280 else if (!strncmp(
"off", pcEqualizer, strlen(
"off"))) {
8281 mediaStatusUpdate.enMediaPlayerEqualizer = enBTMedPlayerEqualizerOff;
8284 else if (!strncmp(str,
"Repeat", strlen(
"Repeat"))) {
8286 dbus_message_iter_next(&lDBusMsgIter1);
8287 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8288 dbus_message_iter_get_basic(&lDBusMsgIterVal, &pcRepeat);
8289 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropRepeat;
8291 if (!strncmp(
"off", pcRepeat, strlen(
"off"))) {
8292 mediaStatusUpdate.enMediaPlayerRepeat = enBTMedPlayerRpOff;
8294 else if (!strncmp(
"singletrack", pcRepeat, strlen(
"singletrack"))) {
8295 mediaStatusUpdate.enMediaPlayerRepeat = enBTMedPlayerRpSingleTrack;
8297 else if (!strncmp(
"alltracks", pcRepeat, strlen(
"alltracks"))) {
8298 mediaStatusUpdate.enMediaPlayerRepeat = enBTMedPlayerRpAllTracks;
8300 else if (!strncmp(
"group", pcRepeat, strlen(
"group"))) {
8301 mediaStatusUpdate.enMediaPlayerRepeat = enBTMedPlayerRpGroup;
8304 else if (!strncmp(str,
"Shuffle", strlen(
"Shuffle"))) {
8305 char* pcShuffle = 0;
8306 dbus_message_iter_next(&lDBusMsgIter1);
8307 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8308 dbus_message_iter_get_basic(&lDBusMsgIterVal, &pcShuffle);
8309 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropShuffle;
8311 if (!strncmp(
"off", pcShuffle, strlen(
"off"))) {
8312 mediaStatusUpdate.enMediaPlayerShuffle = enBTMedPlayerShuffleOff;
8314 else if (!strncmp(
"alltracks", pcShuffle, strlen(
"alltracks"))) {
8315 mediaStatusUpdate.enMediaPlayerShuffle = enBTMedPlayerShuffleAllTracks;
8317 else if (!strncmp(
"group", pcShuffle, strlen(
"group"))) {
8318 mediaStatusUpdate.enMediaPlayerShuffle = enBTMedPlayerShuffleGroup;
8321 else if (!strncmp(str,
"Scan", strlen(
"Scan"))) {
8323 dbus_message_iter_next(&lDBusMsgIter1);
8324 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8325 dbus_message_iter_get_basic(&lDBusMsgIterVal, &pcScan);
8326 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropScan;
8328 if (!strncmp(
"off", pcScan, strlen(
"off"))) {
8329 mediaStatusUpdate.enMediaPlayerScan = enBTMedPlayerScanOff;
8331 else if (!strncmp(
"alltracks", pcScan, strlen(
"alltracks"))) {
8332 mediaStatusUpdate.enMediaPlayerScan = enBTMedPlayerScanAllTracks;
8334 else if (!strncmp(
"group", pcScan, strlen(
"group"))) {
8335 mediaStatusUpdate.enMediaPlayerScan = enBTMedPlayerScanGroup;
8340 if (pstlhBtIfce->fpcBMediaStatusUpdate) {
8341 if(pstlhBtIfce->fpcBMediaStatusUpdate(lenBTDevType, &mediaStatusUpdate, apcDevAddr, pstlhBtIfce->pcBMediaStatusUserData)) {
8344 dbus_message_iter_next(&lDBusMsgIterDict);
8348 else if (!strcmp(lpcDBusIface, BT_DBUS_BLUEZ_MEDIA_ITEM_PATH)) {
8349 const char* apcMediaItemIface = dbus_message_get_path(apDBusMsg);
8351 unsigned int ui32DeviceIfceLen = strstr(apcMediaItemIface,
"/player") - apcMediaItemIface;
8353 char* apcDevAddr = NULL;
8356 BTRCORELOG_ERROR (
"Property Changed! : %s\n", BT_DBUS_BLUEZ_MEDIA_ITEM_PATH);
8358 strncpy(apcDeviceIfce, apcMediaItemIface, ui32DeviceIfceLen);
8359 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, apcDeviceIfce);
8361 lenBTDevType = btrCore_BTMapDevClasstoDevType(pstBTDeviceInfo->ui32Class);
8362 apcDevAddr = pstBTDeviceInfo->pcAddress;
8366 DBusMessageIter lDBusMsgIterDict, lDBusMsgIter1;
8367 dbus_message_iter_recurse(&lDBusMsgIter, &lDBusMsgIterDict);
8369 while (dbus_message_iter_get_arg_type(&lDBusMsgIterDict) == DBUS_TYPE_DICT_ENTRY) {
8370 dbus_message_iter_recurse (&lDBusMsgIterDict, &lDBusMsgIter1);
8372 if (dbus_message_iter_get_arg_type(&lDBusMsgIter1) == DBUS_TYPE_STRING) {
8375 dbus_message_iter_get_basic(&lDBusMsgIter1, &str);
8376 BTRCORELOG_DEBUG (
"%s received event <%s>\n", BT_DBUS_BLUEZ_MEDIA_ITEM_PATH, str);
8382 if (!strncmp(str,
"Playable", strlen(
"Playable"))) {
8384 else if (!strncmp(str,
"Metadata", strlen(
"Metadata"))) {
8392 if (strstr(apcMediaItemIface,
"/NowPlaying")) {
8393 strncpy(mediaPlayerIface, apcMediaItemIface, (
unsigned int)(strstr(apcMediaItemIface,
"/NowPlaying") - apcMediaItemIface));
8395 else if (strstr(apcMediaItemIface,
"/Filesystem")) {
8396 strncpy(mediaPlayerIface, apcMediaItemIface, (
unsigned int)(strstr(apcMediaItemIface,
"/Filesystem") - apcMediaItemIface));
8399 dbus_message_iter_next(&lDBusMsgIter1);
8400 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8402 if (dbus_message_iter_get_arg_type(&lDBusMsgIterVal) == DBUS_TYPE_DICT_ENTRY) {
8403 BTRCORELOG_DEBUG (
"DBUS_TYPE_DICT_ENTRY\n");
8406 btrCore_BTParseMediaTrackMetadata(&lDBusMsgIterVal, &mediaTrackInfo);
8408 mediaStatusUpdate.aenBtOpIfceType = enBTMediaPlayer;
8409 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropTrack;
8412 memcpy(&mediaStatusUpdate.m_mediaTrackInfo, &mediaTrackInfo,
sizeof(
stBTMediaTrackInfo));
8415 BTRCORELOG_ERROR (
"FAILED BtrCore_BTGetTrackInformation !!!!\n");
8419 if (pstlhBtIfce->fpcBMediaStatusUpdate) {
8420 if(pstlhBtIfce->fpcBMediaStatusUpdate(lenBTDevType, &mediaStatusUpdate, apcDevAddr, pstlhBtIfce->pcBMediaStatusUserData)) {
8423 dbus_message_iter_next(&lDBusMsgIterDict);
8427 else if (!strcmp(lpcDBusIface, BT_DBUS_BLUEZ_MEDIA_FOLDER_PATH)){
8428 const char* apcMediaItemIface = dbus_message_get_path(apDBusMsg);
8430 unsigned int ui32DeviceIfceLen = strstr(apcMediaItemIface,
"/player") - apcMediaItemIface;
8432 char* apcDevAddr = NULL;
8435 BTRCORELOG_ERROR (
"Property Changed! : %s\n", BT_DBUS_BLUEZ_MEDIA_FOLDER_PATH);
8437 strncpy(apcDeviceIfce, apcMediaItemIface, ui32DeviceIfceLen);
8438 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, apcDeviceIfce);
8440 lenBTDevType = btrCore_BTMapDevClasstoDevType(pstBTDeviceInfo->ui32Class);
8441 apcDevAddr = pstBTDeviceInfo->pcAddress;
8445 DBusMessageIter lDBusMsgIterDict, lDBusMsgIter1, lDBusMsgIterVal;
8446 dbus_message_iter_recurse(&lDBusMsgIter, &lDBusMsgIterDict);
8448 while (dbus_message_iter_get_arg_type(&lDBusMsgIterDict) == DBUS_TYPE_DICT_ENTRY) {
8449 dbus_message_iter_recurse (&lDBusMsgIterDict, &lDBusMsgIter1);
8451 if (dbus_message_iter_get_arg_type(&lDBusMsgIter1) == DBUS_TYPE_STRING) {
8454 mediaStatusUpdate.aenBtOpIfceType = enBTMediaFolder;
8455 dbus_message_iter_get_basic(&lDBusMsgIter1, &str);
8456 BTRCORELOG_DEBUG (
"%s received event <%s>\n", BT_DBUS_BLUEZ_MEDIA_FOLDER_PATH, str);
8462 if (!strncmp(str,
"Name", strlen(
"Name"))) {
8464 dbus_message_iter_next(&lDBusMsgIter1);
8465 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8466 dbus_message_iter_get_basic(&lDBusMsgIterVal, &pcName);
8467 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaFolderProp = enBTMedFolderPropName;
8468 strncpy (mediaStatusUpdate.m_mediaFolderName, btrCore_BTGetMediaItemAbsoluteName (pcName),
BT_MAX_STR_LEN -1);
8470 else if (!strncmp(str,
"NumberOfItems", strlen(
"NumberOfItems"))) {
8471 unsigned int ui32NumberOfItems = 0;
8472 dbus_message_iter_next(&lDBusMsgIter1);
8473 dbus_message_iter_recurse(&lDBusMsgIter1, &lDBusMsgIterVal);
8474 dbus_message_iter_get_basic(&lDBusMsgIterVal, &ui32NumberOfItems);
8475 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaFolderProp = enBTMedFolderPropNumberOfItems;
8476 mediaStatusUpdate.m_mediaFolderNumberOfItems = ui32NumberOfItems;
8480 if (pstlhBtIfce->fpcBMediaStatusUpdate) {
8481 if(pstlhBtIfce->fpcBMediaStatusUpdate(lenBTDevType, &mediaStatusUpdate, apcDevAddr, pstlhBtIfce->pcBMediaStatusUserData)) {
8484 dbus_message_iter_next(&lDBusMsgIterDict);
8489 else if (!strcmp(lpcDBusIface, BT_DBUS_BLUEZ_GATT_SERVICE_PATH)) {
8490 BTRCORELOG_INFO (
"Property Changed! : %s\n", BT_DBUS_BLUEZ_GATT_SERVICE_PATH);
8492 else if (!strcmp(lpcDBusIface, BT_DBUS_BLUEZ_GATT_CHAR_PATH )) {
8493 BTRCORELOG_INFO (
"Property Changed! : %s\n", BT_DBUS_BLUEZ_GATT_CHAR_PATH);
8494 const char* pCharIface = dbus_message_get_path(apDBusMsg);
8495 unsigned int ui32DeviceIfceLen = strstr(pCharIface,
"/service") - pCharIface;
8498 if ((ui32DeviceIfceLen > 0) && (ui32DeviceIfceLen < (
BT_MAX_STR_LEN - 1))) {
8499 strncpy(apcDeviceIfce, pCharIface, ui32DeviceIfceLen);
8501 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, apcDeviceIfce);
8503 if (pstlhBtIfce->fpcBTLeGattPath) {
8504 pstlhBtIfce->fpcBTLeGattPath(enBTGattCharacteristic, enBTLeGattOpUnknown, pCharIface, pstBTDeviceInfo->pcAddress, enBTDevStPropChanged, NULL, pstlhBtIfce->pcBLePathUserData);
8509 else if (!strcmp(lpcDBusIface, BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH )) {
8510 BTRCORELOG_INFO (
"Property Changed! : %s\n", BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH);
8513 BTRCORELOG_INFO (
"Property Changed! : %s\n", lpcDBusIface);
8518 else if (dbus_message_is_method_call(apDBusMsg, DBUS_INTERFACE_OBJECT_MANAGER,
"GetManagedObjects")) {
8519 BTRCORELOG_INFO (
"%s - GetManagedObjects\n", DBUS_INTERFACE_OBJECT_MANAGER);
8521 else if (dbus_message_is_method_call(apDBusMsg, DBUS_INTERFACE_PROPERTIES,
"GetAll")) {
8522 BTRCORELOG_INFO (
"%s - GetAll\n", DBUS_INTERFACE_PROPERTIES);
8523 if (!strcmp(pstlhBtIfce->stBTLeCustAdvt.pui8AdvertPath, dbus_message_get_path(apDBusMsg))) {
8524 btrCore_BTRegisterLeAdvGetProp(apDBusConn, apDBusMsg, pstlhBtIfce);
8525 BTRCORELOG_INFO (
"btrCore_BTRegisterLeAdvGetProp - GetAll\n");
8529 else if (dbus_message_is_signal(apDBusMsg, DBUS_INTERFACE_OBJECT_MANAGER,
"InterfacesAdded")) {
8530 DBusMessageIter lDBusMsgIter;
8531 DBusMessageIter lDBusMsgIterDict;
8532 const char* lpcDBusIface = NULL;
8534 dbus_message_iter_init(apDBusMsg, &lDBusMsgIter);
8535 if (dbus_message_iter_get_arg_type(&lDBusMsgIter) == DBUS_TYPE_OBJECT_PATH) {
8536 dbus_message_iter_get_basic(&lDBusMsgIter, &lpcDBusIface);
8537 dbus_message_iter_next(&lDBusMsgIter);
8539 if (dbus_message_iter_get_arg_type(&lDBusMsgIter) == DBUS_TYPE_ARRAY) {
8540 BTRCORELOG_INFO (
"InterfacesAdded : Interface %s\n", lpcDBusIface ? lpcDBusIface : NULL);
8543 dbus_message_iter_recurse(&lDBusMsgIter, &lDBusMsgIterDict);
8545 while (dbus_message_iter_get_arg_type(&lDBusMsgIterDict) == DBUS_TYPE_DICT_ENTRY) {
8546 DBusMessageIter lDBusMsgIterStrnArr;
8547 const char* lpcDBusIfaceInternal = NULL;
8549 dbus_message_iter_recurse(&lDBusMsgIterDict, &lDBusMsgIterStrnArr);
8551 if (dbus_message_iter_get_arg_type(&lDBusMsgIterStrnArr) == DBUS_TYPE_STRING) {
8552 dbus_message_iter_get_basic(&lDBusMsgIterStrnArr, &lpcDBusIfaceInternal);
8554 dbus_message_iter_next(&lDBusMsgIterStrnArr);
8555 if (dbus_message_iter_get_arg_type(&lDBusMsgIterStrnArr) == DBUS_TYPE_ARRAY) {
8556 if (lpcDBusIfaceInternal) {
8557 if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_ADAPTER_PATH)) {
8558 BTRCORELOG_INFO (
"InterfacesAdded : %s\n", BT_DBUS_BLUEZ_ADAPTER_PATH);
8560 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_DEVICE_PATH)) {
8561 BTRCORELOG_INFO (
"InterfacesAdded : %s\n", BT_DBUS_BLUEZ_DEVICE_PATH);
8564 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, lpcDBusIface);
8567 enBTDeviceType lenBTDevType = btrCore_BTMapDevClasstoDevType(pstBTDeviceInfo->ui32Class);
8569 if ((!pstBTDeviceInfo->bPaired && !pstBTDeviceInfo->bConnected) ||
8570 ((enBTDevUnknown == lenBTDevType) && (
TRUE == pstBTDeviceInfo->bConnected)) ) {
8571 lenBtDevState = enBTDevStFound;
8573 if (pstlhBtIfce->fpcBDevStatusUpdate) {
8574 if(pstlhBtIfce->fpcBDevStatusUpdate(lenBTDevType, lenBtDevState, pstBTDeviceInfo, pstlhBtIfce->pcBDevStatusUserData)) {
8581 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH)) {
8582 BTRCORELOG_INFO (
"InterfacesAdded : %s\n", BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH);
8584 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_MEDIA_CTRL_PATH)) {
8585 BTRCORELOG_INFO (
"InterfacesAdded : %s\n", BT_DBUS_BLUEZ_MEDIA_CTRL_PATH);
8587 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH)) {
8588 BTRCORELOG_INFO (
"InterfacesAdded : %s\n", BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH);
8590 if (lpcDBusIface && pstlhBtIfce->fpcBTMediaPlayerPath) {
8591 if (pstlhBtIfce->fpcBTMediaPlayerPath(lpcDBusIface, pstlhBtIfce->pcBMediaPlayerPathUserData)) {
8592 BTRCORELOG_ERROR (
"Media Player Path callBack Failed!!!\n");
8596 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_MEDIA_ITEM_PATH)) {
8597 BTRCORELOG_INFO (
"InterfacesAdded : %s\n", BT_DBUS_BLUEZ_MEDIA_ITEM_PATH);
8599 unsigned int ui32DeviceIfceLen = strstr(lpcDBusIface,
"/player") - lpcDBusIface;
8601 char* apcDevAddr = 0;
8603 if ((ui32DeviceIfceLen > 0) && (ui32DeviceIfceLen < (
BT_MAX_STR_LEN - 1))) {
8604 strncpy(apcDeviceIfce, lpcDBusIface, ui32DeviceIfceLen);
8605 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, apcDeviceIfce);
8607 lenBTDevType = btrCore_BTMapDevClasstoDevType(pstBTDeviceInfo->ui32Class);
8608 apcDevAddr = pstBTDeviceInfo->pcAddress;
8612 if (strstr(lpcDBusIface,
"NowPlaying")) {
8615 BTRCORELOG_INFO (
"MediaItem InterfacesAdded : %s\n", strstr(lpcDBusIface,
"/NowPlaying"));
8617 if (strstr(lpcDBusIface,
"item")) {
8622 unsigned int ui32MediaIfceLen = strstr(lpcDBusIface,
"/NowPlaying") - lpcDBusIface;
8626 if ((ui32MediaIfceLen > 0) && (ui32MediaIfceLen < (
BT_MAX_STR_LEN - 1))) {
8627 strncpy(apcMediaIfce, lpcDBusIface, ui32MediaIfceLen);
8632 i32OpRet = btrCore_BTGetMediaIfceProperty (apDBusConn, lpcDBusIface, BT_DBUS_BLUEZ_MEDIA_ITEM_PATH,
"Name", (
void*)&itemName);
8640 if (!strncmp(mediaTrackInfo.pcTitle, name, (strlen(mediaTrackInfo.pcTitle) < strlen(name))?
8641 strlen(name) : strlen(mediaTrackInfo.pcTitle))) {
8643 mediaStatusUpdate.aenBtOpIfceType = enBTMediaPlayer;
8644 mediaStatusUpdate.aunBtOpIfceProp.enBtMediaPlayerProp = enBTMedPlayerPropTrack;
8645 memcpy(&mediaStatusUpdate.m_mediaTrackInfo, &mediaTrackInfo,
sizeof(
stBTMediaTrackInfo));
8647 if (pstlhBtIfce->fpcBMediaStatusUpdate) {
8648 if(pstlhBtIfce->fpcBMediaStatusUpdate(lenBTDevType, &mediaStatusUpdate, apcDevAddr, pstlhBtIfce->pcBMediaStatusUserData)) {
8651 memcpy (&mediaBrowserUpdate.mediaTrackInfo, &mediaTrackInfo,
sizeof(
stBTMediaTrackInfo));
8660 strncpy(mediaBrowserUpdate.pcMediaItemPath, lpcDBusIface,
BT_MAX_STR_LEN -1);
8661 mediaBrowserUpdate.eMediaItemType = enBTMediaItemTypAudio;
8662 mediaBrowserUpdate.ui32BTMediaItemId = btrCore_BTGetMediaItemIdFromMediaPath (lpcDBusIface);
8664 strncpy(mediaBrowserUpdate.mediaTrackInfo.pcTitle, name,
BT_MAX_STR_LEN -1);
8667 memcpy (&mediaBrowserUpdate.mediaTrackInfo, &mediaTrackInfo,
sizeof(
stBTMediaTrackInfo));
8669 strncpy(mediaBrowserUpdate.pcMediaItemName, mediaBrowserUpdate.mediaTrackInfo.pcTitle,
BT_MAX_STR_LEN -1);
8670 BTRCORELOG_DEBUG (
"PlayList Audio Item : %s [ID: %llu]\n", mediaBrowserUpdate.mediaTrackInfo.pcTitle, mediaBrowserUpdate.ui32BTMediaItemId);
8674 BTRCORELOG_ERROR (
"Failed to get MediaTrackInfo\n");
8678 strncpy(mediaBrowserUpdate.pcMediaItemName,
"NowPlaying",
BT_MAX_STR_LEN -1);
8679 strncpy(mediaBrowserUpdate.pcMediaItemPath, lpcDBusIface,
BT_MAX_STR_LEN -1);
8680 mediaBrowserUpdate.ui32BTMediaItemId = btrCore_BTGetMediaItemIdFromMediaPath (lpcDBusIface);
8681 mediaBrowserUpdate.eMediaItemType = enBTMediaItemTypFolder;
8682 BTRCORELOG_DEBUG (
"PlayList root : %s [ID: %llu]\n", mediaBrowserUpdate.pcMediaItemName
8683 , mediaBrowserUpdate.ui32BTMediaItemId);
8687 if ( pstlhBtIfce->fpcBTMediaBrowserPath && 0xFFFFFFFFFFFFFFFF != mediaBrowserUpdate.ui32BTMediaItemId) {
8688 if (pstlhBtIfce->fpcBTMediaBrowserPath(&mediaBrowserUpdate, 1, apcDevAddr, pstlhBtIfce->pcBMediaBrowserPathUserData)) {
8692 else if (strstr(lpcDBusIface,
"Filesystem")) {
8695 unsigned int ui32MediaIfceLen = strstr(lpcDBusIface,
"/Filesystem") - lpcDBusIface;
8697 BTRCORELOG_INFO (
"MediaItem InterfacesAdded : %s\n", strstr(lpcDBusIface,
"/Filesystem"));
8700 if ((ui32MediaIfceLen > 0) && (ui32MediaIfceLen < (
BT_MAX_STR_LEN - 1))) {
8701 strncpy(apcMediaPlayerIfce, lpcDBusIface, ui32MediaIfceLen);
8704 if (strstr(lpcDBusIface,
"item")) {
8708 btrCore_BTGetMediaIfceProperty (apDBusConn, lpcDBusIface, BT_DBUS_BLUEZ_MEDIA_ITEM_PATH,
"Name", (
void*)&itemName);
8710 strncpy(mediaBrowserUpdate.pcMediaItemName, btrCore_BTGetMediaItemAbsoluteName(itemName),
BT_MAX_STR_LEN - 1);
8712 btrCore_BTGetMediaIfceProperty (apDBusConn, lpcDBusIface, BT_DBUS_BLUEZ_MEDIA_ITEM_PATH,
"Type", (
void*)&itemType);
8713 strncpy(mediaBrowserUpdate.pcMediaItemPath, lpcDBusIface,
BT_MAX_STR_LEN - 1);
8715 itemName = mediaBrowserUpdate.pcMediaItemName;
8716 if (itemType != NULL) {
8718 if (!strncmp(itemType,
"audio", strlen(
"audio"))) {
8724 strncpy(mediaBrowserUpdate.mediaTrackInfo.pcTitle, itemName,
BT_MAX_STR_LEN -1);
8725 mediaBrowserUpdate.eMediaItemType = enBTMediaItemTypAudio;
8726 mediaBrowserUpdate.ui32BTMediaItemId = btrCore_BTGetMediaItemIdFromMediaPath (lpcDBusIface);
8727 mediaBrowserUpdate.eMediaFolderType = enBTMediaFldTypTrack;
8728 BTRCORELOG_DEBUG (
"MediaBrowser Audio Item : %s [ID: %llu]\n", itemName, mediaBrowserUpdate.ui32BTMediaItemId);
8730 else if (!strncmp(itemType,
"folder", strlen(
"folder"))) {
8731 char* folderType = 0;
8733 btrCore_BTGetMediaIfceProperty (apDBusConn, lpcDBusIface, BT_DBUS_BLUEZ_MEDIA_ITEM_PATH,
"FolderType", (
void*)&folderType);
8735 mediaBrowserUpdate.eMediaItemType = enBTMediaItemTypFolder;
8736 mediaBrowserUpdate.ui32BTMediaItemId = btrCore_BTGetMediaItemIdFromMediaPath (lpcDBusIface);
8737 mediaBrowserUpdate.eMediaFolderType = btrCore_BTGetMediaFolderType (folderType);
8739 BTRCORELOG_DEBUG (
"MediaBrowser - Folder Item(%s) : %s [ID: %llu]\n", folderType, itemName, mediaBrowserUpdate.ui32BTMediaItemId);
8741 else if (!strncmp(itemType,
"video", strlen(
"video"))) {
8742 BTRCORELOG_DEBUG (
"Its a video Item : %s\n", itemName);
8743 mediaBrowserUpdate.eMediaItemType = enBTMediaItemTypVideo;
8746 BTRCORELOG_ERROR (
"Unknown item type : %s !\n", itemType);
8747 mediaBrowserUpdate.eMediaItemType = enBTMediaItemTypUnknown;
8752 BTRCORELOG_ERROR (
" item type is NULL ");
8753 mediaBrowserUpdate.eMediaItemType = enBTMediaItemTypUnknown;
8759 strncpy(mediaBrowserUpdate.pcMediaItemName,
"Filesystem",
BT_MAX_STR_LEN -1);
8760 strncpy(mediaBrowserUpdate.pcMediaItemPath, lpcDBusIface,
BT_MAX_STR_LEN -1);
8761 mediaBrowserUpdate.ui32BTMediaItemId = btrCore_BTGetMediaItemIdFromMediaPath (lpcDBusIface);
8762 mediaBrowserUpdate.eMediaItemType = enBTMediaItemTypFolder;
8763 BTRCORELOG_DEBUG (
"MediaBrowser root : %s [ID: %llu]\n", mediaBrowserUpdate.pcMediaItemName, mediaBrowserUpdate.ui32BTMediaItemId);
8766 if (!i32OpRet && pstlhBtIfce->fpcBTMediaBrowserPath) {
8767 pstlhBtIfce->fpcBTMediaBrowserPath(&mediaBrowserUpdate, 1, apcDevAddr, pstlhBtIfce->pcBMediaBrowserPathUserData);
8771 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_MEDIA_FOLDER_PATH)) {
8772 BTRCORELOG_INFO (
"InterfacesAdded : %s\n", BT_DBUS_BLUEZ_MEDIA_FOLDER_PATH);
8775 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_GATT_SERVICE_PATH)) {
8776 BTRCORELOG_INFO (
"InterfacesAdded : %s\n", BT_DBUS_BLUEZ_GATT_SERVICE_PATH);
8778 unsigned int ui32DeviceIfceLen = strstr(lpcDBusIface,
"/service") - lpcDBusIface;
8780 if ((ui32DeviceIfceLen > 0) && (ui32DeviceIfceLen < (
BT_MAX_STR_LEN - 1))) {
8781 strncpy(apcDeviceIfce, lpcDBusIface, ui32DeviceIfceLen);
8783 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, apcDeviceIfce);
8785 if (pstlhBtIfce->fpcBTLeGattPath) {
8786 pstlhBtIfce->fpcBTLeGattPath(enBTGattService, enBTLeGattOpUnknown, lpcDBusIface, pstBTDeviceInfo->pcAddress, enBTDevStFound, NULL, pstlhBtIfce->pcBLePathUserData);
8791 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_GATT_CHAR_PATH)) {
8792 BTRCORELOG_INFO (
"InterfacesAdded : %s\n", BT_DBUS_BLUEZ_GATT_CHAR_PATH);
8794 unsigned int ui32DeviceIfceLen = strstr(lpcDBusIface,
"/service") - lpcDBusIface;
8796 if ((ui32DeviceIfceLen > 0) && (ui32DeviceIfceLen < (
BT_MAX_STR_LEN - 1))) {
8797 strncpy(apcDeviceIfce, lpcDBusIface, ui32DeviceIfceLen);
8799 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, apcDeviceIfce);
8801 if (pstlhBtIfce->fpcBTLeGattPath) {
8802 pstlhBtIfce->fpcBTLeGattPath(enBTGattCharacteristic, enBTLeGattOpUnknown, lpcDBusIface, pstBTDeviceInfo->pcAddress, enBTDevStFound, NULL, pstlhBtIfce->pcBLePathUserData);
8807 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH)) {
8808 BTRCORELOG_INFO (
"InterfacesAdded : %s\n", BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH);
8810 unsigned int ui32DeviceIfceLen = strstr(lpcDBusIface,
"/service") - lpcDBusIface;
8812 if ((ui32DeviceIfceLen > 0) && (ui32DeviceIfceLen < (
BT_MAX_STR_LEN - 1))) {
8813 strncpy(apcDeviceIfce, lpcDBusIface, ui32DeviceIfceLen);
8815 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, apcDeviceIfce);
8817 if (pstlhBtIfce->fpcBTLeGattPath) {
8818 pstlhBtIfce->fpcBTLeGattPath(enBTGattDescriptor, enBTLeGattOpUnknown, lpcDBusIface, pstBTDeviceInfo->pcAddress, enBTDevStFound, NULL, pstlhBtIfce->pcBLePathUserData);
8824 BTRCORELOG_INFO (
"InterfacesAdded : %s\n", lpcDBusIfaceInternal);
8830 dbus_message_iter_next(&lDBusMsgIterDict);
8835 else if (dbus_message_is_signal(apDBusMsg, DBUS_INTERFACE_OBJECT_MANAGER,
"InterfacesRemoved")) {
8836 BTRCORELOG_WARN (
"Device Lost!\n");
8838 DBusMessageIter lDBusMsgIterStr;
8839 DBusMessageIter lDBusMsgIter;
8840 const char* lpcDBusIface = NULL;
8842 dbus_message_iter_init(apDBusMsg, &lDBusMsgIter);
8843 dbus_message_iter_get_basic(&lDBusMsgIter, &lpcDBusIface);
8844 dbus_message_iter_next(&lDBusMsgIter);
8846 if (dbus_message_iter_get_arg_type(&lDBusMsgIter) == DBUS_TYPE_ARRAY) {
8847 BTRCORELOG_INFO (
"InterfacesRemoved : Interface %s\n", lpcDBusIface ? lpcDBusIface : NULL);
8849 dbus_message_iter_recurse(&lDBusMsgIter, &lDBusMsgIterStr);
8851 while (dbus_message_iter_get_arg_type(&lDBusMsgIterStr) == DBUS_TYPE_STRING) {
8852 const char* lpcDBusIfaceInternal = NULL;
8854 dbus_message_iter_get_basic(&lDBusMsgIterStr, &lpcDBusIfaceInternal);
8856 if (lpcDBusIfaceInternal) {
8857 if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_ADAPTER_PATH)) {
8858 BTRCORELOG_INFO (
"InterfacesRemoved : %s\n", BT_DBUS_BLUEZ_ADAPTER_PATH);
8860 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_DEVICE_PATH)) {
8861 BTRCORELOG_INFO (
"InterfacesRemoved : %s\n", BT_DBUS_BLUEZ_DEVICE_PATH);
8871 if (pstlhBtIfce->fpcBDevStatusUpdate) {
8872 btrCore_BTGetDevAddressFromDevPath(lpcDBusIface, pstBTDeviceInfo->pcAddress);
8873 if(pstlhBtIfce->fpcBDevStatusUpdate(lenBTDevType, enBTDevStLost, pstBTDeviceInfo, pstlhBtIfce->pcBDevStatusUserData)) {
8878 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH)) {
8879 BTRCORELOG_INFO (
"InterfacesRemoved : %s\n", BT_DBUS_BLUEZ_MEDIA_TRANSPORT_PATH);
8881 pstlhBtIfce->ui32DevLost = 1;
8884 strncpy(pstlhBtIfce->pcMediaCurrState,
"none",
BT_MAX_STR_LEN - 1);
8886 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_MEDIA_CTRL_PATH)) {
8887 BTRCORELOG_INFO (
"InterfacesRemoved : %s\n", BT_DBUS_BLUEZ_MEDIA_CTRL_PATH);
8889 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH)) {
8890 BTRCORELOG_INFO (
"InterfacesRemoved : %s\n", BT_DBUS_BLUEZ_MEDIA_PLAYER_PATH);
8892 if (lpcDBusIface && pstlhBtIfce->fpcBTMediaPlayerPath) {
8898 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_MEDIA_ITEM_PATH)) {
8899 BTRCORELOG_INFO (
"InterfacesRemoved : %s\n", BT_DBUS_BLUEZ_MEDIA_ITEM_PATH);
8901 unsigned int ui32DeviceIfceLen = strstr(lpcDBusIface,
"/player") - lpcDBusIface;
8902 char* apcDevAddr = 0;
8905 if ((ui32DeviceIfceLen > 0) && (ui32DeviceIfceLen < (
BT_MAX_STR_LEN - 1))) {
8906 strncpy(apcDeviceIfce, lpcDBusIface, ui32DeviceIfceLen);
8907 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, apcDeviceIfce);
8909 apcDevAddr = pstBTDeviceInfo->pcAddress;
8912 btrCore_BTGetDevAddressFromDevPath(lpcDBusIface, pstBTDeviceInfo->pcAddress);
8917 if (strstr(lpcDBusIface,
"/NowPlaying")) {
8918 BTRCORELOG_INFO (
"MediaItem InterfacesRemoved : %s\n", strstr(lpcDBusIface,
"/NowPlaying"));
8920 else if (strstr(lpcDBusIface,
"/Filesystem")) {
8921 BTRCORELOG_INFO (
"MediaItem InterfacesRemoved : %s\n", strstr(lpcDBusIface,
"/Filesystem"));
8924 mediaBrowserUpdate.ui32BTMediaItemId = btrCore_BTGetMediaItemIdFromMediaPath (lpcDBusIface);
8925 strncpy(mediaBrowserUpdate.pcMediaItemPath, lpcDBusIface,
BT_MAX_STR_LEN - 1);
8927 if (!i32OpRet && pstlhBtIfce->fpcBTMediaBrowserPath) {
8928 pstlhBtIfce->fpcBTMediaBrowserPath(&mediaBrowserUpdate, 0, apcDevAddr, pstlhBtIfce->pcBMediaBrowserPathUserData);
8931 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_MEDIA_FOLDER_PATH)) {
8932 BTRCORELOG_INFO (
"InterfacesRemoved : %s\n", BT_DBUS_BLUEZ_MEDIA_FOLDER_PATH);
8935 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_GATT_SERVICE_PATH)) {
8936 BTRCORELOG_INFO (
"InterfacesRemoved : %s\n", BT_DBUS_BLUEZ_GATT_SERVICE_PATH);
8938 unsigned int ui32DeviceIfceLen = strstr(lpcDBusIface,
"/service") - lpcDBusIface;
8940 if ((ui32DeviceIfceLen > 0) && (ui32DeviceIfceLen < (
BT_MAX_STR_LEN - 1))) {
8941 strncpy(apcDeviceIfce, lpcDBusIface, ui32DeviceIfceLen);
8943 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, apcDeviceIfce);
8945 if (pstlhBtIfce->fpcBTLeGattPath) {
8946 pstlhBtIfce->fpcBTLeGattPath(enBTGattService, enBTLeGattOpUnknown, lpcDBusIface, pstBTDeviceInfo->pcAddress, enBTDevStLost, NULL, pstlhBtIfce->pcBLePathUserData);
8951 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_GATT_CHAR_PATH )) {
8952 BTRCORELOG_INFO (
"InterfacesRemoved : %s\n", BT_DBUS_BLUEZ_GATT_CHAR_PATH);
8954 unsigned int ui32DeviceIfceLen = strstr(lpcDBusIface,
"/service") - lpcDBusIface;
8956 if ((ui32DeviceIfceLen > 0) && (ui32DeviceIfceLen < (
BT_MAX_STR_LEN - 1))) {
8957 strncpy(apcDeviceIfce, lpcDBusIface, ui32DeviceIfceLen);
8959 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, apcDeviceIfce);
8961 if (pstlhBtIfce->fpcBTLeGattPath) {
8962 pstlhBtIfce->fpcBTLeGattPath(enBTGattCharacteristic, enBTLeGattOpUnknown, lpcDBusIface, pstBTDeviceInfo->pcAddress, enBTDevStLost, NULL, pstlhBtIfce->pcBLePathUserData);
8967 else if (!strcmp(lpcDBusIfaceInternal, BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH)) {
8968 BTRCORELOG_INFO (
"InterfacesRemoved : %s\n", BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH);
8970 unsigned int ui32DeviceIfceLen = strstr(lpcDBusIface,
"/service") - lpcDBusIface;
8972 if ((ui32DeviceIfceLen > 0) && (ui32DeviceIfceLen < (
BT_MAX_STR_LEN - 1))) {
8973 strncpy(apcDeviceIfce, lpcDBusIface, ui32DeviceIfceLen);
8975 i32OpRet = btrCore_BTGetDeviceInfo(apDBusConn, pstBTDeviceInfo, apcDeviceIfce);
8977 if (pstlhBtIfce->fpcBTLeGattPath) {
8978 pstlhBtIfce->fpcBTLeGattPath(enBTGattDescriptor, enBTLeGattOpUnknown, lpcDBusIface, pstBTDeviceInfo->pcAddress, enBTDevStLost, NULL, pstlhBtIfce->pcBLePathUserData);
8984 BTRCORELOG_INFO (
"InterfacesRemoved : %s\n", lpcDBusIfaceInternal);
8988 dbus_message_iter_next(&lDBusMsgIterStr);
8994 return DBUS_HANDLER_RESULT_HANDLED;
8996 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
9000 static DBusHandlerResult
9001 btrCore_BTMediaEndpointHandlerCb (
9002 DBusConnection* apDBusConn,
9003 DBusMessage* apDBusMsg,
9006 DBusMessage* lpDBusReply = NULL;
9007 const char* lpcPath = NULL;
9011 lpcPath = dbus_message_get_path(apDBusMsg);
9013 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
9016 BTRCORELOG_INFO (
"endpoint_handler: MediaEndpoint1 - %s\n", lpcPath);
9018 if (!strcmp(lpcPath, BT_MEDIA_SBC_A2DP_SOURCE_ENDPOINT)) {
9019 lenBTDeviceType = enBTDevAudioSink;
9020 lenBTMediaType = enBTMediaTypeSBC;
9022 else if (!strcmp(lpcPath, BT_MEDIA_SBC_A2DP_SINK_ENDPOINT)) {
9023 lenBTDeviceType = enBTDevAudioSource;
9024 lenBTMediaType = enBTMediaTypeSBC;
9026 else if (!strcmp(lpcPath, BT_MEDIA_PCM_HFP_AG_ENDPOINT)) {
9027 lenBTDeviceType = enBTDevHFPHeadset;
9028 lenBTMediaType = enBTMediaTypePCM;
9030 else if (!strcmp(lpcPath, BT_MEDIA_AAC_A2DP_SOURCE_ENDPOINT)) {
9031 lenBTDeviceType = enBTDevAudioSink;
9032 lenBTMediaType = enBTMediaTypeAAC;
9034 else if (!strcmp(lpcPath, BT_MEDIA_AAC_A2DP_SINK_ENDPOINT)) {
9035 lenBTDeviceType = enBTDevAudioSource;
9036 lenBTMediaType = enBTMediaTypeAAC;
9038 else if (!strcmp(lpcPath, BT_MEDIA_MP3_A2DP_SOURCE_ENDPOINT)) {
9039 lenBTDeviceType = enBTDevAudioSink;
9040 lenBTMediaType = enBTMediaTypeMP3;
9042 else if (!strcmp(lpcPath, BT_MEDIA_MP3_A2DP_SINK_ENDPOINT)) {
9043 lenBTDeviceType = enBTDevAudioSource;
9044 lenBTMediaType = enBTMediaTypeMP3;
9046 else if (!strcmp(lpcPath, BT_MEDIA_SBC_HFP_AG_ENDPOINT)) {
9047 lenBTDeviceType = enBTDevHFPHeadset;
9048 lenBTMediaType = enBTMediaTypeSBC;
9050 else if (!strcmp(lpcPath, BT_MEDIA_PCM_HFP_HS_ENDPOINT)) {
9051 lenBTDeviceType = enBTDevHFPAudioGateway;
9052 lenBTMediaType = enBTMediaTypePCM;
9056 if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_MEDIA_ENDPOINT_PATH,
"SelectConfiguration")) {
9057 BTRCORELOG_INFO (
"endpoint_handler: MediaEndpoint1-SelectConfiguration\n");
9058 lpDBusReply = btrCore_BTMediaEndpointSelectConfiguration(apDBusMsg, lenBTDeviceType, lenBTMediaType, apvUserData);
9060 else if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_MEDIA_ENDPOINT_PATH,
"SetConfiguration")) {
9061 BTRCORELOG_INFO (
"endpoint_handler: MediaEndpoint1-SetConfiguration\n");
9062 lpDBusReply = btrCore_BTMediaEndpointSetConfiguration(apDBusMsg, lenBTDeviceType, lenBTMediaType, apvUserData);
9064 else if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_MEDIA_ENDPOINT_PATH,
"ClearConfiguration")) {
9065 BTRCORELOG_INFO (
"endpoint_handler: MediaEndpoint1-ClearConfiguration\n");
9066 lpDBusReply = btrCore_BTMediaEndpointClearConfiguration(apDBusMsg, lenBTDeviceType, lenBTMediaType, apvUserData);
9069 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
9073 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
9074 dbus_message_unref(lpDBusReply);
9077 return DBUS_HANDLER_RESULT_HANDLED;
9081 static DBusHandlerResult
9082 btrCore_BTAgentMessageHandlerCb (
9083 DBusConnection* apDBusConn,
9084 DBusMessage* apDBusMsg,
9088 BTRCORELOG_INFO (
"btrCore_BTAgentMessageHandlerCb\n");
9090 if (!apDBusConn || !apDBusMsg || !apvUserData)
9091 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
9094 if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_AGENT_PATH,
"Release"))
9095 return btrCore_BTAgentRelease (apDBusConn, apDBusMsg, apvUserData);
9097 if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_AGENT_PATH,
"RequestPinCode"))
9098 return btrCore_BTAgentRequestPincode(apDBusConn, apDBusMsg, apvUserData);
9100 if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_AGENT_PATH,
"RequestPasskey"))
9101 return btrCore_BTAgentRequestPasskey(apDBusConn, apDBusMsg, apvUserData);
9103 if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_AGENT_PATH,
"RequestConfirmation"))
9104 return btrCore_BTAgentRequestConfirmation(apDBusConn, apDBusMsg, apvUserData);
9106 if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_AGENT_PATH,
"AuthorizeService"))
9107 return btrCore_BTAgentAuthorize(apDBusConn, apDBusMsg, apvUserData);
9109 if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_AGENT_PATH,
"Cancel"))
9110 return btrCore_BTAgentCancelMessage(apDBusConn, apDBusMsg, apvUserData);
9112 if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_AGENT_PATH,
"DisplayPinCode"))
9113 return btrCore_BTAgentDisplayPinCodePassKey(apDBusConn, apDBusMsg,
TRUE, apvUserData);
9115 if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_AGENT_PATH,
"DisplayPasskey")) {
9116 BTRCORELOG_INFO (
"btrCore_BTAgentMessageHandlerCb:: DisplayPasskey\n");
9117 return btrCore_BTAgentDisplayPinCodePassKey(apDBusConn, apDBusMsg, FALSE, apvUserData);
9120 if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_AGENT_PATH,
"RequestAuthorization")) {
9121 BTRCORELOG_INFO (
"btrCore_BTAgentMessageHandlerCb:: RequestAuthorization\n");
9124 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
9128 static DBusHandlerResult
9129 btrCore_BTLeGattEndpointHandlerCb (
9130 DBusConnection* apDBusConn,
9131 DBusMessage* apDBusMsg,
9134 DBusMessage* lpDBusReply = NULL;
9135 const char* lpcPath = NULL;
9137 int li32MessageType;
9138 const char* lpcSender;
9139 const char* lpcDestination;
9143 if (!apDBusConn || !apDBusMsg || !apvUserData)
9144 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
9147 li32MessageType = dbus_message_get_type(apDBusMsg);
9148 lpcSender = dbus_message_get_sender(apDBusMsg);
9149 lpcDestination = dbus_message_get_destination(apDBusMsg);
9151 BTRCORELOG_INFO (
"%s Sender=%s -> Dest=%s Path=%s; Interface=%s; Member=%s\n",
9152 btrCore_DBusType2Name(li32MessageType),
9153 lpcSender ? lpcSender :
"Null",
9154 lpcDestination ? lpcDestination :
"Null",
9155 dbus_message_get_path(apDBusMsg),
9156 dbus_message_get_interface(apDBusMsg),
9157 dbus_message_get_member(apDBusMsg));
9159 lpcPath = dbus_message_get_path(apDBusMsg);
9161 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
9164 BTRCORELOG_INFO (
"leGatt: /LeEndpoint/Gatt - %s\n", lpcPath);
9170 if (!pstlhBtIfce->pcBTDAdapterAddr) {
9173 lunBtOpAdapProp.enBtAdapterProp = enBTAdPropAddress;
9179 lCurAdapterAddress)) {
9180 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
9185 strncpy(lCurAdapterAddress, pstlhBtIfce->pcBTDAdapterAddr, (strlen(pstlhBtIfce->pcBTDAdapterAddr)<
BT_MAX_DEV_PATH_LEN) ? strlen(pstlhBtIfce->pcBTDAdapterAddr) :
BT_MAX_DEV_PATH_LEN - 1);
9188 BTRCORELOG_TRACE(
"Current adapter address is : %s\n", lCurAdapterAddress);
9189 pstlhBtIfce->fpcBTLeGattPath(enBTAdvertisement, enBTLeGattOpUnknown, lpcPath, lCurAdapterAddress, enBTDevStUnknown, (
void*)lpstBTLeGattInfo, pstlhBtIfce->pcBLePathUserData);
9190 if (dbus_message_is_method_call(apDBusMsg, DBUS_INTERFACE_OBJECT_MANAGER,
"GetManagedObjects")) {
9192 BTRCORELOG_INFO (
"leGatt: /LeEndpoint/Gatt - %s GetManagedObjects\n", lpcPath);
9193 BTRCORELOG_INFO(
"Number of gatt services%d\n", lpstBTLeGattInfo->nNumGattServices);
9194 if (!strcmp(lpcPath, BT_LE_GATT_SERVER_ENDPOINT)) {
9195 lpDBusReply = btrCore_BTRegisterGattService(apDBusConn, apDBusMsg, pstlhBtIfce, lpstBTLeGattInfo->astBTRGattService, lpstBTLeGattInfo->nNumGattServices);
9197 BTRCORELOG_ERROR (
"Can't Register Le Gatt Object Paths\n");
9201 BTRCORELOG_INFO (
"leGatt: /LeEndpoint/GattServer-GetManagedObjects\n");
9204 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
9209 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
9213 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
9214 dbus_connection_flush(apDBusConn);
9216 dbus_message_unref(lpDBusReply);
9219 return DBUS_HANDLER_RESULT_HANDLED;
9223 static DBusHandlerResult
9224 btrCore_BTLeGattMessageHandlerCb (
9225 DBusConnection* apDBusConn,
9226 DBusMessage* apDBusMsg,
9229 DBusMessage* lpDBusReply = NULL;
9230 const char* lpcPath = NULL;
9233 lpcPath = dbus_message_get_path(apDBusMsg);
9235 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
9237 BTRCORELOG_INFO (
"leGatt: /LeEndpoint/GattServer - %s\n", lpcPath);
9239 if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_GATT_CHAR_PATH,
"ReadValue")) {
9240 BTRCORELOG_INFO (
"leGatt: LeEndpoint/GattServer-Characteristic-ReadValue\n");
9242 lpDBusReply = btrCore_BTLEGattOps(apDBusMsg, pstlhBtIfce, enBTGattCharacteristic, enBTLeGattOpReadValue);
9244 else if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_GATT_CHAR_PATH,
"WriteValue")) {
9245 BTRCORELOG_INFO (
"leGatt: LeEndpoint/GattServer-Characteristic-WriteValue\n");
9247 btrCore_BTLEGattOps(apDBusMsg, pstlhBtIfce, enBTGattCharacteristic, enBTLeGattOpWriteValue);
9249 else if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_GATT_CHAR_PATH,
"StartNotify")) {
9250 BTRCORELOG_INFO (
"leGatt: LeEndpoint/GattServer-Characteristic-StartNotify\n");
9252 else if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_GATT_CHAR_PATH,
"StopNotify")) {
9253 BTRCORELOG_INFO (
"leGatt: LeEndpoint/GattServer-Characteristic-StopNotify\n");
9255 else if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH,
"ReadValue")) {
9256 BTRCORELOG_INFO (
"leGatt: LeEndpoint/GattServer-Descriptor-ReadValue\n");
9258 lpDBusReply = btrCore_BTLEGattOps(apDBusMsg, pstlhBtIfce, enBTGattDescriptor, enBTLeGattOpReadValue);
9260 else if (dbus_message_is_method_call(apDBusMsg, BT_DBUS_BLUEZ_GATT_DESCRIPTOR_PATH,
"WriteValue")) {
9261 BTRCORELOG_INFO (
"leGatt: LeEndpoint/GattServer-Descriptor-WriteValue\n");
9263 btrCore_BTLEGattOps(apDBusMsg, pstlhBtIfce, enBTGattDescriptor, enBTLeGattOpWriteValue);
9266 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
9270 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
9273 dbus_connection_send(apDBusConn, lpDBusReply, NULL);
9274 dbus_connection_flush(apDBusConn);
9276 dbus_message_unref(lpDBusReply);
9278 return DBUS_HANDLER_RESULT_HANDLED;